From ee804cf3710c6758a7b5179bb2fe99e22eebaf0e Mon Sep 17 00:00:00 2001 From: glx <783262171@qq.com> Date: Mon, 1 Jun 2026 16:18:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AE=B9=E5=AE=A1?= =?UTF-8?q?=E6=A0=B8=E6=A8=A1=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 18 ++ .../mapper/MiniContentAuditConfigMapper.java | 14 ++ .../admin/mapper/MiniContentAuditMapper.java | 14 ++ .../mapper/MiniContentAuditTaskMapper.java | 14 ++ .../admin/model/entity/MiniContentAudit.java | 91 +++++++++ .../model/entity/MiniContentAuditConfig.java | 70 +++++++ .../model/entity/MiniContentAuditTask.java | 102 ++++++++++ .../freemarker/MyBatisPlusGenerator.java | 6 + .../common/util/AliyunContentAuditUtil.java | 189 ++++++++++++++++++ .../controller/AdoptionDiaryController.java | 5 - .../mapper/MiniContentAuditAppealMapper.java | 14 ++ .../boot/mini/mapper/MiniReportMapper.java | 14 ++ .../model/entity/MiniContentAuditAppeal.java | 91 +++++++++ .../boot/mini/model/entity/MiniReport.java | 103 ++++++++++ src/main/resources/application-dev.yml | 10 + .../admin/MiniContentAuditConfigMapper.xml | 9 + .../mapper/admin/MiniContentAuditMapper.xml | 9 + .../admin/MiniContentAuditTaskMapper.xml | 9 + .../mini/MiniContentAuditAppealMapper.xml | 9 + .../mapper/mini/MiniReportMapper.xml | 9 + 20 files changed, 795 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditConfigMapper.java create mode 100644 src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditMapper.java create mode 100644 src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditTaskMapper.java create mode 100644 src/main/java/com/youlai/boot/admin/model/entity/MiniContentAudit.java create mode 100644 src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditConfig.java create mode 100644 src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditTask.java create mode 100644 src/main/java/com/youlai/boot/common/util/AliyunContentAuditUtil.java create mode 100644 src/main/java/com/youlai/boot/mini/mapper/MiniContentAuditAppealMapper.java create mode 100644 src/main/java/com/youlai/boot/mini/mapper/MiniReportMapper.java create mode 100644 src/main/java/com/youlai/boot/mini/model/entity/MiniContentAuditAppeal.java create mode 100644 src/main/java/com/youlai/boot/mini/model/entity/MiniReport.java create mode 100644 src/main/resources/mapper/admin/MiniContentAuditConfigMapper.xml create mode 100644 src/main/resources/mapper/admin/MiniContentAuditMapper.xml create mode 100644 src/main/resources/mapper/admin/MiniContentAuditTaskMapper.xml create mode 100644 src/main/resources/mapper/mini/MiniContentAuditAppealMapper.xml create mode 100644 src/main/resources/mapper/mini/MiniReportMapper.xml diff --git a/pom.xml b/pom.xml index e46ac71..afc607c 100644 --- a/pom.xml +++ b/pom.xml @@ -72,6 +72,11 @@ 1.5.13 + + 2.20.0 + + + 2.0.56 @@ -319,6 +324,19 @@ ${dynamic-datasource.version} --> + + + com.aliyun + green20220302 + ${aliyun.green20220302.version} + + + + com.alibaba + fastjson + ${alibaba.fastjson.version} + + diff --git a/src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditConfigMapper.java b/src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditConfigMapper.java new file mode 100644 index 0000000..a493b27 --- /dev/null +++ b/src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditConfigMapper.java @@ -0,0 +1,14 @@ +package com.youlai.boot.admin.mapper; + +import com.youlai.boot.admin.model.entity.MiniContentAuditConfig; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* 内容审核配置表 Mapper 接口 +* +* @author jwy +* @since +*/ +public interface MiniContentAuditConfigMapper extends BaseMapper { + +} diff --git a/src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditMapper.java b/src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditMapper.java new file mode 100644 index 0000000..a37446f --- /dev/null +++ b/src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditMapper.java @@ -0,0 +1,14 @@ +package com.youlai.boot.admin.mapper; + +import com.youlai.boot.admin.model.entity.MiniContentAudit; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* 审核汇总表 Mapper 接口 +* +* @author jwy +* @since +*/ +public interface MiniContentAuditMapper extends BaseMapper { + +} diff --git a/src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditTaskMapper.java b/src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditTaskMapper.java new file mode 100644 index 0000000..2bfb4b8 --- /dev/null +++ b/src/main/java/com/youlai/boot/admin/mapper/MiniContentAuditTaskMapper.java @@ -0,0 +1,14 @@ +package com.youlai.boot.admin.mapper; + +import com.youlai.boot.admin.model.entity.MiniContentAuditTask; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* 审核任务表 Mapper 接口 +* +* @author jwy +* @since +*/ +public interface MiniContentAuditTaskMapper extends BaseMapper { + +} diff --git a/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAudit.java b/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAudit.java new file mode 100644 index 0000000..5149f49 --- /dev/null +++ b/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAudit.java @@ -0,0 +1,91 @@ +package com.youlai.boot.admin.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("mini_content_audit") +@Schema(description = "审核汇总表") +public class MiniContentAudit implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "审核汇总表主键") + private Long id; + + + @TableField("uuid") + @Schema(description = "UUID,前端交互") + private String uuid; + + @TableField("module_code") + @Schema(description = "业务模块") + private String moduleCode; + + @TableField("biz_id") + @Schema(description = "业务数据ID(日记ID或评论ID)") + private String bizId; + + @TableField("audit_type") + @Schema(description = "审核类型(从config快照)") + private String auditType; + + @TableField("status") + @Schema(description = "审核状态:reviewing机审中 / passed通过 / failed不通过 / manual_review待人工 / appealing申诉中") + private String status; + + @TableField("final_result") + @Schema(description = "最终结果") + private String finalResult; + + @TableField("operator") + @Schema(description = "最后操作人ID") + private Long operator; + + @TableField("audit_time") + @Schema(description = "审核完成时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date auditTime; + + @TableField("create_time") + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @TableField("create_timestamp") + @Schema(description = "创建时间毫秒级时间戳") + private Long createTimestamp; + + @TableField("create_by") + @Schema(description = "创建人ID") + private Long createBy; + + @TableField("update_time") + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + @TableField("update_timestamp") + @Schema(description = "更新时间毫秒级时间戳") + private Long updateTimestamp; + + @TableField("update_by") + @Schema(description = "修改人ID") + private Long updateBy; + + @TableField("is_deleted") + @Schema(description = "逻辑删除标识(0-未删除 1-已删除)") + private Byte isDeleted; + + +} diff --git a/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditConfig.java b/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditConfig.java new file mode 100644 index 0000000..626a796 --- /dev/null +++ b/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditConfig.java @@ -0,0 +1,70 @@ +package com.youlai.boot.admin.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("mini_content_audit_config") +@Schema(description = "内容审核配置表") +public class MiniContentAuditConfig implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "审核配置表主键id") + private Long id; + + + @TableField("uuid") + @Schema(description = "UUID,前端交互") + private String uuid; + + @TableField("module_code") + @Schema(description = "业务模块: animal_note / adoption_diary / user_post / note_comment / diary_comment / post_comment / user_avatar / user_nickname / user_introduction") + private String moduleCode; + + @TableField("audit_enable") + @Schema(description = "是否开启审核, 0-开启, 1-关闭") + private Byte auditEnable; + + @TableField("audit_type") + @Schema(description = "审核类型: machine机器 / manual手动 / mixed混合") + private String auditType; + + @TableField("risk_strategy") + @Schema(description = "机器审核风险策略:none无,medium中等,high高") + private String riskStrategy; + + @TableField("create_time") + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @TableField("create_by") + @Schema(description = "创建人ID") + private Long createBy; + + @TableField("update_time") + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + @TableField("update_by") + @Schema(description = "修改人ID") + private Long updateBy; + + @TableField("is_deleted") + @Schema(description = "逻辑删除标识(0-未删除 1-已删除)") + private Byte isDeleted; + + +} diff --git a/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditTask.java b/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditTask.java new file mode 100644 index 0000000..d3b4d11 --- /dev/null +++ b/src/main/java/com/youlai/boot/admin/model/entity/MiniContentAuditTask.java @@ -0,0 +1,102 @@ +package com.youlai.boot.admin.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("mini_content_audit_task") +@Schema(description = "审核任务表") +public class MiniContentAuditTask implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "审核任务表主键id") + private Long id; + + + @TableField("uuid") + @Schema(description = "UUID,前端交互") + private String uuid; + + @TableField("content_audit_id") + @Schema(description = "内容审核汇总id") + private Long contentAuditId; + + @TableField("content_type") + @Schema(description = "内容类型: text / image / video") + private String contentType; + + @TableField("content_value") + @Schema(description = "待审核内容(文字或文件URL)") + private String contentValue; + + @TableField("audit_type") + @Schema(description = "审核类型: machine机器 / manual手动 / mixed混合") + private String auditType; + + @TableField("status") + @Schema(description = "审核状态:reviewing审核中 / success成功 / to_manual转手动") + private String status; + + @TableField("risk_level") + @Schema(description = "风险等级: none无 / medium中 / high高") + private String riskLevel; + + @TableField("machine_result") + @Schema(description = "机审结果JSON") + private String machineResult; + + @TableField("task_id") + @Schema(description = "机审异步视频任务id(轮询设置结果)") + private String taskId; + + @TableField("result") + @Schema(description = "passed通过 / failed未通过") + private String result; + + @TableField("operator") + @Schema(description = "人工审核操作人") + private Long operator; + + @TableField("create_time") + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @TableField("create_timestamp") + @Schema(description = "创建时间毫秒级时间戳") + private Long createTimestamp; + + @TableField("create_by") + @Schema(description = "创建人ID") + private Long createBy; + + @TableField("update_time") + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + @TableField("update_timestamp") + @Schema(description = "更新时间毫秒级时间戳") + private Long updateTimestamp; + + @TableField("update_by") + @Schema(description = "修改人ID") + private Long updateBy; + + @TableField("is_deleted") + @Schema(description = "逻辑删除标识(0-未删除 1-已删除)") + private Byte isDeleted; + + +} diff --git a/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java b/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java index 045c6fb..f025b86 100644 --- a/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java +++ b/src/main/java/com/youlai/boot/codegen/freemarker/MyBatisPlusGenerator.java @@ -120,6 +120,12 @@ public class MyBatisPlusGenerator { ,new TableConfig("mini_user_post_comment", IdType.AUTO, "mini") ,new TableConfig("mini_user_post_comment_like", IdType.AUTO, "mini") ,new TableConfig("mini_adoption_application", IdType.AUTO, "mini") + ,new TableConfig("mini_content_audit_appeal", IdType.AUTO, "mini") + ,new TableConfig("mini_report", IdType.AUTO, "mini") + ,new TableConfig("mini_content_audit_config", IdType.AUTO, "admin") + ,new TableConfig("mini_content_audit", IdType.AUTO, "admin") + ,new TableConfig("mini_content_audit_task", IdType.AUTO, "admin") + // ,new TableConfig("mini_stray_animal", IdType.AUTO, "mini") // ,new TableConfig("mini_stray_animal", IdType.INPUT, "minitest") diff --git a/src/main/java/com/youlai/boot/common/util/AliyunContentAuditUtil.java b/src/main/java/com/youlai/boot/common/util/AliyunContentAuditUtil.java new file mode 100644 index 0000000..48ce635 --- /dev/null +++ b/src/main/java/com/youlai/boot/common/util/AliyunContentAuditUtil.java @@ -0,0 +1,189 @@ +package com.youlai.boot.common.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.aliyun.green20220302.Client; +import com.aliyun.green20220302.models.*; +import com.aliyun.teaopenapi.models.Config; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * 阿里云内容安全统一审核工具类(v2.0) + * ---------------------------------------- + * 支持: + * 1. 文本审核 + * 2. 图片审核 + * 3. 视频审核(异步) + * 4. 取消视频审核任务(直播流) + * + * 特性: + * - 自动切换备用节点(cn-beijing) + * - 从 application.yml 中读取配置 + * - 返回 null 表示请求失败(业务层自行判断) + */ +@Slf4j +@Component +public class AliyunContentAuditUtil { + + @Value("${audit.aliyun.green.accessKeyId}") + private String accessKeyId; + + @Value("${audit.aliyun.green.accessKeySecret}") + private String accessKeySecret; + + // 主节点(上海) + private static final String REGION_PRIMARY = "cn-shanghai"; + private static final String ENDPOINT_PRIMARY = "green-cip.cn-shanghai.aliyuncs.com"; + + // 备用节点(北京) + private static final String REGION_BACKUP = "cn-beijing"; + private static final String ENDPOINT_BACKUP = "green-cip.cn-beijing.aliyuncs.com"; + + /** + * 构建客户端 + */ + private Client createClient(boolean useBackup) throws Exception { + String region = useBackup ? REGION_BACKUP : REGION_PRIMARY; + String endpoint = useBackup ? ENDPOINT_BACKUP : ENDPOINT_PRIMARY; + + Config config = new Config() + .setAccessKeyId(accessKeyId) + .setAccessKeySecret(accessKeySecret) + .setRegionId(region) + .setEndpoint(endpoint) + .setReadTimeout(6000) + .setConnectTimeout(3000); + + return new Client(config); + } + + /** + * 自动调用机制: + * - 优先使用上海节点 + * - 如果响应码为 500 或出现异常,自动切换至北京节点重试一次 + */ + private T executeWithFailover(AliyunRequestExecutor executor) { + try { + Client primary = createClient(false); + T result = executor.execute(primary); + if (isServerError(result)) { + log.warn("阿里云内容安全服务端异常,切换到北京节点重试..."); + Client backup = createClient(true); + return executor.execute(backup); + } + return result; + } catch (Exception e) { + log.error("阿里云内容安全调用异常(主节点失败),切换至备用节点", e); + try { + Client backup = createClient(true); + return executor.execute(backup); + } catch (Exception ex) { + log.error("备用节点调用也失败", ex); + return null; + } + } + } + + /** + * 判断是否服务端异常(statusCode=500) + */ + private boolean isServerError(Object response) { + try { + Integer code = (Integer) response.getClass().getMethod("getStatusCode").invoke(response); + return code != null && code == 500; + } catch (Exception ignored) { + return false; + } + } + + // ===================== 文本审核 ===================== + public TextModerationResponse textModeration(String content) { + return executeWithFailover(client -> { + JSONObject params = new JSONObject(); + params.put("content", content); + + TextModerationRequest request = new TextModerationRequest() + .setService("commentDetection") + .setServiceParameters(params.toJSONString()); + + return client.textModeration(request); + }); + } + + // ===================== 图片审核 ===================== + public ImageModerationResponse imageModeration(String imageUrl) { + return executeWithFailover(client -> { + JSONObject params = new JSONObject(); + JSONArray arr = new JSONArray(); + arr.add(imageUrl); + params.put("images", arr); + + ImageModerationRequest request = new ImageModerationRequest() + .setService("imageDetection") + .setServiceParameters(params.toJSONString()); + + return client.imageModeration(request); + }); + } + + // ===================== 视频审核(异步) ===================== + public VideoModerationResponse videoModeration(String videoUrl) { + return executeWithFailover(client -> { + JSONObject params = new JSONObject(); + params.put("url", videoUrl); + + VideoModerationRequest request = new VideoModerationRequest() + .setService("videoDetection") + .setServiceParameters(params.toJSONString()); + + return client.videoModeration(request); + }); + } + + // ===================== 查询视频审核结果 ===================== + public VideoModerationResultResponse videoModerationResult(String taskId) { + return executeWithFailover(client -> { + JSONObject params = new JSONObject(); + params.put("taskId", taskId); + + VideoModerationResultRequest request = new VideoModerationResultRequest() + .setService("videoDetection") + .setServiceParameters(params.toJSONString()); + + return client.videoModerationResult(request); + }); + } + + // ===================== 取消视频任务(直播流) ===================== + public VideoModerationCancelResponse cancelVideoTask(String taskId) { + return executeWithFailover(client -> { + JSONObject params = new JSONObject(); + params.put("taskId", taskId); + + VideoModerationCancelRequest request = new VideoModerationCancelRequest() + .setService("liveStreamDetection") + .setServiceParameters(params.toJSONString()); + + return client.videoModerationCancel(request); + }); + } + + /** + * 输出调试日志 + */ + public static void print(Object result) { + System.out.println(JSON.toJSONString(result, true)); + } + + /** + * 函数式接口:用于统一封装 SDK 调用逻辑 + */ + @FunctionalInterface + private interface AliyunRequestExecutor { + T execute(Client client) throws Exception; + } + +} diff --git a/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java b/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java index de1b6a6..a09ec67 100644 --- a/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java +++ b/src/main/java/com/youlai/boot/mini/controller/AdoptionDiaryController.java @@ -194,9 +194,4 @@ public class AdoptionDiaryController { return Result.success(); } - //TODO 领养申请 - - //TODO 查询已领养的动物列表 ;这边里的接口需要查询多少字段数据,是查询所有,还是简单几个字段,然后可以根据动物uuid 用已有的 @Operation(summary = "获取动物信息详情") - // @RequestMapping(value = "/getDetails/{animalUuid}", method = RequestMethod.GET) 接口查询更多信息; - } diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniContentAuditAppealMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniContentAuditAppealMapper.java new file mode 100644 index 0000000..19c7616 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniContentAuditAppealMapper.java @@ -0,0 +1,14 @@ +package com.youlai.boot.mini.mapper; + +import com.youlai.boot.mini.model.entity.MiniContentAuditAppeal; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* 内容申诉表 Mapper 接口 +* +* @author jwy +* @since +*/ +public interface MiniContentAuditAppealMapper extends BaseMapper { + +} diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniReportMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniReportMapper.java new file mode 100644 index 0000000..f67668d --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniReportMapper.java @@ -0,0 +1,14 @@ +package com.youlai.boot.mini.mapper; + +import com.youlai.boot.mini.model.entity.MiniReport; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* 举报记录表 Mapper 接口 +* +* @author jwy +* @since +*/ +public interface MiniReportMapper extends BaseMapper { + +} diff --git a/src/main/java/com/youlai/boot/mini/model/entity/MiniContentAuditAppeal.java b/src/main/java/com/youlai/boot/mini/model/entity/MiniContentAuditAppeal.java new file mode 100644 index 0000000..e1447d3 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/entity/MiniContentAuditAppeal.java @@ -0,0 +1,91 @@ +package com.youlai.boot.mini.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("mini_content_audit_appeal") +@Schema(description = "内容申诉表") +public class MiniContentAuditAppeal implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "申诉表主键") + private Long id; + + + @TableField("uuid") + @Schema(description = "UUID,前端交互") + private String uuid; + + @TableField("audit_id") + @Schema(description = "关联content_audit.id") + private Long auditId; + + @TableField("user_id") + @Schema(description = "申诉人用户ID") + private Long userId; + + @TableField("reason") + @Schema(description = "申诉原因") + private String reason; + + @TableField("status") + @Schema(description = "处理状态:pending待处理 / approved通过 / rejected驳回") + private String status; + + @TableField("handler_user_id") + @Schema(description = "处理人ID") + private Long handlerUserId; + + @TableField("handle_remark") + @Schema(description = "处理备注") + private String handleRemark; + + @TableField("handle_time") + @Schema(description = "处理时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date handleTime; + + @TableField("create_time") + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @TableField("create_timestamp") + @Schema(description = "创建时间毫秒级时间戳") + private Long createTimestamp; + + @TableField("create_by") + @Schema(description = "创建人ID") + private Long createBy; + + @TableField("update_time") + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + @TableField("update_timestamp") + @Schema(description = "更新时间毫秒级时间戳") + private Long updateTimestamp; + + @TableField("update_by") + @Schema(description = "修改人ID") + private Long updateBy; + + @TableField("is_deleted") + @Schema(description = "逻辑删除标识(0-未删除 1-已删除)") + private Byte isDeleted; + + +} diff --git a/src/main/java/com/youlai/boot/mini/model/entity/MiniReport.java b/src/main/java/com/youlai/boot/mini/model/entity/MiniReport.java new file mode 100644 index 0000000..95c3657 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/entity/MiniReport.java @@ -0,0 +1,103 @@ +package com.youlai.boot.mini.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; + +@Getter +@Setter +@ToString +@Accessors(chain = true) +@TableName("mini_report") +@Schema(description = "举报记录表") +public class MiniReport implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "举报表主键") + private Long id; + + + @TableField("uuid") + @Schema(description = "UUID,前端交互") + private String uuid; + + @TableField("target_type") + @Schema(description = "举报目标类型: animal_note/adoption_diary/user_post/note_comment/diary_comment/post_comment/username等") + private String targetType; + + @TableField("target_id") + @Schema(description = "被举报内容ID") + private String targetId; + + @TableField("reporter_user_id") + @Schema(description = "举报人用户ID") + private Long reporterUserId; + + @TableField("reason_category") + @Schema(description = "举报原因:违法违规,侵权冒犯,垃圾虚假,违规操作,其他") + private String reasonCategory; + + @TableField("description") + @Schema(description = "举报补充描述") + private String description; + + @TableField("status") + @Schema(description = "处理状态:pending待处理 / processed已处理 / dismissed已驳回") + private String status; + + @TableField("audit_id") + @Schema(description = "处理举报后创建的content_audit.id(可为空)") + private Long auditId; + + @TableField("handler_user_id") + @Schema(description = "处理人ID") + private Long handlerUserId; + + @TableField("handle_remark") + @Schema(description = "处理备注") + private String handleRemark; + + @TableField("handle_time") + @Schema(description = "处理时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date handleTime; + + @TableField("create_time") + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date createTime; + + @TableField("create_timestamp") + @Schema(description = "创建时间毫秒级时间戳") + private Long createTimestamp; + + @TableField("create_by") + @Schema(description = "创建人ID") + private Long createBy; + + @TableField("update_time") + @Schema(description = "更新时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date updateTime; + + @TableField("update_timestamp") + @Schema(description = "更新时间毫秒级时间戳") + private Long updateTimestamp; + + @TableField("update_by") + @Schema(description = "修改人ID") + private Long updateBy; + + @TableField("is_deleted") + @Schema(description = "逻辑删除标识(0-未删除 1-已删除)") + private Byte isDeleted; + + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 8dc1bf5..c656941 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -235,3 +235,13 @@ bloom: fpp: 0.001 # 布隆过期时间(单位天):【注释/留空/配0】都代表永久不过期 expire-days: 7 + +# 阿里云内容审核配置 +audit: + aliyun: + green: + accessKeyId: LTAI5tGpuYNRysEhC8sh1ntx + accessKeySecret: aMmHexhsZJODXBTujKPjl4NfMIsHgN + region-id: cn-shanghai + #备用节点 green-cip.cn-beijing.aliyuncs.com + endpoint: green-cip.cn-shanghai.aliyuncs.com diff --git a/src/main/resources/mapper/admin/MiniContentAuditConfigMapper.xml b/src/main/resources/mapper/admin/MiniContentAuditConfigMapper.xml new file mode 100644 index 0000000..817a5fc --- /dev/null +++ b/src/main/resources/mapper/admin/MiniContentAuditConfigMapper.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/main/resources/mapper/admin/MiniContentAuditMapper.xml b/src/main/resources/mapper/admin/MiniContentAuditMapper.xml new file mode 100644 index 0000000..245412c --- /dev/null +++ b/src/main/resources/mapper/admin/MiniContentAuditMapper.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/main/resources/mapper/admin/MiniContentAuditTaskMapper.xml b/src/main/resources/mapper/admin/MiniContentAuditTaskMapper.xml new file mode 100644 index 0000000..da92f94 --- /dev/null +++ b/src/main/resources/mapper/admin/MiniContentAuditTaskMapper.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/main/resources/mapper/mini/MiniContentAuditAppealMapper.xml b/src/main/resources/mapper/mini/MiniContentAuditAppealMapper.xml new file mode 100644 index 0000000..75b8fdd --- /dev/null +++ b/src/main/resources/mapper/mini/MiniContentAuditAppealMapper.xml @@ -0,0 +1,9 @@ + + + + + + + diff --git a/src/main/resources/mapper/mini/MiniReportMapper.xml b/src/main/resources/mapper/mini/MiniReportMapper.xml new file mode 100644 index 0000000..a8c5308 --- /dev/null +++ b/src/main/resources/mapper/mini/MiniReportMapper.xml @@ -0,0 +1,9 @@ + + + + + + +