xls2ddl/aidocs/xls2ui.md
2025-10-12 13:57:44 +08:00

244 lines
6.8 KiB
Markdown
Raw 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.

# `xls2crud` 工具技术文档
> **用途**:将基于 JSON 描述的数据库模型和 CRUD 配置文件转换为前端 UI 代码CRUD 或树形结构界面)。
---
## 概述
本脚本是一个命令行工具,用于根据指定的模型目录和 JSON 配置文件生成前端 CRUD增删改查或树形结构TreeUI 所需的代码。它通过解析 Excel 衍生出的 JSON 结构,并结合环境变量与模板机制,动态生成对应模块的用户界面代码。
主要功能包括:
- 解析命令行参数
- 加载并处理数据库模型定义
- 处理多个 JSON 格式的 CRUD 配置文件
- 支持环境变量注入(模板替换)
- 分发至不同的 UI 构建器CRUD / Tree
---
## 依赖说明
### 第三方/内部模块
| 模块 | 用途 |
|------|------|
| `os`, `sys` | 系统路径、环境变量、退出控制 |
| `argparse` | 命令行参数解析 |
| `json`, `codecs` | JSON 文件读取(支持 UTF-8 编码) |
| `copy` | 对象拷贝 |
| `appPublic.argsConvert.ArgsConvert` | 支持 `${}` 形式模板变量替换 |
| `appPublic.dictObject.DictObject` | 将字典转为可点式访问的对象 |
| `xls2crud.build_dbdesc`, `build_crud_ui` | 构建数据库描述及 CRUD 界面 |
| `singletree.build_tree_ui` | 构建树形结构 UI |
> ⚠️ 注意:`appPublic`、`xls2crud` 和 `singletree` 是项目内部模块,请确保已安装或在 Python 路径中可用。
---
## 命令行使用方式
```bash
python xls2crud.py [-m models_dir] [-o output_dir] modulename [json_file ...]
```
### 参数说明
| 参数 | 必需 | 说明 |
|------|------|------|
| `modulename` | ✅ | 指定生成代码所属的模块名称(通常用于命名空间或路由前缀) |
| `json_file ...` | ✅(至少一个) | 一个或多个描述表单逻辑的 `.json` 配置文件路径 |
| `-m`, `--models_dir` | ❌ | 数据库模型文件所在的目录列表(可多个),用于构建 `dbdesc` 对象 |
| `-o`, `--output_dir` | ❌ | 输出代码的目标根目录,默认行为可能由配置决定 |
> 如果未提供任何 JSON 文件,程序将打印用法提示并退出。
---
## 输入文件格式CRUD JSON 配置
每个 JSON 文件应遵循如下结构:
```json
{
"tblname": "user",
"alias": "usr", // 可选,作为输出目录名
"uitype": "crud", // 或 "tree"
"params": {
"title": "用户管理",
"fields": [...],
"actions": [...]
}
}
```
### 字段说明
| 字段 | 类型 | 是否必需 | 说明 |
|------|------|----------|------|
| `tblname` | string | ✅ | 关联的数据表名 |
| `alias` | string | ❌ | 输出目录名称;若不存在则使用 `tblname` |
| `uitype` | string | ❌ | UI 类型,可选 `"crud"`(默认)或 `"tree"` |
| `params` | object | ✅ | 包含具体 UI 参数的对象,如标题、字段、操作等 |
| `params.modulename` | string | ❌ | 自动生成,由命令行传入 |
| `params.tblname` | string | ❌ | 自动生成,来自 `tblname` 字段 |
> 💡 支持模板语法 `${VAR_NAME}`,会从环境变量中自动替换。
---
## 环境变量支持(模板替换)
系统使用 `ArgsConvert('${', '}$')` 实现对配置中的 `${...}` 占位符进行替换。
例如:
```json
{
"params": {
"api_base": "${API_HOST}/v1/data"
}
}
```
若环境变量中有 `API_HOST=http://localhost:8000`,则最终值会被替换为:
```json
"api_base": "http://localhost:8000/v1/data"
```
所有当前进程的环境变量均会被加载进命名空间 `ns` 中供替换使用。
---
## 核心流程说明
### 1. 参数解析
使用 `argparse` 解析输入参数,获取:
- 模型目录 (`models_dir`)
- 输出目录 (`output_dir`)
- 模块名 (`modulename`)
- 一个或多个 JSON 配置文件路径
### 2. 构建数据库描述对象 (`dbdesc`)
调用 `build_dbdesc(models_dir)` 从模型目录中提取数据库元信息(如表结构、字段类型等),结果封装为 `DictObject` 以便点式访问。
```python
dbdesc = DictObject(**dbdesc)
```
### 3. 遍历处理每个 JSON 文件
对每一个 JSON 文件执行以下步骤:
#### a. 读取并解析 JSON
使用 `codecs.open(..., 'utf-8')` 安全读取 UTF-8 编码内容,防止中文乱码。
#### b. 模板变量替换
利用 `ArgsConvert``${VAR}` 替换为环境变量实际值。
#### c. 转换为 `DictObject`
便于后续通过 `obj.field.subfield` 访问嵌套属性。
#### d. 设置输出目录
```python
crud_data.output_dir = os.path.join(args.output_dir, tblname)
```
以表名或别名为子目录创建独立输出路径。
#### e. 注入模块名和表名到 params
```python
crud_data.params.modulename = args.modulename
crud_data.params.tblname = crud_data.tblname
```
#### f. 克隆数据库描述
避免污染原始 `dbdesc`,每次传递副本:
```python
db = dbdesc.copy()
```
#### g. 分发 UI 构建任务
根据 `uitype` 决定调用哪个构建函数:
| `uitype` | 函数调用 |
|---------|--------|
| `"tree"` | `build_tree_ui(crud_data, db)` |
| 其他(默认) | `build_crud_ui(crud_data, db)` |
---
## 示例运行命令
```bash
python xls2crud.py \
-m ./models/user -m ./models/shared \
-o ./output \
admin \
./crud_configs/user.json \
./crud_configs/org.json
```
输出结构示例:
```
./output/
├── user/
│ ├── form.js
│ ├── list.vue
│ └── api.js
└── org/
├── form.js
├── list.vue
└── api.js
```
---
## 错误处理
- 若未提供 JSON 文件,输出帮助信息并退出码为 `1`
- 若文件无法打开或 JSON 格式错误,抛出异常(建议添加 try-except 包裹增强健壮性)
---
## 待改进点(建议)
| 问题 | 建议 |
|------|------|
| 缺少异常捕获 | 添加 `try...except` 处理文件读取、JSON 解析错误 |
| 日志输出简单 | 使用 `logging` 模块替代 `print()` |
| 输出目录自动创建 | 添加 `os.makedirs(crud_data.output_dir, exist_ok=True)` |
| 更详细的帮助信息 | 在 `ArgumentParser` 中补充描述 |
---
## 总结
该脚本是自动化生成前端管理界面的重要一环,适用于基于模型驱动开发的企业级后台系统。通过灵活的配置与模板机制,实现了高复用性和可维护性。
---
## 附录:完整调用链示意图
```
[CLI Input]
argparse → args(models_dir, output_dir, modulename, files[])
build_dbdesc(models_dir) → dbdesc (DictObject)
for each file in files:
read JSON → a
ac.convert(a, env) → 替换 ${} 变量
a → DictObject → crud_data
crud_data.output_dir = output_dir/tblname
crud_data.params.{modulename,tblname} = ...
db = dbdesc.copy()
if uitype == 'tree':
build_tree_ui(crud_data, db)
else:
build_crud_ui(crud_data, db)
```
---
**版本**1.0
📅 **最后更新**2025-04-05