20 changed files with 795 additions and 5 deletions
@ -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<MiniContentAuditConfig> { |
||||
|
|
||||
|
} |
||||
@ -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<MiniContentAudit> { |
||||
|
|
||||
|
} |
||||
@ -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<MiniContentAuditTask> { |
||||
|
|
||||
|
} |
||||
@ -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; |
||||
|
|
||||
|
|
||||
|
} |
||||
@ -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; |
||||
|
|
||||
|
|
||||
|
} |
||||
@ -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; |
||||
|
|
||||
|
|
||||
|
} |
||||
@ -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> T executeWithFailover(AliyunRequestExecutor<T> 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> { |
||||
|
T execute(Client client) throws Exception; |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -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<MiniContentAuditAppeal> { |
||||
|
|
||||
|
} |
||||
@ -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<MiniReport> { |
||||
|
|
||||
|
} |
||||
@ -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; |
||||
|
|
||||
|
|
||||
|
} |
||||
@ -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; |
||||
|
|
||||
|
|
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!DOCTYPE mapper |
||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
|
|
||||
|
<mapper namespace="com.youlai.boot.admin.mapper.MiniContentAuditConfigMapper"> |
||||
|
|
||||
|
|
||||
|
</mapper> |
||||
@ -0,0 +1,9 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!DOCTYPE mapper |
||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
|
|
||||
|
<mapper namespace="com.youlai.boot.admin.mapper.MiniContentAuditMapper"> |
||||
|
|
||||
|
|
||||
|
</mapper> |
||||
@ -0,0 +1,9 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!DOCTYPE mapper |
||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
|
|
||||
|
<mapper namespace="com.youlai.boot.admin.mapper.MiniContentAuditTaskMapper"> |
||||
|
|
||||
|
|
||||
|
</mapper> |
||||
@ -0,0 +1,9 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!DOCTYPE mapper |
||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
|
|
||||
|
<mapper namespace="com.youlai.boot.mini.mapper.MiniContentAuditAppealMapper"> |
||||
|
|
||||
|
|
||||
|
</mapper> |
||||
@ -0,0 +1,9 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!DOCTYPE mapper |
||||
|
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" |
||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
|
|
||||
|
<mapper namespace="com.youlai.boot.mini.mapper.MiniReportMapper"> |
||||
|
|
||||
|
|
||||
|
</mapper> |
||||
Loading…
Reference in new issue