From 3263048c183a6b5107e3f2eb5d67dd15618bf301 Mon Sep 17 00:00:00 2001 From: xiongxiaoyang <1179705413@qq.com> Date: Mon, 19 Oct 2026 17:11:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(mobile):=20=E6=96=B0=E5=A2=9E=E5=B0=8F?= =?UTF-8?q?=E8=AF=B4=E6=AE=B5=E8=90=BD=E8=AF=84=E8=AE=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/sql/20261019.sql | 21 + doc/sql/novel_plus.sql | 21 + .../novel/core/enums/ResponseStatus.java | 2 + .../novel/entity/BookParagraphComment.java | 63 ++ .../novel/controller/BookController.java | 34 + .../FrontBookParagraphCommentMapper.java | 44 ++ .../service/BookParagraphCommentService.java | 32 + .../impl/BookParagraphCommentServiceImpl.java | 131 ++++ .../novel/vo/BookParagraphCommentVO.java | 43 ++ .../src/main/resources/application.yml | 2 +- .../FrontBookParagraphCommentMapper.xml | 48 ++ .../main/resources/static/mobile/js/read.js | 4 +- .../templates/mobile/book/book_content.html | 627 +++++++++++++++++- 13 files changed, 1035 insertions(+), 37 deletions(-) create mode 100644 novel-common/src/main/java/com/java2nb/novel/entity/BookParagraphComment.java create mode 100644 novel-front/src/main/java/com/java2nb/novel/mapper/FrontBookParagraphCommentMapper.java create mode 100644 novel-front/src/main/java/com/java2nb/novel/service/BookParagraphCommentService.java create mode 100644 novel-front/src/main/java/com/java2nb/novel/service/impl/BookParagraphCommentServiceImpl.java create mode 100644 novel-front/src/main/java/com/java2nb/novel/vo/BookParagraphCommentVO.java create mode 100644 novel-front/src/main/resources/mybatis/mapping/FrontBookParagraphCommentMapper.xml diff --git a/doc/sql/20261019.sql b/doc/sql/20261019.sql index bcfafce..ee03350 100644 --- a/doc/sql/20261019.sql +++ b/doc/sql/20261019.sql @@ -24,3 +24,24 @@ CREATE TABLE `user_book_list_item` UNIQUE KEY `uk_list_book` (`list_id`, `book_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='书单条目表'; + + +CREATE TABLE `book_paragraph_comment` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `book_id` bigint(20) NOT NULL COMMENT '书籍ID', + `book_index_id` bigint(20) NOT NULL COMMENT '章节ID', + `paragraph_idx` int(11) NOT NULL COMMENT '段落序号(前端按正文拆分顺序,从0开始)', + `root_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '所属顶层评论ID,0表示顶层评论', + `reply_user_name` varchar(50) DEFAULT NULL COMMENT '被回复人昵称(回复时记录)', + `reply_count` int(11) NOT NULL DEFAULT 0 COMMENT '回复数(冗余,仅顶层评论维护)', + `comment_content` varchar(500) NOT NULL COMMENT '评论内容', + `location` varchar(50) DEFAULT NULL COMMENT '数据来源ip所在地', + `create_user_id` bigint(20) NOT NULL COMMENT '创建用户ID', + `create_time` datetime NOT NULL COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_index_paragraph` (`book_index_id`, `paragraph_idx`), + KEY `idx_root_id` (`root_id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='书籍段落评论表(含回复)'; + diff --git a/doc/sql/novel_plus.sql b/doc/sql/novel_plus.sql index 96582f3..bea1d85 100644 --- a/doc/sql/novel_plus.sql +++ b/doc/sql/novel_plus.sql @@ -3312,3 +3312,24 @@ CREATE TABLE `user_book_list_item` UNIQUE KEY `uk_list_book` (`list_id`, `book_id`) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='书单条目表'; + + +CREATE TABLE `book_paragraph_comment` +( + `id` bigint(20) NOT NULL AUTO_INCREMENT, + `book_id` bigint(20) NOT NULL COMMENT '书籍ID', + `book_index_id` bigint(20) NOT NULL COMMENT '章节ID', + `paragraph_idx` int(11) NOT NULL COMMENT '段落序号(前端按正文拆分顺序,从0开始)', + `root_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '所属顶层评论ID,0表示顶层评论', + `reply_user_name` varchar(50) DEFAULT NULL COMMENT '被回复人昵称(回复时记录)', + `reply_count` int(11) NOT NULL DEFAULT 0 COMMENT '回复数(冗余,仅顶层评论维护)', + `comment_content` varchar(500) NOT NULL COMMENT '评论内容', + `location` varchar(50) DEFAULT NULL COMMENT '数据来源ip所在地', + `create_user_id` bigint(20) NOT NULL COMMENT '创建用户ID', + `create_time` datetime NOT NULL COMMENT '创建时间', + PRIMARY KEY (`id`), + KEY `idx_index_paragraph` (`book_index_id`, `paragraph_idx`), + KEY `idx_root_id` (`root_id`) +) ENGINE = InnoDB + DEFAULT CHARSET = utf8mb4 COMMENT ='书籍段落评论表(含回复)'; + diff --git a/novel-common/src/main/java/com/java2nb/novel/core/enums/ResponseStatus.java b/novel-common/src/main/java/com/java2nb/novel/core/enums/ResponseStatus.java index c659a6a..ab913fd 100644 --- a/novel-common/src/main/java/com/java2nb/novel/core/enums/ResponseStatus.java +++ b/novel-common/src/main/java/com/java2nb/novel/core/enums/ResponseStatus.java @@ -30,6 +30,8 @@ public enum ResponseStatus implements IResultCode { * 评论相关错误 * */ HAS_COMMENTS(3001, "已评价过该书籍!"), + PARA_COMMENT_CONTENT_INVALID(3002, "段落评论不能为空且不能超过200个字!"), + PARA_COMMENT_PARAM_INVALID(3003, "段落评论参数有误!"), /** * 作者相关错误 diff --git a/novel-common/src/main/java/com/java2nb/novel/entity/BookParagraphComment.java b/novel-common/src/main/java/com/java2nb/novel/entity/BookParagraphComment.java new file mode 100644 index 0000000..b40f413 --- /dev/null +++ b/novel-common/src/main/java/com/java2nb/novel/entity/BookParagraphComment.java @@ -0,0 +1,63 @@ +package com.java2nb.novel.entity; + +import lombok.Data; + +import java.util.Date; + +/** + * 书籍段落评论 + * + * @author 11797 + */ +@Data +public class BookParagraphComment { + + private Long id; + + /** + * 书籍ID + */ + private Long bookId; + + /** + * 章节ID + */ + private Long bookIndexId; + + /** + * 段落序号(前端按正文拆分顺序,从0开始) + */ + private Integer paragraphIdx; + + /** + * 所属顶层评论ID,0表示顶层评论 + */ + private Long rootId; + + /** + * 被回复人昵称(回复时记录) + */ + private String replyUserName; + + /** + * 回复数(冗余,仅顶层评论维护) + */ + private Integer replyCount; + + /** + * 评论内容 + */ + private String commentContent; + + /** + * 数据来源ip所在地 + */ + private String location; + + /** + * 创建用户ID + */ + private Long createUserId; + + private Date createTime; +} diff --git a/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java b/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java index d10d2a7..d686663 100644 --- a/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java +++ b/novel-front/src/main/java/com/java2nb/novel/controller/BookController.java @@ -5,6 +5,7 @@ import com.java2nb.novel.core.enums.ResponseStatus; import com.java2nb.novel.core.utils.IpUtil; import com.java2nb.novel.entity.*; import com.java2nb.novel.service.BookContentService; +import com.java2nb.novel.service.BookParagraphCommentService; import com.java2nb.novel.service.BookService; import com.java2nb.novel.service.IpLocationService; import com.java2nb.novel.service.LikeService; @@ -39,6 +40,8 @@ public class BookController extends BaseController { private final LikeService likeService; + private final BookParagraphCommentService bookParagraphCommentService; + /** * 查询首页小说设置列表数据 */ @@ -199,6 +202,37 @@ public class BookController extends BaseController { return RestResult.ok(likeService.toggleCommentUnLike(commentId, userDetails.getId())); } + /** + * 查询章节内各段落评论数(key:段落序号,value:评论数) + */ + @GetMapping("listParagraphCommentCounts") + public RestResult> listParagraphCommentCounts(@RequestParam("bookIndexId") Long bookIndexId) { + return RestResult.ok(bookParagraphCommentService.listParagraphCommentCounts(bookIndexId)); + } + + /** + * 查询某段落评论列表 + */ + @GetMapping("listParagraphComment") + public RestResult> listParagraphComment(@RequestParam("bookIndexId") Long bookIndexId, + @RequestParam("paragraphIdx") Integer paragraphIdx) { + return RestResult.ok(bookParagraphCommentService.listParagraphComment(bookIndexId, paragraphIdx)); + } + + /** + * 新增段落评论 + */ + @PostMapping("addParagraphComment") + public RestResult addParagraphComment(BookParagraphComment comment, HttpServletRequest request) { + UserDetails userDetails = getUserDetails(request); + if (userDetails == null) { + return RestResult.fail(ResponseStatus.NO_LOGIN); + } + comment.setLocation(ipLocationService.getLocation(IpUtil.getRealIp(request))); + bookParagraphCommentService.addParagraphComment(userDetails.getId(), comment); + return RestResult.ok(); + } + /** * 新增回复 */ diff --git a/novel-front/src/main/java/com/java2nb/novel/mapper/FrontBookParagraphCommentMapper.java b/novel-front/src/main/java/com/java2nb/novel/mapper/FrontBookParagraphCommentMapper.java new file mode 100644 index 0000000..0c2885e --- /dev/null +++ b/novel-front/src/main/java/com/java2nb/novel/mapper/FrontBookParagraphCommentMapper.java @@ -0,0 +1,44 @@ +package com.java2nb.novel.mapper; + +import com.java2nb.novel.entity.BookParagraphComment; +import com.java2nb.novel.vo.BookParagraphCommentVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; + +/** + * 书籍段落评论Mapper + * + * @author 11797 + */ +@Mapper +public interface FrontBookParagraphCommentMapper { + + /** + * 新增段落评论/回复 + */ + int insert(BookParagraphComment comment); + + /** + * 查询某段落全部评论(含回复,按时间正序) + */ + List listByParagraph(@Param("bookIndexId") Long bookIndexId, + @Param("paragraphIdx") Integer paragraphIdx); + + /** + * 按主键查询(含评论人信息) + */ + BookParagraphCommentVO getById(@Param("id") Long id); + + /** + * 顶层评论回复数+1 + */ + int addReplyCount(@Param("id") Long id); + + /** + * 按段落分组统计章节内各段落评论数(含回复) + */ + List> countGroupByParagraph(@Param("bookIndexId") Long bookIndexId); +} diff --git a/novel-front/src/main/java/com/java2nb/novel/service/BookParagraphCommentService.java b/novel-front/src/main/java/com/java2nb/novel/service/BookParagraphCommentService.java new file mode 100644 index 0000000..e77c678 --- /dev/null +++ b/novel-front/src/main/java/com/java2nb/novel/service/BookParagraphCommentService.java @@ -0,0 +1,32 @@ +package com.java2nb.novel.service; + +import com.java2nb.novel.entity.BookParagraphComment; +import com.java2nb.novel.vo.BookParagraphCommentVO; + +import java.util.List; +import java.util.Map; + +/** + * 书籍段落评论服务 + * + * @author 11797 + */ +public interface BookParagraphCommentService { + + /** + * 查询章节内各段落评论数 + * + * @return key:段落序号,value:评论数 + */ + Map listParagraphCommentCounts(Long bookIndexId); + + /** + * 查询某段落评论列表(按时间倒序) + */ + List listParagraphComment(Long bookIndexId, Integer paragraphIdx); + + /** + * 新增段落评论 + */ + void addParagraphComment(Long userId, BookParagraphComment comment); +} diff --git a/novel-front/src/main/java/com/java2nb/novel/service/impl/BookParagraphCommentServiceImpl.java b/novel-front/src/main/java/com/java2nb/novel/service/impl/BookParagraphCommentServiceImpl.java new file mode 100644 index 0000000..dbc7538 --- /dev/null +++ b/novel-front/src/main/java/com/java2nb/novel/service/impl/BookParagraphCommentServiceImpl.java @@ -0,0 +1,131 @@ +package com.java2nb.novel.service.impl; + +import com.github.houbb.sensitive.word.core.SensitiveWordHelper; +import com.java2nb.novel.core.enums.ResponseStatus; +import com.java2nb.novel.entity.BookParagraphComment; +import com.java2nb.novel.mapper.FrontBookParagraphCommentMapper; +import com.java2nb.novel.service.BookParagraphCommentService; +import com.java2nb.novel.vo.BookParagraphCommentVO; +import io.github.xxyopen.web.exception.BusinessException; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * 书籍段落评论服务实现 + * + * @author 11797 + */ +@Service +@RequiredArgsConstructor +public class BookParagraphCommentServiceImpl implements BookParagraphCommentService { + + /** + * 评论内容最大长度,与前端输入框 maxlength 保持一致 + */ + private static final int COMMENT_MAX_LENGTH = 200; + + /** + * 顶层评论标识(root_id=0) + */ + private static final long ROOT_COMMENT = 0L; + + private final FrontBookParagraphCommentMapper bookParagraphCommentMapper; + + @Override + public Map listParagraphCommentCounts(Long bookIndexId) { + Map counts = new LinkedHashMap<>(); + if (bookIndexId == null) { + return counts; + } + List> rows = bookParagraphCommentMapper.countGroupByParagraph(bookIndexId); + for (Map row : rows) { + Object idx = row.get("idx"); + Object num = row.get("num"); + if (idx != null && num != null) { + counts.put(((Number) idx).intValue(), ((Number) num).intValue()); + } + } + return counts; + } + + @Override + public List listParagraphComment(Long bookIndexId, Integer paragraphIdx) { + if (bookIndexId == null || paragraphIdx == null || paragraphIdx < 0) { + throw new BusinessException(ResponseStatus.PARA_COMMENT_PARAM_INVALID); + } + // 正序取回全部(顶层+回复),组装两级树:顶层按时间倒序(新在前),回复按时间正序 + List all = bookParagraphCommentMapper.listByParagraph(bookIndexId, paragraphIdx); + List tops = new ArrayList<>(); + Map> replyMap = new LinkedHashMap<>(); + for (BookParagraphCommentVO vo : all) { + Long rootId = vo.getRootId(); + if (rootId == null || rootId == ROOT_COMMENT) { + tops.add(vo); + } else { + replyMap.computeIfAbsent(rootId, k -> new ArrayList<>()).add(vo); + } + } + Collections.reverse(tops); + for (BookParagraphCommentVO top : tops) { + top.setReplies(replyMap.getOrDefault(top.getId(), Collections.emptyList())); + top.setReplyCount(top.getReplies().size()); + } + return tops; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public void addParagraphComment(Long userId, BookParagraphComment comment) { + if (comment.getBookId() == null || comment.getBookIndexId() == null + || comment.getParagraphIdx() == null || comment.getParagraphIdx() < 0) { + throw new BusinessException(ResponseStatus.PARA_COMMENT_PARAM_INVALID); + } + String content = StringUtils.trim(comment.getCommentContent()); + if (StringUtils.isBlank(content) || content.length() > COMMENT_MAX_LENGTH) { + throw new BusinessException(ResponseStatus.PARA_COMMENT_CONTENT_INVALID); + } + comment.setCommentContent(SensitiveWordHelper.replace(content)); + comment.setCreateUserId(userId); + comment.setCreateTime(new Date()); + Long rootId = comment.getRootId(); + if (rootId == null || rootId == ROOT_COMMENT) { + // 顶层评论 + comment.setRootId(ROOT_COMMENT); + comment.setReplyUserName(null); + comment.setReplyCount(0); + bookParagraphCommentMapper.insert(comment); + return; + } + // 回复:校验根评论存在且是同一段落的顶层评论,坐标以根评论为准防篡改 + BookParagraphCommentVO root = bookParagraphCommentMapper.getById(rootId); + if (root == null || (root.getRootId() != null && root.getRootId() != ROOT_COMMENT)) { + throw new BusinessException(ResponseStatus.PARA_COMMENT_PARAM_INVALID); + } + if (!root.getBookIndexId().equals(comment.getBookIndexId()) + || !root.getParagraphIdx().equals(comment.getParagraphIdx())) { + throw new BusinessException(ResponseStatus.PARA_COMMENT_PARAM_INVALID); + } + String replyUserName = StringUtils.trim(comment.getReplyUserName()); + if (StringUtils.isNotBlank(replyUserName)) { + if (replyUserName.length() > 50) { + replyUserName = replyUserName.substring(0, 50); + } + comment.setReplyUserName(SensitiveWordHelper.replace(replyUserName)); + } else { + comment.setReplyUserName(null); + } + comment.setBookId(root.getBookId()); + comment.setParagraphIdx(root.getParagraphIdx()); + bookParagraphCommentMapper.insert(comment); + bookParagraphCommentMapper.addReplyCount(rootId); + } +} diff --git a/novel-front/src/main/java/com/java2nb/novel/vo/BookParagraphCommentVO.java b/novel-front/src/main/java/com/java2nb/novel/vo/BookParagraphCommentVO.java new file mode 100644 index 0000000..29ddf8e --- /dev/null +++ b/novel-front/src/main/java/com/java2nb/novel/vo/BookParagraphCommentVO.java @@ -0,0 +1,43 @@ +package com.java2nb.novel.vo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.java2nb.novel.core.serialize.CommentUserNameSerialize; +import com.java2nb.novel.core.serialize.TimeAgoFormatSerialize; +import com.java2nb.novel.entity.BookParagraphComment; +import lombok.Data; + +import java.util.Date; +import java.util.List; + +/** + * 段落评论VO + * + * @author 11797 + */ +@Data +public class BookParagraphCommentVO extends BookParagraphComment { + + /** + * 评论人昵称(脱敏) + */ + @JsonSerialize(using = CommentUserNameSerialize.class) + private String createUserName; + + /** + * 评论人头像 + */ + private String createUserPhoto; + + @JsonSerialize(using = TimeAgoFormatSerialize.class) + private Date createTime; + + /** + * 回复列表(仅顶层评论填充,按时间正序) + */ + private List replies; + + @Override + public String toString() { + return super.toString(); + } +} diff --git a/novel-front/src/main/resources/application.yml b/novel-front/src/main/resources/application.yml index be3bfd2..c656ddb 100644 --- a/novel-front/src/main/resources/application.yml +++ b/novel-front/src/main/resources/application.yml @@ -23,7 +23,7 @@ xss: # 排除链接(多个用逗号分隔) excludes: /system/notice/* # 匹配链接 (多个用逗号分隔) - urlPatterns: /book/addCommentReply,/book/addBookComment,/user/addFeedBack,/author/addBook,/author/addBookContent,/author/updateBookContent,/author/register.html,/bookList/create,/bookList/update,/bookList/addBook + urlPatterns: /book/addCommentReply,/book/addBookComment,/book/addParagraphComment,/user/addFeedBack,/author/addBook,/author/addBookContent,/author/updateBookContent,/author/register.html,/bookList/create,/bookList/update,/bookList/addBook author: diff --git a/novel-front/src/main/resources/mybatis/mapping/FrontBookParagraphCommentMapper.xml b/novel-front/src/main/resources/mybatis/mapping/FrontBookParagraphCommentMapper.xml new file mode 100644 index 0000000..8ac05ed --- /dev/null +++ b/novel-front/src/main/resources/mybatis/mapping/FrontBookParagraphCommentMapper.xml @@ -0,0 +1,48 @@ + + + + + + + insert into book_paragraph_comment (book_id, book_index_id, paragraph_idx, root_id, reply_user_name, + comment_content, location, create_user_id, create_time) + values (#{bookId}, #{bookIndexId}, #{paragraphIdx}, #{rootId}, #{replyUserName}, + #{commentContent}, #{location}, #{createUserId}, #{createTime}) + + + + + + + + update book_paragraph_comment + set reply_count = reply_count + 1 + where id = #{id} + + + + + diff --git a/novel-front/src/main/resources/static/mobile/js/read.js b/novel-front/src/main/resources/static/mobile/js/read.js index ddbc718..f9d6190 100644 --- a/novel-front/src/main/resources/static/mobile/js/read.js +++ b/novel-front/src/main/resources/static/mobile/js/read.js @@ -177,13 +177,13 @@ function set(intype,p){ fontsmall.className="sizebg"; if(p == "big"){ fontbig.className="button sizebgon"; - nr1.style.fontSize="25px"; + nr1.style.fontSize="28px"; fontmiddle.className="sizebg"; fontsmall.className="sizebg"; } if(p == "middle"){ fontmiddle.className="button sizebgon"; - nr1.style.fontSize = "20px"; + nr1.style.fontSize = "22px"; fontbig.className="sizebg"; fontsmall.className="sizebg"; } diff --git a/novel-front/src/main/resources/templates/mobile/book/book_content.html b/novel-front/src/main/resources/templates/mobile/book/book_content.html index 46fbe77..e253f66 100644 --- a/novel-front/src/main/resources/templates/mobile/book/book_content.html +++ b/novel-front/src/main/resources/templates/mobile/book/book_content.html @@ -161,6 +161,225 @@ text-align: center; } + /* ---------- 段落评论 ---------- */ + /* 正文段落左右留白由段落列表自己控制,右侧留给气泡 */ + #paragraphList { + padding: 0 18px; + } + + .para-item { + position: relative; + padding: 2px 0 6px; + } + + .para-text { + text-indent: 2em; + } + + /* 段落入口:纯气泡+数字,绝对定位在段落底部最右侧(挂进右侧留白区) */ + .para-comment-btn { + position: absolute; + right: -24px; + bottom: 6px; + display: inline-flex; + align-items: center; + font-size: 13px; + line-height: 22px; + color: #c9c9c9; + background: transparent; + border: none; + padding: 0 4px; + cursor: pointer; + } + + .para-comment-btn .layui-icon { + font-size: 26px; + } + + /* 评论数嵌在气泡图标内部居中 */ + .para-comment-btn .para-comment-num { + position: absolute; + top: 46%; + left: 50%; + transform: translate(-50%, -50%); + font-style: normal; + font-weight: bold; + font-size: 11px; + line-height: 1; + } + + .para-comment-btn.has { + color: #3eaf7c; + } + + .pc-panel { + padding: 10px; + height: 100%; + box-sizing: border-box; + display: flex; + flex-direction: column; + } + + .pc-list { + flex: 1; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + } + + .pc-empty { + text-align: center; + color: #999; + font-size: 14px; + padding: 30px 0; + } + + .pc-item { + padding: 10px 2px; + border-bottom: 1px solid #f0f0f0; + } + + .pc-item .pc-user { + font-size: 13px; + color: #999; + margin-bottom: 4px; + } + + .pc-item .pc-user .pc-name { + color: #3eaf7c; + margin-right: 8px; + } + + .pc-item .pc-user .pc-loc { + color: #bbb; + margin-right: 8px; + font-size: 12px; + } + + .pc-item .pc-content { + font-size: 15px; + color: #333; + line-height: 22px; + word-break: break-all; + } + + .pc-item .pc-op-bar { + margin-top: 4px; + text-align: right; + font-size: 12px; + } + + .pc-item .pc-reply-btn { + color: #3eaf7c; + cursor: pointer; + } + + .pc-item .pc-reply-num { + float: left; + color: #999; + line-height: 24px; + } + + /* 回复列表(嵌在顶层评论下) */ + .pc-reply-list { + margin-top: 6px; + background-color: #fafafa; + border-radius: 6px; + padding: 2px 10px; + } + + .pc-reply-item { + padding: 8px 0; + border-bottom: 1px solid #f0f0f0; + font-size: 14px; + } + + .pc-reply-item:last-child { + border-bottom: none; + } + + .pc-reply-item .pc-r-user { + font-size: 12px; + color: #999; + margin-bottom: 3px; + } + + .pc-reply-item .pc-r-user .pc-name { + color: #3eaf7c; + margin-right: 6px; + } + + .pc-reply-item .pc-r-user .pc-to { + color: #666; + margin-right: 6px; + } + + .pc-reply-item .pc-r-content { + color: #333; + line-height: 20px; + word-break: break-all; + } + + .pc-reply-item .pc-op-bar { + text-align: right; + font-size: 12px; + } + + .pc-reply-item .pc-reply-btn { + color: #3eaf7c; + cursor: pointer; + } + + /* 回复目标提示条 */ + #pcReplyHint { + display: none; + background-color: rgba(62, 175, 124, 0.08); + border-radius: 4px; + padding: 5px 8px; + margin-bottom: 6px; + font-size: 12px; + color: #3eaf7c; + } + + #pcReplyHint .pc-cancel-reply { + float: right; + color: #999; + cursor: pointer; + } + + .pc-input-box { + border-top: 1px solid #eee; + padding-top: 8px; + } + + .pc-textarea { + width: 100%; + height: 60px; + border: 1px solid #ddd; + border-radius: 4px; + padding: 6px 8px; + font-size: 14px; + box-sizing: border-box; + resize: none; + outline: none; + } + + .pc-input-bar { + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 6px; + } + + .pc-input-bar #pcNum { + font-size: 12px; + color: #999; + } + + .pc-input-bar .layui-btn { + background-color: #3eaf7c !important; + border-color: #3eaf7c !important; + } + @@ -199,33 +418,6 @@ -

- 关灯 - 护眼     - 字体:大 中 小 - - - - - - - - - - - - -

上一章 @@ -256,9 +448,8 @@
-

-

+ +
@@ -321,9 +512,6 @@ - - -