docs: 精简新用户注册模块文档,移除详细设计冗余内容,保留概要引用

This commit is contained in:
2026-07-01 10:36:33 +08:00
parent 7477566b9d
commit e834187099
@@ -1,483 +1,3 @@
# 新用户注册模块
新用户注册包含了[[供应商注册模块]]和[[外部专家注册模块]] 。
### 供应商注册页面要素:
- 企业全称
- 统一社会信用代码
- 注册资本(万元)
- 法定代表人
- 行业
- 地址
- 经营范围
- 主要产品
- 联系人姓名
- 联系电话(手机号)
- 电子邮箱
- 营业执照
## 供应商注册模块
## 外部专家注册模块
## 1. 模块概述
### 1.1 建设目标
建立面向**社会外部评标专家**的在线注册、准入审核与档案管理体系,实现专家信息的结构化采集、AI辅助资质核验、回避关系预审,并与后续的**专家抽取、智能匹配、在线评标、劳务报酬结算**全流程贯通。
### 1.2 设计原则
| 原则 | 说明 |
| :------- | :-------------------------------------- |
| **信息完备** | 采集字段覆盖专业能力、执业资格、回避关系、收款账户等全维度。 |
| **隐私保护** | 身份证号、手机号、银行账户等敏感信息采用**字段级加密**存储(内存级密钥)。 |
| **统一身份** | 注册完成后自动生成STP平台账号,支持手机号/邮箱登录,无需二次注册。 |
### 1.3 适用角色与场景
| 角色 | 场景 |
| :-------------- | :----------------------------- |
| **外部专家申请人** | 通过招标门户“专家注册”入口提交申请,查询审核进度。 |
| **专家管理员(招标专员)** | 在后台审核专家资料、处理回避申报、激活/驳回/冻结专家账户。 |
| **合规审计人员** | 查阅专家注册审计轨迹、关联关系图谱。 |
| **AI 审核服务** | 自动执行OCR识别、证件验真。 |
---
## 2. 页面布局与 UI 设计
### 2.1 整体注册流程步骤条
```svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 120" font-family="'Microsoft YaHei', sans-serif">
<rect width="1000" height="120" fill="#f8f9fc" rx="8"/>
<!-- 步骤条背景 -->
<rect x="50" y="40" width="900" height="40" rx="20" fill="#fff" stroke="#e0e4ec"/>
<!-- 步骤1:已激活 -->
<circle cx="140" cy="60" r="18" fill="#c2185b"/>
<text x="140" y="66" text-anchor="middle" font-size="14" fill="#fff" font-weight="bold">1</text>
<text x="140" y="100" text-anchor="middle" font-size="13" fill="#c2185b" font-weight="bold">基本信息</text>
<!-- 连接线1 -->
<line x1="158" y1="60" x2="232" y2="60" stroke="#c2185b" stroke-width="3"/>
<!-- 步骤2:进行中 -->
<circle cx="250" cy="60" r="18" fill="#c2185b"/>
<text x="250" y="66" text-anchor="middle" font-size="14" fill="#fff" font-weight="bold">2</text>
<text x="250" y="100" text-anchor="middle" font-size="13" fill="#c2185b" font-weight="bold">专业资质</text>
<!-- 连接线2 -->
<line x1="268" y1="60" x2="562" y2="60" stroke="#e0e4ec" stroke-width="3"/>
<!-- 步骤5 -->
<circle cx="580" cy="60" r="18" fill="#e0e4ec"/>
<text x="580" y="66" text-anchor="middle" font-size="14" fill="#8895aa">5</text>
<text x="580" y="100" text-anchor="middle" font-size="13" fill="#8895aa">提交审核</text>
<!-- 提示文字 -->
<text x="900" y="35" text-anchor="end" font-size="12" fill="#8895aa">* 带红色星号均为必填项</text>
</svg>
```
### 2.2 注册主表单页面
```svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1100 900" font-family="'Microsoft YaHei', 'PingFang SC', sans-serif">
<defs>
<filter id="shadowLight" x="-2%" y="-2%" width="104%" height="104%">
<feDropShadow dx="0" dy="4" stdDeviation="8" flood-color="#000" flood-opacity="0.04"/>
</filter>
<linearGradient id="brandGrad" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" stop-color="#c2185b"/>
<stop offset="100%" stop-color="#e91e63"/>
</linearGradient>
</defs>
<!-- 背景 -->
<rect width="1100" height="900" fill="#f5f7fa"/>
<!-- 主卡片 -->
<rect x="80" y="30" width="940" height="840" rx="16" fill="#fff" filter="url(#shadowLight)"/>
<!-- 标题区 -->
<text x="120" y="80" font-size="22" font-weight="bold" fill="#1a2332">外部专家注册</text>
<text x="120" y="108" font-size="14" fill="#8895aa">请完整填写以下信息,所有数据将受到严格加密保护</text>
<line x1="120" y1="125" x2="980" y2="125" stroke="#f0f2f7" stroke-width="2"/>
<!-- ===== 第一行:姓名 + 性别 ===== -->
<text x="120" y="170" font-size="14" fill="#4a5568">真实姓名 <tspan fill="#e91e63">*</tspan></text>
<rect x="120" y="180" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
<text x="135" y="206" font-size="14" fill="#b0bbcc">请输入中文姓名</text>
<text x="430" y="170" font-size="14" fill="#4a5568">性别 <tspan fill="#e91e63">*</tspan></text>
<rect x="430" y="180" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
<text x="445" y="206" font-size="14" fill="#b0bbcc">请选择</text>
<path d="M 670 200 L 678 208 L 686 200" stroke="#b0bbcc" stroke-width="2" fill="none"/>
<!-- ===== 第二行:身份证号(脱敏提示) ===== -->
<text x="120" y="250" font-size="14" fill="#4a5568">身份证号码 <tspan fill="#e91e63">*</tspan></text>
<rect x="120" y="260" width="420" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
<text x="135" y="286" font-size="14" fill="#b0bbcc">请输入18位身份证号</text>
<text x="560" y="286" font-size="12" fill="#8895aa">🔒 将使用AES-256加密存储</text>
<!-- ===== 第三行:出生日期(自动计算) ===== -->
<text x="120" y="330" font-size="14" fill="#4a5568">出生日期</text>
<rect x="120" y="340" width="260" height="40" rx="6" fill="#f5f6fa" stroke="#e0e4ec"/>
<text x="135" y="366" font-size="14" fill="#b0bbcc">由身份证自动识别</text>
<text x="430" y="330" font-size="14" fill="#4a5568">年龄</text>
<rect x="430" y="340" width="260" height="40" rx="6" fill="#f5f6fa" stroke="#e0e4ec"/>
<text x="445" y="366" font-size="14" fill="#b0bbcc">自动计算</text>
<!-- ===== 第四行:手机号 + 邮箱 ===== -->
<text x="120" y="410" font-size="14" fill="#4a5568">手机号码 <tspan fill="#e91e63">*</tspan></text>
<rect x="120" y="420" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
<text x="135" y="446" font-size="14" fill="#b0bbcc">请输入手机号</text>
<text x="430" y="410" font-size="14" fill="#4a5568">电子邮箱 <tspan fill="#e91e63">*</tspan></text>
<rect x="430" y="420" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
<text x="445" y="446" font-size="14" fill="#b0bbcc">请输入常用邮箱</text>
<!-- ===== 第五行:工作单位 + 职务 ===== -->
<text x="120" y="490" font-size="14" fill="#4a5568">工作单位</text>
<rect x="120" y="500" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
<text x="135" y="526" font-size="14" fill="#b0bbcc">请输入单位全称</text>
<text x="430" y="490" font-size="14" fill="#4a5568">现从事专业 <tspan fill="#e91e63">*</tspan></text>
<rect x="430" y="500" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
<text x="445" y="526" font-size="14" fill="#b0bbcc">如:化工工艺、设备管理</text>
<!-- ===== 第六行:职称 ===== -->
<text x="120" y="570" font-size="14" fill="#4a5568">技术职称 <tspan fill="#e91e63">*</tspan></text>
<rect x="120" y="580" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
<text x="135" y="606" font-size="14" fill="#b0bbcc">高级/副高级/中级/初级</text>
<rect x="440" y="580" width="260" height="40" rx="6" fill="#fafbfc" stroke="#e0e4ec"/>
<text x="455" y="606" font-size="14" fill="#b0bbcc">职称专业(如:化工工程)</text>
<!-- ===== 第七行:文件上传(资质证书) ===== -->
<text x="120" y="660" font-size="14" fill="#4a5568">职称/资质证书扫描件 <tspan fill="#e91e63">*</tspan></text>
<rect x="120" y="670" width="560" height="70" rx="6" stroke-dasharray="6,4" fill="#fafbfc" stroke="#c2185b"/>
<text x="400" y="700" text-anchor="middle" font-size="14" fill="#c2185b">📄 点击上传或拖拽文件(支持 PDF/JPG/PNG,≤20MB</text>
<text x="400" y="725" text-anchor="middle" font-size="12" fill="#8895aa">已上传:职称证.pdf (2.3MB) <tspan fill="#4caf50">✅ 识别完成</tspan></text>
<!-- ===== 底部按钮 ===== -->
<line x1="120" y1="770" x2="980" y2="770" stroke="#f0f2f7" stroke-width="2"/>
<rect x="740" y="790" width="120" height="40" rx="6" fill="#e0e4ec"/>
<text x="800" y="816" text-anchor="middle" font-size="14" fill="#8895aa">上一步</text>
<rect x="880" y="790" width="140" height="40" rx="6" fill="url(#brandGrad)"/>
<text x="950" y="816" text-anchor="middle" font-size="14" font-weight="bold" fill="#fff">下一步 →</text>
<!-- 右侧信息浮窗 -->
<rect x="720" y="140" width="260" height="180" rx="8" fill="#fff3e0" stroke="#ffcc80"/>
<text x="740" y="168" font-size="14" font-weight="bold" fill="#e65100">📌 注册须知</text>
<text x="740" y="195" font-size="12" fill="#bf360c">1. 所有信息须与身份证及职称证书一致</text>
<text x="740" y="218" font-size="12" fill="#bf360c">2. 集团公司将对信息进行真实性核验</text>
<text x="740" y="241" font-size="12" fill="#bf360c">3. 入库专家须遵守《评委管理规定》</text>
<text x="740" y="264" font-size="12" fill="#bf360c">4. 个人信息变更需及时在线更新</text>
<text x="740" y="287" font-size="12" fill="#bf360c">5. 评审回避要求详见本章程4.7条</text>
</svg>
```
---
## 4. 核心流程时序图
```mermaid
sequenceDiagram
participant U as 专家申请人
participant FE as STP前端
participant GW as API网关
participant RegSvc as 注册服务
participant AISvc as AI审核服务
participant IDSvc as 身份认证服务(外部)
participant DB as 专家库数据库
participant Admin as 专家管理员
participant Notify as 通知服务
U->>FE: 填写注册表单 + 上传证件
FE->>FE: 前端校验(非空/手机格式/身份证校验位)
FE->>GW: POST /api/v1/expert/register
GW->>RegSvc: 转发请求
RegSvc->>DB: 校验身份证号是否已注册(防重)
alt 已存在
DB-->>RegSvc: 记录已存在
RegSvc-->>FE: 409 Conflict { message: "该身份证已注册" }
else 未注册
RegSvc->>AISvc: 异步启动AI审核任务(OCR+验真+图谱)
RegSvc-->>FE: 202 Accepted { applicationId: "EXP_2024001" }
FE-->>U: 显示“提交成功,审核中...”
AISvc->>IDSvc: 调用公安接口校验身份证号与姓名
IDSvc-->>AISvc: 实名验证通过/失败
AISvc->>AISvc: OCR识别职称证书关键字段
AISvc->>AISvc: 扫描企业关联图谱(回避关系)
AISvc-->>RegSvc: 返回AI审核结论(Pass/Review/Reject
alt AI高风险或敏感
RegSvc->>DB: 状态更新为 PENDING_MANUAL
RegSvc->>Admin: 推送待办任务(站内+邮件)
Admin->>RegSvc: POST /api/v1/expert/audit { action: approve/reject }
else AI低风险
RegSvc->>DB: 状态更新为 APPROVED(自动)
end
RegSvc->>DB: 生成专家档案(EXP_XXXXX
RegSvc->>RegSvc: 创建STP登录账号(默认手机号+随机密码)
RegSvc->>Notify: 发送激活通知(含账号及首次登录链接)
Notify-->>U: 短信+邮件
U->>FE: 点击激活链接
FE->>RegSvc: POST /api/v1/expert/activate { password }
RegSvc->>DB: 更新密码哈希(Argon2id
RegSvc-->>FE: 激活成功,跳转至专家工作台
end
```
---
## 5. 数据模型设计
### 5.1 外部专家主表 `t_expert_profile`
| 字段名 | 类型 | 约束 | 说明 |
| :--- | :--- | :--- | :--- |
| `expert_id` | VARCHAR(32) | PK | 专家档案编号(EXP_YYYYMMDD_XXX |
| `user_id` | VARCHAR(32) | FK | 关联STP用户账号表(登录凭证) |
| `real_name` | VARCHAR(64) | NOT NULL | 真实姓名 |
| `id_card_no` | VARCHAR(256) | NOT NULL, UNIQUE | 身份证号(**字段级加密存储**) |
| `gender` | TINYINT | | 1-男,2-女 |
| `birth_date` | DATE | | 出生日期(由身份证提取) |
| `phone` | VARCHAR(256) | NOT NULL | 手机号(字段级加密) |
| `email` | VARCHAR(128) | NOT NULL | 电子邮箱 |
| `company` | VARCHAR(128) | | 工作单位 |
| `profession` | VARCHAR(64) | NOT NULL | 从事专业 |
| `title` | VARCHAR(32) | NOT NULL | 职称等级(高级/副高/中级) |
| `title_major` | VARCHAR(64) | | 职称专业 |
| `qualification_files` | JSON | | 资质证书文件URL列表(含OCR元数据) |
| `bank_name` | VARCHAR(64) | | 开户银行 |
| `bank_account` | VARCHAR(256) | | 银行账号(字段级加密) |
| `expertise_tags` | JSON | | 擅长领域标签(用于智能匹配) |
| `status` | VARCHAR(20) | NOT NULL | DRAFT/PENDING_AI/PENDING_MANUAL/REJECTED/APPROVED/ACTIVATED/LOCKED |
| `ai_audit_report` | JSON | | AI审核报告(含评分、风险点) |
| `manual_audit_comment` | TEXT | | 人工审核备注 |
| `declaration_signed` | BOOLEAN | DEFAULT 0 | 是否签署回避声明 |
| `created_at` | DATETIME | | 注册时间 |
| `updated_at` | DATETIME | | 更新时间 |
| `activated_at` | DATETIME | | 首次激活时间 |
### 5.2 回避声明表 `t_expert_declaration`
| 字段名 | 类型 | 约束 | 说明 |
| :--- | :--- | :--- | :--- |
| `declaration_id` | VARCHAR(32) | PK | 声明编号 |
| `expert_id` | VARCHAR(32) | FK | 专家ID |
| `declaration_type` | VARCHAR(32) | | 定期声明/项目专项声明 |
| `content` | JSON | | 逐项勾选记录 |
| `signed_at` | DATETIME | | 签署时间 |
| `ip_address` | VARCHAR(64) | | 签署IP |
| `valid_until` | DATETIME | | 有效期(通常1年) |
### 5.3 审核记录表 `t_expert_audit_log`
| 字段名 | 类型 | 约束 | 说明 |
| :--- | :--- | :--- | :--- |
| `audit_id` | VARCHAR(32) | PK | |
| `expert_id` | VARCHAR(32) | FK | |
| `auditor` | VARCHAR(64) | | 审核人(AI/人工) |
| `action` | VARCHAR(20) | | APPROVE/REJECT/REQUEST_INFO |
| `reason` | TEXT | | 原因 |
| `attachments` | JSON | | 附件URL |
| `created_at` | DATETIME | | |
---
## 6. 接口详细定义
### 6.1 提交注册申请
| 项目 | 内容 |
| :--- | :--- |
| **路径** | `/api/v1/expert/register` |
| **方法** | `POST` |
| **认证** | 否(公开接口,需图形验证码) |
**请求体(部分字段)**
```json
{
"realName": "王建国",
"idCardNo": "110101199003074477",
"gender": 1,
"phone": "13800138000",
"email": "wangjianguo@example.com",
"company": "清华大学化工系",
"profession": "化学工程",
"title": "SENIOR", // SENIOR/VICE_SENIOR/MIDDLE/JUNIOR
"titleMajor": "化学工程",
"expertiseTags": ["石油化工", "反应工程", "分离技术"],
"bankName": "中国银行北京分行",
"bankAccount": "6217850000000000",
"qualificationFiles": [
{
"fileName": "professor_cert.pdf",
"fileUrl": "https://oss.stp.com/...",
"ocrResult": { "title": "教授", "issueDate": "2018-06" }
}
],
"declarations": {
"noAffiliation": true,
"noInvestment": true,
"noConsulting": true,
"acceptDiscipline": true
},
"captchaToken": "a1b2c3d4"
}
```
**成功响应(异步)**
```json
{
"code": "0",
"data": {
"applicationId": "EXP_20260628_001",
"status": "PENDING_AI",
"estimatedTime": "预计24小时内完成初审"
}
}
```
### 6.2 查询审核进度
| 项目 | 内容 |
| :--- | :--- |
| **路径** | `/api/v1/expert/application/status` |
| **方法** | `GET` |
| **参数** | `applicationId` / `idCardNo`(二选一) |
### 6.3 专家激活(首次设置密码)
| 项目 | 内容 |
| :--- | :--- |
| **路径** | `/api/v1/expert/activate` |
| **方法** | `POST` |
**请求体**
```json
{
"applicationId": "EXP_20260628_001",
"password": "Abcd@2026#",
"confirmPassword": "Abcd@2026#"
}
```
### 6.4 后台专家审核(管理员)
| 项目 | 内容 |
| :--- | :--- |
| **路径** | `/api/v1/admin/expert/audit` |
| **方法** | `POST` |
| **认证** | 需 ADMIN/EXPERT_MANAGER 角色 |
**请求体**
```json
{
"applicationId": "EXP_20260628_001",
"action": "APPROVE", // APPROVE / REJECT / REQUEST_INFO
"reason": "职称证书已验证,资质符合要求",
"notifyExpert": true
}
```
---
## 7. AI 赋能详细设计
| AI 能力 | 实现方式 | 输出 | 优先级 |
| :--- | :--- | :--- | :--- |
| **身份证 OCR 解析** | 调用OCR服务(如百度/阿里)提取姓名、号码、有效期,自动回填表单。 | 结构化字段 | P0 |
| **实名认证** | 对接公安部CTID接口核验身份证号与姓名一致性。 | 通过/不通过 | P0 |
| **职称证书验真** | 对接人社部/学信网接口(或基于图像防伪特征识别)验证证书真伪。 | 可信度评分 | P1 |
| **利益冲突图谱** | 利用知识图谱匹配专家任职企业是否与集团供应商库/黑名单关联,输出风险等级(绿/黄/红)。 | 风险报告 | P0 |
| **专业标签智能推荐** | 根据专家填写的从事专业与历史项目品类,自动匹配并推荐擅长的采购品类标签。 | 标签列表 | P1 |
| **AI初审报告生成** | 汇总各项检查结果,生成带评分(0-100)的建议结论(自动通过/人工复核/拒绝)。 | 审核报告 | P0 |
---
## 8. 业务规则与异常处理
| 场景 | 规则/处理方式 |
| :--- | :--- |
| **身份证号唯一性** | 系统全局唯一,已注册或审核中的身份证不得重复提交。 |
| **手机号/邮箱唯一性** | 同一手机号或邮箱仅能注册一次(支持找回账号)。 |
| **职称等级门槛** | 至少具备**中级及以上**职称方可入库(《评委管理规定》4.2.1)。 |
| **AI自动通过阈值** | AI评分 ≥ 90 分且无高风险项 → 自动通过;60~89分 → 人工复核;<60分 → 自动驳回。 |
| **驳回后重提** | 允许在 30 天内修改后重新提交,保留历史审核记录供查。 |
| **虚假信息处理** | 一经发现虚假注册,永久拉入黑名单,并通报集团内各单位。 |
| **回避声明有效期** | 每年需重新签署一次,到期前30天系统自动催办。 |
| **敏感信息脱敏展示** | 后台管理中,身份证号显示为 `110101********4477`,银行账号显示为 `******0000`。 |
| **数据导出** | 支持按专家状态、专业分类、注册时间段导出加密Excel(需二次审批)。 |
---
## 9. 安全与合规设计
| 安全维度 | 落地措施 |
| :--- | :--- |
| **传输安全** | 全链路 HTTPS + TLS 1.3,文件上传使用预签名URL直传OSS。 |
| **敏感字段加密** | 身份证、手机号、银行账号使用 **AES-256-GCM** 应用层字段级加密,DEK内存漂移(见《需求说明书》4.2)。 |
| **防机器人** | 注册提交需通过图形验证码 + 滑动验证(极验/人机识别)。 |
| **密码策略** | 首次激活强制设置密码(长度≥8,含大写、小写、数字、特殊字符)。 |
| **审计日志** | 记录每次提交、审核、激活操作的IP、设备指纹、操作人,写入哈希链防篡改(见《需求说明书》4.8.1)。 |
| **个人信息保护** | 遵循《个人信息保护法》,注册前弹出《隐私政策》与《用户协议》,须勾选同意。 |
---
## 10. 通知策略矩阵
| 触发事件 | 通知方式 | 通知对象 | 文案要点 |
| :--- | :--- | :--- | :--- |
| 提交注册成功 | 站内信 | 申请人 | 已收到申请,预计24小时反馈 |
| AI 审核不通过 | 邮件+短信 | 申请人 | 详细说明不通过原因及修改指引 |
| 转入人工审核 | 站内信+邮件 | 专家管理员 | 新专家待审核,附AI报告摘要 |
| 人工审核通过 | 邮件+短信 | 申请人 | 恭喜通过审核,请点击链接激活账号 |
| 账号激活成功 | 站内信 | 申请人 | 欢迎成为STP评标专家,可开始接受评标任务 |
| 回避声明临期 | 邮件 | 专家 | 请及时重新签署回避声明,否则无法参与评标 |
| 补充材料通知 | 邮件+短信 | 申请人 | 请于X月X日前补充如下材料... |
---
## 11. 与整体架构的集成衔接
```mermaid
graph LR
subgraph 专家生命周期
A[注册申请] --> B[AI/人工审核]
B --> C[生成账号]
C --> D[激活登录]
D --> E[专家抽取匹配]
E --> F[在线评标]
F --> G[劳务报酬结算]
end
subgraph 外围系统
H[(专家库)]
I[IAM/认证中心]
J[支付系统]
K[电子档案]
end
C --> I
G --> J
B --> K
E --> H
F --> H
style A fill:#fce4ec,stroke:#c2185b
style D fill:#e8f5e9,stroke:#388e3c
```
---
本详细设计已完整覆盖外部专家从注册入口、信息填报、AI+人工双轨审核、账号激活到后续业务衔接的全链路,严格遵循《评委管理规定》的准入标准,并深度集成平台现有安全体系与AI能力。如需调整字段或审核流层级,可进一步展开讨论。
新用户注册包含了[[供应商注册模块]]和[[外部专家注册模块]] ,详情见具体文件