v0.0.2 评论界面处理

This commit is contained in:
zpc 2025-11-16 20:18:15 +08:00
parent 0211caf572
commit 71103eb85e
3 changed files with 95 additions and 13 deletions

View File

@ -55,5 +55,25 @@ namespace ZR.LiveForum.Model.Liveforum.Dto
public string? StatusLabel { get; set; }
[ExcelColumn(Name = "是否已删除")]
public string? IsDeletedLabel { get; set; }
/// <summary>
/// 评论者昵称
/// </summary>
public string? UserName { get; set; }
/// <summary>
/// 被回复用户昵称
/// </summary>
public string? ReplyToUserName { get; set; }
/// <summary>
/// 帖子标题
/// </summary>
public string? PostTitle { get; set; }
/// <summary>
/// 父评论内容
/// </summary>
public string? ParentCommentContent { get; set; }
}
}

View File

@ -22,12 +22,58 @@ namespace ZR.Service.Liveforum
{
var predicate = QueryExp(parm);
var response = Queryable()
//.OrderBy("Id desc")
var query = Queryable()
.Where(predicate.ToExpression())
.ToPage<T_Comments, T_CommentsDto>(parm);
.LeftJoin<T_Users>((c, u) => c.UserId == u.Id)
.LeftJoin<T_Users>((c, u, ru) => c.ReplyToUserId == ru.Id)
.LeftJoin<T_Posts>((c, u, ru, p) => c.PostId == p.Id)
.LeftJoin<T_Comments>((c, u, ru, p, pc) => c.ParentCommentId == pc.Id);
return response;
// 排序:顶级评论在前,回复评论在后,同层级按创建时间倒序
// 使用多个OrderBy组合排序
query = query.OrderBy((c, u, ru, p, pc) => c.ParentCommentId == null ? 0 : 1, OrderByType.Asc)
.OrderBy((c, u, ru, p, pc) => c.CreatedAt, OrderByType.Desc);
var response = query.Select((c, u, ru, p, pc) => new T_CommentsDto()
{
Id = c.Id,
PostId = c.PostId,
UserId = c.UserId,
ParentCommentId = c.ParentCommentId,
ReplyToUserId = c.ReplyToUserId,
Content = c.Content,
LikeCount = c.LikeCount,
ReplyCount = c.ReplyCount,
Status = c.Status,
IpAddress = c.IpAddress,
CreatedAt = c.CreatedAt,
UpdatedAt = c.UpdatedAt,
IsDeleted = c.IsDeleted,
DeletedAt = c.DeletedAt,
UserName = u.NickName,
ReplyToUserName = ru.NickName,
PostTitle = p.Title,
ParentCommentContent = pc.Content,
}, true);
var resp = ToPage(response, parm);
return resp;
}
/// <summary>
/// 分页查询排序已在Select之前完成
/// </summary>
private PagedInfo<T> ToPage<T>(ISugarQueryable<T> source, PagerInfo parm)
{
var page = new PagedInfo<T>();
var total = 0;
page.PageSize = parm.PageSize;
page.PageIndex = parm.PageNum;
// 注意:排序已经在 Select 之前完成了,这里不再需要排序
page.Result = source
.ToPageList(parm.PageNum, parm.PageSize, ref total);
page.TotalNum = total;
return page;
}

View File

@ -43,12 +43,25 @@
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="50" align="center"/>
<el-table-column prop="id" label="评论ID" align="center" v-if="columns.showColumn('id')"/>
<el-table-column prop="id" label="评论ID" align="center" width="80" v-if="columns.showColumn('id')"/>
<el-table-column prop="postId" label="帖子ID" align="center" v-if="columns.showColumn('postId')"/>
<el-table-column prop="userId" label="用户Id" align="center" v-if="columns.showColumn('userId')"/>
<el-table-column prop="parentCommentId" label="父评论Id" align="center" v-if="columns.showColumn('parentCommentId')"/>
<el-table-column prop="replyToUserId" label="回复用户Id" align="center" v-if="columns.showColumn('replyToUserId')"/>
<el-table-column prop="content" label="评论内容" align="center" :show-overflow-tooltip="true" v-if="columns.showColumn('content')"/>
<el-table-column prop="postTitle" label="帖子标题" align="center" width="200" :show-overflow-tooltip="true" v-if="columns.showColumn('postTitle')"/>
<el-table-column prop="userId" label="评论者Id" align="center" v-if="columns.showColumn('userId')"/>
<el-table-column prop="userName" label="评论者" align="center" width="120" :show-overflow-tooltip="true" v-if="columns.showColumn('userName')"/>
<el-table-column prop="replyToUserName" label="被回复用户" align="center" width="120" :show-overflow-tooltip="true" v-if="columns.showColumn('replyToUserName')">
<template #default="scope">
<span v-if="scope.row.replyToUserName">{{ scope.row.replyToUserName }}</span>
<span v-else style="color: #999;">-</span>
</template>
</el-table-column>
<el-table-column prop="content" label="评论内容" align="left" width="300" :show-overflow-tooltip="true" v-if="columns.showColumn('content')">
<template #default="scope">
<div :style="{ paddingLeft: scope.row.parentCommentId ? '30px' : '0', position: 'relative' }">
<span v-if="scope.row.parentCommentId" style="color: #409eff; font-weight: bold;">回复</span>
<span>{{ scope.row.content }}</span>
</div>
</template>
</el-table-column>
<el-table-column prop="likeCount" label="评论点赞数" align="center" v-if="columns.showColumn('likeCount')"/>
<el-table-column prop="replyCount" label="评论回复数量" align="center" v-if="columns.showColumn('replyCount')"/>
<el-table-column prop="status" label="评论状态" align="center" v-if="columns.showColumn('status')">
@ -158,12 +171,15 @@ const queryParams = reactive({
userId: undefined,
})
const columns = ref([
{ visible: true, align: 'center', type: '', prop: 'id', label: '评论ID主键自增' },
{ visible: true, align: 'center', type: '', prop: 'id', label: '评论ID' },
{ visible: true, align: 'center', type: '', prop: 'postTitle', label: '帖子标题' ,showOverflowTooltip: true },
{ visible: true, align: 'center', type: '', prop: 'userName', label: '评论者' ,showOverflowTooltip: true },
{ visible: true, align: 'center', type: '', prop: 'replyToUserName', label: '被回复用户' ,showOverflowTooltip: true },
{ visible: true, align: 'center', type: '', prop: 'postId', label: '帖子ID' },
{ visible: true, align: 'center', type: '', prop: 'userId', label: '用户Id' },
{ visible: true, align: 'center', type: '', prop: 'parentCommentId', label: '父评论Id' },
{ visible: true, align: 'center', type: '', prop: 'replyToUserId', label: '回复用户Id' },
{ visible: true, align: 'center', type: '', prop: 'content', label: '评论内容' ,showOverflowTooltip: true },
{ visible: false, align: 'center', type: '', prop: 'parentCommentId', label: '父评论Id' },
{ visible: false, align: 'center', type: '', prop: 'replyToUserId', label: '回复用户Id' },
{ visible: true, align: 'left', type: '', prop: 'content', label: '评论内容' ,showOverflowTooltip: true },
{ visible: true, align: 'center', type: '', prop: 'likeCount', label: '评论点赞数' },
{ visible: true, align: 'center', type: '', prop: 'replyCount', label: '评论回复数量' },
{ visible: false, align: 'center', type: 'dict', prop: 'status', label: '评论状态' ,dictType: 'liveforum_posts_comments' },