Skip to content

开发检查清单

本页用于二开、插件开发和发版前自查。重点是多租户隔离、权益控制、插件兼容和移动端构建。

后端模块

新增或修改后端业务时:

  • Controller 只做请求接收、参数校验和调用 Service。
  • Service 负责编排业务、事务和事件,不直接拼接跨层查询。
  • Repository 负责数据访问,租户级查询必须使用 $this->query()
  • Model 只保留 ORM 映射、关联、访问器和修改器。
  • 租户级数据表必须包含 tenant_id,并建立必要索引。
  • 写操作需要考虑 gracefrozen 状态下的中间件拦截。
  • 需要套餐控制的功能,后端必须调用 TenantFeatureService::requireFeature()
  • 文件上传前调用配额校验,上传成功后消费配额,删除确认后释放配额。
  • 金额字段使用整数分,支付回调必须幂等。
  • 重要副作用通过事件 Listener 处理,例如通知、日志和缓存清理。

前端模块

新增平台端或租户端页面时:

  • API 封装放在 src/api/{module}.ts
  • 页面放在 src/views/{module}/index.vue
  • 复用分页、搜索和弹窗逻辑时优先使用 useListPageusePaginguseFormDialog
  • 按钮级权限使用 v-has-perm,不要只依赖路由隐藏。
  • 租户套餐功能入口使用 v-feature,并确保后端有同名守卫。
  • 动态菜单页面要确认后端菜单 component 与前端文件路径一致。
  • 租户端需要展示生命周期限制时,复用用户 store 中的 SaaS 状态。
  • 表单提交要处理重复点击,可使用现有锁函数或页面内 loading。

插件开发

插件提交前检查:

  • plugin.json 位于插件根目录,code 唯一且使用 kebab-case。
  • kind=app 必须声明 tenant.menuskind=plugin 可只提供配置面板或能力接口。
  • entitlement 与套餐授权 code 一致。
  • psr4 命名空间和目录匹配。
  • 插件路由不要手写 /tenantapi/{code} 前缀,框架会自动挂载。
  • 租户级表包含 tenant_id,Repository 使用 $this->query()
  • 菜单 code、权限 code、表名、路由名不能和其他插件冲突。
  • 数据库迁移可重复执行,失败时不会留下不可恢复的半安装状态。
  • 生命周期 hook 不承担表结构变更,表结构统一放迁移。
  • zip 包不包含 node_modules、缓存、构建产物、绝对路径或 ../
  • 有移动端页面时,manifest 声明 uniapp.pages,并提供对应源码目录。

移动端与装修

涉及 UniApp 或装修时:

  • 插件分包路径保持稳定,避免升级后破坏已发布链接。
  • uniapp.pages 中的 path 与插件 uniapp/ 源码实际路径一致。
  • 插件页面需要登录时,使用主壳已有认证和请求封装。
  • TabBar 只放高频入口,插件入口优先通过首页组件、导航宫格或插件中心暴露。
  • 装修组件字段要提供默认值,旧版本装修数据升级后也能渲染。
  • 插件装修组件需要后端补数据时,hydrator 要检查租户权益和数据边界。
  • 仅修改装修内容不需要移动端重新构建;新增分包页面或 TabBar 结构才需要构建。

多租户红线

以下情况必须在代码评审中拦截:

  • 租户业务直接使用 Db::table() 查询租户级表,却没有明确追加 tenant_id
  • Repository 绕过 $this->query() 直接使用 Model 静态查询。
  • 通过请求参数接收 tenant_id 并信任它。
  • 平台接口复用租户接口 token 或中间件。
  • 前端隐藏按钮但后端没有权限或功能校验。
  • 插件 API 只检查插件安装状态,没有检查租户权益和启用状态。
  • 文件删除失败时仍释放存储配额。
  • 支付回调未校验签名、金额、订单状态或重复通知。

本地验证命令

后端:

bash
cd server
composer test

只跑红线测试:

bash
cd server
./vendor/bin/phpunit tests/RedLine

平台前端:

bash
cd platform
pnpm type-check
pnpm test

租户前端:

bash
cd tenant
pnpm type-check
pnpm test

PC 前台和 UniApp:

bash
cd pc
pnpm build

cd ../uniapp
pnpm type-check
pnpm build:h5

插件前端同步:

bash
node scripts/sync-plugins.mjs --target platform
node scripts/sync-plugins.mjs --target tenant
node scripts/sync-plugin-uniapp.mjs

发版前检查

  • 数据库迁移和插件迁移已在空库、旧库各跑一次。
  • saas:install 在新环境可以完成。
  • 平台管理员可登录,租户管理员可登录。
  • 租户创建、续费、支付回调、生命周期扫描可用。
  • 套餐功能、插件授权、租户启用、RBAC 都能共同生效。
  • H5 或小程序构建至少成功一次。
  • CHANGELOG.md 和文档已同步更新。

基于 Apache-2.0 协议开源