284 lines
7.8 KiB
Markdown
284 lines
7.8 KiB
Markdown
# 树形数据管理模块技术文档
|
||
|
||
## 概述
|
||
|
||
本模块用于根据数据库表结构和配置文件,自动生成基于树形控件(Tree)的前端 UI 配置及后端 CRUD 接口代码。适用于快速构建具有父子层级关系的数据管理系统。
|
||
|
||
该工具支持通过 `.xlsx` 或其他格式描述的数据模型生成完整的树形界面与操作逻辑,包括:
|
||
- 树形展示界面 (`index.ui`)
|
||
- 获取节点数据接口
|
||
- 新增、更新、删除节点接口
|
||
|
||
---
|
||
|
||
## 依赖说明
|
||
|
||
### 外部依赖
|
||
|
||
```python
|
||
import os
|
||
import sys
|
||
import codecs
|
||
import json
|
||
```
|
||
|
||
### 内部模块依赖
|
||
|
||
| 模块路径 | 功能 |
|
||
|--------|------|
|
||
| `appPublic.dictObject` | 提供 `DictObject` 类,将字典转换为可点式访问的对象 |
|
||
| `appPublic.folderUtils` | 文件夹操作工具:`listFile`, `_mkdir` |
|
||
| `appPublic.myTE` | 自定义模板引擎 `MyTemplateEngine`,支持 Jinja2 风格语法 |
|
||
| `xlsxData.xlsxFactory` | 从 Excel 文件中读取数据模型 |
|
||
| `xls2crud.build_dbdesc` | 构建数据库描述对象 |
|
||
| `xls2crud.field_list` | 提取字段列表 |
|
||
| `xls2crud.subtable2toolbar` | 将子表信息转为工具栏按钮配置 |
|
||
| `xls2crud.filter_backslash` | 过滤字符串中的多余反斜杠 |
|
||
| `tmpls.*_tmpl` | 各类模板字符串(新增、更新、删除、获取数据等) |
|
||
|
||
---
|
||
|
||
## 模板定义
|
||
|
||
### `ui_tmpl` - 树形组件 UI 配置模板
|
||
|
||
此模板用于生成 `index.ui` 文件,定义前端 Tree 组件的配置项。
|
||
|
||
#### 参数说明
|
||
|
||
| 字段名 | 类型 | 是否必需 | 描述 |
|
||
|-------|------|----------|------|
|
||
| `widgettype` | string | 是 | 固定为 `"Tree"` |
|
||
| `title` | string | 否 | 页面标题;若未提供则使用 `summary[0].title` |
|
||
| `description` | string | 否 | 页面描述 |
|
||
| `toolbar` | array | 否 | 工具栏按钮配置(JSON 格式输出) |
|
||
| `editable` | object | 否 | 编辑功能开关及 URL 配置 |
|
||
| `add_url` | string | 否 | 新增接口地址,默认为 `./new_{tblname}.dspy` |
|
||
| `update_url` | string | 否 | 更新接口地址,默认为 `./update_{tblname}.dspy` |
|
||
| `delete_url` | string | 否 | 删除接口地址,默认为 `./delete_{tblname}.dspy` |
|
||
| `checkField` | string | 否 | 可选复选框字段 |
|
||
| `parentField` | string | 是 | 父节点字段名(如 `parent_id`) |
|
||
| `idField` | string | 是 | 主键字段名 |
|
||
| `textField` | string | 是 | 显示文本字段名 |
|
||
| `typeField` | string | 否 | 节点类型字段 |
|
||
| `params` | object | 否 | 请求附加参数 |
|
||
| `newdata_params` | object | 否 | 新增时携带参数 |
|
||
| `node_typeicons` | object | 否 | 不同类型节点图标映射 |
|
||
| `dataurl` | string | 否 | 获取节点数据接口地址,默认为 `./get_{tblname}.dspy` |
|
||
| `binds` | object | 否 | 数据绑定配置(JSON 格式输出,缩进4格) |
|
||
|
||
> **注意**:模板中使用 `{%- raw -%}` 和 `{%- endraw %}` 包裹动态路径表达式以防止被提前渲染。
|
||
|
||
---
|
||
|
||
### `get_nodes_tmpl` - 获取树节点数据脚本模板
|
||
|
||
生成用于查询树节点的 Python 异步脚本(`.dspy`),支持父子层级过滤。
|
||
|
||
#### SQL 查询逻辑
|
||
|
||
```sql
|
||
SELECT * FROM {tblname}
|
||
WHERE {parentField} = ${id}$ -- 当前节点的子节点
|
||
OR {parentField} IS NULL -- 根节点
|
||
ORDER BY {textField}
|
||
```
|
||
|
||
#### 上下文变量
|
||
|
||
- `params_kw`: 前端传入参数字典
|
||
- `db`: 使用 `DBPools()` 获取数据库连接池
|
||
- `dbname`: 通过 `get_module_dbname(modulename)` 获取模块对应数据库名
|
||
|
||
返回结果为查询到的记录列表。
|
||
|
||
---
|
||
|
||
## 核心函数说明
|
||
|
||
### `gen_tree_ui(d, pat)`
|
||
生成树形 UI 配置文件 `index.ui`
|
||
|
||
#### 参数
|
||
- `d` (dict/DictObject): 渲染上下文数据
|
||
- `pat` (str): 输出目录路径
|
||
|
||
#### 行为
|
||
1. 使用 `MyTemplateEngine` 渲染 `ui_tmpl`
|
||
2. 写入 `pat/index.ui` 文件
|
||
3. 调用 `filter_backslash` 清理反斜杠
|
||
|
||
---
|
||
|
||
### `gen_get_nodedata(d, pat)`
|
||
生成获取节点数据的 `.dspy` 脚本
|
||
|
||
#### 输出文件
|
||
`get_{tblname}.dspy`
|
||
|
||
#### 示例输出
|
||
```python
|
||
ns = params_kw.copy()
|
||
sql = '''select * from my_table where 1 = 1'''
|
||
id = ns.get('parent_id')
|
||
if id:
|
||
sql += " and parent_id = ${id}$"
|
||
else:
|
||
sql += " and parent_id is null"
|
||
sql += " order by name "
|
||
...
|
||
```
|
||
|
||
---
|
||
|
||
### `gen_new_nodedata(d, pat)`
|
||
生成新增节点接口脚本
|
||
|
||
#### 输出文件
|
||
`new_{tblname}.dspy`
|
||
|
||
调用 `data_new_tmpl` 模板进行渲染。
|
||
|
||
---
|
||
|
||
### `gen_update_nodedata(d, pat)`
|
||
生成更新节点接口脚本
|
||
|
||
#### 输出文件
|
||
`update_{tblname}.dspy`
|
||
|
||
调用 `data_update_tmpl` 模板进行渲染。
|
||
|
||
---
|
||
|
||
### `gen_delete_nodedata(d, pat)`
|
||
生成删除节点接口脚本
|
||
|
||
#### 输出文件
|
||
`delete_{tblname}.dspy`
|
||
|
||
调用 `data_delete_tmpl` 模板进行渲染。
|
||
|
||
---
|
||
|
||
### `build_tree_ui(tree_data, dbdesc)`
|
||
主入口函数:根据树配置和数据库结构生成全部文件
|
||
|
||
#### 参数
|
||
- `tree_data`: 包含 `output_dir`, `tblname`, `params` 的对象
|
||
- `dbdesc`: 数据库结构描述字典(由 `build_dbdesc` 生成)
|
||
|
||
#### 流程
|
||
1. 创建输出目录
|
||
2. 提取当前表结构并封装为 `DictObject`
|
||
3. 添加额外参数(如 title、toolbar 等)
|
||
4. 调用 `subtable2toolbar(tbldesc)` 自动生成工具栏
|
||
5. 计算可编辑字段列表(排除 `edit_exclouded_fields`、`idField`、`parentField`)
|
||
6. 依次调用各 `gen_*` 函数生成所有文件
|
||
|
||
---
|
||
|
||
### `main(dbdesc, outdir, modulename, fn)`
|
||
解析输入 JSON/XLSX 配置文件并执行生成流程
|
||
|
||
#### 参数
|
||
- `dbdesc`: 数据库描述对象
|
||
- `outdir`: 输出目录
|
||
- `modulename`: 模块名称(用于确定数据库)
|
||
- `fn`: 输入配置文件路径(JSON 或 XLSX)
|
||
|
||
> ⚠️ 注意:函数重复定义两次,应保留一个。
|
||
|
||
---
|
||
|
||
## 命令行运行方式
|
||
|
||
```bash
|
||
python tree_generator.py <model_path> <outpath> <modelname> <tree_desc_file> [...]
|
||
```
|
||
|
||
### 参数说明
|
||
|
||
| 参数 | 说明 |
|
||
|------|------|
|
||
| `model_path` | 数据模型路径(通常是 `.xlsx` 文件或模型目录) |
|
||
| `outpath` | 输出代码的目标目录 |
|
||
| `modelname` | 模块名(用于查找数据库配置) |
|
||
| `tree_desc_file...` | 一个或多个树形结构定义文件(JSON 或 XLSX) |
|
||
|
||
### 示例
|
||
|
||
```bash
|
||
python tree_generator.py ./models/db.xlsx ./output/admin usermgr ./trees/org_tree.json
|
||
```
|
||
|
||
---
|
||
|
||
## 配置文件结构示例(JSON)
|
||
|
||
```json
|
||
{
|
||
"tblname": "org_dept",
|
||
"output_dir": "./output/admin/org",
|
||
"title": "组织架构管理",
|
||
"description": "管理部门与人员的树形结构",
|
||
"parentField": "parent_id",
|
||
"idField": "id",
|
||
"textField": "dept_name",
|
||
"typeField": "dept_type",
|
||
"notitle": false,
|
||
"editable": true,
|
||
"new_data_url": "/api/org/add",
|
||
"update_data_url": "/api/org/edit",
|
||
"delete_data_url": "/api/org/remove",
|
||
"get_data_url": "/api/org/nodes",
|
||
"params": {
|
||
"status": "active"
|
||
},
|
||
"newdata_params": {
|
||
"autoCreateCode": true
|
||
},
|
||
"node_typeicons": {
|
||
"company": "icon-company",
|
||
"department": "icon-dept"
|
||
},
|
||
"edit_exclouded_fields": ["created_time", "updated_by"]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 输出文件结构
|
||
|
||
在指定 `output_dir` 下生成以下文件:
|
||
|
||
```
|
||
output_dir/
|
||
├── index.ui # 树形界面配置
|
||
├── get_<tblname>.dspy # 获取节点数据
|
||
├── new_<tblname>.dspy # 新增节点
|
||
├── update_<tblname>.dspy # 更新节点
|
||
└── delete_<tblname>.dspy # 删除节点
|
||
```
|
||
|
||
---
|
||
|
||
## 扩展建议
|
||
|
||
1. **增加校验机制**:对必填字段(如 `idField`, `parentField`)做存在性检查
|
||
2. **支持更多控件类型**:可通过 `widgettype` 扩展为 TreeGrid、Cascade 等
|
||
3. **国际化支持**:在模板中加入 `i18n` 支持
|
||
4. **权限控制注入**:可在 `.dspy` 脚本中自动添加权限判断逻辑
|
||
|
||
---
|
||
|
||
## 版权与维护
|
||
|
||
- 项目:通用 CRUD 代码生成器子模块
|
||
- 维护者:未知(原始作者)
|
||
- 修改建议:请提交 PR 或 issue 至项目仓库
|
||
|
||
---
|
||
|
||
> ✅ 文档版本:v1.0
|
||
> 📅 最后更新:2025-04-05 |