服务端代码
开发流程
遵循传统三层结构
实体定义 -> Repository定义 -> Service定义 -> Controller定义
实体定义
在 kernel 模块 cn.gson.financial.kernel.model.entity 包下创建业务实体类
实体类定义遵循jpa标准,字段定义和配置好后,启动项目可自动建表
⚠️注意事项:
1.账套关联数据,实体类需要继承 AbsEntity 类,AbsEntity定义了联合主键(accountSetsId,id)
2.非账套关联数据不需要继承
已凭证字模块为例:
@Comment 和 @ColumnDefault 是v4版本才支持,v3版本不支持这两个注解,v3可以通过 @Column 注解的 columnDefinition 属性实现类似功能
Repository定义
单表数据的 save 操作,需要通过JPA的Repository进行
在 kernel 模块 cn.gson.financial.kernel.model.repo 包下创建Repository
Service定义
在 kernel 模块 cn.gson.financial.kernel.service 包下创建Repository
service需要继承AbsService
AbsService提供了三个对象:
- lazyDao:sqlToy调用
- jqf:queryDsl的update和delete操作对象
- bqf:queryDsl的select操作对象
- snowflakeId:雪花ID生成器
lazyDao、jqf、bqf三个对象的使用可参考以下文档
- querydsl
- blazebit
- sqltoy
目前系统数据操作层面,大多数情况下querydsl能满足业务数据的查询操作,只有涉及到特别复杂的查询,以及需要传递大量参数的情况下,会需要用到sqltoy对象进行原生sql查询。例如报表模块的查询基本都用到了sqltoy的lazyDao进行操作
⚠️如果业务模块是账套关联数据,则服务需要实现 AccountSetsProcessor, BackupProcessor两个接口。如果未实现接口,则创建,删除和备份还原账套时会丢失该业务产生的数据。
AccountSetsProcessor 提供了账套初始化和重置时对相关业务数据的切入。
BackupProcessor 提供了账套备份和还原时对相关业务数据的切入。
已凭证字模块的服务类为例:
⚠️ Service类中涉及到的Q类型类,例如QVoucherWord,是queryDsl框架根据系统中定义的实体类自动生成,不需要手动编写。
如果提示找不到此类,可重新build对应模块。
在模块build/generated/sources/annotationProcessor/java可看到动态生成的此类。
Controller定义
Controller定义在对应服务的server模块中
在 bs-server 模块 cn.gson.financial.controller 包下创建Controller
权限检查通过sa-token的 @SaCheckPermission 注解控制,权限key可再管理后台权限管理进行定义和查看。
Controller中可以通过
- @SessionAccountSetId:注解自动获取到当前登录用户的当前账套ID,
- @SessionAccountSet:获取当前账套对象,
- @SessionUser:获取当前登录用户对象。
具体实现 SessionUserHandlerMethodArgumentResolver.java: