Files
superlink/docs/superlink_架构与功能优化设计方案.md
T

235 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SuperLink 架构与功能优化设计方案(草案 v0.1 · 待评审)
> 原则:**先文档 · 后评审 · 再写代码**。
> 本文档为实施前的设计草案 + 现状评审发现,供项目负责人评审拍板。评审通过前不改动代码。
> 关联:`docs/superlink_产品评测与优化路线图_2026.md`(战略总览);本文档为落地执行细案。
- 撰写:2026-09
- 目标版本:v1.0.51 起
- 状态:**DRAFT — 待评审**
---
## 0. 评审结论速览(TL;DR)
| 主题 | 结论 | 建议动作 |
|---|---|---|
| 迁移管理 | ⚠️ 无版本表,多环境易漏跑迁移 | 第一批落地 |
| 鉴权 | 🔴 login 用 `sha1`(无盐),CSRF 仅靠请求头 | 第一批加固 |
| 样板代码 | 🔴 每个接口重复堆"鉴权+校验+JSON+日志" | 抽出统一定义层 |
| 前端 | 🟡 单文件过大、字符串拼 HTML | 组件化收敛 |
| 官网承诺 vs 代码 | 🔴 AI 触达/线索流转/ROI 是营销态,代码未实现 | 第二批功能闭环 |
| 差异化 | 🟢 碎片治理/完整度/渠道归因已是独特资产 | 放大 + 产品化 |
| 数据库 | 🟡 索引/口径/预算备份表待清理 | 第三批打磨 |
> 🔴=高优先级 · 🟡=中 · 🟢=已具备/优
---
## 1. 现状评审发现(问题清单)
> 依据源码精读(文件行号截至 v1.0.50)。
### 1.1 安全
- **[REV-SEC-1]🔴 密码仅 `sha1` 无加盐**(`api/auth/login.php:37` `hash_equals($user['password'], sha1($password))`)。撞库成本极低。
- **[REV-SEC-2]🟡 CSRF 仅靠 `X-Requested-With` 头**(`common/auth.php::checkAjax`),无真正的 CSRF Token,敏感写操作可被跨站伪造(头只能防"简单表单")。
- **[REV-SEC-3]🟡 登录无速率限制/失败锁定**,可被爆破。
- **[REV-SEC-4]🟡 `session` 默认配置**,未设 cookie httponly/samesite,未设会话超时/固定防护。
### 1.2 可维护性 / 架构
- **[REV-ARCH-1]🔴 无数据库迁移版本表**。`sql/migration_v1.0.XX.sql` 需手工依次执行,无 `schema_versions` 记录、无校验、无回滚;v1.0.48 遗留 `preliminary_data_bak_*` 冗余备份表。
- **[REV-ARCH-2]🔴 样板重复**:每个 `api/<模块>/<动作>.php` 重复 `require db/response/auth + checkAjax + checkPermission + SQL + logAction + Response`,约十余个接口高度同构,改一处规范需改 N 处。
- **[REV-ARCH-3]🟡 无集中错误/慢查询观测**,仅靠 `system_logs` 业务审计,无技术异常日志。
- **[REV-ARCH-4]🟡 前端 `static/js/fragment.js` 单文件承载硬/软两套逻辑,`common.js` 用字符串拼 HTML,难维护难测试。
- **[REV-ARCH-5]🟢 统一 JSON 规范(`code/msg/data`)、字段白名单(`helpers.php`)、完整度引擎(`completeness.php`)、审计(`logger.php`)已具备且质量良好**——是很好的可扩展地基。
### 1.3 数据 / 性能
- **[REV-DATA-1]🟡 `social_accounts` 多态 owner,跨表统计口径绕**;高频过滤列(`is_incomplete`/`source_channel`/`owner_type+owner_id`/`platform`)索引不明确。
- **[REV-DATA-2]🟡 `ammer_time` 历史遗留:`tools/migrate_time_to_date.php` 已有迁移脚本,但未见在迁移流程中统一执行。
- **[REV-DATA-3]🟢 `phone.dat`(4.5MB)已打包,可做成离线手机归属地查询能力,无外部依赖。
### 1.4 功能缺口(对照官网承诺)
- **[REV-FN-1]🔴 "AI 补全" 是占位**(`fragment.js` 操作列),未真正调用任何 AI/RAG。
- **[REV-FN-2]🔴 EDM 只有"筛选+导出"**(`marketing/edm.php`),无真实发送/回传。
- **[REV-FN-3]🔴 无"线索→商机→成交"状态机与跟进轨迹时间线**,与官网"线索自动流转、全程记录跟进轨迹"不符。
- **[REV-FN-4]🟡 无 ROI 面板**(dashboard 有统计卡,无"获客成本/转化率/成交额")。
- **[REV-FN-5]🟡 舆情监测/竞品分析多为占位**;EAV 产品参数已建模但"行业对比"视图未落地。
- **[REV-FN-6]🟢 人脉亲密度算法已实现**(`person/connections.php`),可产品化为可视化图谱放大差异化。
### 1.5 代码级评审发现(已核实 v1.0.50 · 2026-09 补充 code review)
> 由评审会对 `common/ auth/ fragment/ channel/ system/user_add` 逐一核实到行号得出。
**🔴 严重(安全)**
- **[REV-1]** 密码 `sha1` 无加盐:`login.php:37`、`user_add.php:48`。离线可撞库。
- **[REV-2]** CSRF 仅 `X-Requested-With` 头(`auth.php::checkAjax`),无随机 Token。
- **[REV-3]** 前端字符串拼 `innerHTML` 渲染服务器字段 → **潜在存储型 XSS(待确认 C1)**,缺统一转义。
**🟠 高(一致性/正确性)**
- **[REV-4]** 硬碎片来源不可编辑:`hard_update.php:89-111` 的 UPDATE 装列不含 `source_channel`,只能 add 不能改。
- **[REV-5]** 碎片录入被主表全局唯一性"拦死"(`hard_add/soft_update` 对 `companies/social_accounts` 判重):**业务口径需确认 C2**。同邮箱/电话跨企业、多电话同人时新线索录不进。
- **[REV-6]** `soft_update.php:77` `$id` 以字符串拼进 SQL(已 int 强转不可注入,但破坏 prepared 风格,卫生项)。
**🟡 中**
- **[REV-7]** 渠道分析 N+1:`analysis.php:59-69` 循环内逐条查 source_detail。
- **[REV-8]** 登录无限流/无失败锁定、`startSession` 未设 httponly/samesite。
- **[REV-9]** `analysis.php` 表名 `$table` 直接拼 SQL(当前仅内部常量调用安全,属 footgun)。
**🔵 低**
- **[REV-10]** `hard_convert.php:141` `$resolveCompany` 先查后插,并发同名称可能建重复企业。
- **[REV-11]** `user_add.php:23` 密码仅长度校验。
- **[REV-12]** phone/email 全库跨企业+人员全局判重,交叉占用会互相阻断(同 REV-5)。
**待确认项**
- **C1** 前端渲染是否逐处转义(决定 REV-3 是否为已存在 XSS)。
- **C2** 全局唯一性是"阻断"还是"提示"(决定碎片录入产品语义,涉及 REV-5/REV-12)。
---
## 2. 目标架构设计
### 2.1 目录结构(目标)
```
api/
common/
Api.php # 新增:统一接口基座(鉴权 + 参数 + JSON + 日志 + 分页)
migrate.php # 新增:迁移执行器(配合 sql/schema_versions)
security.php # 新增:CSRF Token、限流、Session 安全配置
auth/ channel/ ... # 业务模块(逐步接入 Api.php,非一次性重写)
tools/
migrate.php # 新增/改造:命令行跑迁移
bump_version.php # 改造:同时同步 config.js
sql/
schema_versions.sql # 新增:建版本表 + 首次基线
```
### 2.2 评审通过的决策点(由你拍板)
- **D1 迁移方案**:采用「版本表 + 顺序执行脚本」最小方案(A),暂不引入 php-migrations 等第三方依赖,保持纯 PHP 极简。
- **D2 密码升级**:`password_hash(password_verify)`,存量 sha1 用户在登录命中时平滑迁移到新哈希(登录一次即升级,无需批量重写密码)。
- **D3 CSRF**:Session 绑定随机 Token,前端 `common.js` AJAX 统一追加 `X-CSRF-Token` 头;保持现有 `checkAjax()` 兼容。
- **D4 是否抽统一 `Api.php` 基座**:建议抽;新接口必须走它,存量接口"用到的先迁、不动的不强制迁移",避免大爆炸式重写。
- **D5 AI 补全如何接入**:接千视 RAG/大模型(需提供 API),输出"带置信度的建议字段",用户一键采纳/拒绝。**若暂无 AI API,可先做"规则式自动补全"(手机归属地→城市、行业字号→行业、国家→地址缺省)占位过渡。**
- **D6 触达通道**:EDM 发送优先(可邮件模板 + SMTP/第三方),企微/短信二期。
### 2.3 统一接口基座(`common/Api.php` 设计)
```php
class Api {
// 用法:Api::handle('fragment', function(PDO $pdo, array $in){ ... return $data; })
// 内部统一:requireLogin + checkPermission + checkAjax(写) + 参数默认 + Response + 异常兜底(log) + logAction
}
```
- 收敛 `checkAjax/checkPermission/logAction` 重复样板;
- 统一异常→JSON、SQL 错误→技术日志 + 友好提示;
- 提供 `paged()` 输出,统一 list 分页结构。
### 2.4 迁移执行器(`tools/migrate.php` + `sql/schema_versions`)
- 建 `schema_versions(id, version, applied_at, checksum)`;
- `php tools/migrate.php up` 顺序执行 `sql/migration_*.sql` 中未应用者,记录版本与文件 checksum(防改旧脚本);
- 提供 `php tools/migrate.php down <version>`(可选,先支持正向即可);
- 首次基线收录现有 migration_*.sql;清理 `preliminary_data_bak_*` 用一条收敛迁移。
---
## 3. 功能设计(第二批)
### 3.1 AI/规则补全(P0,破局)
- 数据表:无需新表,落在 `preliminary_data` / 主表字段。
- 接口:`api/fragment/ai_suggest.php`
- 入参:`target_type / fragment_id / 已有字段`
- 出参:`suggestions:[{field, value, confidence, reason}]`
- 前端:硬/软碎片"AI 补全"按钮 → 弹窗展示建议列表 → 采纳/拒绝 → 回写 `hard_update/soft_update`。
- 过渡:权限/hook 式——**有千视 API 走 AI,无则走规则引擎**(手机归属地→工作地/国家;`cn_to_en` 已有能力复用)。
### 3.2 EDM 真实触达 + ROI 面板(P0/P1)
- EDM:`edm.php` 增 `发送/模板/任务`,`edm_export` 保持;发送回执写回 `system_logs` 或新 `edm_tasks`。
- ROI:dashboard 增加"渠道 ROI"卡片/图表(数据来自 `source_channel` × 商机状态 × 预估成交额),复用已引入的 ECharts。
### 3.3 线索状态机 + 跟进轨迹(P1)
- 新表 `leads(id, ref_table, ref_id, status[初访/跟进中/已商机/已成交/放弃], owner_user_id, pipeline...)`,或直接在 `companies/persons` 加 `lead_status`。
- `system_logs` 扩展 `follow_status`,形成按线索的时间线。
- 意向识别(`is_incomplete` 由 1→0、完整度晋升、EDM 打开/回复)→ 自动创建 lead 并推送 `owner_user_id`。
### 3.4 舆情监测 + 竞品参数对比 + 人脉图谱(P1/P2,差异化)
- 舆情:接入千视舆情能力 → `media_opinion` 真实成单页。
- 竞品对比:EAV 行转列,同行业 `company_products_attr_value` 对比表 → `competitor_data` 落地。
- 人脉图谱:`person/connections.php` 亲密度 → ECharts 关系图(graph)→ `person` 详情页增强。
---
## 4. 落地路线图(3 个批次)
> 每批独立可发布、可评审、可回滚。
### 批次 1 · 架构筑基(v1.0.51)
| 项 | 涉及文件 | 说明 |
|---|---|---|
| 迁移版本管理 | 新增 `tools/migrate.php`、`sql/schema_versions.sql`;收敛旧 migration | 先建基座 |
| 登录安全 | `login.php`(bcrypt 平滑迁移)、`auth.php`、新增 `security.php` | bcrypt + 限流 + session 加固(REV-1/REV-8) |
| CSRF Token | `auth/auth.php`/`session.php` + `common.js` | 写接口头校验(REV-2) |
| 统一 Api 基座 | 新增 `common/Api.php`;先迁 `fragment/hard_*` 或 `system/*` 一个模块试点 | 收敛样板 |
| 前端收敛 | `common.js` 拆表格/弹窗/分页 helper + 统一 `esc()` 转义 | 可增量(REV-3/C1) |
| 碎片来源可编辑 | `fragment/hard_update.php` 更新装列加入 `source_channel` | 一致性(REV-4) |
| prepared 卫生 | `soft_update.php:77` 等残余字符串拼参改占位符 | 卫生项(REV-6/REV-9) |
**验收**:①能 `up`/`down` 跑迁移;②新用户密码为 bcrypt、老用户登录后被平滑升级;③写接口带 CSRF Token 合法可过、缺失被拒;④至少 1 个模块接入 Api 基座且行为不变;⑤硬碎片来源可新增/修改;⑥统一 `esc()` 后抽查模块无未转义渲染(此需求取决于 C1 确认)。
### 批次 2 · 功能闭环(v1.0.52)
| 项 | 说明 |
|---|---|
| AI/规则补全落地 | `ai_suggest.php` + 前端弹窗(接千视 API 或规则兜底) |
| EDM 真实触达 | 模板/发送/回执 |
| ROI 面板 | dashboard 渠道 ROI 图表 |
### 批次 3 · 销售闭环 + 差异化(v1.0.53+)
| 项 | 说明 |
|---|---|
| 线索状态机 + 跟进时间线 | `leads` 表 + 自动流转 |
| 舆情监测 / 竞品参数对比 / 人脉图谱 | 差异化成单模块 |
| 索引 / 性能 / 导入即治理 | 打磨 |
---
## 5. 需要你拍板的决策(评审门槛)
1. **D5 关键**:AI 补全——是否已有千视 RAG/大模型 API 可接?若暂缺,**是否接受先用"规则式补全"过渡**?(决定批次 2 的 AI 项怎么落地)
2. **D4**:是否同意新增 `common/Api.php` 统一基座并"用到的先迁、存量不强制"?
3. **D2**:密码升级方案(bcrypt 平滑迁移)是否认可?(会改变存量用户密码存储格式)
4. **批次节奏**:是否按「批次1 架构筑基 → 批次2 功能闭环 → 批次3 差异化」推进?可只做其中某批次。
5. 优先级冲突时:**先保架构地基(批次1)还是先上能对外演示的功能(批次2)?**
6. **C2(评审 REV-5/12)**:手机/邮箱/企业名等**全局唯一性校验**遇到主表已有记录时,是保持"**阻断**新增"(当前行为)还是降级为"**提示但允许继续**"?(后者更贴合"碎片=待审线索"语义,但会让同一电话挂在多个主体下)
> 附:C1(前端转义是否已存在 XSS)需现场确认后再决定批次1「前端收敛」是否纳入 REV-3 修复。
> 评审意见请直接回复上表的决策项编号与结论(例如"D5 暂无AI,先规则补全;按批次1→2→3 推进")。通过后我按批次开始写代码。
---
## 6. 批次1 实现记录(v1.0.51 · 已实现并验证)
已拍板的批次1范围,本版本全部落地。服务器端验证通道:`ssh ubuntu@106.55.169.92` → docker `php:8.2-cli php -l`(95/95 通过)+ CSRF/bcrypt CLI 冒烟(ALL PASS)。
| 项 | 落地文件 | 验证 |
| --- | --- | --- |
| ①版本迁移 | `sql/schema_versions.sql`、`sql/migration_v1.0.51.sql`、`tools/migrate.php`(`up/status/down`、natsort、md5 checksum) | lint 通过 |
| ②登录安全 | bcrypt 平滑迁移(`api/auth/login.php`:旧 sha1 命中→`password_verify`→自动重写 bcrypt;`user_add/user_update` 新强度规则+`password_hash`)+ 限流/session 加固(`api/common/security.php`) | 冒烟 PASS |
| ③CSRF Token | 服务端 `csrfToken()/checkCsrf()`(`security.php`),GET 取 token(`auth/csrf.php` public)、写接口统一校验;前端 `common.js` httpPost 携带 `X-CSRF-Token`、`login.js` 登录页取 token | 冒烟 PASS(错误 token → 403) |
| ④统一基座+强制迁移 | `common/Api.php` `Api::boot(['public'/'super'/'module'/'permissions'])`,**全部 70 个 endpoint 存量强制迁移**(脚本转换,逐一审计无遗漏、无误删 include);`hard_common.php` 等纯 include 保留 | 全局 require 审计干净 |
| ⑤前端收敛 | `common.js` 新增 `esc` 别名(现即统一转义入口);统一 `escHtml` | — |
| ⑥REV-4 来源渠道可编辑 | `hard_update.php` 支持 `source_channel` + 前端补全弹窗新增来源渠道下拉(回显) | — |
| ⑦prepared 卫生 | `soft_update.php` 违规 `$pdo->query` 修为 prepared(REV-6);`analysis.php` 表名白名单(REV-9) | lint 通过 |
**明确延后(记录在案,建议下批次处理)**:
- REV-7:`analysis.php` 渠道详情 N+1(`LIMIT 10` 内子查询,量级可控,批内不动)。
- REV-3/C1:XSS 前端收敛——已提供统一 `esc()` 转义入口,但存量页面 JS 的逐个改逃逸需下批次;新写代码一律用 `esc()`。
- REV-5/12:手机/邮箱/企业名全局唯一性 **保持"阻断新增"**(已拍板)。
- REV-10:并发下企业重名竞态(可在 `company/add` 加唯一索引兜底,下批次)。
- 部署形态:确认长期部署目标为服务器 106.55.169.92;`config/database.php` 当前写死 `127.0.0.1/mysuperlink/...`,容器化部署需改为 env 注入(下批次随 docker-compose 落地)。
---
## 附录 A:与战略文档的关系
本《设计方案》是把战略文档第四部分(架构+功能优化)细化到"改哪些文件、怎么改、能否回滚、验收标准"的可执行层。两文档共用同一结论:**先补齐迁移/安全/样板三块地基,再用 AI 补全 + EDM + 线索流转 + ROI 兑现官网承诺,最后用舆情/竞品/人脉图谱做出差异化。**