# 共性能力平台 — 收藏与收录 数据库设计说明 | 属性 | 内容 | |------|------| | **文档版本** | 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 字符;禁止纯空格;禁止 `=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`