12 KiB
CLAUDE.md
使用方式
开始任何任务前先阅读根目录 AGENTS.md。它是完整架构与开发规范的事实源,本文件是同一规则的执行摘要;二者冲突时先以实际代码核实,再修正文档。架构、接口契约或构建发布方式变化时,必须同步更新两个文件。
项目记忆
这是 Likeshop 单商户 B2C 商城免费企业版 v3.5.1,不是参考项目 php-amdj 的新技术栈:
server/:PHP 7.x + ThinkPHP 5.1 单体工程。- admin:
server/application/admin/中的服务端渲染后台,使用 Think 模板、Layui/Layui Admin、jQuery;没有独立 admin 前端工程。 - mobile:
uniapp/中的 Vue 2 + uni-app + Vuex + uView JavaScript 工程,面向 H5、微信小程序和 App。 - PC 商城:最新
php-b2cNuxt 2/Vue 2 源码位于pc/;server/public/pc/是生成部署目录。 server/public/mobile/:H5 编译产物,不是源码。- 当前业务代码没有可用自动化测试套件,也没有完整的前端 CLI 开发、lint 或 type-check 流程。
不要引入 Vue 3、TypeScript、Vite、Element Plus、Pinia、ThinkPHP 8 等参考项目约定,除非用户明确批准独立升级任务。
目录速记
server/application/admin/controller|logic|validate|view/:后台 HTTP、业务、校验和页面。server/application/api/controller|logic|validate|http/:移动端 API 与 token 中间件。server/application/common/model|logic|server|cache/:跨端公共能力。server/application/index/:站点根路径的 PC/mobile 选择。server/config/、server/route/:全局配置和显式路由。server/public/static/:后台与公共静态资源。server/public/install/db/like.sql:新安装数据库基线,默认表前缀ls_。uniapp/pages/:主包页面;uniapp/bundle/pages/:分包页面。uniapp/api/:业务接口封装;uniapp/utils/request.js:统一请求和响应拦截。uniapp/store/:Vuex;uniapp/components/:业务组件和本地 uView。uniapp/pages.json、uniapp/manifest.json:页面/分包与平台配置。docker/:旧版开发容器配置,仅作为环境参考。
禁止把功能实现写进 server/vendor/、server/thinkphp/、server/runtime/、真实 uploads、uniapp/unpackage/ 或压缩后的 server/public/mobile/。
请求链路
Mobile API
uniapp 页面 -> uniapp/api/*.js -> utils/request.js -> /api/<controller>/<action> -> API Login middleware -> ApiBase controller -> validate/logic -> common model/server
- 登录 token 使用
tokenheader;消费票据功能开启时,需登录接口还要求X-Consume-Token。 - controller 继承
ApiBase。 - 免登录 action 配置在
$like_not_need_login。 - 统一返回
code/msg/data/show/time。 code = 1成功,code = 0业务失败,code = -1登录失效。- 分页沿用
page_no/page_size,默认 15,最大 100。 - 新接口先添加/修改
uniapp/api/封装,页面不要直接拼完整 URL。 GET /api/account/captcha提供一次性图形验证码;发送短信的sms/send、user/send及账号密码登录account/login必须同时提交captcha_key与captcha。- admin 登录使用
admin/account/captcha获取一次性验证码,后台登录请求同样必须提交captcha_key与captcha。 - 密码传输统一使用
account/passwordKey获取短时公钥(API 和 admin 各自模块路径);密码字段以RSA:前缀密文提交,并携带password_key_id。服务端在 API/Admin 的 Login middleware 中解密后再进入 controller 校验和业务逻辑,密钥默认 120 秒且只消费一次。新增密码字段必须加入PasswordCryptoService及三端公共请求层的字段白名单。 server/.env的[consume_token] enabled控制用户 API 的附加消费票据校验,默认关闭;ttl_seconds被限制在 1 到 600 秒。PC/uni-app 从POST /api/account/consumeToken签发短时、会话绑定且 TTL 内可复用的票据,统一请求层负责缓存和注入。开启前先部署新 PC/mobile 构建,多实例环境使用共享缓存。
Admin
Layui 模板 -> 同 action AJAX/表单 -> AdminBase controller -> validate/logic -> model/server -> _success/_error
- admin 使用 Session 登录,Login/Auth 中间件负责登录和角色权限。
- action 常同时处理 GET 渲染和 AJAX;沿用邻近 controller 的
isAjax()+fetch()模式。 - 页面在
application/admin/view/<controller>/<action>.html,静态资源在public/static/。 - 交互优先复用 Layui table/form/layer 和
like.ajax,不要为单页引入新 SPA 框架。 - 新增菜单或受控 action 时同步角色权限、缓存逻辑和安装 SQL 中的菜单/权限数据。
安全基线
config/app.php的app_debug默认true(未配置.env时调试模式开启)、app_trace默认false;生产部署在.env显式[app] app_debug = false关闭调试;判断开关用filter_var(..., FILTER_VALIDATE_BOOLEAN),.env解析值是字符串,不能=== true严格比较。- trace 输出的
debug.request.header会掩码 token/X-Consume-Token/authorization/cookie/set-cookie。 admin/upgrade/index|choosePage|handleUpgrade|addUpdatePkgLog与admin/upgrade/fixAncestorRelation仅超管(admin id=1)可用;存量环境执行server/public/install/db/security_3.5.1.sql移除菜单 245 授权并清权限缓存。- 提现申请在事务内锁行重读余额 + 条件原子
setDec,checkMoney()拒绝 0/负数/非数字且最低提现金额未配置时拒绝。 - 远程下载经
check_url_safety()(仅 http/https,拒绝回环/私网/链路本地/云元数据地址),安全 HTTP 助手限时 10s/30s、不跟随重定向、150MB 上限并用CURLOPT_RESOLVE固定 IP;download_file()、海报合成、check_file_exists()远程分支统一走该助手。 - 微信 URL 验证仅在
echostrGET 分支做 token/timestamp/nonce 排序 SHA1 +hash_equals校验,POST 回调仍走 EasyWeChat。
PC 商城边界
管理后台不是 PC 商城。PC 前台源码位于 pc/,后端接入位于以下位置:
server/route/route.php的/pc/:any。server/application/index/controller/Index.php的桌面模板选择。- admin 的 PC 配置入口和数据库开关;PC 构建使用 Nuxt 2 的
npm run generate,发布脚本会将dist/复制到server/public/pc/。
PC 页面需求直接在 pc/ 源码中实现,必须保持现有 API、账号、支付、SEO 和 /pc/ history 部署约定;不要修改生成后的 server/public/pc/ 代替源码。
PC 本地构建/启动约定:
- 已验证 Node
16.20.2+ npm8.19.4;Nuxt 2/webpack 4 不要优先使用 Node 24/npm 11。 - 在
pc/使用npm ci --legacy-peer-deps --no-audit --no-fund安装。不要混用 npm 与 pnpm;pnpm 的node_modules/.pnpm/会使 npm 产生错误的ERESOLVE依赖树。 npm run dev启动开发服务,默认访问http://localhost:1800/pc/。npm run generate生成静态产物到pc/dist/;确认发布后再运行bash autoRelease.sh复制到server/public/pc/。npm run build+npm run start是 Nuxt Node 生产运行方式,不替代静态发布。旧package-lock.json如含registry.nlark.com/旧淘宝源,需先修复锁文件下载地址。
后端开发规则
- 保持 PHP 7.x / ThinkPHP 5.1 兼容,不使用 PHP 8 专属语法。
- 遵循当前
controller -> validate/logic -> model/server分层。 - controller 只处理 HTTP 上下文、校验和响应,复杂业务进入 logic。
- 公共模型/逻辑/第三方能力优先放
application/common/;新增前搜索已有实现。 - 项目历史上公共服务目录名是
server/,不要在普通任务中批量改名。 - API 用
ApiBase::_success/_error,admin 用AdminBase::_success/_error,不要自造返回结构。 - 业务配置优先通过
ConfigServer和配置表,不硬编码环境值。 - 多表写入遵循邻近 logic 的事务模式。
- 数据表名不手写
ls_,让 ThinkPHP 的 prefix 配置处理。 - 当前无 migration 框架。表结构变更要同时考虑
like.sql新安装基线和存量环境升级步骤。
Mobile 开发规则
- 使用现有 Vue 2 Options API、Vuex、uView 和 JavaScript 风格。
- 新页面注册到
pages.json;按体积和业务归入主包或bundle分包。 - 复用
api/、utils/、Vuex、mixin 和现有组件,避免页面内重复基础能力。 - 使用 uni-app 条件编译处理 H5、
MP-WEIXIN、APP-PLUS差异。 - 登录、支付、分享、定位、WebView 变更必须逐平台检查。
- H5 history base 是
/mobile/;修改它时同步manifest.json、后端路由和 Nginx。 - 平台 AppID、SDK key、支付/微信/短信配置不得写入文档、输出或新硬编码。
uniapp/package.json 没有标准 uni-app CLI 工具链。编译使用匹配版本的 HBuilderX:
- H5 输出:
uniapp/unpackage/dist/build/web/。 - 微信小程序/App:在 HBuilderX 对应发行入口构建并用目标平台工具验证。
npm run build只是执行autoRelease.sh:它会删除server/public/mobile/,再复制已有 web 构建。它不是编译命令,普通源码任务禁止顺手运行。
任务执行流程
- 识别改动端:admin、mobile、API、PC 接入、数据库或部署。
- 阅读入口及邻近实现,追踪到 controller、logic、model/server 和表/配置。
- 确认接口参数、返回码、登录/权限和调用端,再开始修改。
- 用最小范围实现,并同步所有真实调用方;不做无关升级或格式化。
- 表结构变更同时规划新装与存量升级;权限变更同步菜单/角色数据。
- mobile 变更检查页面注册与多平台分支;发布产物仅在明确发布任务中更新。
- 执行可用验证,明确报告无法运行的检查。
跨端开发计划至少写明:用户入口、API、权限、数据/配置、兼容性、验证方式、是否交付编译产物。当前 PC 迁入已完成首轮,后续架构演进应先固化环境和关键业务基线,再补测试、拆分非破坏性 build/deploy,之后才做公共逻辑收敛和 PHP/ThinkPHP 升级。该路线不是自动授权。
安全与变更边界
- 不提交或复述
.env、数据库密码、token、证书、keystore、AppID、地图/支付/短信/微信/存储密钥。 - 仓库已有敏感资产也不要擅自删除、轮换或打印;需要处理时先确认影响。
- 不修改版权/授权逻辑,不移除版权标识。
- 不执行
composer update、数据库安装/写入、线上发布、清缓存、删除构建目录或 Git 提交,除非用户明确要求。 - 不覆盖用户已有修改,不回退无关文件。
server/public/mobile/、server/runtime/、uploads 和uniapp/unpackage/都不是常规源码修改目标。
验证速记
服务端可用时:
composer installcomposer validate --no-check-publishphp think listphp -l path/to/changed.php
Admin 至少手测相关登录/权限、列表、提交、弹层和刷新;API 至少覆盖相关的未登录、已登录、参数错误、成功分支;mobile 至少在目标平台运行,涉及平台能力时补测 H5/微信小程序/App。
当前桌面环境可能没有 PHP、Composer 或 HBuilderX CLI。工具不可用时如实说明,不能声称测试通过。Docker Compose 锁定旧版依赖且包含历史路径,启动前必须检查,不默认用于生产。
文档同步
新增顶级工程、引入 PC 源码、升级框架、改变统一 API/认证/分页、移动端构建目录或部署路径时,同一个任务中更新 AGENTS.md 与本文件。只写实际仓库可验证的信息,不把商业版或规划能力描述为当前实现。