平台概览
ZHYC 快速开发平台是一套企业级低代码快速开发底座,服务于后台管理系统、行业 SaaS 平台、
业务中台、移动办公和第三方系统集成。平台不是单一管理端模板,而是由核心平台、认证中心、
开放 API 网关、后台管理端、移动端和代码生成能力组成的一体化框架。
初学者阅读路线
| 阶段 |
先看什么 |
要掌握什么 |
完成标志 |
| 了解平台 |
平台概览、总体架构、工程结构。 |
知道认证中心、核心平台、开放 API 网关、后台前端分别负责什么。 |
能说清一个后台请求从页面到 Controller、Service、Mapper、数据库的链路。 |
| 跑通本地 |
开发环境、快速启动。 |
会准备 JDK、Maven、Node、MySQL,会复制环境变量并按顺序启动服务。 |
后台页面可以打开,登录后可以访问个人工作台。 |
| 开发业务 |
数据库与租户、后端开发、后台前端开发。 |
会设计业务表、写接口、封装 API client、做列表和表单页面。 |
完成一个带查询、新增、编辑、删除的基础业务模块。 |
| 使用平台能力 |
低代码开发、工作流开发、开放 API 开发、扩展模块。 |
会用数据表建模生成基础代码,会给业务接审批,会开放接口给第三方。 |
业务模块能接入权限、租户、审批、开放 API 和审计。 |
| 交付上线 |
权限与安全、验证与质量门禁、部署发布。 |
知道哪些检查项是阻断项,知道如何记录验证命令和剩余风险。 |
交付说明包含变更范围、验证结果、未覆盖风险和回滚建议。 |
新手建议:不要一开始就改低代码生成器或工作流引擎。先按“数据库表 → 后端接口 → 前端页面 → 权限菜单 → 验证”的顺序做一个简单业务,
再把同样的业务接入低代码、工作流和开放 API。
面向业务快速交付
通过数据源、表模型、字段模型、页面模型和代码生成,把业务模块从表结构到前后端页面打通。
面向企业平台治理
提供租户、组织、用户、角色、菜单、按钮、数据权限、审计日志、密钥中心和系统参数。
面向开放集成
开放 API 网关独立负责 API Key、签名校验、OAuth2 Token 校验、限流和调用审计。
首期核心能力
| 能力域 |
说明 |
关键模块 |
| 系统管理 |
租户、组织、用户、角色、菜单、字典、参数、密钥、审计。 |
zhyc-module-system |
| 低代码中心 |
数据源、表模型、字段模型、表关系、页面模型、模板和生成记录。 |
zhyc-module-lowcode |
| 工作流中心 |
通过平台工作流门面集成 Flowable,覆盖模型、定义、任务、审批和监控。 |
zhyc-module-workflow |
| 开放平台 |
开发者应用、API Key、OAuth2 客户端、API 目录、签名策略、限流和审计。 |
zhyc-module-openapi、zhyc-openapi-gateway |
| AI 能力中心 |
模型供应商、模型配置、AI 应用、提示词、智能体、知识库、会话、调用审计、配额和安全策略。 |
zhyc-module-ai,后续预留 zhyc-ai-gateway |
| 采购样板 |
作为端到端验收样板,验证业务表单、流程审批、权限、租户和开放 API。 |
zhyc-module-purchase |
低代码组件详细使用说明
| 组件 |
操作步骤 |
输入与输出 |
验收点 |
| 数据源组件 |
新增数据源;选择数据库类型;配置连接地址、账号和密钥引用;执行连接测试;保存后用于表结构加载。 |
输入为数据源编码、类型、连接配置、密钥引用;输出为可用数据源记录。 |
连接失败有明确提示;密码不明文回显;数据源编码全局唯一。 |
| 方言能力组件 |
选择数据源后读取方言能力;展示 DDL、字段映射、分页支持状态;能力不足时禁用相关按钮。 |
输入为数据库类型;输出为能力清单和可用字段类型映射。 |
MySQL、达梦等方言能力提示准确;不支持能力不能继续生成。 |
| 物理表加载组件 |
点击加载业务表;后端读取元数据;前端展示可导入表;过滤系统、流程、开放平台和可视化表。 |
输入为数据源 ID;输出为业务表列表、表注释、字段摘要。 |
不会加载 sys_*、openapi_*、visual_* 等内部表;失败提示包含数据源检查建议。 |
| 表模型组件 |
新建或导入模型;填写模型编码、模型名称、物理表名、数据源和状态;保存草稿后允许字段配置。 |
输入为模型基础信息;输出为表模型记录。 |
模型编码符合驼峰或平台命名规范;物理表名符合小写下划线规范。 |
| 字段模型组件 |
维护字段编码、名称、类型、长度、精度、必填、主键、自增、字典和页面属性;字段排序决定生成页面展示顺序。 |
输入为字段元数据;输出为字段模型集合。 |
主键唯一;必填和长度能映射到前端表单规则和 SQL 字段;类型映射正确。 |
| 关系模型组件 |
选择主表和子表;配置关联字段、展示字段、级联保存/删除策略;用于生成主子表页面和后端保存逻辑。 |
输入为主模型、子模型、关联字段;输出为表关系定义。 |
关联字段类型一致;主子表保存事务完整;级联策略明确。 |
| 页面模型组件 |
配置列表列、查询项、表单项、详情项、按钮、权限编码、排序和展示规则。 |
输入为模型字段和页面配置;输出为页面模型。 |
查询字段、列表字段、表单字段可独立控制;权限按钮与后端权限编码一致。 |
| 生成模板组件 |
按后端、前端、SQL、接口文档等分类维护模板;模板读取模型、字段、关系和页面配置变量。 |
输入为模板内容和模板变量;输出为可渲染模板。 |
模板变量缺失时能失败提示;模板生成代码符合项目分层和注释规范。 |
| 代码生成组件 |
选择模型、生成范围和输出策略;先预览文件;校验覆盖风险;确认后执行生成。 |
输入为模型编码、模板集合、输出目录和覆盖策略;输出为生成文件列表。 |
默认不覆盖人工文件;生成前有预览,生成后有记录和文件哈希。 |
| 生成记录组件 |
记录每次生成批次、模型、模板、文件、状态、错误和内容哈希;支持按模型和状态查询。 |
输入为生成执行结果;输出为生成记录和文件明细。 |
失败能定位到模板或文件;成功记录可用于回溯和比对。 |
在线演示
如果只是想先体验框架功能,可以直接访问公开演示环境。演示环境覆盖后台管理、系统管理、低代码中心、工作流中心、开放平台、
AI 能力中心、全文检索和安全防护中心等核心入口。
使用提醒:演示环境数据可能定期重置,请勿录入真实业务数据、敏感信息、生产密钥或个人隐私数据。
本地开发、测试和正式环境仍应按环境配置、初始化脚本和密钥中心规则独立配置。
总体架构
平台采用“核心平台模块化单体 + 独立认证中心 + 独立开放 API 网关”的首期架构。
这种形态可以保持业务开发效率,同时为统一认证和开放接口流量保留安全边界。
新手理解架构的四条线
| 链路 |
从哪里开始 |
经过哪些模块 |
调试重点 |
| 后台管理链路 |
后台 Vue 页面点击按钮。 |
zhyc-base-vue → 核心平台 Controller → Service → Repository/Mapper → MySQL。 |
看浏览器 Network、后端接口日志、SQL 条件和权限编码。 |
| 登录认证链路 |
访问后台页面或 Token 失效。 |
后台前端 → 认证中心 → Token/JWK → 核心平台安全上下文。 |
看回调地址、Token 过期时间、刷新令牌和 401 响应。 |
| 开放接口链路 |
第三方系统调用开放 API。 |
开放 API 网关 → 签名/OAuth2 校验 → API 授权 → 核心平台业务接口 → 调用审计。 |
看应用状态、API 授权、签名字段、时间戳、nonce 和限流结果。 |
| 工作流审批链路 |
业务单据点击提交审批。 |
业务 Service → 工作流门面 → Flowable → 任务中心 → 审批动作 → 业务状态回写。 |
看业务主键绑定、流程定义版本、当前任务处理人和审批记录。 |
运行边界
zhyc-platform-app:核心平台启动入口,组合系统、低代码、工作流、采购等业务模块。
zhyc-auth-server:统一认证中心,负责 OAuth2、OIDC、SSO 和 Token 签发。
zhyc-openapi-gateway:开放 API 入口,负责签名、OAuth2 校验、限流、审计和路由。
zhyc-base-vue:后台管理端和低代码控制台。
zhyc-base-uniapp:移动端工程,面向 H5、小程序和 App 端预留。
模块依赖原则
zhyc-common 放统一响应、异常、租户、审计、数据库方言和公共契约。
- 业务模块可以依赖
zhyc-common,不得直接依赖其他业务模块内部实现。
- 工作流业务只调用平台工作流门面,不直接依赖 Flowable API。
- 开放 API 调用统一进入网关,不绕过签名、Token、限流和审计链路。
技术基线
| 层级 |
技术栈 |
说明 |
| 后端核心 |
Java 21、Spring Boot 4.1、MyBatis、Apache Shiro 2.2.1 |
Spring Boot 4 使用 Jakarta 体系,Shiro 版本统一锁定。 |
| 认证中心 |
Spring Authorization Server、OAuth2、OIDC、JWK |
认证身份映射到核心平台 Shiro 权限上下文。 |
| 工作流 |
Flowable 8 |
通过平台门面集成,业务模块保持解耦。 |
| 后台前端 |
Vue 3、Vite、TypeScript、Ant Design Vue、Pinia、Vue Router |
当前按现有 Ant Design Vue 壳实现,预留 Vben Admin 迁移边界。 |
| 数据库 |
MySQL 首期深度支持 |
已生成 PostgreSQL、Oracle、SQL Server、达梦初始化脚本。 |
| AI 能力 |
模型供应商适配、AI 应用、提示词、知识库、智能体、配额和安全策略 |
首期以内置模块落地,后续可抽出独立 AI 网关。 |
工作流组件详细使用说明
| 组件 |
操作步骤 |
输入与输出 |
验收点 |
| 流程分类组件 |
新增分类编码和名称;绑定业务域;流程模型选择分类;统计和权限按分类扩展。 |
输入为分类编码、名称、排序和状态;输出为可选流程分类。 |
分类停用后不能新建模型;历史模型分类仍可展示。 |
| 流程模型列表组件 |
查询模型列表;按分类和状态筛选;支持新增、设计、编辑、发布和停用。 |
输入为筛选条件;输出为流程模型列表。 |
按钮权限生效;模型状态决定可执行操作。 |
| 可视化设计器组件 |
拖拽开始、审批、条件、结束节点;连接节点;配置节点名称、处理人、表单和策略;保存设计。 |
输入为节点、连线、节点属性;输出为流程设计 JSON 或可部署模型数据。 |
必须有开始和结束节点;审批节点处理人不为空;连线无断点和孤立节点。 |
| 表单绑定组件 |
选择流程模型和业务表单;配置业务主键、详情路由、流程变量和状态回写字段。 |
输入为模型 ID、表单编码、业务表、业务键字段;输出为绑定关系。 |
待办点击能打开正确业务详情;流程状态能回写业务单据。 |
| 流程定义组件 |
发布流程模型生成定义版本;展示版本、状态和发布时间;支持启停。 |
输入为流程模型;输出为流程定义版本。 |
新实例使用最新启用版本;历史实例继续使用原定义。 |
| 任务列表组件 |
按待办、已办、发起、抄送、监控分类查询任务;支持关键字和时间筛选;点击进入详情。 |
输入为任务查询条件;输出为任务列表和分页信息。 |
任务只展示当前用户可处理范围;监控入口需要单独权限。 |
| 审批动作组件 |
打开审批弹窗;填写意见;选择审批、驳回或撤回;调用工作流门面;刷新任务和业务状态。 |
输入为任务 ID、动作、审批意见、业务键;输出为任务处理结果。 |
动作二次确认;重复处理同一任务会被拒绝;审批记录完整。 |
| 审批记录组件 |
按业务键或流程实例查询审批历史;在详情页按时间展示节点、处理人、动作和意见。 |
输入为业务键或流程实例 ID;输出为审批记录列表。 |
记录顺序正确;撤回、驳回、通过等动作有明确标识。 |
开发环境
开发环境的目标不是“能启动一次”,而是让后端、认证中心、前端、数据库和脚本都使用同一套版本基线。
初学者先把环境固定下来,再开始排查业务问题,否则很容易把版本问题误判成代码问题。
新手环境准备顺序
| 顺序 |
检查项 |
命令或位置 |
通过标准 |
| 1 |
确认 Java 版本。 |
rtk java -version |
使用 Java 21,不用 Java 17 临时替代。 |
| 2 |
确认 Maven 可用。 |
rtk mvn -version 或 IDE 内置 Maven。 |
Maven 能读取 zhyc-base-server/pom.xml。 |
| 3 |
确认 Node 环境。 |
rtk node -v、rtk npm -v |
Node 20+,前端依赖可安装。 |
| 4 |
确认 MySQL 连接。 |
docs/release/phase1.env.local |
库名、账号、密码、端口正确,账号具备建表和查询权限。 |
| 5 |
确认浏览器。 |
Chrome 或 Chromium。 |
能打开后台、查看 Network、保存截图用于验收。 |
基础软件
- JDK 21 LTS
- Maven 3.9+
- Node.js 20+
- MySQL 8+
- Chrome 或 Chromium,用于前端页面验证和截图检查
本地目录
.
├── db/
├── docs/
├── zhyc-base-server/
├── zhyc-base-vue/
└── zhyc-base-uniapp/
注意:本仓库规范要求所有 shell 命令使用 rtk 前缀。正式验证以 Java 21 为准,
不得把 JDK17 临时通过等同于 Java 21 基线通过。
环境变量样例
本地环境变量样例位于 docs/release/phase1.env.example。
rtk cp docs/release/phase1.env.example docs/release/phase1.env.local
# 按本机 MySQL、认证中心密钥和本机地址修改 docs/release/phase1.env.local
快速启动
首次启动按“数据库 → 种子数据 → 认证中心 → 核心平台 → 前端”的顺序执行。不要先启动前端再补数据库,
否则页面会因为认证、菜单、权限或数据缺失反复跳转或报空数据。
启动顺序和失败判断
| 步骤 |
为什么先做 |
常见失败 |
处理方式 |
| 初始化数据库 |
后端启动依赖基础表、租户、菜单、权限和客户端配置。 |
连接失败、账号无权限、脚本未执行。 |
先跑 --check,确认环境变量和数据库账号。 |
| 生成种子数据 |
登录、菜单、角色、权限需要基础数据。 |
登录后无菜单或无权限。 |
检查种子脚本是否执行到当前库。 |
| 启动认证中心 |
后台和核心平台需要统一认证。 |
前端回调失败、Token 无法签发。 |
检查 OAuth2 客户端、回调地址和 JWK 配置。 |
| 启动核心平台 |
后台页面的接口都由核心平台提供。 |
接口 500、数据源连接失败。 |
看平台启动日志、数据库连接和 Flyway/脚本状态。 |
| 启动前端 |
最后访问页面并联调接口。 |
页面跳认证、接口跨域、菜单为空。 |
看浏览器 Network,确认 API 地址、认证地址和 Token 状态。 |
1. 初始化数据库
rtk node zhyc-base-server/scripts/phase1-db-initializer.mjs --env-file docs/release/phase1.env.local --plan
rtk node zhyc-base-server/scripts/phase1-db-initializer.mjs --env-file docs/release/phase1.env.local --check
rtk node zhyc-base-server/scripts/phase1-db-initializer.mjs --env-file docs/release/phase1.env.local --emit-mysql
2. 生成系统基础种子数据
rtk node zhyc-base-server/scripts/phase1-seed-initializer.mjs --env-file docs/release/phase1.env.local --plan
rtk node zhyc-base-server/scripts/phase1-seed-initializer.mjs --env-file docs/release/phase1.env.local --materialize --output /tmp/zhyc-system-seed.local.sql
3. 启动认证中心
rtk env JAVA_HOME=<JDK21_HOME> \
'/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/bin/mvn' \
-f zhyc-base-server/pom.xml -pl zhyc-auth-server spring-boot:run
4. 启动核心平台
rtk node zhyc-base-server/scripts/run-platform-local.mjs --env-file docs/release/phase1.env.local
5. 启动后台管理端
rtk npm --prefix zhyc-base-vue install
rtk npm --prefix zhyc-base-vue run dev
默认后台访问地址为 http://127.0.0.1:5173。若前端总是跳转统一认证,优先检查本地访问令牌、
刷新令牌、认证中心地址、前端回调地址和令牌过期时间。
新手实战:供应商分类模块
本节用“供应商分类”作为练习业务。它足够简单,可以覆盖数据库、后端接口、前端列表表单、权限菜单、低代码建模和验证;
又不会一开始引入复杂审批、附件、开放 API 等额外难度。初学者可以按本节顺序做一遍,再迁移到真实业务模块。
实战目标
| 目标 |
要交付什么 |
验收标准 |
| 数据库 |
新增 pur_supplier_category 表和必要索引。 |
表、字段、索引都有中文注释,包含 tenant_id、审计字段和逻辑删除字段。 |
| 后端接口 |
提供分页、详情、新增、修改、删除、启用、停用接口。 |
接口有权限控制、参数校验、租户隔离、统一响应和审计记录。 |
| 前端页面 |
提供查询栏、表格、状态标签、新增/编辑弹窗和删除确认。 |
页面有加载、空数据、失败、保存中状态;按钮权限生效。 |
| 权限菜单 |
新增菜单和按钮权限。 |
无权限用户看不到按钮,直接调用接口也会被拒绝。 |
| 验证 |
执行后端测试、前端类型检查、页面手工验收。 |
新增、编辑、删除、启停、跨租户访问和无权限访问都有验证结论。 |
字段设计样例
| 字段 |
类型 |
业务含义 |
页面控件 |
校验规则 |
category_code |
VARCHAR(64) |
供应商分类编码,同一租户内唯一。 |
a-input |
必填,2-64 个字符,建议只允许字母、数字、下划线和短横线。 |
category_name |
VARCHAR(100) |
供应商分类名称,用于列表、下拉选择和详情展示。 |
a-input |
必填,不能超过 100 个字符,提交前 trim。 |
parent_id |
BIGINT |
父级分类 ID,空值表示一级分类。 |
a-tree-select |
不能选择自己或自己的子级作为父级。 |
sort_no |
INT |
排序号,值越小越靠前。 |
a-input-number |
0-9999,默认 100。 |
status |
VARCHAR(20) |
状态,启用或停用。 |
a-select、a-tag |
必填,只允许 ENABLED、DISABLED。 |
remark |
VARCHAR(500) |
备注说明。 |
a-textarea |
选填,最多 500 个字符。 |
权限编码样例
| 权限编码 |
对应按钮/接口 |
后端动作 |
前端展示 |
purchase:supplier-category:query | 查询、刷新、分页 | 分页和详情接口 | 菜单可见,列表可加载 |
purchase:supplier-category:create | 新增 | 创建接口 | 显示新增按钮 |
purchase:supplier-category:update | 编辑 | 更新接口 | 显示编辑按钮 |
purchase:supplier-category:delete | 删除 | 逻辑删除接口 | 显示删除按钮并二次确认 |
purchase:supplier-category:enable | 启用 | 状态切换为启用 | 停用记录显示启用按钮 |
purchase:supplier-category:disable | 停用 | 状态切换为停用 | 启用记录显示停用按钮 |
后端接口清单
| 方法 |
路径 |
请求对象 |
返回对象 |
注意事项 |
GET | /api/purchase/supplier-categories | SupplierCategoryQueryRequest | PageResult<SupplierCategoryResponse> | 按租户、关键字、状态分页查询。 |
GET | /api/purchase/supplier-categories/{id} | 路径 ID | SupplierCategoryResponse | 按租户 + ID 查询,已删除数据不返回。 |
POST | /api/purchase/supplier-categories | SupplierCategoryCreateRequest | SupplierCategoryResponse | 校验同租户编码唯一。 |
PUT | /api/purchase/supplier-categories/{id} | SupplierCategoryUpdateRequest | SupplierCategoryResponse | 校验版本、状态和父级合法性。 |
DELETE | /api/purchase/supplier-categories/{id} | 路径 ID | 空结果 | 逻辑删除;有子级或被供应商引用时拒绝。 |
PATCH | /api/purchase/supplier-categories/{id}/status | StatusChangeRequest | SupplierCategoryResponse | 只允许启用、停用状态切换。 |
低代码建模配置
| 配置项 |
建议值 |
影响范围 |
| 模型编码 | supplierCategory | 后端类名、前端文件名、权限编码。 |
| 模型名称 | 供应商分类 | 菜单标题、页面标题、接口说明。 |
| 物理表名 | pur_supplier_category | DDL、Mapper、SQL 查询。 |
| 列表字段 | 编码、名称、父级、状态、排序号、更新时间。 | 表格列和导出字段。 |
| 查询字段 | 关键字、状态、更新时间范围。 | 查询栏控件和分页条件。 |
| 表单字段 | 编码、名称、父级、排序号、状态、备注。 | 新增/编辑弹窗和校验规则。 |
| 按钮权限 | 查询、新增、编辑、删除、启用、停用。 | 前端按钮、后端权限注解、菜单权限。 |
验收清单
- 使用有权限账号可以完成查询、新增、编辑、删除、启用、停用。
- 使用无新增权限账号看不到新增按钮,直接调用新增接口返回权限拒绝。
- 同一租户内重复分类编码保存失败,不同租户可以使用相同编码。
- 删除一级分类时,如果存在子分类或供应商引用,接口返回业务错误。
- 表格空数据、加载中、保存中、接口失败都有可见状态。
- 后端测试、前端类型检查、页面手工验收结果写入交付说明。
工程结构
看工程结构时先分清“运行入口”和“业务模块”。运行入口负责把模块组装起来,业务模块只负责自己的领域能力。
初学者开发新业务时,不要把代码直接塞进启动模块,应先判断归属模块或新建独立模块。
新手找文件方法
| 想做什么 |
先找哪里 |
再看哪里 |
不要做什么 |
| 新增后台接口 |
对应业务模块的 controller、service、dto。 |
repository、mapper、权限常量。 |
不要在 zhyc-platform-app 里写业务 Controller。 |
| 新增后台页面 |
zhyc-base-vue/src/views。 |
src/api、src/router、权限工具。 |
不要在页面里直接拼后端 URL。 |
| 新增数据库表 |
db/ 初始化脚本或补丁脚本。 |
低代码表模型、Mapper 查询、字段注释。 |
不要只改实体不补 SQL 脚本。 |
| 新增工作流能力 |
zhyc-module-workflow 和业务模块工作流门面调用点。 |
流程绑定、任务中心、审批记录。 |
不要在业务模块直接调用 Flowable 内部 API。 |
| 开放第三方接口 |
zhyc-openapi-gateway 和 zhyc-module-openapi。 |
API 目录、授权、签名、审计。 |
不要绕过网关直接暴露内部管理接口。 |
后端模块
| 模块 |
职责 |
zhyc-common | 统一响应、异常、租户、审计、模块描述、数据库方言、工作流门面等公共契约。 |
zhyc-auth-server | OAuth2/OIDC、SSO、Token 签发、第三方登录扩展。 |
zhyc-openapi-gateway | API Key、签名校验、OAuth2 Token 校验、限流、开放 API 审计。 |
zhyc-platform-app | 核心平台启动入口,运行期组合各业务模块。 |
zhyc-module-system | 租户、组织、用户、角色、菜单、字典、参数、审计、监控。 |
zhyc-module-lowcode | 数据源、表模型、字段模型、页面模型、代码生成。 |
zhyc-module-workflow | 工作流门面、Flowable 集成、流程任务、审批记录。 |
zhyc-module-openapi | 开发者应用、API Key、OAuth2 客户端映射、API 目录、授权、调用审计。 |
zhyc-module-purchase | 采购申请、采购订单、首期验收样板业务。 |
zhyc-module-message、zhyc-module-file、zhyc-module-job | 消息、文件和在线作业扩展能力。 |
zhyc-module-cms、zhyc-module-visual、zhyc-module-i18n、zhyc-module-search | 内容、报表大屏、国际化和全文检索扩展能力。 |
推荐包结构
com.zhyc.<module>
├── api
├── controller
├── service
├── service.impl
├── repository
├── mapper
├── domain
├── dto
├── convert
├── permission
├── event
├── config
└── constant
模块开发组件总览
| 组件 |
推荐位置 |
使用场景 |
落地要求 |
| 领域实体 |
domain |
承载数据库实体或业务聚合根,例如用户、角色、采购申请、流程模型。 |
字段用业务语义命名,所有字段必须有中文注释;租户业务对象必须包含 tenantId。 |
| 请求/响应 DTO |
dto |
Controller 入参、出参、分页查询条件、保存命令、状态变更命令。 |
创建、更新、查询、返回对象分开命名,不复用数据库实体直接对外暴露。 |
| Controller |
controller |
后台管理接口、开放接口 BFF、轻量查询接口。 |
只做参数校验、权限控制、调用 Service 和统一响应,不写业务逻辑。 |
| Service |
service / service.impl |
业务动作、状态流转、事务边界、权限/租户边界、工作流门面调用。 |
公开方法必须表达完整业务动作,例如 createRequest、submitRequest、approveTask。 |
| Repository |
repository |
隔离 Service 与 MyBatis/SQL Provider 细节,便于替换持久化实现。 |
新增模块默认使用 Repository;例外必须说明原因。 |
| Mapper / SQL Provider |
mapper / mybatis |
执行数据库查询、分页、租户过滤、逻辑删除过滤和动态条件组合。 |
显式列字段,禁止 SELECT *;动态 SQL 必须处理空条件和租户条件。 |
| Convert |
convert |
实体、DTO、页面响应、导入导出对象之间转换。 |
复杂转换集中封装,避免 Controller 或 Service 出现重复字段拷贝。 |
| Permission / Data Scope |
permission |
按钮权限、数据范围、组织范围、角色范围和租户隔离补充判断。 |
必须与菜单权限编码一致,后端校验不能只依赖前端隐藏按钮。 |
| Event |
event |
审计、消息通知、业务状态变更、异步扩展点。 |
事件内容不得携带密码、Token、密钥等敏感字段。 |
开放 API 组件详细使用说明
| 组件 |
操作步骤 |
输入与输出 |
验收点 |
| 开发者应用组件 |
创建应用;填写应用编码、名称、负责人和状态;分配 API 权限;绑定 API Key 或 OAuth2 客户端。 |
输入为应用基础信息;输出为应用档案。 |
应用编码唯一;禁用应用后所有调用被拒绝。 |
| API Key 组件 |
为应用创建 Key;生成访问标识和密钥引用;配置有效期;支持轮换和禁用。 |
输入为应用编码和有效期;输出为访问标识、密钥引用和状态。 |
密钥不明文持久化展示;轮换后旧 Key 按策略失效。 |
| OAuth2 客户端组件 |
登记认证中心客户端;绑定开发者应用;配置授权范围、回调地址和状态。 |
输入为客户端 ID、应用编码、授权范围、回调地址;输出为客户端映射。 |
非法回调地址不能保存;禁用后令牌访问开放 API 被拒绝。 |
| API 目录组件 |
新增 API 分组和接口;维护路径、方法、版本、鉴权方式、请求响应说明和权限编码。 |
输入为 API 元数据;输出为 API 目录记录。 |
路径和方法组合唯一;请求/响应说明可供门户展示。 |
| API 发布组件 |
选择目录 API;填写版本;配置发布状态;记录发布时间和发布人。 |
输入为 API 目录、版本、状态;输出为可调用 API 版本。 |
下线版本不能新调用;历史调用审计仍可查询。 |
| API 授权组件 |
选择应用和 API;分配调用权限、方法范围和有效期;保存授权记录。 |
输入为应用、API、权限范围;输出为授权关系。 |
未授权 API 返回权限拒绝;授权过期后自动拒绝。 |
| 签名策略组件 |
配置签名算法、参与字段、时间窗口、nonce 存储策略;网关按策略校验。 |
输入为请求头、请求体、时间戳、nonce、密钥;输出为签名校验结果。 |
重放请求被拒绝;时间戳超窗被拒绝;签名错误写审计。 |
| 限流策略组件 |
配置应用、租户、接口维度限流;设置 QPS、日配额或错误熔断阈值;网关执行。 |
输入为调用上下文和限流规则;输出为放行或限流拒绝。 |
超过阈值返回稳定错误码;调用审计记录限流结果。 |
| 调用审计组件 |
网关在调用结束后写入应用、API、结果、耗时、错误码、请求时间和追踪 ID。 |
输入为网关调用上下文;输出为审计记录。 |
成功、失败、限流、鉴权失败都可查询;敏感字段已脱敏。 |
后端开发
后端开发先记住一个原则:Controller 只接收请求和返回响应,Service 负责业务动作,Repository/Mapper 负责数据访问。
新手写接口时可以按下面的步骤从 DTO 开始,最后再补权限、租户、异常和测试。
新手开发一个后端业务接口
| 步骤 |
要写的内容 |
示例命名 |
检查点 |
| 1. 定义 DTO |
创建查询、创建、更新、详情返回对象,字段写中文注释和校验规则。 |
PurchaseRequestCreateRequest、PurchaseRequestResponse |
入参不直接复用实体;必填、长度、枚举值都有校验。 |
| 2. 定义领域对象 |
创建业务实体或聚合对象,表达数据库字段和核心业务状态。 |
PurchaseRequest |
租户业务对象包含 tenantId;状态字段有枚举说明。 |
| 3. 写 Repository/Mapper |
封装新增、修改、详情、分页、逻辑删除等数据访问。 |
PurchaseRequestRepository、PurchaseRequestMapper |
显式列字段;查询、更新、删除都带租户和逻辑删除条件。 |
| 4. 写 Service |
实现创建、更新、删除、提交、发布等完整业务动作。 |
createRequest、updateRequest、submitRequest |
写操作有事务;非法状态流转会被拒绝;异常有稳定错误码。 |
| 5. 写 Controller |
绑定路由、权限注解、参数校验,调用 Service 并返回统一响应。 |
PurchaseRequestController |
Controller 不写业务规则,不拼 SQL,不返回裸对象。 |
| 6. 补测试和审计 |
覆盖成功、失败、无权限、跨租户、重复提交等场景。 |
PurchaseRequestServiceTest |
关键操作有审计;测试能暴露权限和租户问题。 |
后端常见文件怎么写
| 文件类型 |
主要内容 |
初学者容易错 |
正确做法 |
| Controller |
路由、权限、参数校验、统一响应。 |
在 Controller 里查数据库、判断复杂业务规则。 |
把业务动作交给 Service,Controller 保持薄层。 |
| Service |
状态流转、事务、权限边界、工作流门面、审计事件。 |
只做简单转发,导致业务规则散落在 Mapper 或前端。 |
每个 public 方法表达一个完整业务动作。 |
| Repository |
封装业务需要的数据访问方法。 |
Service 直接依赖多个 Mapper,后续难以替换和测试。 |
新增模块默认使用 Repository 隔离持久化细节。 |
| Mapper/SqlProvider |
SQL 字段、动态条件、分页、租户和逻辑删除。 |
使用 SELECT *,动态 SQL 漏空值和租户条件。 |
显式列清单,所有条件先判断空值,统一追加租户过滤。 |
| Convert |
实体和 DTO 转换。 |
在多个地方重复 set 字段,改字段时遗漏。 |
集中写转换方法,复杂字段写清来源。 |
| Enum/Constant |
状态、类型、权限编码、字典编码。 |
页面、后端、SQL 各写一套魔法字符串。 |
统一定义编码和中文说明,前后端保持一致。 |
分层规则
| 层级 |
允许做什么 |
禁止做什么 |
| Controller |
参数接收、基础校验、权限注解、调用 Service、返回统一响应。 |
写业务规则、拼 SQL、直接处理流程引擎对象。 |
| Service |
表达完整业务动作、事务边界、状态流转、权限和租户边界。 |
拼接 SQL 字符串、吞异常、跨模块访问内部实现。 |
| Repository / Mapper |
隔离数据访问和 MyBatis 细节,显式列字段,处理分页、租户、逻辑删除。 |
绕过租户条件、无条件更新删除、返回不稳定结构。 |
| DTO / Domain |
表达入参、出参、命令和领域对象,字段有中文业务注释。 |
用魔法字符串表达状态、暴露敏感字段。 |
接口约定
- 所有对外接口必须返回统一响应结构,禁止直接返回裸字符串、裸 Map 或框架异常。
- 后台管理接口必须配置 Shiro 权限标识,权限编码要能映射到菜单或按钮权限。
- 租户业务查询、更新、删除必须带租户上下文。
- 敏感字段禁止写入明文日志,包括密码、密钥、Token、身份证、手机号完整值。
REST 接口命名速查
| 动作 |
HTTP 方法 |
路径示例 |
Service 方法建议 |
权限动作 |
| 分页查询 | GET | /api/module/resources | pageResources | query |
| 详情查询 | GET | /api/module/resources/{id} | getResource | query |
| 新增 | POST | /api/module/resources | createResource | create |
| 修改 | PUT | /api/module/resources/{id} | updateResource | update |
| 删除 | DELETE | /api/module/resources/{id} | deleteResource | delete |
| 启停 | PATCH | /api/module/resources/{id}/status | changeResourceStatus | enable / disable |
| 导出 | GET | /api/module/resources/export | exportResources | export |
| 导入 | POST | /api/module/resources/import | importResources | import |
后端组件使用细则
| 开发组件 |
怎么使用 |
关键边界 |
| 统一响应组件 |
Controller 统一返回平台响应对象,业务数据放在 data 中,错误通过稳定错误码和用户可读消息表达。 |
不得把 Java 异常类名、SQL 异常、第三方原始响应直接透出给前端或开放 API。 |
| 参数校验组件 |
创建、更新、状态变更 DTO 使用 Jakarta Validation 校验必填、长度、格式和枚举值。 |
复杂业务校验放 Service;Controller 不写跨字段业务判断。 |
| 权限注解组件 |
后台接口按菜单或按钮权限编码绑定 Shiro 权限,例如 system:user:query、lowcode:table:save。 |
前端按钮隐藏只是体验优化,后端权限必须独立生效。 |
| 租户上下文组件 |
从统一上下文读取当前 tenantId,写入新增数据,查询/更新/删除都带租户条件。 |
禁止写死 master 或默认租户;平台级全局表例外必须明确说明。 |
| 事务组件 |
跨多表写入、状态流转、审批提交、发布/撤回操作必须在 Service 层声明事务边界。 |
只读查询不扩大事务;外部接口调用和数据库事务组合时要考虑失败补偿。 |
| 分页组件 |
列表查询统一接收 pageNo、pageSize、排序和筛选条件,返回统一分页结构。 |
分页大小必须有上限,避免一次加载过多数据。 |
| 审计日志组件 |
新增、修改、删除、启停、发布、审批等关键动作记录操作者、租户、业务主键、结果和耗时。 |
日志中对密钥、Token、手机号等敏感字段脱敏。 |
| 字典/枚举组件 |
状态、类型、来源等字段优先使用枚举或字典,前后端展示值保持一致。 |
禁止在页面和后端分散写魔法字符串。 |
后端组件详细使用说明
| 组件 |
操作步骤 |
输入与输出 |
验收点 |
| 统一响应组件 |
在 Controller 中接收 Service 返回的业务对象;成功时包装为统一成功结构;业务失败抛出平台业务异常,由全局异常处理转换为统一错误结构。 |
输入为 DTO、分页对象或简单结果;输出必须包含 success、code、message、data、timestamp。 |
接口状态码、业务码、用户可读消息稳定;前端无需识别 Java 异常。 |
| 参数校验组件 |
在创建/更新/查询 DTO 上声明必填、长度、格式、范围;Controller 接口启用校验;跨字段校验放入 Service 私有方法。 |
输入为请求 DTO;输出为通过校验的命令对象或统一校验错误。 |
空值、超长、非法枚举、非法金额、非法日期均能给出明确提示。 |
| 权限注解组件 |
按菜单和按钮动作配置权限编码;Controller 方法绑定查询、新增、编辑、删除、发布等权限;批量操作不能复用弱权限。 |
输入为当前登录主体和接口权限编码;输出为允许访问或权限拒绝。 |
无权限账号访问接口返回权限拒绝;前端按钮隐藏与后端权限保持一致。 |
| 租户上下文组件 |
从认证上下文读取租户;新增数据自动写入租户;查询条件注入租户;更新和删除按租户 + 主键双条件执行。 |
输入为登录上下文和业务查询条件;输出为当前租户范围内的数据。 |
跨租户主键不能查询、更新或删除;列表和详情均受租户隔离保护。 |
| 事务组件 |
写操作在 Service public 方法声明事务;把状态变更、明细保存、审批记录、消息事件纳入同一业务事务或补偿链路。 |
输入为业务命令;输出为提交后的业务结果或回滚后的错误。 |
任一关键写入失败时数据不出现半成功;重复提交有幂等或状态判断。 |
| 分页组件 |
DTO 接收 pageNo、pageSize、排序和筛选;Service 规范化分页;Mapper 只查询当前页和总数。 |
输入为分页查询请求;输出为 total、pageNo、pageSize、records。 |
页码越界、页大小过大、空结果都表现稳定;分页查询不返回全表数据。 |
| 审计日志组件 |
在新增、编辑、删除、启停、发布、审批、密钥轮换等动作完成后记录审计;失败动作记录失败原因摘要。 |
输入为操作者、租户、模块、动作、业务主键、结果和耗时;输出为审计日志记录。 |
能根据业务单号和操作者追溯操作;敏感字段已脱敏或不落库。 |
| 字典/枚举组件 |
后端定义枚举或字典编码;DTO 字段说明值域;前端使用同一编码渲染标签和筛选项。 |
输入为状态编码或类型编码;输出为稳定编码和中文展示名。 |
新增状态时后端、前端、SQL、文档同步更新;不存在硬编码散落。 |
典型接口骨架
/**
* 查询业务列表。
*
* <p>按当前租户和查询条件分页返回业务数据,接口必须绑定菜单查询权限。</p>
*/
@RequiresPermissions("module:resource:query")
public ApiResult<PageResult<ResourceResponse>> page(ResourceQueryRequest request) {
return ApiResult.success(resourceService.page(request));
}
模块测试命令
rtk env JAVA_HOME=<JDK21_HOME> \
'/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/bin/mvn' \
-f zhyc-base-server/pom.xml -pl <module> -am test
后台前端开发
后台管理端位于 zhyc-base-vue,使用 Vue 3、Vite、TypeScript、Ant Design Vue、
Pinia 和 Vue Router。页面开发优先复用现有布局、API client、权限指令和状态处理模式。
新手先掌握的前端概念
| 概念 |
在哪里用 |
怎么理解 |
上手动作 |
| API client |
src/api |
页面调用后端接口的唯一入口,负责 URL、方法、参数和返回类型。 |
先给业务模块建 types.ts 和 index.ts。 |
| 页面状态 |
views 页面组件 |
包括查询条件、列表数据、分页、加载中、错误信息、弹窗开关、表单模型。 |
每个页面先列出这些状态,再写模板。 |
| 表格列 |
a-table 的 columns |
决定列表展示字段、宽度、对齐、状态渲染和操作按钮。 |
先写编码、名称、状态、创建时间、操作列。 |
| 表单规则 |
a-form 的 rules |
让用户在提交前看到必填、长度、格式和范围错误。 |
每个必填字段都写 required 和中文提示。 |
| 权限按钮 |
新增、编辑、删除、导入、导出、发布按钮。 |
前端只负责隐藏或禁用,真正安全由后端权限保证。 |
按钮权限编码和后端 Controller 保持一致。 |
| 反馈提示 |
message、a-alert、a-popconfirm。 |
让用户知道正在加载、保存成功、保存失败、危险操作后果。 |
每个接口失败都要有错误提示,危险操作都要二次确认。 |
目录约定
zhyc-base-vue/src
├── api/ # API client 和类型
├── router/ # 路由定义
├── utils/ # 认证、权限、上下文等工具
└── views/ # 业务页面
页面开发要求
- 页面不得直接拼接后端 URL,必须走
src/api 封装。
- 请求、响应和页面状态必须具备 TypeScript 类型。
- 新增、修改、删除、导出、发布等按钮必须绑定权限。
- 表单必须声明 Ant Design Vue 校验规则、触发方式和错误提示。
- 页面必须具备加载、失败、空数据状态。
- 删除、禁用、发布、撤回等危险操作必须二次确认。
开发一个业务功能的前端落地流程
| 步骤 |
要做什么 |
产物 |
注意事项 |
| 1. 定义接口类型 |
在 src/api/<module>/types.ts 定义查询参数、列表记录、详情、创建、更新和状态枚举。 |
QueryParams、RecordItem、CreateCommand、UpdateCommand。 |
字段必须写中文注释;金额、状态、时间、权限字段要说明来源和展示规则。 |
| 2. 封装 API client |
在 src/api/<module>/index.ts 统一封装列表、详情、新增、修改、删除、发布、导出等请求。 |
listXxx、getXxx、createXxx、updateXxx、deleteXxx。 |
页面不拼 URL;请求参数和返回值都要带 TypeScript 类型。 |
| 3. 配置路由和菜单 |
新增页面路由,配置中文标题、权限编码、菜单搜索关键字。 |
业务页面入口和可搜索菜单项。 |
路由权限、按钮权限和后端 Shiro 权限编码保持一致。 |
| 4. 编写查询栏 |
用 a-input-search、a-select、a-range-picker 组合查询条件。 |
可重置、可分页的查询请求。 |
查询条件变化后页码回到 1;避免重复并发请求。 |
| 5. 编写列表表格 |
用 a-table 声明列、行主键、加载态、分页、空数据和操作列。 |
业务列表页。 |
长文本用省略和 Tooltip;状态列用统一字典映射。 |
| 6. 编写新增/编辑表单 |
用 a-modal 或 a-drawer 承载 a-form,声明表单模型和校验规则。 |
创建、编辑、详情查看能力。 |
打开前初始化,关闭后清理;保存按钮必须防重复提交。 |
| 7. 编写操作按钮 |
新增、编辑、删除、发布、导出等按钮绑定权限和二次确认。 |
可控的业务动作入口。 |
危险操作使用 a-popconfirm 或 Modal.confirm;失败信息要可读。 |
| 8. 验证页面状态 |
覆盖加载中、空数据、接口失败、校验失败、无权限、保存成功、删除成功。 |
可交付页面。 |
执行类型检查和构建,确认桌面宽度下不重叠、不遮挡。 |
前端控件选型和属性说明
| 控件 |
适用场景 |
常用属性 |
常用事件 |
校验和边界 |
a-input |
编码、名称、联系人、短文本字段。 |
v-model:value、placeholder、maxlength、allow-clear、disabled。 |
@pressEnter、@change、@blur。 |
编码类字段限制长度和字符集;名称类字段 trim 后提交;只读详情用 disabled 或文本展示。 |
a-input-search |
列表页关键词搜索、菜单搜索。 |
v-model:value、placeholder、enter-button、allow-clear、loading。 |
@search、@change。 |
搜索时重置页码;空字符串按清空条件处理;搜索中禁用重复触发。 |
a-textarea |
备注、说明、审批意见、失败原因。 |
v-model:value、maxlength、show-count、auto-size。 |
@change、@blur。 |
备注通常限制 500 字以内;审批意见按业务动作决定是否必填;禁止提交纯空白内容。 |
a-input-number |
金额、排序号、数量、超时时间、重试次数。 |
v-model:value、min、max、precision、step、addon-after。 |
@change、@blur。 |
金额必须声明精度;数量不得小于 0;排序号建议正整数;提交前处理 null。 |
a-select |
状态、类型、字典、单选关联对象。 |
v-model:value、options、placeholder、allow-clear、show-search、filter-option。 |
@change、@search、@dropdownVisibleChange。 |
枚举选项必须来自常量或字典;未知值要有兜底展示;远程搜索要做防抖。 |
a-tree-select |
组织、部门、菜单、区域等树形选择。 |
v-model:value、tree-data、field-names、tree-default-expand-all、allow-clear。 |
@change、@select。 |
节点禁用状态由后端或权限决定;选择组织时注意数据范围和租户隔离。 |
a-cascader |
地区、分类、层级业务类型。 |
v-model:value、options、field-names、change-on-select、show-search。 |
@change。 |
提交时明确传末级编码还是全路径;编辑回填要保证路径完整。 |
a-date-picker |
单个日期、截止日期、生效日期。 |
v-model:value、format、value-format、show-time、disabled-date。 |
@change、@openChange。 |
接口统一传后端约定格式;截止日期用 disabled-date 限制非法范围。 |
a-range-picker |
创建时间、更新时间、业务发生时间范围查询。 |
v-model:value、format、value-format、show-time、allow-clear。 |
@change、@calendarChange。 |
查询接口拆成 startTime 和 endTime;结束时间按后端约定补齐到日末或秒级。 |
a-switch |
启用/停用、是否默认、是否公开等二值状态。 |
v-model:checked、checked-value、un-checked-value、checked-children、un-checked-children。 |
@change。 |
直接改状态前要确认是否需要二次确认;失败后回滚原值。 |
a-radio-group |
选项少且互斥的类型选择,如性别、审批方式、发布范围。 |
v-model:value、options、button-style、disabled。 |
@change。 |
选项超过 4 个优先改用 a-select;枚举值不得硬编码在多个页面。 |
a-checkbox-group |
多选标签、功能开关集合、授权范围。 |
v-model:value、options、disabled。 |
@change。 |
提交空数组和未选择要区分;授权范围类字段必须由后端再次校验。 |
a-upload |
附件、图片、导入文件。 |
file-list、action、headers、before-upload、max-count、accept。 |
@change、@remove、@preview。 |
校验文件类型和大小;上传请求携带认证头;失败要清理临时文件状态。 |
a-table |
业务列表、选择列表、明细列表。 |
row-key、columns、data-source、loading、pagination、row-selection。 |
@change、@resizeColumn。 |
必须设置稳定行主键;分页、排序、筛选统一回写查询参数;操作列固定宽度。 |
a-form |
新增、编辑、查询高级筛选、配置页。 |
model、rules、layout、label-col、wrapper-col。 |
validate()、resetFields()、clearValidate()。 |
必填、长度、格式、范围必须前端提示;提交前调用 validate;关闭弹窗清理校验状态。 |
a-modal |
短表单、确认、轻量配置。 |
v-model:open、title、confirm-loading、width、destroy-on-close。 |
@ok、@cancel。 |
保存中锁定确定按钮;复杂长表单优先用抽屉;关闭时避免残留旧数据。 |
a-drawer |
详情、日志、复杂配置、关联数据查看。 |
v-model:open、title、width、placement、destroy-on-close。 |
@close。 |
宽度按内容控制,建议桌面 520 到 720;打开时加载详情,关闭时清理当前记录。 |
a-popconfirm |
删除、停用、撤回等单行危险操作。 |
title、ok-text、cancel-text、placement。 |
@confirm、@cancel。 |
动作不可逆时文案必须写清影响;批量危险操作使用 Modal.confirm。 |
a-tag |
状态、类型、来源、审批结果。 |
color、closable。 |
@close。 |
颜色来自统一状态映射;未知编码展示“未知”而不是空白。 |
a-tooltip |
长文本省略、图标按钮说明、字段补充说明。 |
title、placement、mouse-enter-delay。 |
无强制事件。 |
不要把关键业务信息只放在 Tooltip;表格长文本仍要保留可复制能力。 |
a-alert |
接口失败、配置缺失、能力不可用、权限不足说明。 |
message、description、type、show-icon、closable。 |
@close。 |
错误文案面向用户,不暴露 Java 异常类名、SQL 或密钥信息。 |
字段类型到前端控件映射
| 字段类型/业务语义 |
推荐控件 |
列表展示 |
表单校验 |
查询方式 |
| 编码、名称、短文本 | a-input | 普通文本,长文本加省略和 Tooltip。 | 必填、长度、字符集。 | a-input-search 关键字。 |
| 备注、说明、审批意见 | a-textarea | 详情页展示,列表不建议展示完整内容。 | 长度上限,审批意见按动作决定必填。 | 通常不作为查询条件。 |
| 状态、类型、字典 | a-select | a-tag 颜色和文案映射。 | 必填,值域来自字典或枚举。 | a-select 单选或多选。 |
| 金额、数量、排序号 | a-input-number | 格式化数字或金额。 | 最小值、最大值、精度。 | 按范围查询时拆成最小值和最大值。 |
| 日期、时间 | a-date-picker / a-range-picker | 按统一格式展示。 | 必填、不能早于/晚于指定日期。 | 范围查询,提交为开始和结束字段。 |
| 组织、部门、树形分类 | a-tree-select | 展示名称,必要时展示完整路径。 | 禁止选择自己或无权限节点。 | 按节点 ID 或编码查询。 |
| 附件、图片、导入文件 | a-upload | 文件名、大小、状态、预览入口。 | 文件类型、大小、数量。 | 按文件名或业务主键查询。 |
| 是否启用、是否默认 | a-switch | a-tag 或开关状态。 | 失败后回滚原值。 | a-select 查询更清晰。 |
表单控件规则模板
const formRules: Record<string, Rule[]> = {
code: [
{ required: true, message: '请输入业务编码', trigger: 'blur' },
{ min: 2, max: 64, message: '业务编码长度为 2-64 个字符', trigger: 'blur' },
],
name: [
{ required: true, message: '请输入业务名称', trigger: 'blur' },
{ max: 100, message: '业务名称不能超过 100 个字符', trigger: 'blur' },
],
status: [
{ required: true, message: '请选择状态', trigger: 'change' },
],
effectiveDate: [
{ required: true, message: '请选择生效日期', trigger: 'change' },
],
};
业务页面控件组合示例
<template>
<section class="module-page">
<a-card title="业务管理" :bordered="false">
<template #extra>
<a-space wrap>
<a-input-search
v-model:value="query.keyword"
placeholder="请输入编码或名称"
allow-clear
:loading="loading"
@search="handleSearch"
/>
<a-select
v-model:value="query.status"
placeholder="状态"
allow-clear
:options="statusOptions"
style="width: 140px"
@change="handleSearch"
/>
<a-range-picker
v-model:value="query.createdRange"
value-format="YYYY-MM-DD HH:mm:ss"
show-time
@change="handleSearch"
/>
<a-button @click="resetQuery">重置</a-button>
<a-button type="primary" @click="openCreate">新增</a-button>
</a-space>
</template>
<a-alert v-if="errorMessage" :message="errorMessage" type="error" show-icon closable />
<a-table
row-key="id"
:columns="columns"
:data-source="records"
:loading="loading"
:pagination="pagination"
@change="handleTableChange"
>
<template #bodyCell="{ column, record }">
<a-tag v-if="column.key === 'status'" :color="statusMap[record.status]?.color">
{{ statusMap[record.status]?.label || '未知' }}
</a-tag>
<a-space v-if="column.key === 'action'">
<a @click="openEdit(record)">编辑</a>
<a-popconfirm title="确认删除该记录?" @confirm="handleDelete(record)">
<a class="danger-link">删除</a>
</a-popconfirm>
</a-space>
</template>
</a-table>
</a-card>
<a-modal
v-model:open="formOpen"
:title="formTitle"
:confirm-loading="saving"
destroy-on-close
@ok="handleSubmit"
@cancel="closeForm"
>
<a-form ref="formRef" :model="formModel" :rules="formRules" layout="vertical">
<a-form-item label="业务编码" name="code">
<a-input v-model:value="formModel.code" maxlength="64" allow-clear />
</a-form-item>
<a-form-item label="业务名称" name="name">
<a-input v-model:value="formModel.name" maxlength="100" allow-clear />
</a-form-item>
<a-form-item label="状态" name="status">
<a-select v-model:value="formModel.status" :options="statusOptions" />
</a-form-item>
<a-form-item label="排序号" name="sortNo">
<a-input-number v-model:value="formModel.sortNo" :min="0" :max="9999" style="width: 100%" />
</a-form-item>
<a-form-item label="备注" name="remark">
<a-textarea v-model:value="formModel.remark" :maxlength="500" show-count :auto-size="{ minRows: 3, maxRows: 6 }" />
</a-form-item>
</a-form>
</a-modal>
</section>
</template>
后台页面组件使用细则
| 组件 |
使用位置 |
使用方式 |
| 路由组件 |
src/router/routes.ts |
新增页面必须配置 path、name、懒加载组件和 meta.title、meta.permission。 |
| API client |
src/api/<module>/ |
每个业务模块独立封装请求函数和 TypeScript 类型;页面只调用 API 函数,不直接调用 fetch。 |
| 上下文组件 |
src/utils/adminContext.ts |
读取当前租户、用户、组织和访问令牌;保存、清理和同步认证状态。 |
| 权限组件 |
src/utils/permission.ts |
按钮使用权限函数或权限指令控制展示;路由和后端权限编码保持一致。 |
| 查询栏组件 |
页面顶部或卡片 extra |
关键词使用 a-input-search,状态用 a-select,日期用日期选择器;查询触发统一调用 loadList。 |
| 表格组件 |
列表页主体 |
使用 a-table,声明 row-key、columns、loading、空数据文案和统一分页。 |
| 表单组件 |
新增/编辑弹窗、抽屉、独立表单页 |
使用 a-form、a-form-item、a-input、a-select、a-input-number 等;必填和长度规则前端明确提示。 |
| 状态标签组件 |
表格状态列、详情状态块 |
使用 a-tag 统一渲染启用、停用、草稿、已发布、审批中等状态,颜色和文案来自枚举/字典。 |
| 反馈组件 |
加载失败、保存结果、危险操作 |
错误使用 a-alert 或 message.error;删除、撤回、发布使用 a-modal 二次确认。 |
| 抽屉/弹窗组件 |
复杂详情、日志、绑定关系、配置表单 |
详情和日志优先用 a-drawer;短表单用 a-modal;不要在一个卡片里再嵌套多个装饰卡片。 |
| 菜单搜索组件 |
顶部栏 |
使用菜单源数据过滤关键字,回车跳转第一个匹配项,选择后同步菜单展开和标签页。 |
后台页面组件详细使用说明
| 组件 |
操作步骤 |
输入与输出 |
验收点 |
| 路由组件 |
在 routes.ts 新增路由;指定唯一 name;设置中文标题和权限编码;确保菜单搜索源能读取。 |
输入为路径、组件、标题、权限;输出为可访问页面和可检索菜单项。 |
刷新页面不丢路由;无权限时菜单/按钮不可见,接口仍拒绝。 |
| API client |
在 src/api/<module> 定义类型和请求函数;统一调用 request;页面只处理业务状态。 |
输入为查询/保存/删除命令;输出为类型化响应、分页对象或空结果。 |
页面没有直接 fetch;接口字段变更可通过 TypeScript 暴露。 |
| 上下文组件 |
页面加载前读取当前租户、用户、组织;发起保存和查询时由 API 层自动带请求头;退出登录时清理上下文。 |
输入为本地认证缓存;输出为租户、用户、组织和访问令牌。 |
未登录或令牌失效时能跳统一认证;页面不写死租户和用户。 |
| 权限组件 |
页面按钮用权限函数或指令包裹;高危动作绑定更细粒度权限;页面加载后刷新权限缓存。 |
输入为权限编码;输出为按钮展示状态。 |
权限变化后刷新页面生效;无权限用户不能通过手工 URL 操作后端。 |
| 查询栏组件 |
把关键词、状态、日期、租户等条件放在卡片顶部;条件变化后重置页码并调用列表加载。 |
输入为筛选条件;输出为规范化查询请求。 |
清空条件后恢复默认列表;查询时有加载态,不重复并发请求。 |
| 表格组件 |
声明稳定 row-key;列定义包含宽度、状态渲染和操作列;分页使用统一配置。 |
输入为列表记录和加载态;输出为可排序、可分页、可操作的表格。 |
空数据、加载中、失败重试都可见;长文本不撑破布局。 |
| 表单组件 |
打开弹窗时初始化表单;编辑时回填详情;提交前做前端校验;成功后关闭弹窗并刷新列表。 |
输入为表单状态;输出为创建或更新命令。 |
必填、长度、格式错误即时提示;保存中按钮防重复提交。 |
| 状态标签组件 |
用状态编码映射中文文案和颜色;状态筛选项与表格标签共用同一来源。 |
输入为状态编码;输出为 a-tag 文案和颜色。 |
未知状态有兜底文案;状态文案不在多个页面重复硬编码。 |
| 反馈组件 |
列表失败显示 a-alert;保存结果用 message;删除、撤回、发布用确认弹窗。 |
输入为请求状态和异常信息;输出为用户可理解的提示。 |
错误不会静默失败;成功提示不遮挡关键操作区。 |
| 抽屉/弹窗组件 |
详情、日志、绑定关系使用抽屉;短表单使用弹窗;打开时加载数据,关闭时释放临时状态。 |
输入为当前记录和打开状态;输出为详情展示或编辑命令。 |
连续打开不同记录不会残留旧数据;宽屏和窄屏不遮挡主要按钮。 |
| 菜单搜索组件 |
从路由/菜单源生成搜索项;按标题、分组和关键字匹配;选择后跳转并同步左侧菜单展开。 |
输入为关键字;输出为目标路由跳转。 |
中文、拼音关键字可扩展;搜索框不会遮挡顶部用户操作区。 |
列表页基础骨架
<template>
<section class="module-page">
<a-card title="业务列表" :bordered="false">
<template #extra>
<a-space>
<a-input-search v-model:value="keyword" placeholder="关键字" @search="loadList" />
<a-button :loading="loading" @click="loadList">刷新</a-button>
<a-button type="primary" @click="openCreateForm">新增</a-button>
</a-space>
</template>
<a-alert v-if="errorMessage" :message="errorMessage" type="error" show-icon />
<a-table row-key="id" :columns="columns" :data-source="records" :loading="loading" />
</a-card>
</section>
</template>
前端验证
rtk npm --prefix zhyc-base-vue run typecheck
rtk npm --prefix zhyc-base-vue run build
数据库与租户
首期采用共享库共享表,通过 tenant_id 做租户隔离。所有租户业务表和查询不得遗漏租户条件。
新手建一张业务表的步骤
| 步骤 |
要做什么 |
示例 |
检查点 |
| 1. 确认模块前缀 |
根据业务归属选择表名前缀。 |
采购申请使用 pur_request。 |
不要把业务表放进 sys_、openapi_、wf_ 等平台内部前缀。 |
| 2. 设计主键和租户 |
统一使用 id 主键,租户业务表加 tenant_id。 |
id BIGINT、tenant_id VARCHAR(64)。 |
唯一索引必须考虑租户,否则不同租户会互相冲突。 |
| 3. 设计业务字段 |
按业务页面和接口需要设计编码、名称、状态、金额、时间等字段。 |
request_code、request_name、status。 |
字段名小写下划线,每个字段有中文注释。 |
| 4. 加通用字段 |
补审计、逻辑删除、乐观锁和备注字段。 |
created_at、updated_at、deleted。 |
列表查询默认过滤 deleted = 0。 |
| 5. 设计索引 |
按查询条件和唯一规则设计索引。 |
tenant_id + request_code 唯一索引。 |
不要只给单个状态字段建孤立索引,优先贴合实际查询组合。 |
| 6. 写脚本和回滚 |
新增表写初始化或补丁脚本,发布变更准备回滚方案。 |
db/init-zhyc-base-v1.sql 或日期补丁脚本。 |
脚本可在空库执行,补丁可在已有库执行。 |
表前缀规范
| 前缀 |
归属模块 |
说明 |
sys_ | 系统管理 | 租户、组织、用户、角色、菜单、字典、参数、审计。 |
auth_ | 认证中心 | OAuth2/OIDC 客户端、授权、登录绑定、认证审计。 |
openapi_ | 开放平台 | 开发者应用、API Key、API 目录、调用审计、限流。 |
ai_ | AI 能力中心 | 模型供应商、AI 应用、提示词、智能体、知识库、会话和调用审计。 |
lc_ | 低代码中心 | 数据源、表模型、字段模型、页面模型、代码生成。 |
wf_ | 工作流中心 | 流程分类、流程绑定、审批记录、业务流程快照。 |
pur_ | 采购样板 | 采购申请、采购订单、明细。 |
msg_、file_、job_、mon_ | 扩展能力 | 消息、文件、作业和监控。 |
通用字段
id BIGINT NOT NULL COMMENT '主键'
tenant_id VARCHAR(64) NOT NULL COMMENT '租户业务编码,用于共享表模式下的数据隔离'
created_by BIGINT NULL COMMENT '创建人用户 ID'
created_at DATETIME NOT NULL COMMENT '创建时间'
updated_by BIGINT NULL COMMENT '最后更新人用户 ID'
updated_at DATETIME NOT NULL COMMENT '最后更新时间'
deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除标识'
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号'
remark VARCHAR(500) NULL COMMENT '备注'
业务表 DDL 模板
CREATE TABLE pur_supplier_category (
id BIGINT NOT NULL COMMENT '主键',
tenant_id VARCHAR(64) NOT NULL COMMENT '租户业务编码,用于共享表模式下的数据隔离',
category_code VARCHAR(64) NOT NULL COMMENT '供应商分类编码,同一租户内唯一',
category_name VARCHAR(100) NOT NULL COMMENT '供应商分类名称',
parent_id BIGINT NULL COMMENT '父级分类 ID,空值表示一级分类',
sort_no INT NOT NULL DEFAULT 100 COMMENT '排序号,值越小越靠前',
status VARCHAR(20) NOT NULL COMMENT '状态:ENABLED 启用,DISABLED 停用',
created_by BIGINT NULL COMMENT '创建人用户 ID',
created_at DATETIME NOT NULL COMMENT '创建时间',
updated_by BIGINT NULL COMMENT '最后更新人用户 ID',
updated_at DATETIME NOT NULL COMMENT '最后更新时间',
deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除标识',
version INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
remark VARCHAR(500) NULL COMMENT '备注',
PRIMARY KEY (id),
UNIQUE KEY uk_pur_supplier_category_code (tenant_id, category_code),
KEY idx_pur_supplier_category_status (tenant_id, status, deleted),
KEY idx_pur_supplier_category_parent (tenant_id, parent_id, deleted)
) COMMENT='供应商分类表';
SQL 安全门禁:禁止生产 SELECT *、无条件 UPDATE、无条件 DELETE。
业务表必须有中文表注释、字段注释、租户索引、状态索引和必要唯一约束。
数据库组件使用细则
| 组件 |
使用方式 |
检查重点 |
| 初始化脚本 |
首期主脚本放在 db/init-zhyc-base-v1.sql,补丁脚本按日期和能力命名。 |
脚本可重复检查,表和字段都有中文注释。 |
| 租户字段 |
租户业务表统一使用 tenant_id VARCHAR(64)。 |
查询、更新、删除 SQL 都必须带租户条件。 |
| 逻辑删除字段 |
业务表默认使用 deleted 标记逻辑删除。 |
列表查询默认过滤 deleted = 0。 |
| 审计字段 |
使用 created_by、created_at、updated_by、updated_at。 |
写操作必须补齐操作者和时间。 |
| 状态字段 |
按业务语义命名,例如 status、process_status、publish_status。 |
值域必须有枚举/字典说明,前后端展示一致。 |
| 索引组件 |
常用组合为租户 + 编码唯一索引、租户 + 状态索引、租户 + 创建时间索引。 |
唯一索引要覆盖租户,避免跨租户编码冲突误判。 |
| 方言组件 |
低代码 DDL、字段类型映射、分页方言通过扩展接口实现。 |
新增数据库方言必须补字段类型映射、分页和 DDL 验证。 |
数据库组件详细使用说明
| 组件 |
操作步骤 |
输入与输出 |
验收点 |
| 初始化脚本 |
新增表先写初始化脚本;后续变更写补丁脚本;脚本文件名体现日期和能力;发布前执行结构检查。 |
输入为表结构和种子数据;输出为可执行 SQL。 |
空库可初始化,已有库可补丁升级;脚本不包含本地密码和真实密钥。 |
| 租户字段 |
租户业务表新增 tenant_id;唯一索引包含租户;Mapper 查询统一带租户条件。 |
输入为当前租户和业务数据;输出为租户隔离后的数据集。 |
跨租户相同编码可以共存;跨租户数据不可见。 |
| 逻辑删除字段 |
删除动作更新 deleted = 1;查询默认过滤;唯一索引按业务决定是否兼容已删除数据。 |
输入为删除命令;输出为逻辑删除状态。 |
删除后列表不可见,审计日志可追溯;详情接口不会返回已删除数据。 |
| 审计字段 |
新增时写创建人/创建时间;更新时写更新人/更新时间;批量操作同样补齐审计字段。 |
输入为操作者上下文;输出为带审计信息的数据行。 |
所有业务记录能追溯创建和最后修改信息。 |
| 状态字段 |
根据状态机设计字段值;写操作先校验当前状态,再切换到目标状态。 |
输入为当前状态和目标动作;输出为新状态。 |
非法状态流转被拒绝;状态值有中文说明和前端展示映射。 |
| 索引组件 |
按查询场景设计索引;列表常用租户 + 状态 + 时间;详情常用租户 + 编码。 |
输入为查询条件;输出为可被数据库优化器使用的索引。 |
核心列表查询不全表扫描;唯一约束覆盖真实业务唯一性。 |
| 方言组件 |
新增数据库类型时补字段映射、DDL 生成、分页语法和标识符转义。 |
输入为平台字段类型和分页条件;输出为目标数据库 SQL/DDL。 |
同一模型可生成目标数据库可执行 DDL;分页结果一致。 |
扩展模块组件详细使用说明
| 模块 |
组件 |
操作步骤 |
验收点 |
| 消息中心 |
站内消息 |
业务模块发出消息事件;消息模块解析接收人和模板;生成站内消息;用户读取后标记已读。 |
未读数量准确;消息与业务主键可追溯;重复事件不会生成重复消息。 |
| 消息中心 |
消息模板 |
维护模板编码、标题模板、内容模板和消息类型;发送时传入模板参数渲染。 |
缺少模板参数有明确提示;模板禁用后不能发送。 |
| 文件中心 |
文件对象 |
上传或登记文件;生成文件编码;业务表保存文件编码;下载和预览通过文件中心查询。 |
业务模块不保存真实物理路径;文件状态和预览日志可查。 |
| 文件中心 |
存储配置 |
配置本地、对象存储或扩展存储;文件上传时选择可用存储配置。 |
存储配置停用后不能继续上传;密钥不明文展示。 |
| 在线作业 |
任务配置 |
新增任务编码、名称、Cron、执行器和状态;启用后调度;支持手动触发。 |
Cron 校验通过;停用后不再自动调度;手动触发写日志。 |
| 内容管理 |
栏目与文章 |
创建栏目;维护文章标题、内容、状态;发布后供门户或后台展示。 |
文章必须归属栏目;发布和下线有审计记录。 |
| 报表大屏 |
数据集和大屏 |
配置受控数据集;报表或大屏选择数据集;发布后生成访问入口。 |
数据集不能执行任意未审计 SQL;公开访问带租户和编码校验。 |
| 全文检索 |
索引配置和重建任务 |
配置索引编码、来源表、检索字段、过滤字段;执行重建任务;记录检索日志。 |
重建任务状态可追踪;检索结果受租户和权限过滤。 |
| 国际化 |
语言包和词条 |
维护词条编码、语言、文案;前端和后端按编码读取;缺失时回退默认语言。 |
同一编码多语言不冲突;缺失词条可被巡检发现。 |
| 系统监控 |
服务、数据源、SQL 监控 |
定期采集运行状态;展示服务健康、数据源状态和 SQL 执行信息。 |
异常状态有明确标识;监控数据不参与业务事务判断。 |
低代码开发
低代码中心是平台的核心生产力能力,负责把业务库物理表、在线建模、字段元数据、页面模型和代码生成串联起来。
数据表建模既可以从数据源加载业务表结构导入,也可以先新建模型再生成数据库表。
新手从表到代码的完整路径
| 步骤 |
页面操作 |
会生成或影响什么 |
注意事项 |
| 1. 选择数据源 |
在数据表建模页面选择主数据源。 |
决定加载哪些物理表、使用哪套方言能力。 |
连接失败先检查账号权限和密钥解析。 |
| 2. 加载业务表 |
点击加载业务表,选择要导入的物理表。 |
生成表模型和字段模型初始数据。 |
系统、流程、开放平台、可视化内部表会被过滤。 |
| 3. 调整字段 |
修改字段名称、类型、长度、精度、必填、字典、列表展示和表单展示。 |
影响 SQL、后端 DTO、前端表格列、表单控件和校验规则。 |
字段编码一旦用于生成代码,不要随意改名。 |
| 4. 配置页面模型 |
设置查询条件、列表列、表单项、详情项和按钮权限。 |
影响后台页面、权限按钮和菜单入口。 |
查询项不要过多,常用条件优先放在列表顶部。 |
| 5. 预览生成 |
选择生成范围,先查看将要生成的文件列表和内容。 |
后端、前端、SQL、接口文档等文件预览。 |
默认不要覆盖人工文件,先检查覆盖风险。 |
| 6. 执行生成和验证 |
确认后生成文件,再运行后端测试和前端构建。 |
形成可编译、可运行、可追溯的业务模块。 |
生成记录要保存文件哈希和失败原因。 |
数据源加载规则
- 根据选中的数据源加载全部业务表结构,页面下拉只展示可导入的业务物理表。
- 默认过滤系统、流程、开放平台、可视化等平台内部表,例如
sys_*、openapi_*、visual_*、wf_* 和工作流引擎表。
- 如果业务库和平台库共库部署,表加载仍然以过滤规则保护平台基础表,避免误导入系统菜单、权限、流程和可视化配置表。
- 导入为模型后,字段配置作为代码生成、DDL 生成和页面生成的统一输入。
从已有业务表导入模型
| 操作 |
字段来源 |
系统行为 |
常见问题 |
| 选择数据源 |
数据源管理中已保存并测试通过的数据源。 |
读取数据库方言能力,判断是否支持 DDL、字段类型映射和分页。 |
失败时先检查数据库账号权限、网络地址和密钥引用。 |
| 加载业务表 |
数据库元数据中的表名、表注释、字段、主键、长度和精度。 |
自动排除平台内部表,只返回业务表候选项。 |
如果业务表被过滤,检查表名前缀是否命中了系统保留前缀。 |
| 导入为模型 |
物理表结构和字段注释。 |
生成模型编码、模型名称、物理表名和字段配置初稿。 |
导入后仍需人工确认字段中文名、控件类型、字典和权限编码。 |
先建模型再生成数据库表
当业务还没有物理表时,可以先在数据表建模中新建模型,再维护字段配置并生成 DDL。
该模式适合新业务从零设计表结构,生成前必须检查租户字段、逻辑删除字段、主键策略、索引和字段注释。
- 模型编码用于代码包名、接口路径和前端文件名,创建后不要频繁变更。
- 物理表名必须符合数据库命名规范,业务表不要使用平台保留前缀。
- 字段类型由平台类型映射到数据库方言类型,长度、精度、必填、主键和自增会影响 DDL。
- 保存模型只保存元数据;发布或生成 DDL 前必须预览 SQL,确认不会覆盖已有表。
生成链路
- 创建或导入表模型。
- 维护字段编码、字段名称、类型、长度、精度、必填、主键、自增等元数据。
- 配置页面模型、关系模型、生成模板和权限编码。
- 预览生成文件,确认覆盖策略和哈希记录。
- 生成后端、后台前端、SQL、接口文档或移动端预留页面。
生成质量要求
- 后端模板必须生成 Controller、Service、Mapper、DTO、测试和中文注释。
- 前端模板必须生成 API client、类型、列表、表单、详情和权限按钮。
- SQL 模板必须生成表注释、字段注释、索引、租户字段和逻辑删除字段。
- 生成结果默认输出到预览或受控目录,不直接覆盖人工修改代码。
低代码组件使用细则
| 组件 |
页面入口 |
使用说明 |
| 数据源组件 |
数据源管理 |
维护数据源编码、名称、数据库类型、连接信息和密钥引用;连接测试通过后才能加载物理表。 |
| 方言能力组件 |
数据表建模顶部能力提示 |
展示当前数据源是否支持 DDL、字段类型映射和分页;不支持时禁止发布生成相关能力。 |
| 物理表加载组件 |
数据表建模 |
按数据源加载业务表,过滤平台内部表;选择表后可导入为模型。 |
| 表模型组件 |
数据表建模 |
维护模型编码、模型名称、物理表名、数据源 ID、模型状态和发布状态。 |
| 字段模型组件 |
字段配置 |
维护字段编码、字段名称、类型、长度、精度、必填、主键、自增、字典编码和页面展示属性。 |
| 关系模型组件 |
表关系建模 |
维护主子表、一对多、多对一、外键字段、展示字段和级联策略。 |
| 页面模型组件 |
页面模型 |
配置列表、表单、详情、查询条件、排序、按钮权限和移动端预留展示规则。 |
| 生成模板组件 |
生成模板 |
按后端、后台前端、SQL、接口文档、移动端预留模板分类管理。 |
| 代码生成组件 |
代码生成 |
选择模型和模板后先预览,再校验覆盖风险,最后执行生成。 |
| 生成记录组件 |
生成记录 |
记录生成批次、文件列表、内容哈希、生成状态和失败原因,便于回溯。 |
工作流开发
工作流中心通过平台工作流门面集成 Flowable。业务模块不得直接依赖 Flowable API,
只通过平台门面发起流程、处理任务、查询状态和写入审批记录。
新手接入一个审批业务
| 步骤 |
业务侧要做什么 |
工作流侧要做什么 |
验收点 |
| 1. 定义状态 |
给业务单据定义草稿、审批中、通过、驳回、撤回等状态。 |
确认哪些状态允许提交、审批、撤回和重新提交。 |
非法状态动作被拒绝。 |
| 2. 设计业务键 |
确定流程绑定的业务主键或业务编码。 |
表单绑定配置业务键字段和详情路由。 |
待办点击能打开正确业务详情。 |
| 3. 设计流程模型 |
提供审批角色、条件字段和业务变量。 |
在设计器配置节点、处理人、条件和连线。 |
流程保存和发布校验通过。 |
| 4. 发起流程 |
提交按钮调用业务 Service,写业务状态为审批中。 |
业务 Service 调用工作流门面发起流程。 |
生成流程实例和第一条待办。 |
| 5. 处理任务 |
审批通过、驳回、撤回后同步业务状态。 |
调用工作流门面处理任务并写审批记录。 |
待办消失,已办和审批历史可查。 |
| 6. 异常处理 |
重复提交、重复审批、流程不存在要返回稳定错误。 |
工作流门面统一转换引擎异常。 |
前端不展示 Flowable 原始异常。 |
核心对象
| 对象 |
说明 |
| 流程分类 | 按业务域管理流程模型,例如采购、合同、费用。 |
| 流程模型 | 维护可视化流程设计、节点、连线和属性配置。 |
| 流程定义 | 部署后的可执行流程定义。 |
| 表单绑定 | 把业务表单、业务主键、流程变量和流程回调绑定起来。 |
| 任务中心 | 待办、已办、我发起的、抄送我的和流程监控。 |
业务接入步骤
- 定义业务单据状态,例如草稿、审批中、通过、驳回、撤回、终止。
- 完成业务表单和业务唯一键设计。
- 创建流程模型并绑定业务表单。
- 业务模块调用工作流门面发起流程。
- 审批、驳回、撤回时写审批记录并同步业务状态。
业务状态与流程动作矩阵
| 当前业务状态 |
允许动作 |
流程动作 |
目标业务状态 |
前端按钮 |
| 草稿 | 保存、提交、删除 | 提交时发起流程 | 审批中 | 编辑、提交、删除 |
| 审批中 | 审批、驳回、撤回 | 处理当前任务或撤回实例 | 通过、驳回、撤回 | 审批、驳回、撤回 |
| 通过 | 查看、归档 | 流程结束 | 通过 | 查看 |
| 驳回 | 编辑、重新提交、删除 | 重新提交时新发起或恢复流程 | 审批中 | 编辑、重新提交、删除 |
| 撤回 | 编辑、重新提交、删除 | 重新提交时新发起流程 | 审批中 | 编辑、重新提交、删除 |
| 终止 | 查看 | 流程终止 | 终止 | 查看 |
状态门禁:按钮显示不能替代后端状态校验。每个审批动作都必须在 Service 层检查当前业务状态、当前任务处理人和租户边界。
工作流组件使用细则
| 组件 |
使用说明 |
开发要点 |
| 流程分类组件 |
按采购、合同、费用等业务域组织流程模型。 |
分类编码要稳定,后续表单绑定和统计报表会引用。 |
| 流程模型列表组件 |
展示模型编码、名称、分类、Flowable 模型、状态和操作按钮。 |
设计、编辑、发布按钮必须绑定权限。 |
| 可视化设计器组件 |
使用开始、审批、条件、结束节点编排流程,并配置节点属性。 |
审批节点必须配置处理人、表单、策略或候选组;保存前校验连线闭环。 |
| 表单绑定组件 |
绑定业务表单路由、业务表、业务主键字段和流程变量映射。 |
流程实例必须能回查业务单据;业务状态必须随流程状态同步。 |
| 流程定义组件 |
管理已部署定义和版本。 |
发布新版本不能影响历史流程实例继续流转。 |
| 任务列表组件 |
待办、已办、我发起的、抄送我的和流程监控共享任务列表模式。 |
列表必须展示业务单号、流程名称、节点、创建时间和状态。 |
| 审批动作组件 |
审批、驳回、撤回、终止等动作统一进入平台工作流门面。 |
动作必须二次确认,成功后写审批记录并刷新业务状态。 |
| 审批记录组件 |
按业务单号或流程实例展示审批历史。 |
记录操作者、动作、意见、时间、节点和结果。 |
开放 API 开发
开放 API 面向第三方系统集成和开发者门户。API Key 适合系统到系统集成,OAuth2/OIDC 适合第三方应用授权访问。
新手开放一个接口给第三方
| 步骤 |
要配置什么 |
开发要点 |
验证方式 |
| 1. 明确接口范围 |
确定第三方需要查询、创建、更新还是回调通知。 |
优先暴露稳定 DTO,不直接复用后台管理接口。 |
接口文档写清请求、响应、错误码和权限。 |
| 2. 登记 API 目录 |
配置路径、方法、版本、鉴权方式和权限编码。 |
路径要带版本,例如 /v1/purchase/requests。 |
目录中能查到接口和版本。 |
| 3. 创建应用 |
登记第三方应用、负责人、租户和状态。 |
不同调用方使用不同应用,便于限流和审计。 |
禁用应用后调用被拒绝。 |
| 4. 选择鉴权 |
系统集成用 API Key,用户授权用 OAuth2/OIDC。 |
API Key 必须校验签名、时间戳和 nonce。 |
签名错误、时间超窗、nonce 重放均被拒绝。 |
| 5. 分配授权和限流 |
给应用授权 API,配置 QPS、日配额或熔断规则。 |
授权粒度至少到 API 或权限编码。 |
未授权接口返回权限拒绝,超限返回限流错误码。 |
| 6. 查看审计 |
调用后查询应用、接口、结果、耗时和错误码。 |
审计中敏感字段脱敏。 |
成功、失败、限流、鉴权失败都有记录。 |
安全链路
- API Key 调用必须校验时间戳、nonce、签名和权限。
- OAuth2 调用必须校验访问令牌、租户、应用授权和 API 权限。
- 网关必须记录应用、接口、结果、耗时和错误码。
- 对外错误码必须稳定,不能暴露 Java 异常类名和内部堆栈。
API Key 签名字段示例
| 字段 |
位置 |
说明 |
校验规则 |
X-ZHYC-App-Key | Header | 开放平台分配的应用访问标识。 | 应用存在、启用、未过期。 |
X-ZHYC-Timestamp | Header | 请求时间戳。 | 必须在网关允许时间窗口内。 |
X-ZHYC-Nonce | Header | 一次性随机串。 | 同一应用同一时间窗口内不能重复。 |
X-ZHYC-Signature | Header | 签名结果。 | 按约定字段和密钥计算后必须一致。 |
X-ZHYC-Tenant | Header | 租户业务编码。 | 应用必须被授权访问该租户。 |
签名原文建议格式:
METHOD + "\n" +
PATH + "\n" +
QUERY_STRING + "\n" +
BODY_SHA256 + "\n" +
TIMESTAMP + "\n" +
NONCE
校验顺序:
1. 校验应用状态和有效期
2. 校验时间戳窗口
3. 校验 nonce 是否重复
4. 校验签名
5. 校验租户、API 授权和限流
开放平台菜单
开发者门户
开发者应用
API Key
OAuth2 客户端
API 目录
API 发布
API 授权
签名策略
限流策略
调用审计
开放 API 组件使用细则
| 组件 |
使用说明 |
安全要求 |
| 开发者应用组件 |
维护应用编码、应用名称、归属租户、负责人和启停状态。 |
应用禁用后 API Key 和 OAuth2 授权必须同时失效。 |
| API Key 组件 |
为系统集成调用方生成访问标识和密钥引用,支持轮换。 |
密钥只展示一次或展示脱敏值,日志禁止输出明文。 |
| OAuth2 客户端组件 |
把开发者应用与认证中心客户端绑定,支持第三方应用授权访问开放 API。 |
回调地址、授权范围和租户范围必须受控。 |
| API 目录组件 |
维护 API 分组、路径、方法、版本、请求/响应说明和权限编码。 |
发布前必须明确鉴权方式、限流策略和错误码。 |
| API 发布组件 |
把目录 API 发布到可调用版本,支持启停和版本演进。 |
下线 API 要保留兼容期和调用方通知。 |
| API 授权组件 |
为应用分配可访问 API、方法和范围。 |
授权粒度至少到 API 或权限编码,不能只按应用全量放行。 |
| 签名策略组件 |
配置签名算法、时间戳窗口、nonce 重放保护和参与签名字段。 |
所有 API Key 调用必须校验签名和时间窗口。 |
| 限流策略组件 |
按应用、租户、接口维度配置 QPS、日配额或错误熔断。 |
限流拒绝必须返回稳定错误码,并写调用审计。 |
| 调用审计组件 |
记录应用、接口、结果、耗时、错误码和请求时间。 |
请求体和响应体如含敏感字段必须脱敏或不落库。 |
AI 能力中心
AI 能力中心用于统一接入大模型,并把 AI 能力安全地融合到后台页面、低代码、工作流、开放 API 和知识库场景。
平台规划见 AI 大模型能力中心规划设计。
开发边界
| 能力 |
归属模块 |
开发要求 |
禁止事项 |
| 模型供应商 |
zhyc-module-ai/provider |
通过适配器统一封装文本对话、流式输出、向量化和工具调用。 |
页面或业务模块不得直接调用模型供应商 SDK。 |
| AI 应用 |
zhyc-module-ai/app |
业务模块必须通过 AI 应用编码调用模型,应用绑定模型、知识库、配额和安全策略。 |
不得绕过 AI 应用直接传模型名称和密钥。 |
| 提示词模板 |
zhyc-module-ai/prompt |
提示词支持变量、版本、审核和发布,调用日志记录模板版本。 |
不得在业务代码中硬编码大段提示词。 |
| 知识库 |
zhyc-module-ai/knowledge |
文档从文件中心进入解析、切片、向量化和召回流程,召回结果必须按租户和权限过滤。 |
不得让 AI 直接读取全库或跨租户文档。 |
| 工具函数 |
zhyc-module-ai/tool |
工具必须声明参数 schema、权限编码和租户边界,写操作默认需要人工确认。 |
不得开放任意 SQL、任意 HTTP 或无权限业务动作。 |
| 审计和配额 |
zhyc-module-ai/audit、quota |
记录应用、用户、租户、模型、Token、耗时、结果和错误;按租户、应用、用户限额。 |
不得出现不可追踪、不可计量的模型调用。 |
业务接入流程
- 在 AI 能力中心配置模型供应商,密钥只保存密钥引用。
- 创建 AI 应用,绑定默认模型、可用模型、配额策略和安全策略。
- 配置提示词模板,明确变量、版本和发布状态。
- 如需企业知识问答,创建知识库并完成文档解析、切片和向量化。
- 业务页面、低代码、工作流或开放 API 通过 AI 应用编码调用 AI 能力。
- 上线前检查权限、租户、配额、安全命中、调用审计和失败兜底。
模型供应商配置说明
| 字段 |
怎么填 |
系统行为 |
注意事项 |
| 供应商编码 |
租户内稳定唯一,例如 deepseek、openai-main。 |
作为后端配置和调用审计中的稳定标识。 |
不要使用数据库主键 ID 作为业务配置值。 |
| 供应商类型 |
选择 OpenAI 兼容、DeepSeek、通义千问、智谱等类型。 |
选择后自动带出默认基础地址。 |
基础地址可以按企业代理网关或私有化地址手动修改。 |
| 基础地址 |
填写供应商 API 根地址或企业内部模型网关地址。 |
测试供应商和运行时调用都使用该地址。 |
不要把模型路径、密钥或临时参数拼在基础地址中。 |
| 密钥引用 |
从密钥中心下拉选择启用状态的 API 密钥。 |
页面保存 secret:<secretCode>,后端运行时解析密文。 |
页面不录入、不回显、不保存明文密钥。 |
| 状态 |
启用后才参与模型配置和调用。 |
停用供应商会阻止后续调用。 |
生产环境先测试通过再启用给业务应用。 |
模型、应用和提示词怎么配合
| 对象 |
用途 |
关键配置 |
调用时怎么用 |
| 模型配置 |
声明可用模型和模型能力。 |
供应商、模型编码、上下文长度、流式输出、工具调用、状态。 |
由 AI 应用绑定,业务页面不直接传供应商密钥。 |
| AI 应用 |
业务接入 AI 的最小授权单位。 |
应用编码、默认模型、可用模型、配额、安全策略。 |
业务模块按应用编码调用,后端统一做权限、租户和审计。 |
| 提示词 |
复用业务提示词模板。 |
提示词编码、名称、版本、变量清单、模板内容、发布状态。 |
调用时传变量值,审计记录模板版本和实际应用。 |
供应商测试失败排查
- 提示“解析密钥前必须绑定租户上下文”:检查登录状态、租户上下文和密钥所属租户。
- HTTP 401:优先检查 API Key 是否正确、是否过期、是否属于所选供应商,以及基础地址是否匹配供应商类型。
- 密钥下拉为空:先到系统管理的密钥中心新增 API 密钥,确认状态启用且当前租户可见。
- 模型调用失败但供应商测试通过:检查模型编码、模型权限、应用状态、配额策略和安全策略。
融合场景
| 场景 |
AI 能力 |
验收点 |
| 低代码建模 |
根据业务描述生成字段、注释、控件建议、接口文档和测试用例。 |
生成结果只进入预览和人工确认,不直接覆盖代码。 |
| 工作流审批 |
生成审批摘要、风险提示、历史相似单据和处理建议。 |
AI 只能给建议,审批、驳回、撤回必须由有权限用户确认。 |
| 知识库问答 |
基于企业文档、接口文档、制度文件进行问答。 |
回答返回引用来源,召回结果受租户和文档权限控制。 |
| 开放 API |
第三方系统通过开放 API 调用 AI 应用、智能体或知识库问答。 |
必须经过 API Key/OAuth2、签名、限流和调用审计。 |
扩展模块
扩展模块是业务系统常用的通用能力。新手开发业务时不要重复造消息、文件、作业、内容、检索这些基础能力,
先判断是否可以接入已有扩展模块。
新手选择扩展模块的方法
| 业务需要 |
应该接入 |
业务模块保存什么 |
注意事项 |
| 审批后通知用户、发送站内提醒。 |
消息中心。 |
业务主键、消息模板编码、模板参数。 |
不要在业务模块直接维护未读状态。 |
| 上传合同、附件、图片或导入文件。 |
文件中心。 |
文件编码或业务文件关系。 |
不要保存本地物理路径;下载和预览统一走文件中心。 |
| 定时同步、定时清理、定时统计。 |
在线作业。 |
任务编码、执行参数和业务处理器。 |
Cron、启停、执行日志由作业模块管理。 |
| 发布公告、帮助文档、政策内容。 |
内容管理。 |
栏目编码、文章编码或展示入口。 |
发布和下线要记录审计。 |
| 做统计图表或大屏展示。 |
报表大屏。 |
受控数据集编码和页面入口。 |
不要让报表直接执行未审计 SQL。 |
| 按关键字检索业务单据或内容。 |
全文检索。 |
索引编码、来源表、检索字段。 |
检索结果仍要受租户和权限过滤。 |
消息中心
提供站内消息、消息模板、已读未读状态和业务通知入口。
文件中心
提供存储配置、文件登记、上传、文件对象管理和预览日志。
在线作业
维护定时任务、Cron 周期、任务启停、手动触发和执行日志。
内容管理
提供栏目和文章维护能力,可用于平台公告、帮助文档和业务内容发布。
报表大屏
提供数据集、报表设计器和可视化数据大屏管理能力。
全文检索与国际化
提供索引配置、重建任务、检索日志、多语言词条和本地化文案维护。
扩展模块组件使用细则
| 模块 |
组件 |
使用方式 |
| 消息中心 |
站内消息、消息模板、已读未读状态 |
业务事件触发消息时只传业务主键和模板参数;接收人、租户和阅读状态由消息模块维护。 |
| 文件中心 |
存储配置、文件对象、上传、预览日志 |
业务模块只保存文件编码,不直接保存物理路径;预览统一走文件中心接口。 |
| 在线作业 |
任务配置、Cron 构建器、执行日志、手动触发 |
任务编码稳定唯一,执行日志记录开始时间、结束时间、结果和异常摘要。 |
| 内容管理 |
栏目、文章、发布状态 |
公告、帮助文档和业务内容通过栏目归档;发布、下线必须记录审计。 |
| 报表大屏 |
数据集、报表设计器、可视化大屏 |
数据集负责查询边界,报表和大屏只消费受控数据集,不直接拼接任意 SQL。 |
| 全文检索 |
索引配置、重建任务、检索日志 |
索引字段、过滤字段和来源表必须显式配置;重建任务需要记录触发类型和执行结果,检索结果继续受租户和权限过滤。 |
| 国际化 |
语言包、词条、翻译值 |
前端展示文案、状态文案和错误提示逐步迁移到词条编码,避免页面硬编码。 |
| 系统监控 |
服务状态、数据源状态、SQL 监控 |
监控数据用于运维查看,不作为业务状态判断的唯一来源。 |
全文检索初始化和使用
- 执行数据库初始化和种子脚本,确认全文检索菜单、索引配置表、重建任务表和检索日志表已创建。
- 进入全文检索配置页面,新增索引编码、索引名称、来源表、主键字段、标题字段、内容字段和过滤字段。
- 对需要检索的业务表执行重建任务,等待任务状态完成。
- 在业务页面或全局检索入口发起搜索,后端按租户、权限和过滤字段返回结果。
- 上线前查看检索日志,确认关键词、耗时、命中数量和失败原因可追踪。
权限与安全
权限与安全不是上线前才补的内容,而是每个接口、每张表、每个按钮设计时就要同步考虑。
初学者可以按“身份、权限、租户、数据、日志、密钥”六个维度检查。
新手安全检查表
| 维度 |
检查什么 |
常见错误 |
正确做法 |
| 身份 |
用户是否登录,Token 是否有效。 |
接口默认信任前端传来的用户 ID。 |
从认证上下文读取当前用户和租户。 |
| 权限 |
菜单、按钮、接口是否绑定权限编码。 |
只在前端隐藏按钮,后端没有校验。 |
前端隐藏 + 后端 Shiro 权限双重控制。 |
| 租户 |
业务表和查询是否带 tenant_id。 |
详情、更新、删除只按 id 操作。 |
所有租户业务数据按租户 + 主键访问。 |
| 数据 |
输入是否校验,输出是否脱敏。 |
手机号、密钥、Token 原样返回或写日志。 |
敏感字段脱敏,不返回不必要字段。 |
| 日志 |
关键动作是否可追踪。 |
捕获异常后不记录,排查无上下文。 |
记录操作者、租户、业务主键、动作、结果和耗时。 |
| 密钥 |
密码、API Key、OAuth2 secret 是否安全存储。 |
密钥明文展示、明文落库或提交到仓库。 |
使用密钥引用或加密存储,只展示脱敏值。 |
权限编码
模块:资源:动作[:扩展]
常用动作包括 view、query、create、update、delete、export、import、enable、disable、publish、deploy、approve、reject、revoke。
安全门禁
- 后台管理接口必须有 Shiro 权限控制。
- 开放 API 必须有 API Key 签名或 OAuth2/OIDC 校验。
- 租户业务表和查询不得遗漏
tenant_id 隔离。
- 认证中心、开放 API 网关和核心平台之间只共享 Token、签名和权限契约,不共享内部实现类。
- 不得提交密钥、Token、密码、个人隐私或本地环境配置。
安全防护中心
安全防护中心位于系统管理菜单下,用于把三级等保常见的访问来源统计、违规发现、IP 封禁、访问限制规则和运行时拦截做成可配置能力。
新手先理解“看板、策略、访问限制、封禁、事件”五个对象,再开发扩展功能。
| 模块 |
用途 |
前端控件 |
后端接口和权限 |
| 安全总览 |
展示今日请求来源、最高 IP 请求、违规 IP 和封禁 IP。 |
指标区使用只读数据块,刷新按钮重新请求所有数据。 |
GET /system/security-protection/overview,权限 system:security-protection:query。 |
| 核心阈值 |
维护单 IP、写接口、登录失败、AI 高成本调用等策略。 |
表格行内使用输入框、数字输入、下拉框和保存按钮。 |
GET/PUT /system/security-protection/policies,保存权限 system:security-protection:save。 |
| IP 封禁 |
手动封禁或解封 IP、IPv6、IPv4 CIDR,并同步访问限制规则。 |
IP 输入框、原因输入框、截止时间控件、封禁和解封按钮。 |
POST /system/security-protection/ip-blocks 和 /ip-blocks/unblock,权限分别为 block、unblock。 |
| 访问限制规则 |
维护 IP、账号、设备维度的允许或拒绝规则,作为安全防护中心的规则管理区。 |
标签页、类型下拉框、表格、标签、弹窗表单和保存按钮。 |
GET/PUT /system/access-restrictions,权限分别为 system:access-restriction:query 和 system:access-restriction:save。 |
| 排行与事件 |
查看来源 IP、接口访问排行和最近安全事件。 |
表格、标签和排行中的快捷封禁按钮。 |
/ip-ranking、/api-ranking、/events,查询权限 system:security-protection:query。 |
数据库和菜单初始化
V5__system_security_protection.sql 创建 sys_security_policy、sys_security_event、sys_security_ip_block 三张表。
V2__system_seed.sql 保留安全防护中心一个菜单入口,并把访问限制查询、保存、校验权限挂到该菜单下。
V6__system_security_protection_menu.sql 用于已初始化数据库补齐并合并安全防护中心菜单和平台管理员角色授权。
- 运行时拦截由核心平台
PlatformSecurityProtectionFilter 完成,配置项为 zhyc.security.protection.enabled。
开发扩展步骤
- 先在 Service 测试中补充风险场景,例如 CIDR 命中、封禁过期、策略停用。
- 再扩展
SysSecurityProtectionService,保持租户、IP、策略编码和阈值校验在服务层完成。
- 新增接口必须写
@RequiresPermissions,权限编码同步到菜单脚本。
- 前端新增按钮必须同时绑定
v-permission,并提供 loading、错误提示和空状态。
- 上线前执行后端测试、前端类型检查、权限门禁、敏感配置和 SQL 安全验证。
常见问题
| 现象 |
优先检查 |
| 看不到菜单 |
确认执行了菜单种子脚本、当前角色已绑定菜单、权限缓存已刷新。 |
| 页面无统计数据 |
确认运行时过滤器已启用、请求头带 X-ZHYC-Tenant-Id、事件表已有访问记录。 |
| 封禁不生效 |
确认 sys_security_ip_block 状态为 active,当前时间在生效区间内,CIDR 规则格式正确。 |
| 本地临时不需要防护 |
设置 ZHYC_SECURITY_PROTECTION_ENABLED=false 或在配置中关闭 zhyc.security.protection.enabled。 |
验证与质量门禁
变更完成前必须按变更范围执行匹配验证,并在交付说明中列出命令、结果和未覆盖风险。
新手验证顺序
| 顺序 |
验证目标 |
怎么做 |
失败后先看什么 |
| 1 |
确认文件结构和静态文档没坏。 |
检查链接、图片、HTML 结构、关键字。 |
路径是否写错,图片是否存在,锚点是否缺失。 |
| 2 |
确认后端能编译和测试。 |
按变更模块执行 Maven test。 |
Java 版本、依赖版本、测试数据和数据库连接。 |
| 3 |
确认前端类型和构建通过。 |
执行 typecheck 和 build。 |
接口类型、组件属性、未定义变量和路由引用。 |
| 4 |
确认页面可用。 |
浏览器打开页面,走查询、新增、编辑、删除、失败提示。 |
Network、控制台错误、权限按钮、加载状态。 |
| 5 |
确认安全边界。 |
用无权限账号、跨租户数据、非法状态测试。 |
后端权限注解、租户条件和状态流转校验。 |
| 6 |
确认交付说明完整。 |
列出验证命令、结果、未覆盖原因和剩余风险。 |
是否遗漏移动端、开放 API、工作流或数据库脚本验证。 |
| 变更类型 |
必跑验证 |
| 后端业务模块 |
rtk env JAVA_HOME=<JDK21_HOME> mvn -f zhyc-base-server/pom.xml -pl <module> -am test |
| 认证中心 |
rtk env JAVA_HOME=<JDK21_HOME> mvn -f zhyc-base-server/pom.xml -pl zhyc-auth-server -am test |
| 开放 API 网关 |
rtk env JAVA_HOME=<JDK21_HOME> mvn -f zhyc-base-server/pom.xml -pl zhyc-openapi-gateway -am test |
| 后台前端 |
rtk npm --prefix zhyc-base-vue run typecheck 和 rtk npm --prefix zhyc-base-vue run build |
| uni-app 移动端 |
rtk npm --prefix zhyc-base-uniapp run build:h5 |
| 文档规范 |
rtk rg -n "<关键字>" docs AGENTS.md,并检查链接和图片资源。 |
交付说明模板
变更范围:
- 后端:
- 前端:
- 数据库:
- 权限菜单:
- 低代码/工作流/开放 API:
已执行验证:
- rtk ...
- rtk ...
验证结果:
- 通过:
- 未覆盖:
- 未覆盖原因:
安全与租户检查:
- 后台接口权限:
- 租户隔离:
- 敏感信息:
- 审计日志:
剩余风险:
-
回滚建议:
-
手工验收用例模板
| 用例 |
操作 |
期望结果 |
适用模块 |
| 列表查询 | 输入关键字、选择状态、切换分页。 | 列表按条件刷新,分页总数正确。 | 所有后台列表页。 |
| 新增保存 | 填写必填字段并保存。 | 保存成功,弹窗关闭,列表刷新。 | 基础资料、业务单据。 |
| 表单校验 | 清空必填、输入超长值、输入非法格式。 | 前端显示中文校验提示,接口不被重复提交。 | 所有表单页。 |
| 危险操作 | 点击删除、停用、撤回、发布。 | 出现二次确认,确认后执行,失败有明确提示。 | 删除、启停、流程、发布。 |
| 权限验证 | 使用无权限账号访问页面或直接调用接口。 | 页面按钮隐藏,接口返回权限拒绝。 | 所有管理接口。 |
| 租户验证 | 用 A 租户主键尝试在 B 租户查询或修改。 | 详情不可见,更新和删除失败。 | 所有租户业务表。 |
部署发布
发布不是简单执行构建命令。初学者需要先确认数据库脚本、环境变量、密钥、回滚方案和验证记录,再进入发布窗口。
新手发布流程
| 阶段 |
要准备什么 |
输出物 |
风险点 |
| 发布前 |
确认变更范围、数据库脚本、回滚脚本、配置项、密钥来源。 |
发布清单和回滚方案。 |
漏配置、漏脚本、密钥写入仓库。 |
| 构建 |
执行后端测试、前端构建、移动端构建。 |
后端包、前端静态资源、构建日志。 |
本地能跑但构建环境版本不一致。 |
| 发布 |
按顺序执行数据库变更、后端发布、前端发布、网关配置。 |
运行中的服务和可访问页面。 |
数据库先后顺序错误,前后端接口版本不匹配。 |
| 验证 |
验证登录、菜单、核心业务、开放 API、审批、审计和监控。 |
发布验证记录。 |
只验证首页,不验证核心操作链路。 |
| 回滚 |
当出现阻断问题时按回滚方案恢复服务和数据。 |
回滚记录和问题复盘。 |
只回滚代码不处理数据库兼容问题。 |
发布前检查
- 确认数据库脚本、补丁脚本、回滚方案和种子数据。
- 确认认证中心、核心平台、开放 API 网关的环境变量和密钥来源。
- 确认前端构建产物、API 地址、OAuth2 回调地址和跨域配置。
- 确认监控、日志、审计、异常告警和访问限制策略。
- 确认版本说明、变更范围、验证记录和剩余风险。
常用构建命令
rtk env JAVA_HOME=<JDK21_HOME> \
'/Applications/IntelliJ IDEA.app/Contents/plugins/maven/lib/maven3/bin/mvn' \
-f zhyc-base-server/pom.xml -pl zhyc-platform-app -am test
rtk npm --prefix zhyc-base-vue run build
rtk npm --prefix zhyc-base-uniapp run build:h5
回滚方案模板
| 对象 |
回滚动作 |
前置条件 |
风险说明 |
| 后端服务 |
恢复上一版本包和配置,重启服务。 |
上一版本包可用,配置备份完整。 |
新版本写入的数据可能与旧版本不兼容。 |
| 前端资源 |
恢复上一版本静态资源。 |
上一版本构建产物可用。 |
浏览器缓存可能继续命中新版本资源,需要清缓存或更新版本号。 |
| 数据库结构 |
执行回滚脚本或兼容补丁。 |
已确认数据备份和影响范围。 |
删除字段、拆表、数据迁移类变更不能无脑回滚。 |
| 菜单权限 |
恢复旧菜单、旧权限编码或禁用新入口。 |
知道新增菜单和按钮权限清单。 |
权限回滚后用户可能暂时看不到入口,需要刷新权限缓存。 |
| 开放 API |
下线新 API 版本或恢复旧路由。 |
调用方已通知或具备兼容版本。 |
正在调用的新版本可能失败,需要审计和告警跟进。 |
更完整的本地运行和发布流程见 本地运行手册。
常见问题
1. 为什么后台总是跳转统一认证?
优先检查本地运行时上下文、访问令牌过期时间、刷新令牌、认证中心地址、前端回调地址和 BFF 令牌刷新接口。令牌过期或接口返回 401 时,前端会清理上下文并跳转登录。
2. 低代码数据源为什么加载不到表?
检查数据源连接、密钥解析器、数据库账号权限和方言能力。加载业务表时会过滤系统、流程、开放平台和可视化等平台内部表。
3. 新增业务模块要从哪里开始?
先设计数据库表和权限编码,再补后端模块、API client、后台页面、菜单权限和验证命令。若适合生成,优先走低代码表模型和模板生成。
4. 移动端当前是否展示效果图?
当前文档仅保留移动端规划说明,不展示移动端效果图;后续随移动端版本计划更新。
5. 初学者应该先开发哪个业务练手?
建议先做一个简单字典类或主数据类业务,例如“供应商分类”或“物料分类”。它能覆盖建表、接口、列表、表单、权限和验证,但不会一开始就引入复杂审批和开放 API。
6. 为什么接口能查到数据但页面不显示?
优先检查 API client 返回类型、表格 data-source、分页字段映射、列 dataIndex 和接口响应结构。常见原因是后端返回 records,前端却读取了 list。
7. 为什么删除按钮隐藏了但接口还能被调用?
前端隐藏按钮只能改善体验,不能作为安全边界。必须在后端 Controller 绑定 Shiro 权限,并在 Service 层确认租户和状态边界。
8. 修改数据库表后还要改哪里?
需要同步检查实体、DTO、Mapper 列清单、前端类型、表格列、表单字段、低代码字段模型、初始化脚本或补丁脚本,以及相关测试数据。
9. 为什么添加密钥后供应商里仍然选不到?
先确认密钥类型是 API 密钥、状态为启用、所属租户与当前登录租户一致,并且页面已刷新密钥选项。供应商只保存密钥引用,不读取或展示密钥明文。
10. 供应商测试 401 怎么处理?
401 通常表示供应商拒绝认证。检查 API Key 是否有效、是否绑定了正确供应商、基础地址是否正确、模型服务是否要求额外组织或项目权限。平台不会把明文密钥写入日志,排查时只看密钥编码和供应商响应摘要。
11. 未登录为什么不能先看到页面?
后台和移动端受保护页面都必须先完成统一认证。未登录、令牌过期或上下文缺失时,前端会跳转登录页,不渲染菜单、表格、表单或业务数据,避免敏感信息短暂暴露。