Files
hzhub/docs/erp-api-management-plan.md
大壮 c2513849b4 feat: 添加ERP服务和系统服务,完善员工门户功能
## 新增服务模块

### 1. ERP服务 (hzhub-erp)
- 新增独立的ERP数据适配服务
- 支持SQL Server 2008 R2数据源
- 提供动态API配置管理系统
- 包含客户管理、销售数据等业务接口

### 2. 系统服务 (hzhub-system)
- 新增独立的系统管理服务
- 用户、角色、权限、部门、菜单管理
- 租户管理、操作日志、在线用户监控
- 工作流引擎(warm-flow)集成
- 企业微信审批同步功能

### 3. API网关 (hzhub-gateway)
- 新增Spring Cloud Gateway网关服务
- JWT认证、路由分发、限流熔断
- XSS防护、请求日志记录
- 统一入口端口8080

## 后台管理功能增强

### ERP动态API管理
- 新增动态API配置管理界面
- API测试、文档预览、统计监控
- 错误日志查看、缓存管理
- 从数据库表自动导入API配置

### 系统管理增强
- 企业微信配置管理
- 企业微信审批同步配置
- 部门和用户管理优化

## 员工门户功能完善

### 业务页面
- 审批中心:工作流审批、待办任务
- CRM管理:客户关系管理
- 经销商管理:经销商数据展示
- 供应链管理:采购、库存、销售
- BI报表:数据可视化分析
- ERP数据探索:SQL Server数据查询

### 个人中心
- 基本设置:个人信息管理
- 安全设置:密码修改、登录日志
- 锁屏功能:自动锁屏、手动锁屏

### 其他功能
- 标签页管理:多标签页导航
- 页面缓存:keepAlive缓存机制
- 会话超时:自动检测并提示

## 经销商门户

### 页面路由
- 新增经销商管理页面路由
- AI聊天界面完善

## 文档更新

- ERP API数据库初始化指南
- ERP API前端完整实现文档
- ERP API测试和验证指南
- Gateway路由迁移计划
- 项目配置文档更新

## 部署脚本

- 统一启动/停止/重启脚本
- Docker Compose配置优化
- Nginx配置文件更新

## 技术栈

- 后端: Spring Boot 3.5.8, Java 17
- 前端: Vue 3, TypeScript, Element Plus, Vben Admin
- 工作流: warm-flow 1.8.2
- 网关: Spring Cloud Gateway
- 数据库: MySQL 8.0, SQL Server 2008 R2
- 缓存: Redis 7
- 向量库: Weaviate 1.25.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 08:00:19 +00:00

743 lines
29 KiB
Markdown
Raw Permalink 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.
# ERP API 管理平台实现方案
## Context
**需求背景**:用户需要一个界面来查看和管理 ERP 数据库的定制 API 封装,并提供手动创建 API 的功能。当前 ERP 服务只有少量固定的 APICustomerController缺乏灵活的 API 管理能力。
**重要决策****完全集成到管理后台hzhub-admin中**,作为系统管理的一个新模块,实现统一管理:
- 前端界面集成在 hzhub-admin 的标准管理界面中(左侧菜单 + 右侧功能页面)
- 通过后端菜单系统动态添加菜单项(类似"系统管理"、"工具"等模块)
- 使用统一的权限体系(通过 Sa-Token 和 permission_code
- 使用统一的认证体系JWT Token 共享)
- 与现有的系统管理、代码生成器等模块保持一致的界面风格和操作体验
**设计目标**
1. 查看 ERP 数据库中的所有表结构
2. 从数据库表一键生成 API 配置
3. 手动创建和编辑 API配置 SQL、参数、权限等
4. API 测试功能(在线测试执行)
5. API 文档预览
6. API 调用统计和监控(完整功能)
7. Redis 缓存支持(完整功能)
8. 版本管理支持(完整功能)
**参考架构**
- 基于代码生成器gen_table + gen_table_column的两表元数据管理模式
- 使用 JdbcTemplate 执行动态 SQL安全、简单
- 参考 Vben Admin 的标准 CRUD 界面模式
---
## 一、架构设计
### 1.1 数据库表设计
创建两张元数据表存储 API 配置:
**erp_api_configAPI 配置主表)**
```sql
CREATE TABLE erp_api_config (
api_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 'API ID',
api_name VARCHAR(100) NOT NULL COMMENT 'API名称',
api_path VARCHAR(200) NOT NULL COMMENT 'API路径如 /erp/dynamic/customer/list',
api_method VARCHAR(10) NOT NULL DEFAULT 'GET' COMMENT 'HTTP方法GET/POST',
api_desc VARCHAR(500) COMMENT 'API描述',
api_version VARCHAR(10) DEFAULT 'v1' COMMENT 'API版本号v1/v2',
-- 数据源配置
data_source VARCHAR(50) DEFAULT 'erp' COMMENT '数据源名称',
-- SQL配置
sql_template TEXT NOT NULL COMMENT 'SQL模板支持参数占位符 #{paramName}',
result_type VARCHAR(20) NOT NULL DEFAULT 'LIST' COMMENT '结果类型LIST/SINGLE/COUNT',
-- 分页配置
support_pagination TINYINT(1) DEFAULT 0 COMMENT '是否支持分页',
page_param_name VARCHAR(50) DEFAULT 'pageNum' COMMENT '页码参数名',
size_param_name VARCHAR(50) DEFAULT 'pageSize' COMMENT '页大小参数名',
-- 权限配置
require_auth TINYINT(1) DEFAULT 0 COMMENT '是否需要认证',
permission_code VARCHAR(100) COMMENT '权限标识(如 erp:customer:list',
-- 缓存配置
enable_cache TINYINT(1) DEFAULT 0 COMMENT '是否启用缓存',
cache_key_template VARCHAR(200) COMMENT '缓存键模板(支持参数占位符)',
cache_ttl INT DEFAULT 300 COMMENT '缓存过期时间(秒)',
-- 来源表信息
source_table VARCHAR(100) COMMENT '来源表名',
source_table_comment VARCHAR(500) COMMENT '来源表描述',
-- 状态
status TINYINT(1) DEFAULT 1 COMMENT '状态0禁用 1启用',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
create_by VARCHAR(50),
update_by VARCHAR(50),
remark VARCHAR(500)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP动态API配置表';
CREATE INDEX idx_api_path_method ON erp_api_config(api_path, api_method, api_version);
CREATE INDEX idx_status ON erp_api_config(status);
```
**erp_api_paramAPI 参数配置表)**
```sql
CREATE TABLE erp_api_param (
param_id BIGINT PRIMARY KEY AUTO_INCREMENT,
api_id BIGINT NOT NULL COMMENT '所属API ID',
-- 参数基本信息
param_name VARCHAR(100) NOT NULL COMMENT '参数名称',
param_desc VARCHAR(500) COMMENT '参数描述',
param_type VARCHAR(20) NOT NULL DEFAULT 'String' COMMENT '参数类型String/Integer/Long/Date/Boolean',
-- 参数位置
param_position VARCHAR(20) NOT NULL DEFAULT 'QUERY' COMMENT '参数位置QUERY/BODY',
-- 参数验证
is_required TINYINT(1) DEFAULT 0 COMMENT '是否必填',
default_value VARCHAR(200) COMMENT '默认值',
-- SQL映射
sql_param_name VARCHAR(100) COMMENT 'SQL参数名',
-- 排序
sort INT DEFAULT 0,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP动态API参数配置表';
CREATE INDEX idx_api_id ON erp_api_param(api_id);
ALTER TABLE erp_api_param ADD CONSTRAINT fk_api_param_api
FOREIGN KEY (api_id) REFERENCES erp_api_config(api_id) ON DELETE CASCADE;
```
**erp_api_statsAPI 调用统计表)**
```sql
CREATE TABLE erp_api_stats (
stats_id BIGINT PRIMARY KEY AUTO_INCREMENT,
api_id BIGINT NOT NULL COMMENT 'API ID',
-- 调用信息
call_time DATETIME NOT NULL COMMENT '调用时间',
call_params TEXT COMMENT '调用参数JSON',
response_time INT COMMENT '响应时间ms',
call_status VARCHAR(10) COMMENT '调用状态SUCCESS/ERROR',
-- 错误信息
error_message TEXT COMMENT '错误消息',
error_stack TEXT COMMENT '错误堆栈',
-- 客户端信息
client_ip VARCHAR(50) COMMENT '客户端IP',
user_id VARCHAR(50) COMMENT '用户ID',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='ERP动态API调用统计表';
CREATE INDEX idx_api_id_time ON erp_api_stats(api_id, call_time);
CREATE INDEX idx_call_status ON erp_api_stats(call_status);
```
### 1.2 核心技术选型
**动态 SQL 执行**JdbcTemplate
- 优点:简单、安全、支持 PreparedStatement 参数绑定
- 避免复杂的 MyBatis 动态 SQL不适合动态生成场景
**参数类型转换**:自定义 ParamTypeConverter
- 支持 String、Integer、Long、Date、Boolean 类型
- 自动转换前端参数到 SQL 参数类型
**结果映射**:动态 RowMapper → Map<String, Object>
- 避免硬编码 VO 类,灵活适配不同表结构
**安全防护**
- SQL 注入防护:强制 PreparedStatement 参数绑定(#{param} → ?
- SQL 关键字白名单:只允许 SELECT、FROM、WHERE、AND、OR、ORDER、BY 等安全关键字
- 禁止危险操作DROP、DELETE、TRUNCATE、ALTER、CREATE 等
- 可选权限控制:通过 Sa-Token 的 permission_code 验证
### 1.3 后端架构
**文件结构**
```
hzhub-erp/src/main/java/org/hzhub/erp/
├── controller/
│ ├── ErpApiController.java # API 配置管理 CRUD
│ └── DynamicApiController.java # 动态 API 执行入口(通配符路由)
├── service/
│ ├── IErpApiService.java # API 配置 Service 接口
│ ├── impl/
│ │ ├── ErpApiServiceImpl.java # API 配置管理 + 从表导入
│ │ ├── DynamicApiExecutor.java # 核心 SQL 执行引擎
│ │ ├── ApiCacheService.java # Redis 缓存服务
│ │ └── ApiMonitorService.java # 监控统计服务
│ └── ParamTypeConverter.java # 参数类型转换器
├── domain/
│ ├── ErpApiConfig.java # API 配置实体
│ ├── ErpApiParam.java # API 参数实体
│ └── vo/
│ │ ├── ErpApiConfigVO.java # API 配置 VO
│ │ └── ApiTestResultVO.java # API 测试结果 VO
├── mapper/
│ ├── ErpApiConfigMapper.java # API 配置 Mapper
│ ├── ErpApiParamMapper.java # API 参数 Mapper
│ └── ErpApiStatsMapper.java # API 统计 Mapper
└── util/
└── SqlValidator.java # SQL 安全验证工具
```
**关键模块设计**
1. **DynamicApiExecutor核心执行引擎**
- 处理 SQL 模板:将 #{param} 转换为 ? 占位符
- 参数绑定:按照参数顺序提取值并绑定到 PreparedStatement
- 分页处理:自动添加 OFFSET FETCHSQL Server 语法)
- 结果封装LIST → TableDataInfoSINGLE → RCOUNT → R<Long>
- 缓存检查:检查 Redis 缓存,如果存在直接返回
- 统计记录:记录执行时间、调用参数到 erp_api_stats
2. **ApiCacheService缓存服务**
- 缓存键生成:根据 cache_key_template 和参数生成缓存键
- 缓存操作get、set、delete、clear
- 缓存过期处理:支持 TTL 配置
- 缓存命中率统计:记录缓存命中和未命中次数
3. **ApiMonitorService监控服务**
- 调用记录:记录每次调用到 erp_api_stats
- 统计查询:按 API ID、时间段查询调用统计
- 错误分析:查询错误日志、错误率统计
- 性能分析:响应时间趋势、慢查询告警
4. **ErpApiController配置管理**
- CRUD 接口list、getInfo、add、edit、remove
- 从表导入importFromTable调用 ErpExploreController 获取表结构)
- API 测试testApi执行并返回结果 + 执行时间)
- 状态切换changeStatus
- 统计查询getApiStats、getApiErrorLog
- 版本管理:支持 v1/v2 版本号,路径自动包含版本(/erp/dynamic/v1/xxx
5. **DynamicApiController动态路由**
- 通配符路径:`@GetMapping("/erp/dynamic/{version}/{apiPath}")`
- 根据请求路径、版本和方法查询 API 配置
- 权限检查(如果 require_auth = 1
- 参数验证和类型转换
- 缓存检查(如果 enable_cache = 1
- 调用 DynamicApiExecutor 执行
- 记录统计信息
---
## 二、功能模块详细设计
### 2.1 API 配置管理CRUD
**后端接口**
| Method | Path | 功能 |
|--------|------|------|
| GET | `/erp/api/config/list` | 分页查询 API 配置列表 |
| GET | `/erp/api/config/{apiId}` | 获取配置详情(含参数列表) |
| POST | `/erp/api/config` | 新增 API 配置 |
| PUT | `/erp/api/config` | 修改 API 配置 |
| DELETE | `/erp/api/config/{apiIds}` | 删除配置 |
| PUT | `/erp/api/config/changeStatus` | 启用/禁用 |
| POST | `/erp/api/config/importFromTable` | 从表导入 |
| GET | `/erp/api/config/syncTable/{apiId}` | 同步表结构 |
| POST | `/erp/api/config/test/{apiId}` | API 测试 |
| GET | `/erp/api/config/preview/{apiId}` | API 文档预览 |
| GET | `/erp/api/config/stats/{apiId}` | 查询调用统计 |
| GET | `/erp/api/config/errorLog/{apiId}` | 查询错误日志 |
| DELETE | `/erp/api/config/cache/{apiId}` | 清除缓存 |
### 2.2 从数据库表导入
**流程**
1. 前端调用 ErpExploreController 获取表列表(`/erp/test/explore`
2. 用户选择要导入的表(多选)
3. 后端 `importFromTable` 方法:
- 查询表的列信息(调用 `/erp/test/explore/table?tableName=xxx`
- 生成默认查询 SQL`SELECT * FROM tableName WHERE 1=1`
- 为每个列创建参数配置paramName、paramType、paramDesc
- 保存到 erp_api_config 和 erp_api_param
**自动生成逻辑**
- API 名称:`{tableName}列表查询`
- API 路径:`/erp/dynamic/{tableName}`
- SQL 类型:根据列数据类型推断 Java 类型varchar → String, int → Integer, datetime → Date
- 支持分页:默认启用
### 2.3 API 测试功能
**设计**
- 输入apiId + testParamsMap<String, Object>
- 输出ApiTestResultVO包含执行结果、执行时间、SQL、错误信息
**ApiTestResultVO 结构**
```java
public class ApiTestResultVO {
private String apiPath;
private String testMethod;
private Map<String, Object> requestParams;
private Boolean success;
private Object data; // 执行结果
private Long executionTime; // 执行时间ms
private String executedSql; // 实际执行的 SQL
private String errorMessage; // 错误信息(如果失败)
private String errorStack; // 错误堆栈
}
```
### 2.4 API 文档预览
**生成内容**
- 基本信息API 名称、路径、方法、描述
- 参数说明表:参数名、类型、必填、默认值、描述
- SQL 模板说明
- 响应格式示例
- 使用示例(请求 URL + 参数示例)
---
## 三、前端界面设计
### 3.1 文件结构
```
hzhub-admin/apps/web-antd/src/
├── api/erp/
│ ├── api/
│ │ ├── index.ts # API 函数定义
│ │ └── model.d.ts # TypeScript 类型
│ └── explore/
│ │ ├── index.ts # 数据库探查 API
│ │ └── model.d.ts
├── views/erp/api/
│ ├── index.vue # API 配置列表页
│ ├── data.tsx # 列定义、搜索表单 schema
│ ├── edit-api.vue # 编辑页(两 Tab
│ ├── edit-tabs/
│ │ ├── basic-setting.vue # 基础设置 Tab
│ │ └── params-config.vue # 参数配置 TabVxeGrid inline-editable
│ ├── table-import-modal.vue # 从表导入弹窗
│ ├── test-modal.vue # API 测试弹窗
│ ├── doc-preview-modal.vue # 文档预览弹窗
│ └── stats-modal.vue # 统计监控弹窗
```
### 3.2 列表页index.vue
**参考**tenant/index.vue完整 CRUD
**功能**
- VxeGrid 表格展示 API 配置apiName、apiPath、apiMethod、status、createTime
- 搜索表单apiName、apiPath、status
- 操作列:测试、编辑、删除、启用/禁用、查看统计
- 工具栏:从表导入、新增 API
### 3.3 编辑页edit-api.vue
**参考**generator/edit-gen.vue两 Tab 设计)
**Tab 1 - 基础设置**
- API 名称、路径、方法(下拉选择 GET/POST
- SQL 模板(使用 CodeMirror 编辑器,支持 SQL Server 语法高亮)
- 数据源(下拉选择)
- 结果类型LIST/SINGLE/COUNT
- 分页配置(是否支持分页、参数名)
- 权限配置(是否需要认证、权限标识)
- 缓存配置是否启用缓存、缓存键模板、TTL
- 版本号(下拉选择 v1/v2
- 来源表信息(只读,显示来源表名和描述)
**Tab 2 - 参数配置**
- VxeGrid inline-editable 表格
-paramName、paramType下拉、paramPosition下拉、isRequired复选框、defaultValue、paramDesc
- 工具栏:新增参数、删除参数、同步表结构
### 3.4 从表导入弹窗table-import-modal.vue
**参考**generator/table-import-modal.vue
**功能**
- 调用 `/erp/test/explore` 获取表列表
- VxeGrid 表格展示tableName、schemaName、rowCount、columnCount、hasPrimaryKey
- 多选框选择要导入的表
- 确认导入:调用 `/erp/api/config/importFromTable`
### 3.5 API 测试弹窗test-modal.vue
**设计**
- 上半部分:参数输入表单(根据参数配置动态生成)
- 下半部分:执行结果展示
- 元信息:执行时间、状态(成功/失败)
- 结果数据JSON 格式化展示(使用 CodeMirror
- 错误信息:如果失败,显示错误消息和堆栈
### 3.6 文档预览弹窗doc-preview-modal.vue
**参考**generator/code-preview-modal.vue多 Tab 展示)
**Tab 内容**
- API 说明:名称、路径、方法、描述
- 参数说明:表格形式展示参数列表
- SQL 模板:代码高亮显示
- 响应示例JSON 示例
- 使用示例:完整的请求 URL 和参数示例
### 3.7 统计监控弹窗stats-modal.vue
**设计**
- 上部分:统计概览(总调用次数、平均响应时间、错误率)
- 中部分:调用次数趋势图(使用 Charts
- 下部分:响应时间趋势图
- 错误日志列表:最近的错误调用记录
---
## 四、SQL 模板设计
### 4.1 参数占位符语法
使用 `#{paramName}` 作为参数占位符,自动转换为 PreparedStatement 的 `?`
**示例 SQL 模板**
```sql
-- 简单查询
SELECT * FROM customer
WHERE #{customerCode} IS NOT NULL THEN customer_code = #{customerCode}
AND #{companyCode} IS NOT NULL THEN company_code = #{companyCode}
-- 带分页查询
SELECT customer_code, customer_name, company_code
FROM customer
WHERE #{keyword} IS NOT NULL THEN customer_name LIKE '%#{keyword}%'
ORDER BY customer_code
-- 分页参数自动添加OFFSET #{pageNum} ROWS FETCH NEXT #{pageSize} ROWS ONLY
-- 聚合查询
SELECT COUNT(*) AS total
FROM customer
WHERE #{salesAreaCode} IS NOT NULL THEN sales_area_code = #{salesAreaCode}
```
### 4.2 SQL 安全验证
**白名单关键字**
```java
Set<String> ALLOWED_KEYWORDS = Set.of(
"SELECT", "FROM", "WHERE", "AND", "OR", "ORDER", "BY", "GROUP", "HAVING",
"OFFSET", "FETCH", "NEXT", "ROWS", "ONLY", "AS", "COUNT", "SUM", "AVG"
);
```
**禁止关键字**
```java
Set<String> DANGEROUS_KEYWORDS = Set.of(
"DROP", "DELETE", "TRUNCATE", "ALTER", "CREATE", "GRANT", "INSERT", "UPDATE"
);
```
---
## 五、安全考虑
### 5.1 SQL 注入防护
1. **强制参数绑定**:禁止拼接 SQL必须使用 PreparedStatement
2. **关键字验证**:执行前验证 SQL 只包含白名单关键字
3. **参数值验证**:基于配置的正则表达式验证参数格式
### 5.2 权限控制
1. **可选认证**:通过 `require_auth` 字段控制
2. **权限标识**:通过 `permission_code` 配置(如 `erp:customer:list`
3. **Sa-Token 验证**
```java
if (config.getRequireAuth() == 1) {
StpUtil.checkPermission(config.getPermissionCode());
}
```
### 5.3 访问控制
- 所有动态 API 默认需要通过网关验证(`X-Gateway-Verified` header
- 可选启用 Sa-Token 权限检查
- 支持 RateLimiter 限流(后续添加)
---
## 六、实现步骤(分阶段)
根据用户确认的设计决策:
- **路由机制**:使用通配符路由(`/erp/dynamic/{version}/{apiPath}`
- **SQL 编辑器**基础版本CodeMirror + 语法高亮)
- **高级功能**:第一版实现完整功能(缓存、监控、版本管理)
### Phase 1核心功能 + 基础增强(第 1-2 周)
**目标**:实现最小可用版本 + 基础高级功能
1. **数据库表创建**hzhub-erp
- 创建 erp_api_config 和 erp_api_param 表(包含缓存、版本字段)
- 创建 erp_api_stats 表(监控统计)
- 添加索引和外键约束
2. **后端基础架构**
- 创建 Domain 实体类ErpApiConfig、ErpApiParam、ErpApiStats
- 创建 Mapper 接口和 XML基础 CRUD
- 创建 Service 接口和实现ErpApiServiceImpl
- 创建 DynamicApiExecutor核心 SQL 执行引擎)
- 创建 ParamTypeConverter参数类型转换
- 创建 ApiCacheServiceRedis 缓存服务)
- 创建 ApiMonitorService调用统计服务
3. **Controller 实现**
- ErpApiControllerCRUD 接口 + 缓存配置 + 版本管理)
- DynamicApiController通配符路由 + 缓存检查 + 统计记录)
4. **前端基础页面**
- 列表页index.vue
- 基础的增删改查功能
- CodeMirror SQL 编辑器(语法高亮)
### Phase 2导入和编辑功能 + 版本管理(第 3 周)
**目标**:完善配置管理功能 + 版本支持
1. **从表导入**
- ServiceimportFromTable 方法
- SQL 模板自动生成
- 参数自动生成
2. **编辑页**
- 两 Tab 设计(基础设置 + 参数配置)
- VxeGrid inline-editable 参数编辑
- SQL 编辑器CodeMirror + SQL Server 语法高亮)
- 版本管理字段api_version支持 v1/v2
3. **前端弹窗**
- 从表导入弹窗
- 基础设置表单(包含缓存配置)
- 版本选择下拉框
### Phase 3测试和文档 + 监控统计(第 4 周)
**目标**:增强可用性 + 监控功能
1. **API 测试功能**
- ServicetestApi 方法
- 执行日志和错误处理
- 前端测试弹窗
2. **API 文档预览**
- ServicegenerateApiDoc 方法
- 前端文档预览弹窗
3. **监控统计功能**
- 创建 erp_api_stats 表(记录调用次数、响应时间、错误率)
- ApiMonitorService记录每次调用调用时间、参数、响应时间
- 统计接口getApiStats、getApiErrorLog
- 前端统计页面:调用次数图表、响应时间趋势
4. **优化体验**
- JSON 格式化展示
- 执行时间统计
- 调用统计可视化
### Phase 4安全增强和稳定性第 5 周)
**目标**:提升安全性和稳定性
1. **安全增强**
- SQL 安全验证SqlValidator
- 权限控制集成
- 参数验证
2. **缓存优化**
- Redis 缓存键生成策略
- 缓存过期处理TTL
- 缓存命中率统计
3. **同步表结构**
- syncTableStructure 方法
4. **状态管理**
- 启用/禁用功能
- API 状态验证
5. **监控告警**
- 响应时间阈值告警
- 错误率告警
- 调用异常记录
---
## 七、关键文件清单
### 后端关键文件(需创建)
1. `/data/hzhub/hzhub-erp/src/main/java/org/hzhub/erp/service/impl/DynamicApiExecutor.java` - 核心 SQL 执行引擎
2. `/data/hzhub/hzhub-erp/src/main/java/org/hzhub/erp/service/impl/ApiCacheService.java` - Redis 缓存服务
3. `/data/hzhub/hzhub-erp/src/main/java/org/hzhub/erp/service/impl/ApiMonitorService.java` - 监控统计服务
4. `/data/hzhub/hzhub-erp/src/main/java/org/hzhub/erp/controller/DynamicApiController.java` - 动态路由入口
5. `/data/hzhub/hzhub-erp/src/main/java/org/hzhub/erp/service/impl/ErpApiServiceImpl.java` - API 配置管理核心业务
6. `/data/hzhub/hzhub-erp/src/main/java/org/hzhub/erp/controller/ErpApiController.java` - API 配置管理 Controller
7. `/data/hzhub/hzhub-erp/src/main/java/org/hzhub/erp/util/SqlValidator.java` - SQL 安全验证工具
### 前端关键文件(需创建)
1. `/data/hzhub/hzhub-admin/apps/web-antd/src/views/erp/api/index.vue` - API 配置列表页
2. `/data/hzhub/hzhub-admin/apps/web-antd/src/views/erp/api/edit-api.vue` - 编辑页(两 Tab
3. `/data/hzhub/hzhub-admin/apps/web-antd/src/views/erp/api/test-modal.vue` - API 测试弹窗
4. `/data/hzhub/hzhub-admin/apps/web-antd/src/views/erp/api/stats-modal.vue` - 统计监控弹窗
5. `/data/hzhub/hzhub-admin/apps/web-antd/src/api/erp/api/index.ts` - API 函数定义
### 需复用的现有文件
- `/data/hzhub/hzhub-erp/src/main/java/org/hzhub/erp/controller/ErpExploreController.java` - 数据库探查功能
- `/data/hzhub/hzhub-admin/apps/web-antd/src/views/tool/gen/edit-gen.vue` - 编辑页设计参考
- `/data/hzhub/hzhub-admin/apps/web-antd/src/views/system/tenant/index.vue` - CRUD 页面参考
---
## 八、验证方式
### 8.1 后端测试
1. **单元测试**
- DynamicApiExecutor SQL 执行测试
- ParamTypeConverter 类型转换测试
- SqlValidator 安全验证测试
2. **集成测试**
- 从表导入流程测试
- API 执行流程测试(完整流程)
- 权限控制测试
3. **手动测试**
- 启动 hzhub-erp 服务
- 访问 Actuator 健康检查:`curl http://localhost:8082/actuator/health`
- 测试动态 API`curl http://localhost:8082/erp/dynamic/v1/customer/list?pageNum=1&pageSize=10`
### 8.2 前端测试
1. **页面功能测试**
- 启动前端:`cd hzhub-admin && pnpm dev`
- 访问 API 管理页面:`http://localhost:5666/#/erp/api`
- 测试列表查询、新增、编辑、删除功能
- 测试从表导入功能
- 测试 API 测试功能
2. **API 执行测试**
- 创建一个测试 API
- 输入参数执行测试
- 查看执行结果和执行时间
- 测试错误场景(错误的 SQL、缺少参数
### 8.3 端到端测试
1. 通过网关访问动态 API
- 先登录获取 Token
- 访问:`http://localhost:8080/erp/dynamic/v1/customer/list?pageNum=1&pageSize=10`
- 验证返回数据格式和分页信息
2. 权限测试:
- 创建一个需要权限的 APIrequire_auth=1, permission_code='erp:test:list')
- 未登录访问应该返回 401
- 无权限用户访问应该返回 403
---
## 九、用户确认的设计决策
根据用户反馈,最终确定的设计决策:
1. **动态路由机制**:使用通配符路由(`/erp/dynamic/{version}/{apiPath}`
- 简单稳定,所有动态 API 共享统一前缀
- 支持版本号v1/v2路径自动包含版本
2. **SQL 编辑器**基础版本CodeMirror + SQL Server 语法高亮)
- 第一版使用代码编辑器 + 语法高亮
- 快速实现核心功能,后续可扩展可视化构建器
3. **高级功能**:第一版实现完整功能
- Redis 缓存支持缓存配置、缓存键模板、TTL、缓存清除
- API 监控:调用统计、响应时间记录、错误日志
- 版本管理:支持 v1/v2 版本号,可同时运行多版本 API
- 统计可视化:调用次数图表、响应时间趋势、错误率统计
这些决策已整合到实现步骤和数据库表设计中。
---
## 十、集成到管理后台的具体方案
### 10.1 菜单配置
需要在 hzhub-system 的菜单表中添加 ERP 管理菜单(通过 SQL 插入):
```sql
-- ERP 管理菜单(一级菜单)
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
VALUES ('ERP管理', 0, 5, '/erp', NULL, 1, 0, 'M', '0', '0', '', 'monitor', 'admin', NOW(), 'ERP API管理目录');
-- API 配置管理菜单(二级菜单)
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
VALUES ('API配置', (SELECT menu_id FROM sys_menu WHERE menu_name='ERP管理'), 1, 'api', 'erp/api/index', 1, 0, 'C', '0', '0', 'erp:api:list', 'tool', 'admin', NOW(), 'API配置管理菜单');
-- API 配置按钮权限
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
VALUES ('API查询', (SELECT menu_id FROM sys_menu WHERE menu_name='API配置'), 1, '', NULL, 1, 0, 'F', '0', '0', 'erp:api:query', '#', 'admin', NOW());
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
VALUES ('API新增', (SELECT menu_id FROM sys_menu WHERE menu_name='API配置'), 2, '', NULL, 1, 0, 'F', '0', '0', 'erp:api:add', '#', 'admin', NOW());
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
VALUES ('API修改', (SELECT menu_id FROM sys_menu WHERE menu_name='API配置'), 3, '', NULL, 1, 0, 'F', '0', '0', 'erp:api:edit', '#', 'admin', NOW());
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
VALUES ('API删除', (SELECT menu_id FROM sys_menu WHERE menu_name='API配置'), 4, '', NULL, 1, 0, 'F', '0', '0', 'erp:api:remove', '#', 'admin', NOW());
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time)
VALUES ('API测试', (SELECT menu_id FROM sys_menu WHERE menu_name='API配置'), 5, '', NULL, 1, 0, 'F', '0', '0', 'erp:api:test', '#', 'admin', NOW());
-- API 监控统计菜单(二级菜单)
INSERT INTO sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark)
VALUES ('API监控', (SELECT menu_id FROM sys_menu WHERE menu_name='ERP管理'), 2, 'stats', 'erp/stats/index', 1, 0, 'C', '0', '0', 'erp:api:stats', 'monitor', 'admin', NOW(), 'API调用统计监控');
```
### 10.2 权限体系集成
- 所有 API 配置管理接口都需要权限验证(通过 Sa-Token
- 前端按钮使用 `v-access:code="['erp:api:add']"` 控制权限
- 动态 API 本身的权限通过配置表的 `require_auth` 和 `permission_code` 字段控制
- 与现有的系统管理、监控等模块共享统一的 JWT Token
### 10.3 组件复用
复用 hzhub-admin 的标准组件和适配器:
- `useVbenVxeGrid` - 表格组件(列表页)
- `useVbenForm` - 表单组件(搜索、编辑)
- `useVbenDrawer` / `useVbenModal` - 抽屉/弹窗组件
- `TableSwitch` - 状态切换组件
- `CodeMirror` - SQL 编辑器(复用代码生成器的编辑器)
### 10.4 API 函数集成
在 `/data/hzhub/hzhub-admin/apps/web-antd/src/api/erp/` 目录下新增 API 模块,遵循现有的 API 定义模式:
- 使用 `requestClient` 统一请求客户端
- 使用 `postWithMsg` / `putWithMsg` / `deleteWithMsg` 自动提示消息
- 定义 TypeScript 类型model.d.ts
---
本方案提供了一个完整的 ERP API 管理平台设计,**完全集成到管理后台中**,实现统一管理。从数据库表设计、后端架构、前端界面到安全防护都有详细规划,包含缓存、监控、版本管理等完整功能。实现步骤按优先级分阶段推进,确保核心功能优先完成,逐步增强功能和安全性。