Ver Fonte

研报点赞和留言

xiexiaoyuan há 2 anos atrás
pai
commit
cd2ef8793d

+ 43 - 0
controller/comment/comment.go

@@ -0,0 +1,43 @@
+package comment
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	reqComment "hongze/hongze_yb/models/request/comment"
+	commentService "hongze/hongze_yb/services/comment"
+	userService "hongze/hongze_yb/services/user"
+)
+
+// Comment 发布留言
+func Comment(c *gin.Context)  {
+	var req reqComment.ReqComment
+	if c.ShouldBind(&req) !=nil {
+		response.Fail("入参错误", c)
+		return
+	}
+	userInfo := userService.GetInfoByClaims(c)
+	data, err := commentService.Comment(userInfo, req)
+	if err != nil {
+		response.Fail(err.Error(),c)
+		return
+	}
+	response.OkData("留言成功", data, c)
+	return
+}
+
+// Delete 删除留言
+func Delete(c *gin.Context) {
+	var req *reqComment.ReqDel
+	if c.ShouldBind(&req) != nil {
+		response.Fail("参数异常", c)
+		return
+	}
+	userInfo := userService.GetInfoByClaims(c)
+	err := commentService.Delete(userInfo, req)
+	if err != nil {
+		response.Fail(err.Error(),c)
+		return
+	}
+	response.Ok("删除留言成功", c)
+	return
+}

+ 27 - 0
controller/like/like.go

@@ -0,0 +1,27 @@
+package like
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/response"
+	"hongze/hongze_yb/models/request/like"
+	likeService "hongze/hongze_yb/services/like"
+	userService "hongze/hongze_yb/services/user"
+)
+
+// SetLike 点赞设置
+func SetLike(c *gin.Context)  {
+	var req like.ReqLike
+	if c.ShouldBind(&req) != nil {
+		response.Fail("参数异常", c)
+		return
+	}
+	userinfo := userService.GetInfoByClaims(c)
+
+	data, err := likeService.SetLike(userinfo, req)
+	if err != nil {
+		response.Fail(err.Error(), c)
+		return
+	}
+	response.OkData("操作成功", data, c )
+	return
+}

+ 4 - 0
init_serve/router.go

@@ -52,5 +52,9 @@ func InitRouter() (r *gin.Engine) {
 	routers.InitReport(r)
 	// 设置静态文件夹件路径
 	r.StaticFS("/static", http.Dir("./static"))
+	// 研报点赞相关路由
+	routers.InitLike(r)
+	// 研报留言相关路由
+	routers.InitComment(r)
 	return
 }

+ 13 - 0
models/request/comment/comment.go

@@ -0,0 +1,13 @@
+package comment
+
+type ReqComment struct {
+	Content                string `description:"留言内容" json:"content"`
+	ReportId               int `description:"报告ID" json:"report_id" `
+	ReportChapterId        int `description:"报告章节ID" json:"report_chapter_id" `
+	IsShowName             int8 `description:"是否匿名 0-匿名,1-不匿名" json:"is_show_name"`
+	SourceAgent            int  `description:"留言入口来源,1:小程序,2:pc" json:"source_agent"`
+}
+
+type ReqDel struct {
+	CommentId        uint64 `description:"留言ID" json:"comment_id"`
+}

+ 8 - 0
models/request/like/like.go

@@ -0,0 +1,8 @@
+package like
+
+type ReqLike struct {
+	ReportId               int `description:"报告ID" json:"report_id" `
+	ReportChapterId        int `description:"报告章节ID" json:"report_chapter_id" `
+	OldReportId            int `description:"老后台报告ID" json:"old_report_id" `
+	OldReportChapterId     int `description:"老后台报告章节ID" json:"old_report_chapter_id" `
+}

+ 31 - 0
models/response/comment.go

@@ -0,0 +1,31 @@
+package response
+
+import "time"
+
+type RespCommentItem struct {
+	CommentId         uint64 `description:"评论ID"`
+	UserId            uint64 `description:"用户id"`
+	ReportId          uint `description:"报告ID"`
+	ReportChapterId   uint `description:"报告章节ID"`
+	Content           string `description:"留言内容"`
+	IsTop             int8 `description:"是否置顶(0-未置顶,1-置顶)"`
+	IsHot             int8 `description:"是否设置精选(0-未设置,1-已设置)"`
+	HotTopTime        time.Time `description:"设置精选或者设置置顶的时间"`
+	UserName          string `description:"昵称"`
+	UserImg           string `description:"头像"`
+	CreateTime        time.Time `description:"创建时间"`
+	ReplayList        []*ReplayItem
+}
+
+type ReplayItem struct {
+	AdminId           uint64 `description:"发布留言回复的管理员ID"`
+	AdminName         string `description:"系统昵称"`
+	AdminImg          string `description:"系统头像"`
+	Content           string `description:"回复内容"`
+	ReplyCommentId    uint64 `description:"回复的留言ID"`
+	CreateTime        time.Time `description:"创建时间"`
+}
+
+type RespCommentAdd struct {
+	CommentId    uint64 `description:"留言ID" json:"comment_id"`
+}

+ 6 - 0
models/response/like.go

@@ -0,0 +1,6 @@
+package response
+
+type RespLike struct {
+	LikeNum  int64  `description:"点赞总数" json:"like_num"`
+	LikeEnabled  int8 `description:"本次点赞结果: 0-已取消赞 1-有效赞" json:"like_enabled"`
+}

+ 1 - 1
models/tables/rddp/report_chapter/query.go

@@ -82,7 +82,7 @@ func GetReportIdsByTypeIdsAndClass(typeIds []int, classifyNameFirst string) (rep
 
 // GetTypeIdById 根据ID获取章节类型
 func GetTypeIdById(id int) (info *ReportChapter, err error)  {
-	err = global.MYSQL["rddp"].Model(ReportChapter{}).Select("report_chapter_id, type_id").
+	err = global.MYSQL["rddp"].Model(ReportChapter{}).Select("report_chapter_id, report_id, type_id").
 		Where("report_chapter_id = ? AND publish_state = 2 ", id).
 		First(&info).Error
 	if err == utils.ErrNoRow {

+ 8 - 0
models/tables/yb_comment/create.go

@@ -0,0 +1,8 @@
+package yb_comment
+
+import "hongze/hongze_yb/global"
+
+func (yc *YbComment) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(yc).Error
+	return
+}

+ 50 - 0
models/tables/yb_comment/query.go

@@ -0,0 +1,50 @@
+package yb_comment
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+
+// GetListByUserId 获取用户的留言列表
+func GetListByUserId(userId uint64, reportId, reportChapterId int) (list []*YbComment, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbComment{}).
+		Where("user_id = ? and report_id = ? and report_chapter_id = ?", userId, reportId, reportChapterId).
+		Order("create_time desc, id desc").
+		Scan(&list).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetHotListByReportId 获取报告的精选留言列表
+func GetHotListByReportId(reportId, reportChapterId int, offset, limit int) (list []*YbComment, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbComment{}).
+		Where("report_id = ? and report_chapter_id = ? and enabled = 1 and is_hot = 1 and type = 1", reportId, reportChapterId).
+		Order("hot_top_time desc, id desc").
+		Offset(offset).
+		Limit(limit).
+		Scan(&list).Error
+	return
+}
+
+// GetReplayListByReplyCommentId 获取报告的精选留言的回复列表
+func GetReplayListByReplyCommentId(reportId, reportChapterId int, replyCommentIds []int) (list []*YbComment, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbComment{}).
+		Where("report_id = ? and report_chapter_id = ? and enabled = 1 and type = 2 and reply_comment_id in ?", reportId, reportChapterId, replyCommentIds).
+		Order("create_time desc, id desc").
+		Scan(&list).Error
+	return
+}
+
+// GetSimpleByCommentId 根据评论ID,查询评论
+func GetSimpleByCommentId(commentId uint64)(item *YbComment, err error)  {
+	err = global.DEFAULT_MYSQL.Model(YbComment{}).
+		Select("comment_id, user_id, type, enabled").
+		Where("comment_id = ?", commentId).First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}

+ 11 - 0
models/tables/yb_comment/update.go

@@ -0,0 +1,11 @@
+package yb_comment
+
+import "hongze/hongze_yb/global"
+
+// Update 更新对应字段数据
+func (yc *YbComment) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(yc).Select(updateCols).Updates(*yc).Error
+	return
+}
+
+

+ 31 - 0
models/tables/yb_comment/yb_comment.go

@@ -0,0 +1,31 @@
+package yb_comment
+
+import "time"
+
+// 研报 用户留言表
+type YbComment struct {
+	CommentId         uint64 `gorm:"primaryKey;column:comment_id;type:bigint(20) unsigned;not null" ` //留言ID
+	UserId            uint64 `gorm:"column:user_id"` //用户id
+	AdminId           uint64 `gorm:"column:admin_id"` //发布留言回复的管理员ID
+	ReportId          int `gorm:"column:report_id"` //报告ID
+	ReportChapterId   int `gorm:"column:report_chapter_id"` //报告章节ID
+	Content           string `gorm:"column:content"` //留言内容
+	SysIsRead         int8 `gorm:"column:sys_is_read"` //管理员是否已读 0-未读,1-已读
+	SysReadTime       time.Time `gorm:"column:sys_read_time"` //管理员已读时间
+	SysReadAdminId    int64 `gorm:"column:sys_read_admin_id"` //已读的管理员id
+	ReplyCommentId    uint64 `gorm:"column:reply_comment_id"` //回复的留言ID
+	IsTop             int8 `gorm:"column:is_top"` //是否置顶(0-未置顶,1-置顶)
+	IsHot             int8 `gorm:"column:is_hot"` //是否设置精选(0-未设置,1-已设置)
+	HotTime           time.Time `gorm:"column:hot_time"` //设置精选的时间
+	HotTopTime        time.Time `gorm:"column:hot_top_time"` //设置精选或者设置置顶的时间
+	Type              int8 `gorm:"column:type"` //留言类型 1-评论 2-回复
+	Enabled           int8 `gorm:"column:enabled"` //是否有效, 0-无效留言 1-有效留言
+	IsShowName        int8 `gorm:"column:is_show_name"` //是否匿名 0-匿名,1-不匿名
+	SourceAgent       int `gorm:"column:source_agent"` //留言入口来源,1:小程序,2:pc
+	CreateTime        time.Time `gorm:"column:create_time"` //创建时间
+	ModifyTime        time.Time `gorm:"column:modify_time"` //修改时间
+}
+
+func (yc *YbComment) TableName() string {
+	return "yb_comment"
+}

+ 8 - 0
models/tables/yb_like/create.go

@@ -0,0 +1,8 @@
+package yb_like
+
+import "hongze/hongze_yb/global"
+
+func (yl *YbLike) Create() (err error) {
+	err = global.DEFAULT_MYSQL.Create(yl).Error
+	return
+}

+ 26 - 0
models/tables/yb_like/query.go

@@ -0,0 +1,26 @@
+package yb_like
+
+import (
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/utils"
+)
+
+
+// GetLikeByUserIdAndReportId 获取点赞记录
+func GetLikeByUserIdAndReportId(userId uint64, reportId, reportChapterId int) (item *YbLike, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbLike{}).
+		Where("user_id = ? and report_id = ? and report_chapter_id = ?", userId, reportId, reportChapterId).
+		First(&item).Error
+	if err == utils.ErrNoRow {
+		err = nil
+	}
+	return
+}
+
+// GetLikeNumByReportId 统计报告的点赞数
+func GetLikeNumByReportId(reportId, reportChapterId int) (num int64, err error) {
+	err = global.DEFAULT_MYSQL.Model(YbLike{}).
+		Where("report_id = ? and report_chapter_id = ? and enabled=1", reportId, reportChapterId).
+		Count(&num).Error
+	return
+}

+ 9 - 0
models/tables/yb_like/update.go

@@ -0,0 +1,9 @@
+package yb_like
+
+import "hongze/hongze_yb/global"
+
+// Update 更新对应字段数据
+func (yl *YbLike) Update(updateCols []string) (err error) {
+	err = global.DEFAULT_MYSQL.Model(yl).Select(updateCols).Updates(*yl).Error
+	return
+}

+ 18 - 0
models/tables/yb_like/yb_like.go

@@ -0,0 +1,18 @@
+package yb_like
+
+import "time"
+
+// YbLike 研报 点赞
+type YbLike struct {
+	LikeId                 uint64 `gorm:"primaryKey;column:like_id;type:bigint(20) unsigned;not null" json:"like_id" ` //消息序号
+	UserId                 uint64 `gorm:"column:user_id"  json:"user_id" ` //用户id
+	Enabled                int8 `gorm:"column:enabled"  json:"enabled" ` //状态. 0-已取消赞 1-有效赞
+	CreateTime             time.Time `gorm:"column:create_time"  json:"create_time" ` //创建时间
+	ModifyTime             time.Time `gorm:"column:modify_time"  json:"modify_time" ` //修改时间
+	ReportId               int `gorm:"column:report_id"  json:"report_id" ` //报告ID
+	ReportChapterId        int `gorm:"column:report_chapter_id" json:"report_chapter_id" ` //报告章节ID
+}
+
+func (yl *YbLike) TableName() string {
+	return "yb_like"
+}

+ 13 - 0
routers/comment.go

@@ -0,0 +1,13 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/comment"
+	"hongze/hongze_yb/middleware"
+)
+
+func InitComment(r *gin.Engine)  {
+	rGroup := r.Group("/api/comment").Use(middleware.Token())
+	rGroup.POST("/set", comment.Comment)
+	rGroup.POST("/del", comment.Delete)
+}

+ 12 - 0
routers/like.go

@@ -0,0 +1,12 @@
+package routers
+
+import (
+	"github.com/gin-gonic/gin"
+	"hongze/hongze_yb/controller/like"
+	"hongze/hongze_yb/middleware"
+)
+
+func InitLike(r *gin.Engine)  {
+	rGroup := r.Group("api/like").Use(middleware.Token())
+	rGroup.POST("/set", like.SetLike)      //点赞设置
+}

+ 143 - 0
services/comment/comment.go

@@ -0,0 +1,143 @@
+package comment
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_yb/global"
+	reqComment "hongze/hongze_yb/models/request/comment"
+	"hongze/hongze_yb/models/response"
+	report "hongze/hongze_yb/models/tables/rddp/report"
+	"hongze/hongze_yb/models/tables/rddp/report_chapter"
+	"hongze/hongze_yb/models/tables/yb_comment"
+	"hongze/hongze_yb/services/user"
+	"time"
+)
+
+// Comment 发布留言
+func Comment(user user.UserInfo, req reqComment.ReqComment) (ret response.RespCommentAdd, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+	//校验请求入参
+	if req.IsShowName != 0 && req.IsShowName != 1 {
+		err = errors.New("匿名设置出错")
+		return
+	}
+	if req.Content == "" {
+		err = errors.New("请输入留言内容")
+		return
+	}
+	if req.ReportId <= 0 && req.ReportChapterId <= 0 {
+		err = errors.New("请输入报告ID")
+		return
+	}
+	if req.SourceAgent == 0 {
+		err = errors.New("请输入留言来源")
+		return
+	}
+
+	//todo 校验权限
+	// 校验报告是否存在
+	reportInfo, err := report.GetByReportId(req.ReportId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询报告出错")
+		return
+	}
+	if reportInfo.Id <=0  {
+		err = errors.New("报告不存在")
+		return
+	}
+
+	if (reportInfo.ClassifyNameFirst == "晨报" || reportInfo.ClassifyNameFirst == "周报") && req.ReportChapterId <=0 {
+		err = errors.New("请输入报告章节ID")
+		return
+	}
+
+	if req.ReportChapterId > 0 {
+		reportChapterInfo, tErr := report_chapter.GetTypeIdById(req.ReportChapterId)
+		if tErr != nil {
+			errMsg = tErr.Error()
+			err = errors.New("查询章节失败")
+			return
+		}
+
+		if reportChapterInfo.ReportChapterId == 0 {
+			err = errors.New("章节不存在或者未发布")
+			return
+		}
+
+		if reportChapterInfo.ReportId != req.ReportId {
+			err = errors.New("章节ID和报告ID不匹配")
+			return
+		}
+	}
+
+	//todo 敏感词过滤
+	//新增留言
+	now := time.Now()
+	commentInfo := &yb_comment.YbComment{
+		UserId: user.UserID,
+		Content: req.Content,
+		ReportId: req.ReportId,
+		ReportChapterId: req.ReportChapterId,
+		IsShowName: req.IsShowName,
+		SourceAgent: req.SourceAgent,
+		Type: 1,
+		Enabled: 1,
+		CreateTime: now,
+		ModifyTime: now,
+	}
+	err = commentInfo.Create()
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("新增留言出错")
+		return
+	}
+	ret.CommentId = commentInfo.CommentId
+	return
+}
+
+// Delete 删除留言
+func Delete(user user.UserInfo, req *reqComment.ReqDel) (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+	if req.CommentId <= 0 {
+		err = errors.New("请输入留言ID")
+		return
+	}
+	//校验请求入参
+	commentInfo, err := yb_comment.GetSimpleByCommentId(req.CommentId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询留言出错")
+		return
+	}
+	if commentInfo.CommentId <= 0 {
+		err = errors.New("留言不存在")
+		return
+	}
+	if commentInfo.UserId != user.UserID {
+		err = errors.New("不允许删除他人的留言")
+		return
+	}
+	if commentInfo.Enabled == 0 {
+		return
+	}
+	commentInfo.Enabled = 0
+	commentInfo.ModifyTime = time.Now()
+	err = commentInfo.Update([]string{"enabled", "modify_time"})
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("更新留言出错")
+		return
+	}
+	return
+}

+ 90 - 0
services/like/like.go

@@ -0,0 +1,90 @@
+package like
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_yb/global"
+	"hongze/hongze_yb/models/request/like"
+	"hongze/hongze_yb/models/response"
+	"hongze/hongze_yb/models/tables/yb_like"
+	"hongze/hongze_yb/services/user"
+	"time"
+)
+
+// 设置点赞
+func SetLike(user user.UserInfo, req like.ReqLike) (resp response.RespLike, err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			global.LOG.Critical(fmt.Sprintf("GetReportList: userId=%d, err:%s, errMsg:%s", user.UserID, err.Error(), errMsg))
+		}
+	}()
+
+	//todo 判断是否是老报告
+	if req.ReportChapterId <=0 && req.ReportId <=0 {
+		err = errors.New("请输入报告ID")
+		return
+	}
+	//todo 判断是否有点赞权限, 判断报告ID是否正确
+
+
+	//查询用户对研报的点赞状态
+	likeItem, err := yb_like.GetLikeByUserIdAndReportId(user.UserID, req.ReportId, req.ReportChapterId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询用户点赞记录出错")
+		return
+	}
+	//如果未点赞则新增点赞记录
+	now :=  time.Now()
+	if likeItem.LikeId <= 0 {
+		likeItem = &yb_like.YbLike{
+			ReportId:          req.ReportId,
+			ReportChapterId:   req.ReportChapterId,
+			UserId:            user.UserID,
+			Enabled:         1,
+			CreateTime:     now,
+			ModifyTime:     now,
+		}
+		err = likeItem.Create()
+		if err != nil {
+			errMsg = err.Error()
+			err = errors.New("新增点赞记录出错")
+			return
+		}
+	} else {
+		//如果已点赞则更新成取消点赞
+		if likeItem.Enabled == 1 {
+			updates := []string{"enabled", "modify_time"}
+			likeItem.Enabled = 0
+			likeItem.ModifyTime = now
+			err = likeItem.Update(updates)
+			if err != nil {
+				errMsg = err.Error()
+				err = errors.New("更新点赞记录出错")
+				return
+			}
+		} else {
+			//如果取消点赞则更新成已点赞
+			updates := []string{"enabled", "modify_time"}
+			likeItem.Enabled = 1
+			likeItem.ModifyTime = now
+			err = likeItem.Update(updates)
+			if err != nil {
+				errMsg = err.Error()
+				err = errors.New("更新点赞记录出错")
+				return
+			}
+		}
+	}
+	//查询总的点赞数
+	likeNum, err := yb_like.GetLikeNumByReportId(req.ReportId, req.ReportChapterId)
+	if err != nil {
+		errMsg = err.Error()
+		err = errors.New("查询点赞数出错")
+		return
+	}
+	resp.LikeEnabled = likeItem.Enabled
+	resp.LikeNum = likeNum
+	return
+}