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

7.8 KiB
Raw Permalink Blame History

树形数据管理模块技术文档

概述

本模块用于根据数据库表结构和配置文件自动生成基于树形控件Tree的前端 UI 配置及后端 CRUD 接口代码。适用于快速构建具有父子层级关系的数据管理系统。

该工具支持通过 .xlsx 或其他格式描述的数据模型生成完整的树形界面与操作逻辑,包括:

  • 树形展示界面 (index.ui)
  • 获取节点数据接口
  • 新增、更新、删除节点接口

依赖说明

外部依赖

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 查询逻辑

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

示例输出

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_fieldsidFieldparentField
  6. 依次调用各 gen_* 函数生成所有文件

main(dbdesc, outdir, modulename, fn)

解析输入 JSON/XLSX 配置文件并执行生成流程

参数

  • dbdesc: 数据库描述对象
  • outdir: 输出目录
  • modulename: 模块名称(用于确定数据库)
  • fn: 输入配置文件路径JSON 或 XLSX

⚠️ 注意:函数重复定义两次,应保留一个。


命令行运行方式

python tree_generator.py <model_path> <outpath> <modelname> <tree_desc_file> [...]

参数说明

参数 说明
model_path 数据模型路径(通常是 .xlsx 文件或模型目录)
outpath 输出代码的目标目录
modelname 模块名(用于查找数据库配置)
tree_desc_file... 一个或多个树形结构定义文件JSON 或 XLSX

示例

python tree_generator.py ./models/db.xlsx ./output/admin usermgr ./trees/org_tree.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