功能点
https://www.yuque.com/docs/share/b2744453-e825-4078-b4f0-501df37d7868?# 《功能点梳理》
结构
模块说明
Core
项目的核心模块,主要由3部分组成:
- Repository接口: 定义操作db的核心方法, 例如query,execute,配置dataSource等
- Service接口: 定义项目的核心方法,以提供给业务层和内部rpc服务调用
- CoreModel模块: 定义项目内部使用的POJO模型或者只有内部才会使用的常量,枚举等
core模块里面没有代码的具体功能实现, 只是对功能的形式进行定义, 并且core模块不应当依赖于其他任何一个模块,它是底层服务的入口,真正的业务层将依赖于core模块来实现功能
ServiceImpl
依赖于core模块, 功能上用于实现core模块中的service接口.
这个模块代码实现的内容包括:
- 动态选择LowCodeRepository的实现 - 这个功能的位置待定,暂时放在这里
- 组合调用core中的LowCodeRepository接口, 完成低代码相关db操作,例如调用一个建表的方法
- 调用DAP/Mapper存储业务数据, 例如页面配置的表信息,查询方式等, 可以采用jpa等通用db交互方式
LowCodeRepositoryImpl
依赖于core模块, 功能上用于实现core模块中的LowCodeRepository接口,是动态数据库操作的核心
这个模块具体的功能应当包括:
- db记录和项目模型的转换
- 生成db操作的具体语句
- 发送语句交给db执行
该模块可以有复数个, 每种db理应对应一个实现,当需要连接新db时,新加一个该模块
需要注意管理dataSource的写法
bizData
一般db操作, jpa,tkmapper都行, 其实可以放在serviceImpl里面而不是单独抽一个模块.
但是考虑到也许以后LowCodeRepositoryImpl的复杂实现可能会依赖于db, 所以将它抽出来.
与数据库交互的实体类, 应该有一个公共的父类, 存有id,时间等基本字段
bizModel
biz
业务代码模块,依赖于bizModel模块和core模块
这个模块包括功能类似下面这些:
- 参数校验
- 出入参包装/转化
- 复杂的业务逻辑
对第三方功能的调用和结果处理(第三方服务应该专门抽一个模块)
infrastructure
专用于提供对内rpc服务的模块, 其他微服务有可能也需要调用低代码的功能,通过该模块提供出去
理论上的功能应当是大于等于biz层封装的功能的对外入口
应当有三种对外入口
api: 提供给前端访问的api服务, 只提供biz里面的功能
- sdk: 是对api的封装,提供sdk的形式调用接口的可能, 参照alipay
- rpc: 通过OpenRemote把服务当rpc服务提供出去, 看需要增加功能
理论上来说, 项目整体完成后, 只需要维护这部分入口代码即可
bizData类图
实现功能所需的数据库表应当包含以下几个个方面:
- 表结构存储所需的, 例如列, 索引, 校验用到的表
- 语法存储所需的, 例如定义复杂查询
- 表单的存储结构, 用于存储页面对表单的设计
- 人的属性和语法的关联关系表, 例如用户创建了哪些表, 用户创建了哪些sql语句, 哪个表单用哪个sql
下图中省略:id,createTime,modifyTiem,createBy,modifyBy
五个基本字段,待定:是否要软删
表的基本存储结构
语法的存储结构
参考页面
sql示例
1.1【插入单行】 - 新增
insert into <表名> (列名) values (列值)
例:insert into Strdents (姓名,性别,出生日期) values ('开心朋朋','男','1980/6/15');
【前端传入值】
schemaId,List<ColumnName>,List<rowValue>
codes(insert)
1.2【插入多行】- 导入/仅新增
insert into <表名> (列名) values (列值),(列值) * n次循环
例:insert into Strdents (姓名,性别,出生日期) values ('开心朋朋','男','1980/6/15'),('开心朋朋2','男','1980/6/15');
1.3【修改单行】- 编辑
update <表名> set (列名) = (列值), * n次循环 where id = <rowId>
例:update emp set sex='男';
【前端传入值】
schemaId,List<RowParam(列名,value)>,rowId
codes(update-where)
1.4【删除单行】- 删除/仅支持删除指定行
delete from <表名> WHERE id = <rowId>
例:delete from emp where id = '1';
【前端传入值】
schemaId,List<RowParam(列名,value)>,行id
codes(delete-where)
1.5【查询全部/部分】- 导出
select <列名> * n次循环 from <源表名>
例:select name,address,email from students;
1.6【条件查询】
select <列名> * n次循环 from <源表名> where (<列名> <column-condition > <页面输入值>) <where-condition> * n次循环
例:select name,address,email from students
1.7 【join连接】
select <列名> * n次循环 from <源表名> join <目标表> on <源表column> = <目标表column>
例: select * from Info join Nation on Info.Nation = Nation.Code
1.8 【子查询】
select * from Info where Nation = (select Code from Nation where Name='汉族') 两个查询 一个查询的结果当做另一个查询的条件 查一个 =
select * from Info where Nation in (select Code from Nation where Name='汉族' or Name='苗族')
类设计
SqlGrammer : sql语法表
- codes属性, ,例如 select-where/ select / select - join - where,
- type属性, basic所有表通用,不允许修改, advanced是用户创建的可以修改
- whereCondition, 当type为advanced时,需要指定本语法where条件的连接方式 不支持and和or的复杂混用
SqlTemplate : sqlCodes 对照表, 这个或许可以不用表的形式
- code, code代表语句中用到了哪些具体的sql语法, 例如select , where , order
- value, 某个code对应的语法模板, 例如join xxx on xxx
GrammerColumn: 语法列配置表
保存语法对列的查询方式, and/join/in这些都放在一起, 只要查询这一次就够了
- type, 当前列的配置是对哪一部分生效, 例如指定查询某几列, where条件中的列等
- columnId,列id
- columnCondition, 如果是where条件, 则页面配置的时候会有连接条件
- value, 如果是where条件, 则页面配置的时候会有值
- order, 列在sql中出现的顺序
- son,是否有子查询的标志 column in/= (子查询)
- sonSqlGrammerId,如果有子查询, 子查询的sql语法组装
- targetSchemaId, 如果有join查询, 具体join那张表的id
- targetSchemaId, 如果有join查询, 具体join目标表的哪一列
UserGrammerRelation: 用户和语法的关系表
- userId用户属性标识, 和人相关的一个属性, 具体是哪个值待定
- 语法的存储应当是无属性的, 与业务的关联管理在本表中
- schemaId: 本条语法创建在哪张表上
表单存储结构(暂不实现)
参考以下内容图表设计
表单设计
数据结构
db配置
项目规范
异常标准
抛出的异常信息,应该包含以下内容 ```java 抛出异常的模块/异常的级别/异常code/异常描述 例如: SERVICE-5-NOTFOUND-没有找到模板
```
该异常信息抛出后页面不显示, 前端根据异常code自行决定显示方式
或者只返回异常code, 其他信息写在log里
日志标准
- 需要能够输出执行的sql
- 需要能够输出某些方法的出入参
- 需要能够随时开启和关闭某种日志
- 需要确定统一日志格式