# 模块开发规范 模块包括完成特定功能的前后台代码,符合[ahserver](https://git.opencomputing.cn/yumoqing/ahserver)+[sqlor](https://git.opencomputing.cn/yumoqing/sqlor)+[bricks](https://git.opencomputing.cn/yumoqing/bricks)技术路线的B/S架构 假设需开发的模块名为“mymodule” ## 模块目录结构 ``` +--mymodule目录 # 存放模块的主要逻辑py代码 | | | +--init.py # 模块初始化脚本,需要定义一个load_mymodule()函数,此函>数需要将在ui和dspy文件中用到的函数通过ServerEnv实例传过去 | | | +--__init__.py #python模块所需 | | | +--其他源码.py # 模块中需要的其他py源码文件 | +--wwwroot目录 # 前后台脚本,文件以.ui和.dspy结束,ui文件是bricks控件的json文件,支持jinja2模板;dspy是ahserver支持的受限python脚本,可以按照需要设置下级目录 | +--models目录 # 模块使用的数据表以“表名.json”为文件名,存放在此目录中 | +--json目录 # CRUD描述文件,以“表名或别名.json”为文件名 | +--pyproject.toml文件 # pip打包文件, 其中项目名字与mymodule相同 | +--README.md文件 # 模块自说明文件 | +--init目录 # 模块初始化目录 | +--data.json # 初始化数据 | +--script.py # 初始化脚本 ``` ## 核心代码 模块的核心代码保存在mymodule目录下,init.py是每个模块都需要的, init.py中定义一个load_`mymodule`函数,如pricing模块为load_pricing(),accounting模块为load_accounting(),在此模块中做初始化模块,并把模块的核心代码通过ServerEnv()发布给应用的脚本使用, 以下为例子 ``` from ahserver.serverenv import ServerEnv from appPublic.worker import awaitify from .x import a, b, c # a,b, c是协程 from .y import x, y # x, y是普通函数 def load_mymodule(): # mymodule需替换为实际的模块名字 env = ServerEnv() env.a = a # 脚本中用"a" 调用"a" env.b = b # 脚本中用"b"调用"b" env.cc = c # 脚本中用"cc"调用"c" env.y = awaitify(y) # 将函数包装为协程 env.x = awaitify(x) # 将函数包装为协程 ``` 数据库表操作需要符合[sqlor数据库操作规范](sqlor.md) ## 数据库表设计 [数据库表设计规范](table.md) ## 数据表的CRUD 为数据表定义crud功能, 每个表至少一个 ## 初始化数据 init/data.json 文件保存需要初始化的数据,格式如下 { "table1":[ { "field1":"value1", ... }, ... { "field1":"valuen", ... } ] } ### 模块中使用的编码 模块中如果用到编码,编码需保存在appbase模块的appcodes表和appcodes_kv两个表中 appcodes(编码表)有如下字段: [ "id" # str 32, 主键,可设置为数据表字段名称 "name" # 编码名称 "hierarchy_flg", # str 1, '0':单级编码,“1”:多级编码 ] appcodes_kv(编码键值表)字段如下 [ "id", # str, 32,主键,唯一值 "parentid" # str, 32, 一级编码为appcodes表的id, 否则为上级编码键值记录的id “k" # str 32, 编码值 “v” “ str 255,编码显示文本 ] ## 前后台脚本 本模块用到的脚本以及资源都放在这个目录下,以.ui和.dspy后缀结束,用.ui文件遵守jinja2规范, 而.dspy文件是一个受控的脚本 脚本中可以直接使用的变量,请看[脚本中可以使用的变量列表](variable.md) ## 工程文件 ### pyproject.toml文件 python模块打包控制文件 ### README.md文件 模块说明文件