feat: 异步校验社区post文本内容是否违规
This commit is contained in:
@@ -10,4 +10,5 @@ type ServiceGroup struct {
|
||||
LevelConfigService
|
||||
BadgeConfigService
|
||||
UserProfileService
|
||||
CallbackService
|
||||
}
|
||||
|
||||
+91
-2
@@ -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 帖子列表
|
||||
|
||||
Reference in New Issue
Block a user