Files
huangjingfen/docs/license-commercial-auth-license_replacement_execution_94b55501.plan.md

250 lines
11 KiB
Markdown
Raw Normal View History

---
name: license replacement execution
overview: 把现有合规替换方案落成可执行推进计划:按阶段改动、测试、提交,优先处理常用 out/supplier/admin 路径,客服、企业微信和库存链路最后处理。
todos:
- id: baseline
content: 固定基线依赖清单、测试记录模板和核心接口响应基线
status: completed
- id: out-token
content: 实现 AccessTokenService 并替换 out 外部账号 token 解析依赖
status: completed
- id: search-builder
content: 实现 SearchConditionBuilder 并替换通用 SearchDaoTrait 依赖
status: completed
- id: base-controller
content: 新增 AppBaseController 并按 out、supplier、admin 分入口迁移
status: completed
- id: license-endpoints
content: 清理授权/版权接口为自有系统信息,不返回伪造授权状态
status: completed
- id: config-closeout
content: 移除 config/app.php 的 BaseAuth 配置依赖并全库收口搜索
status: completed
- id: deferred-modules
content: 最后迁移企业微信 DAO、库存链路和未使用客服模块
status: completed
isProject: false
---
# 合规替换执行计划
## 执行原则
-`pro_v3.5.1/.cursor/plans/compliant-license-dependency-replacement.plan.md` 为源方案,不做绕过授权、伪造授权或替换加密商业文件的改动。
- 每个阶段独立完成:改动、自动化检查、手工接口回归、测试记录、单独提交。
- 阶段未通过验收不得进入下一阶段;不得把多个阶段混在同一个提交里。
- 客服模块、企业微信 DAO、库存扣减/回滚当前项目未使用,全部移到最后阶段处理。
## 阶段 0基线与测试记录模板
目标:先固定当前状态,避免后续把已有问题误判为新回归。
改动范围:
- `pro_v3.5.1/.cursor/plans/compliant-license-dependency-replacement.plan.md`
- 可新增一份阶段测试记录文档,例如 `docs/license-replacement-test-record.md`
执行内容:
- 记录 `BaseAuth``BaseController``auth_crmeb`、版权接口依赖清单。
- 记录当前可访问接口的基线响应:`/adminapi/login/info``/adminapi/menusList``/adminapi/home/header``/adminapi/jnotice`
- 确认当前项目没有可直接运行的 root PHPUnit/Composer test 脚本,把自动化检查缺口写入记录。
- 建立统一测试记录格式命令、环境、接口、身份、关键参数、HTTP 状态码、业务 `status`、关键字段、结果。
验收与提交:
- 基线清单完整。
- 没有代码行为改动。
- 单独提交:`docs(plan): record license replacement baseline`
## 阶段 1替换外部账号 token 解析
目标:优先移除常用、低风险的 `BaseAuth::parseToken()` 依赖,不处理客服 token。
改动范围:
- 新建 `app/services/auth/AccessTokenService.php`
- 修改 `app/services/out/OutAccountServices.php`
- 按项目现有测试条件补充或记录测试缺口;若能引入 PHPUnit再补 `tests/hjf/AccessTokenServiceTest.php`
执行内容:
- 复用 `crmeb\utils\JwtAuth``CacheService` 的 token bucket 语义。
- 保持外部账号 token 格式、过期、缓存失效、禁用账号语义兼容。
- `app/services/kefu/LoginServices.php` 只记录为最后阶段遗留,不在本阶段修改。
手工回归:
- 外部账号获取 token。
- 外部账号刷新 token。
- 使用有效 token 访问受保护接口。
- 伪造 token、过期 token、禁用/退出后的 token 均失败。
- 后台核心 smoke 接口不受影响。
验收与提交:
- 所有外部账号回归通过。
- `kefu` 未被修改。
- 单独提交:`feat(auth): add local access token service` 和/或 `refactor(out): remove BaseAuth token parsing dependency`
## 阶段 2替换通用搜索条件构建
目标:移除常用列表查询中 `SearchDaoTrait``BaseAuth::________` 的依赖。
改动范围:
- 新建 `app/services/dao/SearchConditionBuilder.php`
- 修改 `crmeb/traits/SearchDaoTrait.php`
- 若能补测试:`tests/hjf/SearchConditionBuilderTest.php`
执行内容:
- 模型存在 `searchXxxAttr` 搜索器的字段进入 `withSearch`
- 普通合法字段保留为直接查询条件。
- 非法字段过滤,避免拼接 SQL。
- `timeKey` 等既有特殊逻辑保持兼容。
- 企业微信 `app/dao/work/*Dao.php` 暂不处理,最后阶段统一迁移。
手工回归:
- 商品列表:关键词、分类、上下架状态、分页、空结果。
- 订单列表:订单号、用户、状态、时间范围、分页。
- 用户列表:手机号/昵称、等级/标签、状态、分页。
- 财务列表:时间范围、类型、分页、空结果。
- 非法字段请求不返回 500不产生异常 SQL。
验收与提交:
- 常用列表筛选行为与基线一致。
- 后台核心 smoke 接口不受影响。
- 单独提交:`feat(dao): add local search condition builder``refactor(dao): remove BaseAuth search dependency`
## 阶段 3引入并分入口切换 AppBaseController
目标:用自有控制器基类替换常用入口对 `crmeb\basic\BaseController` 的继承。
改动范围:
- 新建 `app/common/controller/AppBaseController.php`
- 低风险入口:`app/controller/out/OutAccount.php`
- 中风险入口:`app/controller/supplier/AuthController.php`
- 高风险入口:`app/controller/admin/AuthController.php`
- 暂不处理:`app/controller/kefu/*`
执行内容:
- `AppBaseController` 提供 `request``success()``fail()``validate()``initialize()` 调用。
- 响应结构保持与 `app('json')` 一致。
- 先切 `out` 并提交,再切 `supplier` 并提交,最后切 `admin` 并提交。
手工回归:
- `out`:登录/鉴权、token 失效、核心受保护接口。
- `supplier`:登录信息、商品列表、订单列表、上传图片、无权限访问失败。
- `admin``/adminapi/login/info``/adminapi/menusList``/adminapi/home/header``/adminapi/jnotice`、表单校验失败响应。
- 上传、导出、表单生成接口单独确认响应结构。
验收与提交:
- 三类入口各自回归通过后分别提交。
- 建议提交:`feat(controller): add app base controller``refactor(out): migrate out controller to app base controller``refactor(supplier): migrate supplier auth controller to app base controller``refactor(admin): migrate admin auth controller to app base controller`
## 阶段 4清理版权和授权接口
目标:删除或隐藏原厂授权申请/购买入口,只保留自有系统信息和版权配置,不返回伪造授权状态。
改动范围:
- `route/admin.php`
- `route/api.php`
- `route/supplier.php`
- 常用控制器:`app/controller/admin/Common.php``app/controller/api/v1/Common.php``app/controller/supplier/Common.php`
- 新建 `app/services/system/LocalCopyrightService.php`
- `app/controller/kefu/Common.php` 最后阶段处理
执行内容:
- `check_auth``auth``auth_apply``crmeb_*` 相关入口改为合规的自有系统信息或隐藏。
- `saveCopyright()``getCopyright()` 改为读取/保存本地配置。
- 不返回 `AUTHORIZED`、授权天数、原厂授权成功等伪造字段。
手工回归:
- 后台不再展示申请 CRMEB 授权/购买版权入口。
- 页脚版权、系统版本、备案等展示正常。
- 授权/版权接口返回自有系统信息或明确禁用结果。
- 后台核心 smoke 接口不受影响。
验收与提交:
- 合规字段确认通过。
- 前端页面无 500 或空白页。
- 单独提交:`refactor(license): replace copyright endpoints with local system metadata`
## 阶段 5移除配置依赖并做全库收口
目标:常用自有代码不再依赖 `BaseAuth``auth_crmeb`
改动范围:
- `config/app.php`
- 全库搜索确认剩余引用
执行内容:
- 移除 `use crmeb\basic\BaseAuth`
- 删除或替换 `'auth_crmeb' => BaseAuth::AUTH_CRMEB`
- 全库确认 `BaseAuth|BaseController|auth_crmeb|__z6uxy|__qsG` 的剩余引用只属于最后阶段暂不使用模块或已授权保留模块。
手工回归:
- `php think` 能启动或明确记录当前环境授权基线问题。
- admin/supplier/out 核心接口 smoke 通过。
- 不再触发基础类授权异常。
验收与提交:
- 搜索结果附到测试记录。
- 常用路径依赖收口完成。
- 单独提交:`chore(config): remove BaseAuth app config dependency`
## 阶段 6最后迁移暂不使用模块
目标:处理低使用率/高风险模块,避免阻塞前期常用路径上线。
### 6.1 企业微信 DAO 搜索
改动范围:
- `app/dao/work/WorkMemberDao.php`
- `app/dao/work/WorkWelcomeDao.php`
- `app/dao/work/WorkGroupMsgSendResultDao.php`
- `app/dao/work/WorkClientDao.php`
- `app/dao/work/WorkGroupMsgTaskDao.php`
验收:
- 未启用企业微信时返回明确错误。
- 启用环境可查客户、成员、群发、欢迎语列表。
- 非法字段不拼接 SQL。
- 单独提交:`refactor(work): remove BaseAuth enterprise wechat dao dependency`
### 6.2 库存扣减/回滚
改动范围:
- 新建 `app/services/product/StockMutationService.php`
- 修改 `app/dao/BaseDao.php`
- 若可补测试:`tests/hjf/StockMutationServiceTest.php`
验收:
- 并发下单不产生负库存。
- 库存不足不创建异常订单。
- 取消/退款正确回滚库存和销量。
- 规格库存、商品总库存、活动库存分别验证。
- 单独提交:`feat(stock): add local stock mutation service``refactor(dao): remove BaseAuth stock mutation dependency`
### 6.3 客服模块
改动范围:
- `app/services/kefu/LoginServices.php`
- `app/controller/kefu/AuthController.php`
- `app/controller/kefu/Login.php`
- `app/controller/kefu/Common.php`
验收:
- 当前项目未启用客服时,接口返回明确错误,不触发基础类授权依赖。
- 如业务方启用客服,再回归客服登录、会话列表、订单查询、聊天记录、上传图片。
- 过期 token、伪造 token、禁用客服账号均失败。
- 单独提交:`refactor(kefu): remove BaseAuth dependencies from unused kefu module`
## 阶段门禁
每个阶段提交前必须满足:
- 改动只包含当前阶段文件。
- 自动化检查已执行或明确记录缺口。
- 相关手工接口回归已记录。
- 后台核心 smoke 没有退化。
- 剩余风险和未处理模块已记录。
## 回滚策略
- 每个阶段一个或多个独立提交,失败时优先回滚当前阶段提交。
- 阶段 3 按 `out``supplier``admin` 分入口回滚。
- 阶段 4 如前端未同步,保留兼容字段,但不得返回伪造原厂授权状态。
- 阶段 6 库存链路必须预发验证后上线,失败时回滚 `BaseDao.php``StockMutationService`