# rain-codegen **Repository Path**: yy136/rain-codegen ## Basic Information - **Project Name**: rain-codegen - **Description**: 代码生成器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-22 - **Last Updated**: 2022-05-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 1、项目结构 为了方便统一规范,项目的后台代码结构如下 #### 项目命名 > 统一项目名:以`rain-XXXX`的格式命名,`XXXX`为projectName #### 层次结构 > 代码层次结构,以`rain-codegen`为例: ``` |--rain-codegen |-rain-codegen-common 存放基础通用类 |--rain-codegen-api 存放controller层代码 ``` #### 结构说明 > **`rain-codegen-common`** : 存放基础通用类,该模块可以打成单独的jar包,不依赖上层的任何jar包,主要放置的类如util,pojo,plugins 等, 1. 包名命名规范:`com.rain.xxxx.common` ``` |--rain-xxxx-common 项目模块 --/main/java 路径 -- com.rain.xxxx.common 包名 --annotation 包名 --config 包名, --exception 包名 --utils 包名 --xxx --. . . --/main/resource -- 配置文件 ``` 2. common主要放置一些通用配置类 > **`rain-codegen-facade`** 存放实体model和interface,这个model底层依赖`rain-codegen-common`,本层主要是数据库model,service层的interface接口 1. 包命名规范:`com.rain.xxxx.model` 和`com.rain.xxxx.service.modelName`,如下图: ``` |--rain-xxxx-facade 项目模块 --/main/java 路径 -- com.rain.xxxx 包名 --modelName1 包名 ,模块名 --model 包名,固定为 model --xxxxModel.java 类名,具体的模型类 --yyyyModel.java 类名,具体的模型类 --service 包名,固定service --xxxxService.java 类名,具体接口类 --yyyyService.java 类名,具体接口类 --modelName2 包名 ,模块名 --model 包名,固定为 model --xxxxModel.java 类名,具体的模型类 --yyyyModel.java 类名,具体的模型类 --service 包名,固定service --xxxxService.java 类名,具体接口类 --yyyyService.java 类名,具体接口类 ... --/main/resource ``` 2. 该工程下主要放置的是javabean ,DO 或者DTO等,和service接口,主要是两个包,一个是model,另一个是service,包下面按***模块***划分,存放相应的内容 > **`rain-codegen-service`** 存放业务操作和数据实现,底层依赖`rain-codegen-facade` ,当然也可以将数据层单独抽出Dao层,如果要拆的话,dao层位于`facade`和`service`层中间。service层禁止出现controller上层代码 1. 包命名规范:`com.rain.xxxx`主要包括两个模块`mapper`和`service` 2. mapper层使用 mybatis-plus 插件:官网参照:[https://mybatis.plus/guide/]() ``` |--rain-xxxx-service 项目模块 --/main/java 路径 -- com.rain.xxxx 包名 --modelName1 包名 ,模块1名 --mapper 包名 ,包名固定为mapper --xxxxMapper.java 类名 --yyyyMapper.java 类名 --servive 包名 固定 servive --impl 包名,固定impl ,下面放置按模块划分的service实现类 --xxxxServiceImpl.java 类名 --yyyyServiceImpl.java 类名 --modelName2 包名 ,模块2名 --mapper 包名 ,包名固定为mapper --xxxxMapper.java 类名 --yyyyMapper.java 类名 --servive 包名 固定 servive --impl 包名,固定impl ,下面放置按模块划分的service实现类 --xxxxServiceImpl.java 类名 --yyyyServiceImpl.java 类名 ... --/main/resource 放置资源文件 --mapper 放置mapper 的地方 必须是mapper -- modelName1 模块名1 -- xxxMapper.xml mapper xml -- yyyMapper.xml mapper xml -- modelName2 模块名2 -- xxxMapper.xml mapper xml -- yyyMapper.xml mapper xml ... ``` > `rain-codegen-web-api `存放controller层代码,底层依赖`rain-codegen-service` 1. 包命名规范:`com.rain.xxxx`主要包括一个模块controller 2. 启动类扫码时:扫描:`@ComponentScan("com.rain")` ``` |--rain-xxxx-api[-yyyy] 项目模块 --/main/java 路径 -- com.rain.xxxx 包名 --modelName1 包名,模块的名字 --controller 包名 , 固定,下面放置controller --xxxxcontroller.java 类名 --config 包名,可放置配置类 --xxxxConfig.java 类 --handler 包名,可放置处理器 -- xxxHandler 类 --modelName2 包名,模块的名字 --controller 包名 , 固定,下面放置controller --xxxxcontroller.java 类名 --config 包名,可放置配置类 --xxxxConfig.java 类 --handler 包名,可放置处理器 -- xxxHandler 类 --/main/resource 放置资源文件 ``` > `rain-codegen-web` 存放前端代码,不依赖后台代码 1. 前端框架采用 ***VUE*** 2.5以上版本 2. 样式框架采用 ***vue-emelemt *** 2.7以上,***建议2.7.2*** 3. 项目中***必须包含eslintrc.js*** 做语法检查,所有代码必须符合`eslintrc`代码检查规范 ### 2、版本限定 ``` ## 主要jar包版本限定 springboot 2.1.4.RELEASE spring-boot-starter 相关版本依赖springboot主版本号: 2.1.4 hibernate-validator # springboot自动选择 # mybatis-plus 插件 com.baomidou:mybatis-plus-boot-starter:3.0.7.1 以上版本 # lombok org.projectlombok:lombok:1.18.6 #springfox-swagger2 group: 'io.springfox', name: 'springfox-swagger2', version: '2.8.0' ##前端版本限定 js 使用 vue2.5以上 vue-emelemt 2.7.2 vue-element-admin ^4.0.1 ``` ### 3、 编写规范 1. 业务代码写在Service层,controller层只负责参数的校验和转换,以及执行结果的返回 2. Service层不要出现controller代码,如返回BaseResult等 3. 能批量操作的尽量不要使用循环来操作,以免影响性能,当数据量较大时,请分次批量操作 4. 循环中不能调用数据库连接,不能调用高开销的方法、不能调用外部服务等 5. If/for不能超过3层 6. 类、类属性、类方法的注释要使用javadoc注释,要用简洁又能懂的语言说明这个类或方法是干嘛的,注释不要用英文 7. 无用的代码请删掉,而不是给它注释掉就完事了 8. 能使用枚举的请使用枚举,不要偷懒。 9. 获取毫秒数使用System.currentTimeMills(),而不是new Date().getTime(),纳秒级使用System.nanoTime() 10. 金额类型必须使用BigDecimal类型 11. Service层的每个方法都得有对应的单元测试,且测试类和测试方法的命名一定要和Service层的类名和方法名对应上 12. PO中的变量必须使用引用类型(正例:Integer i 反例:int i) 13. 包装类统一使用equals来比较值,不要使用”==”来比较值,以免出现类似Integer的大坑 14. 尽量使用””.equals(Object),而不是Object.equals(“”),避免出现NullPointerException 15. 实现Serializable接口请添加UUID,谨防出现类A实现了Serializable接口,但是类A中的成员类B没有实现Serializable接口的问题,这种情况会存在潜在的BUG ### 4、数据库及sql规范 1. 能定义成tinyint的不要定义成int,能定义成int的不要定义成varchar,varchar长度长于5000的请定义成text 2. 定义成text的字段请独立出一张表来,以免影响其他字段的索引效率 3. 字段可适当冗余,以提供查询性能,但冗余字段一定要考虑数据一致,且不是频繁修改的字段,不是varchar超长字段或text字段 4. 避免在索引列上使用not、in、<>、!=等关键字或符号 5. 避免在索引上使用is null或is not null 6. 任何字段为非负数请使用unsigned 7. 请使用count(*)而不是count(列名),count(*)会统计值为null的行,而count(列名)不会 8. count只会返回0,而sum(col)可能返回null,需要注意 9. Null与任何值比较都是null,而不是true和false,需要注意 10. 尽量不要使用存储过程,存储过程难以调试和扩展,更没有移植性 ### 5、示例中的数据库脚本 ``` CREATE TABLE `demo_model` ( `id` bigint(30) NOT NULL, `name` varchar(255) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` ###