# business-content-security（UGC 内容安全）

跨模块 **内容安全检测** 能力：业务侧仅依赖 `ContentSecurityApi`，底层通过 **Provider SPI** 对接微信（可扩展阿里云等），满足小程序审核对 UGC 文本/图片检测的要求。

---

## 模块结构

```
business-content-security/
├── business-content-security-api/          # ContentSecurityApi、Provider SPI、事件
├── business-content-security-bean/         # Entity、VO、Convert
├── business-content-security-service/      # Log/Task 持久化
├── business-content-security-application/  # 编排、WeChat Provider、ApiImpl
├── business-content-security-controller/   # 管理端流水查询
└── src/main/resources/sql/
    ├── content_security.sql                # 建表
    └── content_security_menu_permission.sql # 菜单权限（可选）
```

---

## 已接入业务

| 业务模块 | 入口 | 文本 | 图片 | 异步回调 |
|---------|------|------|------|----------|
| **统一评价** `REVIEW` | `ReviewApplicationService.submit` | ✅ | ✅ | 违规 → 评价 **已拒绝** |
| **意见反馈** `FEEDBACK` | `FeedbackApplicationService.submitFeedback` | ✅ | ✅ | 违规 → 反馈 **已关闭** |

---

## 配置（`application.yaml`）

```yaml
jeesharp:
  content-security:
    enabled: true                    # 总开关
    default-provider: WECHAT_MINI
    on-missing-openid: REVIEW          # 无 openid 时：REVIEW / REJECT
    on-provider-error: REVIEW          # Provider 异常时
    media-async-enabled: true          # 图片走 mediaCheckAsync
    media-async-fallback-sync: true    # 异步失败降级同步 img_sec_check
```

---

## 微信运维

1. **执行建表**：`src/main/resources/sql/content_security.sql`
2. **小程序消息推送 URL**（服务器配置）：
   ```
   https://{域名}/mobile/noAuth/contentSecurity/wechat/mediaCallback
   ```
   路径已在 `/mobile/noAuth/**` 白名单，无需额外 yaml。
3. **依赖**：会员须绑定微信小程序 openid（`MemberOauthService`），否则按 `on-missing-openid` 降级。

---

## 管理端

- **接口**：`POST /admin/manager/business/contentSecurity/log/v1/list`
- **权限**：`manager:business:contentSecurity:log:list`
- **前端（开发路由）**：`/business/contentSecurity/log`（`asyncRouter.ts`）
- **生产菜单**：执行 `content_security_menu_permission.sql`（按环境调整父菜单 ID）

---

## 业务接入方式（新模块）

1. `pom` 依赖 **`business-content-security-api`**（禁止依赖 application）
2. 注入 `ContentSecurityApi`，UGC 写入口优先使用 **`ContentSecurityUgcCheckSupport.checkTextAndImages`** + **`bindAfterPersist`**
3. 监听 `ContentSecurityMediaCompletedEvent` 处理异步 **REJECT**（可选）

---

## 版本记录

| 日期 | 说明 |
|------|------|
| 2026-06-27 | 初版：微信文本/图片、异步任务、评价/反馈接入、管理端流水 |
