This commit is contained in:
2026-01-18 18:20:40 +08:00
commit 20ed44aa74
178 changed files with 13789 additions and 0 deletions

View File

@@ -0,0 +1,218 @@
package ForumComments
import (
"context"
"errors"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"leke/api/forum/v1"
"leke/internal/dao"
"leke/internal/model/entity"
"leke/internal/service"
)
// ForumComments 评论相关方法
type sForumComments struct{}
func init() {
service.RegisterForumComments(&sForumComments{})
}
// ForumCommentsCreate 创建评论
func (s *sForumComments) Create(ctx context.Context, req *v1.ForumCommentsCreateReq) (res *v1.ForumCommentsCreateRes, err error) {
data := &entity.ForumComments{
UserId: req.UserId,
PostId: req.PostId,
ParentId: req.ParentId,
Content: req.Content,
Status: req.Status,
LikeCount: 0,
ReplyCount: 0,
}
result, err := dao.ForumComments.Ctx(ctx).Data(data).OmitEmpty().Insert()
if err != nil {
return nil, gerror.Wrap(err, "创建评论失败")
}
id, err := result.LastInsertId()
if err != nil {
return nil, gerror.Wrap(err, "获取评论ID失败")
}
// 更新帖子的评论数
if req.PostId > 0 {
_, err = dao.ForumPosts.Ctx(ctx).WherePri(req.PostId).OnDuplicate("comment_count", 1).Update()
if err != nil {
g.Log().Warning(ctx, "更新帖子评论数失败:", err)
}
}
// 如果是回复评论,则更新父评论的回复数
if req.ParentId > 0 {
_, err = dao.ForumComments.Ctx(ctx).WherePri(req.ParentId).OnDuplicate("reply_count", 1).Update()
if err != nil {
g.Log().Warning(ctx, "更新父评论回复数失败:", err)
}
}
return &v1.ForumCommentsCreateRes{
Id: uint64(id),
}, nil
}
// ForumCommentsUpdate 更新评论
func (s *sForumComments) Update(ctx context.Context, req *v1.ForumCommentsUpdateReq) (res *v1.ForumCommentsUpdateRes, err error) {
// 检查评论是否存在
one, err := dao.ForumComments.Ctx(ctx).WherePri(req.Id).One()
if err != nil {
return nil, gerror.Wrap(err, "查询评论失败")
}
if one.IsEmpty() {
return nil, errors.New("评论不存在")
}
// 更新评论
_, err = dao.ForumComments.Ctx(ctx).WherePri(req.Id).Data(req).OmitEmpty().Update()
if err != nil {
return nil, gerror.Wrap(err, "更新评论失败")
}
return &v1.ForumCommentsUpdateRes{
Id: req.Id,
}, nil
}
// ForumCommentsView 查看评论
func (s *sForumComments) View(ctx context.Context, req *v1.ForumCommentsViewReq) (res *v1.ForumCommentsViewRes, err error) {
record, err := dao.ForumComments.Ctx(ctx).WherePri(req.Id).One()
if err != nil {
return nil, gerror.Wrap(err, "查询评论失败")
}
if record.IsEmpty() {
return nil, errors.New("评论不存在")
}
var entity *entity.ForumComments
err = record.Struct(&entity)
if err != nil {
return nil, gerror.Wrap(err, "解析评论数据失败")
}
res = &v1.ForumCommentsViewRes{
Id: entity.Id,
UserId: entity.UserId,
PostId: entity.PostId,
ParentId: entity.ParentId,
Content: entity.Content,
Status: entity.Status,
LikeCount: entity.LikeCount,
ReplyCount: entity.ReplyCount,
CreatedAt: entity.CreatedAt,
UpdatedAt: entity.UpdatedAt,
}
return res, nil
}
// ForumCommentsList 评论列表
func (s *sForumComments) List(ctx context.Context, req *v1.ForumCommentsListReq) (res *v1.ForumCommentsListRes, err error) {
query := dao.ForumComments.Ctx(ctx).OmitEmpty()
if req.UserId > 0 {
query = query.Where("user_id", req.UserId)
}
if req.PostId > 0 {
query = query.Where("post_id", req.PostId)
}
if req.ParentId > 0 {
query = query.Where("parent_id", req.ParentId)
}
if req.Status != "" {
query = query.Where("status", req.Status)
}
// 分页查询
pageResult, err := query.Page(req.Page, req.PageSize).Order("created_at DESC").All()
if err != nil {
return nil, gerror.Wrap(err, "查询评论列表失败")
}
var list []*v1.ForumCommentsViewRes
for _, record := range pageResult {
var entity *entity.ForumComments
err = record.Struct(&entity)
if err != nil {
return nil, gerror.Wrap(err, "解析评论数据失败")
}
item := &v1.ForumCommentsViewRes{
Id: entity.Id,
UserId: entity.UserId,
PostId: entity.PostId,
ParentId: entity.ParentId,
Content: entity.Content,
Status: entity.Status,
LikeCount: entity.LikeCount,
ReplyCount: entity.ReplyCount,
CreatedAt: entity.CreatedAt,
UpdatedAt: entity.UpdatedAt,
}
list = append(list, item)
}
total, err := query.Count()
if err != nil {
return nil, gerror.Wrap(err, "统计评论总数失败")
}
res = &v1.ForumCommentsListRes{}
res.List = list
res.Page = req.Page
res.PageSize = req.PageSize
res.Total = total
return res, nil
}
// ForumCommentsDelete 删除评论
func (s *sForumComments) Delete(ctx context.Context, req *v1.ForumCommentsDeleteReq) (res *v1.ForumCommentsDeleteRes, err error) {
// 检查评论是否存在
one, err := dao.ForumComments.Ctx(ctx).WherePri(req.Id).One()
if err != nil {
return nil, gerror.Wrap(err, "查询评论失败")
}
if one.IsEmpty() {
return nil, errors.New("评论不存在")
}
var comment *entity.ForumComments
err = one.Struct(&comment)
if err != nil {
return nil, gerror.Wrap(err, "解析评论数据失败")
}
// 软删除评论
_, err = dao.ForumComments.Ctx(ctx).WherePri(req.Id).Delete()
if err != nil {
return nil, gerror.Wrap(err, "删除评论失败")
}
// 更新帖子的评论数
if comment.PostId > 0 {
_, err = dao.ForumPosts.Ctx(ctx).WherePri(comment.PostId).OnDuplicate("comment_count", 1).Update()
if err != nil {
g.Log().Warning(ctx, "更新帖子评论数失败:", err)
}
}
// 如果是回复评论,则更新父评论的回复数
if comment.ParentId > 0 {
_, err = dao.ForumComments.Ctx(ctx).WherePri(comment.ParentId).OnDuplicate("reply_count", 1).Update()
if err != nil {
g.Log().Warning(ctx, "更新父评论回复数失败:", err)
}
}
return &v1.ForumCommentsDeleteRes{}, nil
}

View File

@@ -0,0 +1,186 @@
package ForumComments
import (
"context"
"errors"
"leke/api/forum/v1"
"leke/internal/dao"
"leke/internal/model/entity"
"leke/internal/service"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
)
type sForumPosts struct{}
func init() {
service.RegisterForumPosts(&sForumPosts{})
}
// ForumPostsCreate 创建帖子
func (s *sForumPosts) Create(ctx context.Context, req *v1.ForumPostsCreateReq) (res *v1.ForumPostsCreateRes, err error) {
data := &entity.ForumPosts{
UserId: req.UserId,
Title: req.Title,
Content: req.Content,
CoverImage: req.CoverImage,
Status: req.Status,
ViewCount: 0,
LikeCount: 0,
CommentCount: 0,
}
result, err := dao.ForumPosts.Ctx(ctx).Data(data).OmitEmpty().Insert()
if err != nil {
return nil, gerror.Wrap(err, "创建帖子失败")
}
id, err := result.LastInsertId()
if err != nil {
return nil, gerror.Wrap(err, "获取帖子ID失败")
}
return &v1.ForumPostsCreateRes{
Id: uint64(id),
}, nil
}
// ForumPostsUpdate 更新帖子
func (s *sForumPosts) Update(ctx context.Context, req *v1.ForumPostsUpdateReq) (res *v1.ForumPostsUpdateRes, err error) {
// 检查帖子是否存在
one, err := dao.ForumPosts.Ctx(ctx).WherePri(req.Id).One()
if err != nil {
return nil, gerror.Wrap(err, "查询帖子失败")
}
if one.IsEmpty() {
return nil, errors.New("帖子不存在")
}
// 更新帖子
_, err = dao.ForumPosts.Ctx(ctx).WherePri(req.Id).Data(req).OmitEmpty().Update()
if err != nil {
return nil, gerror.Wrap(err, "更新帖子失败")
}
return &v1.ForumPostsUpdateRes{
Id: req.Id,
}, nil
}
// ForumPostsView 查看帖子
func (s *sForumPosts) View(ctx context.Context, req *v1.ForumPostsViewReq) (res *v1.ForumPostsViewRes, err error) {
record, err := dao.ForumPosts.Ctx(ctx).WherePri(req.Id).One()
if err != nil {
return nil, gerror.Wrap(err, "查询帖子失败")
}
if record.IsEmpty() {
return nil, errors.New("帖子不存在")
}
// 更新浏览量
_, err = dao.ForumPosts.Ctx(ctx).WherePri(req.Id).OnDuplicate("view_count", "view_count+1").Update()
if err != nil {
g.Log().Warning(ctx, "更新浏览量失败:", err)
}
var entity *entity.ForumPosts
err = record.Struct(&entity)
if err != nil {
return nil, gerror.Wrap(err, "解析帖子数据失败")
}
res = &v1.ForumPostsViewRes{
Id: entity.Id,
UserId: entity.UserId,
Title: entity.Title,
Content: entity.Content,
CoverImage: entity.CoverImage,
Status: entity.Status,
ViewCount: entity.ViewCount,
LikeCount: entity.LikeCount,
CommentCount: entity.CommentCount,
CreatedAt: entity.CreatedAt,
UpdatedAt: entity.UpdatedAt,
}
return res, nil
}
// ForumPostsList 帖子列表
func (s *sForumPosts) List(ctx context.Context, req *v1.ForumPostsListReq) (res *v1.ForumPostsListRes, err error) {
query := dao.ForumPosts.Ctx(ctx).OmitEmpty()
if req.UserId > 0 {
query = query.Where("user_id", req.UserId)
}
if req.Title != "" {
query = query.WhereLike("title", "%"+req.Title+"%")
}
if req.Status != "" {
query = query.Where("status", req.Status)
}
// 分页查询
pageResult, err := query.Page(req.Page, req.PageSize).Order("created_at DESC").All()
if err != nil {
return nil, gerror.Wrap(err, "查询帖子列表失败")
}
var list []*v1.ForumPostsViewRes
for _, record := range pageResult {
var entity *entity.ForumPosts
err = record.Struct(&entity)
if err != nil {
return nil, gerror.Wrap(err, "解析帖子数据失败")
}
item := &v1.ForumPostsViewRes{
Id: entity.Id,
UserId: entity.UserId,
Title: entity.Title,
Content: entity.Content,
CoverImage: entity.CoverImage,
Status: entity.Status,
ViewCount: entity.ViewCount,
LikeCount: entity.LikeCount,
CommentCount: entity.CommentCount,
CreatedAt: entity.CreatedAt,
UpdatedAt: entity.UpdatedAt,
}
list = append(list, item)
}
total, err := query.Count()
if err != nil {
return nil, gerror.Wrap(err, "统计帖子总数失败")
}
res = &v1.ForumPostsListRes{}
res.List = list
res.PageResult.Page = req.Page
res.PageResult.PageSize = req.PageSize
res.PageResult.Total = total
return res, nil
}
// ForumPostsDelete 删除帖子
func (s *sForumPosts) Delete(ctx context.Context, req *v1.ForumPostsDeleteReq) (res *v1.ForumPostsDeleteRes, err error) {
// 检查帖子是否存在
one, err := dao.ForumPosts.Ctx(ctx).WherePri(req.Id).One()
if err != nil {
return nil, gerror.Wrap(err, "查询帖子失败")
}
if one.IsEmpty() {
return nil, errors.New("帖子不存在")
}
// 软删除帖子
_, err = dao.ForumPosts.Ctx(ctx).WherePri(req.Id).Delete()
if err != nil {
return nil, gerror.Wrap(err, "删除帖子失败")
}
return &v1.ForumPostsDeleteRes{}, nil
}