aicode/kdb/module.md
2026-01-15 17:14:16 +08:00

4.3 KiB
Raw Blame History

模块开发规范

假设需开发的模块名为“mymodule”

一个模块如果使用数据库存储数据则需要按照数据表规范生成数据表和相应的crud定义

模块目录结构

    +--mymodule目录         # 存放模块的主要逻辑py代码
        
        +--init.py        # 模块初始化脚本需要定义一个load_mymodule()函数,此函>数需要将在ui和dspy文件中用到的函数通过ServerEnv实例传过去
        
        +--__init__.py    #python模块所需
        |
    |     +--其他源码.py	# 模块中需要的其他py源码文件
        
    +--wwwroot目录          # web服务脚本文件以.ui和.dspy结束ui文件支持jinja2模>板前端控件文件内容为json格式的控件描述文本 dspy是ahserver支持的受限python脚本>,可以按照需要设置下级目录
    
    +--models目录           # 模块使用的数据表以.xlsx后缀存放在此目录中
    
    +--json目录             # 存放json文件定义数据表的CRUD逻辑
    
    +--pyproject.toml文件   # pip打包文件, 其中项目名字与mymodule相同
    
    +--README.md文件        # 模块自说明文件
    
    +--init目录             # 模块初始化目录
        
        +--data.json        # 初始化数据
        
        +--script.py        # 初始化脚本

mymodule/init.py的主要内容

from ahserver.serverenv import ServerEnv
from appPublic.worker import awaitify
from .x import a, b, c  # ab, 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) # 将函数包装为协程

注释这里的load_mymodule中的mymodule是模块名字而不是“mymodule”本身

mymodule/*.py

模块中的主要逻辑用py源码

models/*.json

每个数据表一个文件,存放按照数据表定义规范生成的数据表定义

json/*.json

为数据表定义crud功能 每个表至少一个

wwwroot/*.ui

模块前端ui代码文件内容遵守json格式要求支持jinja2模板

wwwroot/*.dspy

模块后端脚本代码

init/data.json

文件保存需要初始化的数据,格式如下 { "table1":[ { "field1":"value1", ... }, ... { "field1":"valuen", ... } ] }

init/script.py

脚本主要任务是将init/data.json中的数据导入到数据库中

  • 客户端业务功能放在wwwroot目录下以.ui和.dspy后缀结束用.ui文件遵守jinja2规范, 而.dspy文件是一个受控的脚本

  • 返回客户端数据的功能放在wwwroot目录下以.dspy后缀结束

ui, dspy可以直接使用的变量

request

aiohttp.Request实例每个客户端请求有一个独立的Request实例

request._run_ns可以获得所有在.ui和.dspy源码中可以使用的变量通过ahserver.ServerEnv 传递

params_kw

DictObjectdict子类, 支持a.b方式获取属性实例接收到客户端传来的数据如果有文件>文件都保存在服务器指定的位置params_kw中属性名保存的是其相对路径可用FileStorage().realPath(params_kw.myfile)来获得文件在服务器中的实际路径。

get_user()

来自rbac模块协程函数获得当前登录用户如果用户没有登录返回None

get_userorgid()

来自rbac模块协程函数获得当前登录用户的机构id如果用户没有登录返回None

pyproject.toml和README.md

编写pyproject.toml文件和README.md文件

模块中使用的编码

模块中如果用到编码编码需保存在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,编码显示文本 ]