607 lines
22 KiB
Markdown
607 lines
22 KiB
Markdown
# 共性能力平台 — 收藏与收录 数据库设计说明
|
||
|
||
| 属性 | 内容 |
|
||
|------|------|
|
||
| **文档版本** | v2.0 |
|
||
| **编写日期** | 2026-05-23 |
|
||
| **修订日期** | 2026-05-23 |
|
||
| **编写人** | (待填写) |
|
||
| **审核人** | (待填写) |
|
||
| **适用系统** | `txw-mhzc` 门户 — 共性能力页 `/gxnlpt` |
|
||
| **适用数据库** | **MySQL 8.0+**(InnoDB,`utf8mb4`);本文 DDL/索引以 MySQL 为准,不承诺 Oracle 等库可直接复用 |
|
||
| **关联前端** | `txw-mhzc-web/src/pages/index/views/gxnlpt/index.vue` |
|
||
| **DDL 脚本** | `txw-mhzc/sql/txw_mhzc_gxnl_slxxb_gxscb.sql` |
|
||
|
||
---
|
||
|
||
## 修订记录
|
||
|
||
| 版本 | 日期 | 修订人 | 审核人 | 说明 |
|
||
|------|------|--------|--------|------|
|
||
| v1.0 | 2026-05-23 | — | — | 初稿:双表、ER、基础字段与状态 |
|
||
| v2.0 | 2026-05-23 | — | — | 参照评审意见补充:字段校验、命名规范、乐观锁、索引与唯一约束、状态矩阵、API 规范、一致性/异常/迁移/性能 |
|
||
|
||
---
|
||
|
||
## 1. 设计背景与目标
|
||
|
||
### 1.1 业务场景
|
||
|
||
| 能力 | 前端入口 | 业务特征 |
|
||
|------|----------|----------|
|
||
| 分类浏览 | 左侧 5 类导航 + 卡片 | 展示已上架网站条目 |
|
||
| **收录** | 「收录」表单 | 提交名称/链接/简介/分类/标签/联系人;审核后展示 |
|
||
| **收藏** | 星标 +「我的收藏」 | 登录用户对已上架条目收藏/取消 |
|
||
|
||
### 1.2 设计目标
|
||
|
||
- 与供需体系(`txw_gxzx_*`)解耦,新建 `txw_mhzc_gxnl_*` 域表。
|
||
- 字段、状态、索引、API 具备**可落地校验规则**,减少脏数据与并发覆盖。
|
||
- 首期双表交付;审核流水、操作日志表列为**可选扩展**,并给出过渡期方案。
|
||
|
||
### 1.3 表清单
|
||
|
||
| 序号 | 物理表名 | 中文名 | 职责 |
|
||
|------|----------|--------|------|
|
||
| 1 | `txw_mhzc_gxnl_slxxb` | 共性能力收录信息表 | 主数据 + 收录申请 + 审核/上架 |
|
||
| 2 | `txw_mhzc_gxnl_gxscb` | 共性能力收藏表 | 用户收藏关系 |
|
||
| (扩展) | `txw_mhzc_gxnl_slshb` | 收录审核流水表 | 多轮审核留痕(二期建议建表) |
|
||
| (扩展) | 平台操作日志 | 复用现有审计/日志组件 | 关联 `wz_uuid` 追溯操作链路 |
|
||
|
||
---
|
||
|
||
## 2. 命名与缩写规范
|
||
|
||
### 2.1 后缀约定(全库统一)
|
||
|
||
| 后缀 | 含义 | 示例 |
|
||
|------|------|------|
|
||
| `_dm` | 代码(字典值、枚举) | `gxnl_fl_dm`、`lyqd_dm` |
|
||
| `_mc` | 名称(展示冗余) | `gxnl_fl_mc`、`qymc` |
|
||
| `_uuid` | 业务主键/外键 UUID | `wz_uuid`、`yh_uuid` |
|
||
| `_bz` | 标志(Y/N) | `yxbz`、`sjzt`(上架标志,历史命名保留) |
|
||
| `_jh` | 集合(逗号分隔) | `bqjh` |
|
||
| `_rq` / `_sj` | 日期/时间 | `lrrq`、`shsj` |
|
||
| `lrr` / `xgr` / `shr` | 录入人/修改人/审核人 | `lrruuid`、`xgruuid` |
|
||
| `tjr_` | 提交人(门户侧填写) | `tjr_nc`、`tjr_lxdh` |
|
||
|
||
### 2.2 未使用后缀的字段说明
|
||
|
||
| 字段 | 说明 |
|
||
|------|------|
|
||
| `zt` | 业务状态(历史习惯,与 `sjzt` 成对使用,不改为 `zt_dm` 以降低迁移成本) |
|
||
| `sjzt` | 上架状态(`s`=上架,`j`=见,与项目内 `sjzt` 一致) |
|
||
| `bt` | 标题 title 缩写 |
|
||
|
||
### 2.3 易混字段语义(收录表)
|
||
|
||
| 字段 | 语义 | 赋值规则 |
|
||
|------|------|----------|
|
||
| `yh_uuid` | **门户提交账号** | 用户登录提交时 = 当前 `Session.yh_uuid`;游客提交 = `NULL` |
|
||
| `lrruuid` | **数据录入操作人** | 门户提交:登录用户 = `yh_uuid`,游客 = `NULL`;运营后台录入/导入 = 操作员 `yh_uuid` |
|
||
| `tjr_nc` / `tjr_lxdh` | **表单展示用联系人** | 用户填写;可与账号信息不一致 |
|
||
| `xgruuid` | **最后修改人** | 审核、编辑、下架等写操作更新 |
|
||
| `shruuid` | **最后审核人** | 仅审核通过/驳回时写入 |
|
||
|
||
> **结论**:`yh_uuid` 表示「谁提交的」;`lrruuid` 表示「谁执行了入库动作」。多数登录场景二者相同;运营代录时 `lrruuid`=运营员,`yh_uuid` 可空。
|
||
|
||
### 2.4 已删除/弱化的字段
|
||
|
||
| 原字段 | v2.0 处理 |
|
||
|--------|-----------|
|
||
| `sjzt_bz` | **删除**。运营备注统一走管理端备注或扩展表,避免与 `shyj` 混用 |
|
||
|
||
---
|
||
|
||
## 3. ER 图(与字段清单一致)
|
||
|
||
### 3.1 完整实体关系(Mermaid)
|
||
|
||
```mermaid
|
||
erDiagram
|
||
TXW_MHZC_YHXXB ||--o{ TXW_MHZC_GXNL_GXSCB : "收藏"
|
||
TXW_MHZC_GXNL_SLXXB ||--o{ TXW_MHZC_GXNL_GXSCB : "被收藏"
|
||
TXW_MHZC_YHXXB ||--o{ TXW_MHZC_GXNL_SLXXB : "提交账号"
|
||
TXW_MHZC_QYXXB ||--o{ TXW_MHZC_GXNL_SLXXB : "关联企业"
|
||
TXW_MHZC_GXNL_SLXXB ||--o{ TXW_MHZC_GXNL_SLSHB : "审核流水(二期)"
|
||
|
||
TXW_MHZC_GXNL_SLXXB {
|
||
varchar wz_uuid PK
|
||
varchar bt
|
||
varchar wz_lj
|
||
varchar jj
|
||
char gxnl_fl_dm
|
||
varchar gxnl_fl_mc
|
||
varchar bqjh
|
||
char zt
|
||
char sjzt
|
||
varchar lyqd_dm
|
||
varchar tjr_nc
|
||
varchar tjr_lxdh
|
||
varchar yh_uuid
|
||
varchar qyuuid
|
||
varchar qymc
|
||
varchar shyj
|
||
varchar shruuid
|
||
datetime shsj
|
||
int shcs
|
||
text shls_j
|
||
int pxh
|
||
int llcs
|
||
int sccs
|
||
int bbh
|
||
varchar lrruuid
|
||
datetime lrrq
|
||
varchar xgruuid
|
||
datetime xgrq
|
||
char yxbz
|
||
}
|
||
|
||
TXW_MHZC_GXNL_GXSCB {
|
||
varchar uuid PK
|
||
varchar wz_uuid FK
|
||
varchar yh_uuid FK
|
||
datetime lrrq
|
||
datetime qxrq
|
||
char yxbz
|
||
}
|
||
|
||
TXW_MHZC_YHXXB {
|
||
varchar yh_uuid PK
|
||
}
|
||
|
||
TXW_MHZC_QYXXB {
|
||
varchar qyuuid PK
|
||
}
|
||
```
|
||
|
||
### 3.2 关系与一致性(应用层)
|
||
|
||
| 关系 | 基数 | 一致性策略 |
|
||
|------|------|------------|
|
||
| 用户 → 收藏 | 1:N | 用户注销:异步任务将 `gxscb.yxbz='N'`,`sccs` 重算;失败入补偿队列 |
|
||
| 收录 → 收藏 | 1:N | 条目 `yxbz='N'` 或下架:不删收藏行;「我的收藏」JOIN 时标 `yxzt=invalid` |
|
||
| 用户 → 收录 | 1:N | 用户注销:不删 `slxxb`,`yh_uuid` 保留用于审计 |
|
||
| 企业 → 收录 | 1:N | 企业注销:`qyuuid` 置空或保留历史,不级联删条目 |
|
||
|
||
**不建数据库外键**:与 `txw_gxzx_gxscb` 等项目表一致;所有引用在 Service 层校验存在性。
|
||
|
||
---
|
||
|
||
## 4. 字段校验规则(入库前必校验)
|
||
|
||
### 4.1 通用约定
|
||
|
||
| 项 | 规范 |
|
||
|----|------|
|
||
| 时区 | 服务端统一 **Asia/Shanghai** |
|
||
| 时间格式 | `DATETIME`,入库 `YYYY-MM-DD HH:mm:ss`;接口 ISO8601 可选,入库前转换 |
|
||
| UUID | `[a-zA-Z0-9_-]{1,50}`,系统生成优先 |
|
||
| 字符串 | 入库前 `trim()`;全角空格转半角(可选) |
|
||
|
||
### 4.2 `txw_mhzc_gxnl_slxxb` 字段校验
|
||
|
||
| 字段 | 类型/长度 | 必填 | 校验规则 |
|
||
|------|-----------|------|----------|
|
||
| `wz_uuid` | VARCHAR(50) | Y | 系统生成,唯一 |
|
||
| `bt` | VARCHAR(200) | Y | 1~200 字符;禁止纯空格;禁止 `<script` 等 XSS 片段(输出编码为主,入库可做长度+危险字符拦截) |
|
||
| `wz_lj` | VARCHAR(500) | Y | 必须 `http://` 或 `https://` 开头;总长 ≤500;域名合法;禁止 `javascript:`;入库前 `URI` 规范化 |
|
||
| `jj` | VARCHAR(40) | Y* | 用户收录必填,运营导入可空;**1~40 字符**(与前端 maxlength 一致) |
|
||
| `gxnl_fl_dm` | CHAR(2) | Y | 枚举 `01`~`05`,否则拒绝 |
|
||
| `gxnl_fl_mc` | VARCHAR(50) | N | 由服务端根据 `gxnl_fl_dm` 填充,不信任前端 |
|
||
| `bqjh` | VARCHAR(500) | N | 最多 **10** 个标签;单标签 1~20 字符;仅中英文数字及 `-_`;英文逗号分隔;去重 |
|
||
| `zt` | CHAR(1) | Y | 枚举 `0`~`4` |
|
||
| `sjzt` | CHAR(1) | Y | 仅 `Y`/`N`;仅当 `zt=2` 时允许 `sjzt=Y` |
|
||
| `lyqd_dm` | VARCHAR(20) | Y | 枚举 `admin`/`user`/`import` |
|
||
| `tjr_nc` | VARCHAR(50) | N | ≤50 字符 |
|
||
| `tjr_lxdh` | VARCHAR(20) | N* | 发验证码时必填;手机号 `^1[3-9]\d{9}$` 或座机 `^0\d{2,3}-?\d{7,8}$` |
|
||
| `yh_uuid` | VARCHAR(50) | N | 存在则校验 `yhxxb` 有效 |
|
||
| `qyuuid` | VARCHAR(50) | N | 存在则校验 `qyxxb` |
|
||
| `qymc` | VARCHAR(200) | N | 由企业表冗余,不信任前端随意改 |
|
||
| `shyj` | VARCHAR(500) | N | 驳回时必填;≤500 字符 |
|
||
| `shruuid` | VARCHAR(50) | N | 审核时必填 |
|
||
| `shsj` | DATETIME | N | 审核时必填 |
|
||
| `shcs` | INT | Y | ≥0;每次驳回/通过 +1 |
|
||
| `shls_j` | TEXT | N | JSON 数组,见 §8.3;单条 ≤2000 字符建议 |
|
||
| `pxh` | INT | Y | 0~999999 |
|
||
| `llcs` | INT | Y | ≥0 |
|
||
| `sccs` | INT | Y | ≥0;**冗余字段**,规则见 §7.2 |
|
||
| `bbh` | INT | Y | ≥0;乐观锁,更新时 `WHERE bbh=?` |
|
||
| `lrruuid`/`xgruuid` | VARCHAR(50) | N | 写操作写入 |
|
||
| `lrrq`/`xgrq` | DATETIME | N | 首次/更新自动 |
|
||
| `yxbz` | CHAR(1) | Y | `Y`/`N` |
|
||
|
||
### 4.3 `txw_mhzc_gxnl_gxscb` 字段校验
|
||
|
||
| 字段 | 类型/长度 | 必填 | 校验规则 |
|
||
|------|-----------|------|----------|
|
||
| `uuid` | VARCHAR(50) | Y | 系统生成 |
|
||
| `wz_uuid` | VARCHAR(50) | Y | 须存在且 `slxxb.yxbz=Y` 且 `zt=2` 且 `sjzt=Y` |
|
||
| `yh_uuid` | VARCHAR(50) | Y | 当前登录用户 |
|
||
| `lrrq` | DATETIME | Y | 收藏时写入 |
|
||
| `qxrq` | DATETIME | N | 取消收藏时写入 |
|
||
| `yxbz` | CHAR(1) | Y | `Y`/`N` |
|
||
|
||
---
|
||
|
||
## 5. 表结构明细
|
||
|
||
### 5.1 `txw_mhzc_gxnl_slxxb` — 共性能力收录信息表
|
||
|
||
| 字段名 | 类型 | 空 | 默认 | 注释 |
|
||
|--------|------|----|------|------|
|
||
| `wz_uuid` | VARCHAR(50) | N | — | 网站信息 UUID,主键 |
|
||
| `bt` | VARCHAR(200) | N | — | 名称 |
|
||
| `wz_lj` | VARCHAR(500) | N | — | 网站链接(http/https) |
|
||
| `jj` | VARCHAR(40) | Y | NULL | 简介,≤40 字 |
|
||
| `gxnl_fl_dm` | CHAR(2) | N | — | 分类代码 01~05 |
|
||
| `gxnl_fl_mc` | VARCHAR(50) | Y | NULL | 分类名称冗余 |
|
||
| `bqjh` | VARCHAR(500) | Y | NULL | 标签合集,逗号分隔,最多 10 个 |
|
||
| `zt` | CHAR(1) | N | `1` | 业务状态,§6 |
|
||
| `sjzt` | CHAR(1) | N | `N` | 上架状态 Y/N |
|
||
| `lyqd_dm` | VARCHAR(20) | N | `user` | 来源:admin/user/import |
|
||
| `tjr_nc` | VARCHAR(50) | Y | NULL | 提交人昵称 |
|
||
| `tjr_lxdh` | VARCHAR(20) | Y | NULL | 提交人联系方式 |
|
||
| `yh_uuid` | VARCHAR(50) | Y | NULL | 提交账号 UUID |
|
||
| `qyuuid` | VARCHAR(50) | Y | NULL | 关联企业 UUID |
|
||
| `qymc` | VARCHAR(200) | Y | NULL | 企业名称冗余 |
|
||
| `shyj` | VARCHAR(500) | Y | NULL | **当前轮次**审核意见 |
|
||
| `shruuid` | VARCHAR(50) | Y | NULL | 最后审核人 |
|
||
| `shsj` | DATETIME | Y | NULL | 最后审核时间 |
|
||
| `shcs` | INT | N | `0` | 审核轮次(提交/重提/审核累计) |
|
||
| `shls_j` | TEXT | Y | NULL | 审核历史 JSON(过渡期多轮审核) |
|
||
| `pxh` | INT | N | `0` | 排序号 |
|
||
| `llcs` | INT | N | `0` | 浏览次数 |
|
||
| `sccs` | INT | N | `0` | 有效收藏数冗余 |
|
||
| `bbh` | INT | N | `0` | 版本号(乐观锁) |
|
||
| `lrruuid` | VARCHAR(50) | Y | NULL | 录入人 UUID |
|
||
| `lrrq` | DATETIME | Y | NULL | 录入时间 |
|
||
| `xgruuid` | VARCHAR(50) | Y | NULL | 修改人 UUID |
|
||
| `xgrq` | DATETIME | Y | NULL | 修改时间 |
|
||
| `yxbz` | CHAR(1) | N | `Y` | 有效标志 Y/N |
|
||
|
||
**分类代码 `gxnl_fl_dm`**
|
||
|
||
| 代码 | 名称 | 前端 anchor |
|
||
|------|------|-------------|
|
||
| `01` | 碳核算平台 | content-1 |
|
||
| `02` | 碳认证机构 | content-2 |
|
||
| `03` | 碳交易平台 | content-3 |
|
||
| `04` | 碳金融服务 | content-4 |
|
||
| `05` | 碳技术咨询 | content-5 |
|
||
|
||
### 5.2 `txw_mhzc_gxnl_gxscb` — 共性能力收藏表
|
||
|
||
| 字段名 | 类型 | 空 | 默认 | 注释 |
|
||
|--------|------|----|------|------|
|
||
| `uuid` | VARCHAR(50) | N | — | 收藏记录 UUID |
|
||
| `wz_uuid` | VARCHAR(50) | N | — | 关联网站信息 |
|
||
| `yh_uuid` | VARCHAR(50) | N | — | 收藏用户 |
|
||
| `lrrq` | DATETIME | N | — | 收藏时间 |
|
||
| `qxrq` | DATETIME | Y | NULL | 取消收藏时间 |
|
||
| `yxbz` | CHAR(1) | N | `Y` | Y=有效收藏 N=已取消 |
|
||
|
||
**收藏写入策略(解决唯一约束与软删冲突)**
|
||
|
||
- 表级唯一约束:`UNIQUE (yh_uuid, wz_uuid)` **不变**。
|
||
- **取消收藏**:`UPDATE SET yxbz='N', qxrq=NOW()`,不删行。
|
||
- **再次收藏**:若存在该行则 `UPDATE SET yxbz='Y', lrrq=NOW(), qxrq=NULL`;否则 `INSERT`。
|
||
- **禁止**对同一 `(yh_uuid, wz_uuid)` 重复 `INSERT`。
|
||
|
||
---
|
||
|
||
## 6. 状态流转矩阵
|
||
|
||
### 6.1 状态枚举
|
||
|
||
**`zt` 业务状态**
|
||
|
||
| 值 | 含义 | 门户列表 | 可收藏 |
|
||
|----|------|----------|--------|
|
||
| `0` | 草稿 | 否 | 否 |
|
||
| `1` | 待审核 | 否 | 否 |
|
||
| `2` | 审核通过 | 是* | 是* |
|
||
| `3` | 审核驳回 | 否 | 否 |
|
||
| `4` | 已下架 | 否 | 否 |
|
||
|
||
\* 须同时 `sjzt=Y` 且 `yxbz=Y`。
|
||
|
||
**`sjzt` 上架状态**
|
||
|
||
| 值 | 含义 |
|
||
|----|------|
|
||
| `Y` | 门户可见 |
|
||
| `N` | 不可见 |
|
||
|
||
### 6.2 状态变更矩阵(含权限)
|
||
|
||
| 当前状态 | 事件 | 目标状态 | 操作角色 | 附加条件 |
|
||
|----------|------|----------|----------|----------|
|
||
| — | 用户提交收录 | `zt=1,sjzt=N` | 游客/登录用户 | 验证码通过 |
|
||
| `1` | 用户撤回 | `zt=0,sjzt=N` | 提交人本人 | 仅 `zt=1`;`yh_uuid` 匹配或手机号验证 |
|
||
| `0` | 用户再次提交 | `zt=1` | 提交人 | 更新同 `wz_uuid` |
|
||
| `1` | 审核通过 | `zt=2,sjzt=Y` | 运营/管理员 | 写 `shyj` 可空;`shcs+1` |
|
||
| `1` | 审核驳回 | `zt=3,sjzt=N` | 运营/管理员 | `shyj` 必填 |
|
||
| `2,Y` | 运营下架 | `zt=4,sjzt=N` | 运营/管理员 | 可不删收藏记录 |
|
||
| `4,N` | 重新上架 | `zt=2,sjzt=Y` | 运营/管理员 | 须 `yxbz=Y` |
|
||
| `3` | 修改后重提 | `zt=1,sjzt=N` | 提交人 | `shcs+1`;历史写入 `shls_j` |
|
||
| 任意 | 逻辑删除 | `yxbz=N` | 管理员 | 门户不可见;待审单不再展示在审核队列(或单独筛) |
|
||
|
||
### 6.3 异常场景处理
|
||
|
||
| 场景 | 处理 |
|
||
|------|------|
|
||
| 待审条目被逻辑删除 | 审核接口返回「条目已失效」;不再出现在待审列表 |
|
||
| 已收藏条目下架 | 「我的收藏」仍展示,卡片标 **「已失效」**,不可跳转或灰显;`scbz` 仍 Y,增加 `yxzt=N` |
|
||
| 已收藏条目逻辑删除 | 同下架,`yxzt=N` |
|
||
| 并发审核/编辑 | `UPDATE ... WHERE wz_uuid=? AND bbh=?`;失败返回「数据已被修改,请刷新」 |
|
||
| 用户注销 | 收藏批量 `yxbz=N`;`sccs` 按条目异步重算 |
|
||
|
||
---
|
||
|
||
## 7. 收藏业务规则
|
||
|
||
### 7.1 方案选定
|
||
|
||
| 方案 | 说明 | 本期 |
|
||
|------|------|------|
|
||
| 软删 `yxbz` | 取消置 N,可统计、可复收藏 | **采用** |
|
||
| 物理删除 | 无法追溯取消行为 | 不采用 |
|
||
|
||
### 7.2 `sccs` 冗余维护规则
|
||
|
||
| 项 | 规则 |
|
||
|----|------|
|
||
| 含义 | 当前 **有效收藏** 数,等价于 `COUNT(*) FROM gxscb WHERE wz_uuid=? AND yxbz='Y'` |
|
||
| 增加 | `toggle add` 成功且由 N→Y 时 `sccs+1`(复收藏若从 N→Y 也 +1) |
|
||
| 减少 | `toggle remove` 成功且由 Y→N 时 `sccs-1`,下限 0 |
|
||
| 并发 | 与 `gxscb` 更新同一事务;`sccs` 更新 `WHERE sccs>=0` |
|
||
| 校验 | 每日凌晨 Job 全量校对,偏差 >0 则修复并告警 |
|
||
| 是否含注销用户 | **不含**;注销时已置 `yxbz=N` |
|
||
|
||
### 7.3 查询规则
|
||
|
||
- **门户列表 `scbz`**:`LEFT JOIN gxscb ON wz_uuid AND yh_uuid AND yxbz='Y'`。
|
||
- **我的收藏**:`gxscb.yxbz='Y'` JOIN `slxxb`;下架条目带 `yxzt` 字段返回。
|
||
|
||
---
|
||
|
||
## 8. 审核流程
|
||
|
||
### 8.1 权限
|
||
|
||
| 角色 | 权限 |
|
||
|------|------|
|
||
| 游客 | 提交收录、验证码 |
|
||
| 登录用户 | 提交、撤回自己的待审单、收藏 |
|
||
| 运营 | 审核、上下架、编辑条目 |
|
||
| 管理员 | 全部 + 逻辑删除 |
|
||
|
||
首期不按分类分审核人;二期可在 `slshb` 增加 `gxnl_fl_dm` 路由。
|
||
|
||
### 8.2 多轮审核(过渡期)
|
||
|
||
未建 `txw_mhzc_gxnl_slshb` 前:
|
||
|
||
- `shyj` / `shruuid` / `shsj`:保存 **最后一轮** 审核信息。
|
||
- `shls_j`:JSON 数组,元素示例:
|
||
|
||
```json
|
||
{
|
||
"shcs": 1,
|
||
"shjg_dm": "3",
|
||
"shyj": "链接无法访问",
|
||
"shruuid": "admin-001",
|
||
"shsj": "2026-05-23 14:00:00"
|
||
}
|
||
```
|
||
|
||
`shjg_dm`:`2` 通过,`3` 驳回。
|
||
|
||
### 8.3 二期审核流水表(建议)
|
||
|
||
`txw_mhzc_gxnl_slshb`:`uuid`, `wz_uuid`, `shcs`, `shjg_dm`, `shyj`, `shruuid`, `shsj`, `lrrq`。
|
||
建成后 `shls_j` 可弃用,历史数据迁移入流水表。
|
||
|
||
---
|
||
|
||
## 9. 索引设计
|
||
|
||
### 9.1 设计原则(MySQL 8.0)
|
||
|
||
- 组合索引字段顺序:**等值条件按区分度从高到低**,范围/排序字段放最后。
|
||
- 门户主查:`gxnl_fl_dm`(5 类)+ `sjzt` + `zt` + `ORDER BY lrrq DESC`。
|
||
- `%keyword%` 模糊查询 **不走 BTree**;名称搜索用 **FULLTEXT** 或 ES(二期)。
|
||
|
||
### 9.2 `txw_mhzc_gxnl_slxxb` 索引
|
||
|
||
| 索引名 | 字段 | 说明 |
|
||
|--------|------|------|
|
||
| PRIMARY | `wz_uuid` | 主键 |
|
||
| `idx_slxx_fl_sjzt_zt_lrrq` | `gxnl_fl_dm`, `sjzt`, `zt`, `lrrq` | 门户分类列表(v2 调整顺序) |
|
||
| `idx_slxx_zt_lrrq` | `zt`, `lrrq` | 管理端待审 `zt=1` |
|
||
| `idx_slxx_yh_lrrq` | `yh_uuid`, `lrrq` | 我的提交 |
|
||
| `idx_slxx_yxbz` | `yxbz` | 过滤有效数据 |
|
||
| `ft_slxx_bt_jj` | FULLTEXT(`bt`,`jj`) | 名称/简介搜索(可选,见 DDL 注释) |
|
||
|
||
**`idx_slxx_bt` BTree 说明**:仅适合 **前缀** 查询 `LIKE 'keyword%'`;`%keyword%` 会失效,已改用 FULLTEXT。
|
||
|
||
### 9.3 `txw_mhzc_gxnl_gxscb` 索引
|
||
|
||
| 索引名 | 字段 | 说明 |
|
||
|--------|------|------|
|
||
| PRIMARY | `uuid` | — |
|
||
| `uk_gxsc_yh_wz` | `yh_uuid`, `wz_uuid` | 唯一;配合 UPDATE 复收藏 |
|
||
| `idx_gxsc_yh_yxbz_lrrq` | `yh_uuid`, `yxbz`, `lrrq` | 我的收藏 |
|
||
| `idx_gxsc_wz_yxbz` | `wz_uuid`, `yxbz` | 统计/校对 sccs |
|
||
|
||
---
|
||
|
||
## 10. 数据清理与归档
|
||
|
||
| 数据 | 策略 |
|
||
|------|------|
|
||
| `gxscb` 且 `yxbz=N` 且 `qxrq` < 1 年 | 可物理删除(夜间 Job) |
|
||
| `slxxb` 且 `zt=3` 且 `yxbz=Y` 超过 2 年 | 归档至历史表或 `yxbz=N` |
|
||
| `slxxb` 且 `yxbz=N` | 保留 3 年后物理删除(合规待定) |
|
||
|
||
---
|
||
|
||
## 11. API 规范(概要)
|
||
|
||
**统一约定**
|
||
|
||
- Base:`/mhzc/gxnl`
|
||
- Method:POST(与项目现有 `/gxdt` 一致)
|
||
- Content-Type:`application/json`
|
||
- 分页:`pageNo`(从 1)、`pageSize`(默认 10,最大 50)
|
||
- 排序:列表默认 `lrrq DESC, pxh DESC`
|
||
- 响应:`{ code, msg, data }`;`code=0` 成功
|
||
|
||
### 11.1 `POST /mhzc/gxnl/wzxx/list` — 分类列表
|
||
|
||
**请求**
|
||
|
||
```json
|
||
{
|
||
"pageNo": 1,
|
||
"pageSize": 10,
|
||
"gxnlFlDm": "01",
|
||
"nr": "碳足迹",
|
||
"onlySc": false
|
||
}
|
||
```
|
||
|
||
| 参数 | 类型 | 必填 | 说明 |
|
||
|------|------|------|------|
|
||
| pageNo | int | Y | ≥1 |
|
||
| pageSize | int | N | 默认 10,最大 50 |
|
||
| gxnlFlDm | string | N | 01~05 |
|
||
| nr | string | N | 关键词;有值时走 FULLTEXT 或 LIKE(见实现开关) |
|
||
| onlySc | boolean | N | true 时仅返回当前用户收藏 |
|
||
|
||
**响应 data**:`{ list: [{ wzUuid, bt, jj, wzLj, bqjh, gxnlFlMc, scbz, lrrq }], total }`
|
||
|
||
### 11.2 `POST /mhzc/gxnl/slxx/submit` — 收录提交
|
||
|
||
**请求**
|
||
|
||
```json
|
||
{
|
||
"bt": "某某碳核算平台",
|
||
"wzLj": "https://example.com",
|
||
"jj": "简介文案",
|
||
"gxnlFlDm": "01",
|
||
"bqjh": "碳足迹,LCA",
|
||
"tjrNc": "张三",
|
||
"tjrLxdh": "13800138000",
|
||
"captchaId": "xxx",
|
||
"captchaCode": "123456"
|
||
}
|
||
```
|
||
|
||
**异常码**
|
||
|
||
| code | 说明 |
|
||
|------|------|
|
||
| 40001 | 参数校验失败(附 fieldErrors) |
|
||
| 40002 | URL 格式非法 |
|
||
| 40003 | 分类代码不存在 |
|
||
| 40004 | 验证码错误或过期 |
|
||
| 40005 | 标签数量/格式超限 |
|
||
|
||
### 11.3 `POST /mhzc/gxnl/slxx/audit` — 审核
|
||
|
||
**请求**:`{ wzUuid, shjgDm: "2"|"3", shyj, bbh }`
|
||
**权限**:运营/管理员
|
||
**异常**:40010 状态不允许审核;40011 乐观锁冲突
|
||
|
||
### 11.4 `POST /mhzc/gxnl/slxx/withdraw` — 撤回
|
||
|
||
**请求**:`{ wzUuid }`
|
||
**条件**:`zt=1` 且本人提交
|
||
|
||
### 11.5 `POST /mhzc/gxnl/gxsc/toggle` — 收藏切换
|
||
|
||
**请求**:`{ wzUuid, type: "add" | "remove" }`(**小写**,大小写敏感)
|
||
**异常**:40101 未登录;40020 条目不可收藏
|
||
|
||
### 11.6 `POST /mhzc/gxnl/gxsc/myList` — 我的收藏
|
||
|
||
**请求**:`{ pageNo, pageSize }`
|
||
**响应**:含 `yxzt`(Y=正常 N=已下架/删除)
|
||
|
||
### 11.7 `POST /mhzc/gxnl/captcha/send`
|
||
|
||
**请求**:`{ tjrLxdh, bizType: "gxnl_submit" }`
|
||
**限流**:同一手机号 1 分钟 1 次,1 小时 5 次
|
||
|
||
---
|
||
|
||
## 12. 数据迁移(自供需表)
|
||
|
||
| 源 | 目标 | 规则 |
|
||
|----|------|------|
|
||
| `txw_gxzx_gxxxb`(若曾误用) | `txw_mhzc_gxnl_slxxb` | 仅迁移明确标记为共性能力的数据;`bt_1→bt`,链接从 `kzwj` 或 `fwnr` 解析 |
|
||
| `txw_gxzx_gxscb` | `txw_mhzc_gxnl_gxscb` | **不自动迁移**(`gx_uuid` 与 `wz_uuid` 无稳定映射);需人工或脚本映射表 |
|
||
| 历史收藏 | — | 建议上线后用户重新收藏,或一次性脚本 + 映射表 |
|
||
|
||
**迁移步骤**:停写 → 备份 → 脚本导入 → 校对条数 → 抽测 → 开写。
|
||
**锁表**:大批量时按主键分批,避免长事务锁表。
|
||
|
||
---
|
||
|
||
## 13. 性能与容量(预估)
|
||
|
||
| 项 | 预估 | 措施 |
|
||
|----|------|------|
|
||
| 收录条目 | 5 万级/3 年 | 索引 + 归档 |
|
||
| 收藏记录 | 50 万级 | 分区(按年)二期考虑 |
|
||
| 列表 QPS | 峰值 200 | Redis 缓存分类列表 60s;收藏态用户级缓存 |
|
||
| 收藏 toggle | 峰值 50 | 行级锁 + 事务 |
|
||
|
||
---
|
||
|
||
## 14. 操作日志(扩展)
|
||
|
||
写操作(提交、审核、上下架、删除)通过现有平台审计日志记录,建议扩展字段:
|
||
|
||
- `bizType=gxnl_slxx`
|
||
- `bizId=wz_uuid`
|
||
- `op=submit|audit|onShelf|offShelf|delete`
|
||
|
||
不在业务表增加 `czrz_uuid`;以日志中心为准。
|
||
|
||
---
|
||
|
||
## 15. 与现有表对比
|
||
|
||
| 维度 | 原供需表 | v2.0 新表 |
|
||
|------|----------|-----------|
|
||
| 链接 | 无 | `wz_lj` + URL 校验 |
|
||
| 分类 | 关键词 | `gxnl_fl_dm` |
|
||
| 收藏唯一 | `gx_uuid` | `wz_uuid` + upsert |
|
||
| 并发 | 无版本号 | `bbh` 乐观锁 |
|
||
| 多轮审核 | `shqkb` | `shls_j` 过渡 + 二期 `slshb` |
|
||
|
||
---
|
||
|
||
## 16. 前端字段映射
|
||
|
||
| 前端 | 表字段 |
|
||
|------|--------|
|
||
| submitForm.bt1 | bt |
|
||
| submitForm.lj | wz_lj |
|
||
| submitForm.jj | jj |
|
||
| submitForm.fl | gxnl_fl_dm |
|
||
| submitForm.bq | bqjh |
|
||
| submitForm.nc | tjr_nc |
|
||
| submitForm.lxfs | tjr_lxdh |
|
||
| card.gxUuid | **wz_uuid**(接口驼峰 `wzUuid`) |
|
||
|
||
---
|
||
|
||
## 17. DDL
|
||
|
||
见:`txw-mhzc/sql/txw_mhzc_gxnl_slxxb_gxscb.sql`
|