# happiness **Repository Path**: vlifepro/happiness ## Basic Information - **Project Name**: happiness - **Description**: 对前端最友好的后端API框架,提升开发幸福感 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2021-12-22 - **Last Updated**: 2021-12-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 框架介绍 - 在QueryDSL这个可以适配各类ORM框架的一个通用的查询框架基础之上进行二次封装。 - 大量封装了满足实际业务场景的CRUD方法;后端尽可能不去面对数据库操作dao层代码; ``` java // QuseyDSL是专注于通过Java API构建类型安全的SQL查询。 queryFactory.select(qBlogInfo.blogTitle,qBlogInfo.blogContent).from(qBlogInfo) ``` ## 一 理念:面向POJO进行研发 - 慢病管理平台借助queryDSL这个查询能力以及我们对于前后端交互的一些痛点的理解; - 按照框架约定的规则来对DO、VO、DTO、QUERY的类及类属性进行命名或采用指定的接口; - 将外部、内部产生的各类POJO数据传入对QueryDSL框架二次封装的CRUD方法里,数据操作的处理逻辑交封装的各类方法处理就能直接返回需要的视图; ``` java // 查询 vo查询结果 query 查询条件 List query(Class voClass, Request query){ //编辑 dto 保存对象 t 返回的对象类型 public T save(E dto, Class t); ``` ## 二 目标 1. 产出符合前端需求的接口数据格式; 2. 封装的方法能够覆盖85%以上业务的CRUD代码; 3. 让前后端配合更融洽,都能专注把更多精力投入到各自的领域里; 4. 成为生产力工具,提升基础研发效率; ## 三 数据查询 1. 对查询方法入参VO的Class类信息进行分析,完成相关select语句的创建和执行,将查询结果封装到VO对象上返回; 2. 框架对查询方法里的查询条件Query对象进行where条件的解析,支持常用的in,like,between等; 3. 支持对query对象能够用链式调用的方式对从视图层传入query进行系统预设条件的设置; ``` java userService.query(UserVo.class,userQuery); userQuery.and("username").eq("test"); ``` ### 3.1 VO返回给视图的对象 - 返回视图层需要的数据结构 1. 多对一,查询多的一方数据,将1方的数据打平一起展示 ``` java public class UserVo extends TogetherDslVo { String username; // SysUser的字段 String orgname; //机构表(1方)机构名称 @Override public Class[] togetherItemClazz() { return togetherItemClazz(SysOrg.class); } } ``` 2. 一对多和多对多 - 将多方数据封装到本方,一次返回给前端 ``` java public class GroupVo extends IdDto { public String groupName; //组名称 public List roles; //角色组集合 多对多 级联关系表 public List users; //角色组用户 1对多,在多方维护关系 } ``` ### 3.2 QUERY对象 1. 完成查询对象的定义,即完成查询语句的封装 - 支持各种查询条件 ``` java public class UserQuery extends CustomQuery implements IPage { public Like areacode; //like 模糊匹配查询 public In orgcode; // 范围查询接收数组 public Bettween age; // 上下限范围查询 public Like deptName; // 能支持关联表的属性查询条件 public String idno; // eq 查询 } ``` ## 四 数据编辑 ``` java class UserDto extend IdDto{ String userName; String pwd; List } // api save save(userDto); save(user,entity->{ if(entity.getId()==null){ ((SysUser)entity).setPassword(new BCryptPasswordEncoder().encode(user.getPwd())); } return entity; }); ``` 1. 支持1对多,多对多的数据封装到一个DTO,可以保存完成多表数据的新增或修改。 2. 保存方法第2个参数传入回调函数,将在保存前可以对数据进行逻辑处理。 3. 多表关联保存通常会遇见的问题 - 子表数据级联保存时没有给全,没有给的这部分数据是删除还是保留? - 关联保存时,部分子表数据删除、部分新增、部分修订、部分不更改如何一次提交后端处理? ### 五 数据删除 - 支持对删除对象的级联对象进行操作,以及级联对象进行的递归删除操作; - DO实体类继承指定接口; ``` java public class SysGroup extends BaseBean implements DelConf { public String name;// 角色组名称 @Override public DelRs[] delRs() { return new DelRs[]{ DelRs.ofClear(SysUser.class) //级联清空 ofDel() 级联清除 }; } } ``` ## 六 和JPA(HIbernate)对比 1. 贴近前端 - 虽然都支持级联查询和写入,hibernate是对数据库关联实体类全量字段的操作,不易用和实际业务场景有差距; - 本框架查询和写入的级联操作都可以是对封装后的DTO(部分字段)进行级操作, - 能直接把前端提交的dto数据传入封装的方法,无需多层转换; 2. 灵活性高: - 在实体类里(entity)不需要hibernate里的配置表关系注解代码,也不需在要有外键关系。 - 框架按照命名约定即可取到关联关系。所以适合在新系统上引入该框架 ## 七 其它方面 1. 查询统计 (50%) - 一般查询语句+聚合函数= 统计语句 - 将有相同维度(地区、机构、时间)的统计语句进行行级叠加以及列级叠加形成统计报表; 2. 权限处理 (20%) - 能够实现同一角色的不同用户的权限差异 - 同一角色不同地区的用户权限差异 - 差异体现在操作权限、查询权限、字段权限