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

284 lines
7.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.

# 树形数据管理模块技术文档
## 概述
本模块用于根据数据库表结构和配置文件自动生成基于树形控件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