feat: 异步校验社区post文本内容是否违规

This commit is contained in:
Blizzard
2026-02-14 13:08:52 +08:00
parent 3cf4841fdd
commit 4ffc41ea84
7 changed files with 112 additions and 16 deletions
+91 -2
View File
@@ -6,7 +6,11 @@ import (
plantReq "sundynix-go/model/plant/request"
"sundynix-go/model/system"
"sundynix-go/utils/wechat"
"gorm.io/gorm"
"go.uber.org/zap"
)
type PostService struct{}
@@ -15,9 +19,11 @@ var PostServiceApp = new(PostService)
// PublishPost 发表帖子
func (s *PostService) PublishPost(req plantReq.CreatePost, userId string) error {
return global.DB.Transaction(func(tx *gorm.DB) error {
var postId string
var ossList []*system.Oss
err := global.DB.Transaction(func(tx *gorm.DB) error {
//1.验证oss是否存在
var ossList []*system.Oss
err := tx.Where("id in ?", req.OssIds).Find(&ossList).Error
if err != nil {
return err
@@ -33,6 +39,8 @@ func (s *PostService) PublishPost(req plantReq.CreatePost, userId string) error
if err != nil {
return err
}
postId = post.Id
//3.处理图片关系
if len(ossList) > 0 {
var relations []map[string]interface{}
@@ -49,6 +57,87 @@ func (s *PostService) PublishPost(req plantReq.CreatePost, userId string) error
}
return nil
})
if err != nil {
return err
}
// 4.异步内容安全检查
// 4.异步内容安全检查
go func(pid, uid, title, content string, imgs []*system.Oss) {
defer func() {
if r := recover(); r != nil {
global.Logger.Error("异步内容安全检查Panic", zap.Any("panic", r))
}
}()
// 获取用户 openid
var user system.User
if err := global.DB.Where("id = ?", uid).First(&user).Error; err != nil {
global.Logger.Error("获取用户失败,跳过安全检查", zap.String("userId", uid), zap.Error(err))
return
}
openid := user.MiniOpenId
if openid == "" {
global.Logger.Warn("用户无MiniOpenId,跳过安全检查", zap.String("userId", uid))
return
}
// 文本检查
fullContent := title + "\n" + content
isSafe := wechat.MsgSecCheck(fullContent, openid)
// 文本违规 -> 直接拒绝
if !isSafe {
if err := global.DB.Model(&plant.Post{}).Where("id = ?", pid).Update("has_reviewed", 2).Error; err != nil {
global.Logger.Error("更新帖子违规状态失败", zap.String("postId", pid), zap.Error(err))
}
global.Logger.Info("帖子内容违规,已标记", zap.String("postId", pid))
return // 文本违规,无需再检查图片
}
if err := global.DB.Model(&plant.Post{}).Where("id = ?", pid).Update("has_reviewed", 1).Error; err != nil {
global.Logger.Error("更新帖子违规状态失败", zap.String("postId", pid), zap.Error(err))
}
return // 文本违规,无需再检查图片
// 文本通过,判断是否有图片
//if len(imgs) == 0 {
// // 无图且文本通过 -> 直接通过
// if err := global.DB.Model(&plant.Post{}).Where("id = ?", pid).Update("has_reviewed", 1).Error; err != nil {
// global.Logger.Error("更新帖子通过状态失败", zap.String("postId", pid), zap.Error(err))
// }
// return
//}
// 有图,文本通过 -> 保持状态为0(待审核),等待图片回调
// todo 图片检查
//for _, oss := range imgs {
// // 假设 oss.Url 是完整链接
// traceId, err := wechat.MediaCheckAsync(oss.Url, 2, openid)
// if err != nil {
// global.Logger.Error("图片安全检查请求失败", zap.String("url", oss.Url), zap.Error(err))
// continue
// }
// global.Logger.Info("图片安全检查请求成功", zap.String("traceId", traceId))
//
// // 保存检测记录
// checkResult := plant.MediaCheckResult{
// TraceId: traceId,
// PostId: pid,
// OssId: oss.Id,
// UserId: uid,
// Status: 0, // 检测中
// Type: 2, // 图片
// }
// if err := global.DB.Create(&checkResult).Error; err != nil {
// global.Logger.Error("保存媒体检测记录失败", zap.Error(err))
// }
//}
}(postId, userId, req.Title, req.Content, ossList)
return nil
}
// PostPage 帖子列表