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 @@
+
+
+
+
+
+
+