视频下载
准备环境
安装 OpenJDK 1.8
安装 Idea 社区版(可自选)
安装 Pai-Cli 工具,下载后解压并添加到环境变量,依赖
JAVA_HOME
技术选型
1、系统环境
- Java EE 8
- Servlet 3.0
- Apache Maven 3
- MySQL >= 8.0.18
- Nacos 1.3.0
- Redis >= 5.0.5
- ElaticSearch + Logstash + Kibana
- MQ(Kafka)
2、主框架
- Spring Boot 2.2.5
- Spring Framework 5.2.4
- Spring Security 2.2.1
3、持久层
- Apache MyBatis 3.4 + MyBatisPlus
- Alibaba Druid 1.1
4、视图层
- Vue
- ElementUI
规范约定
禁止使用
Lombok
语法(为什么)由
Nacos
来实现注册与发现工程名称规范:
- 前端:以
pai
开头,前端以ui
结尾, 如:pai-xxx-ui - 后端:以
pai
开头, 如:pai-xxx - Docker:以
pai
开头,前端以dk
结尾, 如:pai-xxxx-dk - 数据端:以
pai-dp
开头, 如:pai-dp-xxxx
- 前端:以
统一端口:后端工程为8080,前端工程为80
源代码参考 GitFlow 工作流 规范,以
develop
为开发分支,master
为保护分支,只能合并不能提交每个后端工程会对应一个数据库,库名为工程名,账号为工程名,密码由系统随机生成
表名以应用缩写为前缀,要求由字母和下划线组成,如:sys_users
表结构规范
主键使用雪花算法生成
varchar 最长2000,超过请使用text类型
时间使用datetime类型
默认要有create_by,create_time,update_by,update_time字段;create_by、update_by存使用者主键
Hutool 雪花算法ID工具,workerId与datacenterId还需确定怎么取值,暂时(1, 1)
示例:
Snowflake snowflake = IdUtil.createSnowflake(1, 1);
snowflake.nextId();
遵从阿里 JAVA 开发规范
Pai 工具介绍及安装
Pai 工具介绍
pai是一个能让开发进行以下一系列的操作的辅助工具:
快速创建工程项目骨架
根据表结构生成代码
使用Maven进行本地运行和执行单测试
远程构建: 编译 > 打包 > 构建Docker > K8S部署
Pai 工具安装
JDK 1.8+
Git提交消息约定
[IMP] 提升改善正在开发或者已经实现的功能
[FIX] 修正BUG
[REF] 重构一个功能,对功能重写
[ADD] 添加实现新功能
[REM] 删除不需要的文件
创建套件
1. 创建套件
- 登录 开发者后台
- 演示套件(sims) cn.flyrise.sims
- sims > student information management system 学生信息管理系统
角色权限配置
- 权限管理:定义权限标识,在接口类(Controller)进行权限鉴权
- 角色管理:场景化设计及开过程按角色进行鉴权放行
- 数据权限:按部门或个体进行数据组分配,在业务实现中进行获取过滤数据
参数配置
- 数字字典:分为系统级(只读)、套件级(只读)、用户级(编辑)
- 参数管理:预定义套件中工程要用到的参数声明,利于在安装套件时进行配置实际的参数
消息配置
- 即模板配置,于开发阶段先定义一个开发模板标识,实现开发与使用者解耦
流水号配置
- 即模板配置,于开发阶段先定义一个开发模板标识,实现开发与使用者解耦,开发阶段需要引入Common包进行模板代码实现
流程建模
- 开发阶段定义好流程标识,绑定表单,绘制标准建议流程,再由实施阶段进行规则配置
规则管理
- 通过引用Common包加注解式声明,再由实施阶段进行配置实际的规则
API权限
- 申请开通获取Client Id 和 Secret Key(只能通过重置获取),开通后通过AIP市场选用接口套件,添加进来即进行了授权
OSS配置
- 申请开通获取Client Id 和 Secret Key 通过Nacos配置参数,前端提供了标准化附件上传及回显示控件,需后端配合实现OSS认证签发
2. 后端
- 创建工程 pai-sim
# 根据骨架创建工程
pai create service -n pai-sims -s cn.flyrise.sims
# 初始化git
cd pai-sims
pai init
# 添加所有文件
pai add .
# 提交初始项目
pai commit -m "[ADD] 创建初始项目"
SQL目录:src/main/resources/meta/sql/VYYYYMMDDNN__[DESC].sql
Nacos配置:src/main/reources/meta/nacos.yml
修改Swagger标题:学生信息管理系统
- 创建表生成代码
student 学生信息表
字段 | 类型 | 描述 |
---|---|---|
name | varchar(20) | 姓名 |
age | int(11) | 年龄 |
sex | char(1) | 性别(F - 女 M - 男 O - 其他) |
cd pai-sims
pai code -t student
- 本地运行(pai 或 IDE)
pai run
- Swagger接口验证: http://localhost:8080/doc.html
- 国际化
文件夹里包含三个属性文件: messages.properties,messages_en_US.properties和messages_zh_CN.properties,
其中 messages.properties 是个默认文件,即使为空也要有,否则MessageSource加会变成[Empty MessageSource]
切记切记 所有文件编码必需是 UTF-8 格式
- 验证+国际化
VO
/** 姓名 */
@ApiModelProperty("姓名")
@NotBlank
@InvalidCode(value = "5001", desc = "姓名")
private String name;
/** 年龄 */
@ApiModelProperty("年龄")
@Range(min = 6, max = 100)
@InvalidCode(value = "5002", desc = "年龄")
private Integer age;
PO
原则上建议继承BaseEntity,如不继承需要配置自动填充注解
Controller
注意修改Swagger描述,原则上Controller不写业务逻辑,统一写到Service层,新增或修改基本上要返回处理完成的VO(实际上是PO在Service中转成VO返回)
@ApiOperation("添加单条记录")
@PostMapping
public Reply<StudentVO> insert(@RequestBody @Valid StudentVO vo) {
return Reply.success(this.studentService.add(vo));
}
Sevice
@Override
public StudentVO add(StudentVO studentVO){
StudentPO po = new StudentPO();
po.setName(studentVO.getName());
StudentPO exist = selectOnePO(new QueryWrapper<>(po));
if(exist != null){
throw new SimsBizException(BusinessErrors.ERR_1001, null);
}
studentVO = insertVoReturnVO(studentVO);
return studentVO;
}
可通过 BusinessErrors.main生成message.properties
通过Swagger 添加全局参数模拟不同语言: Accept-Language en-US header
异常处理
统一抛出异常BizException的子类
获取当前用户信息
LoginUser loginUser = SecurityUtils.getLoginUser();
相关权限及鉴权参考详情
部署运行
# 添加所有文件
pai add .
# 添加新功能模块
pai commit -m "[ADD] 增加学生信息管理功能"
# 推送代码到远程仓库
pai push
# 远程构建并部署到k8s
pai deploy service -n pai-sims
实战演练
图书管理系统
表1 图书信息表(TB_BOOINFO)
字段名 | 类型 | 长度 | 小数位数 | 允许空 | 默认值 | 描述 |
---|---|---|---|---|---|---|
ID | VARCHAR | 19 | 0 | 主键 | ||
BOOKCODE | VARCHAR | 30 | 0 | 图书条形码(可唯一索引) | ||
BOOKNAME | VARHCAR | 50 | 0 | V | NULL | 图书名称 |
BOOKTYPE | VARHCAR | 50 | 0 | V | NULL | 图书类型 |
AUTHOR | VERCHAR | 50 | 0 | V | NULL | 作者 |
TRANSLATOER | VERCHAR | 50 | 0 | V | NULL | 图书翻译者 |
PUBNAME | VERCHAR | 100 | 0 | V | NULL | 出版社名 |
PRICE | DECIMAL | 19 | 4 | V | NULL | 价格 |
PAGE | INT | 11 | 0 | V | NULL | 页码 |
BCASE | VERCHAR | 50 | 0 | V | NULL | 书架信息 |
STORAGE | INT | 11 | 0 | V | NULL | 库存 |
INTTIME | DATETIME | V | NULL | 入库时间 | ||
OPERATOR | VERCHAR | 30 | 0 | V | NULL | 操作员 |
BORROWNUM | INT | 11 | 0 | V | NULL | 借阅次数 |
表2 图书类型信息表(TB_BOOKTYPE)
字段名 | 类型 | 长度 | 小数位数 | 允许空 | 默认值 | 描述 |
---|---|---|---|---|---|---|
ID | VARCHAR | 19 | 0 | 主键 | ||
TYPENAME | VARCHAR | 30 | 0 | NULL | 类型名称 | |
DAYS | INT | 11 | 0 | V | NULL | 可借阅天数 |
表3 读者信息表(TB_READER)
字段名 | 类型 | 长度 | 小数位数 | 允许空 | 默认值 | 描述 |
---|---|---|---|---|---|---|
ID | VARCHAR | 19 | 0 | 主键 | ||
NAME | VARCHAR | 50 | 0 | V | NULL | 姓名 |
SEX | VARCHAR | 50 | 0 | V | NULL | 类型 |
UTYPE | VARCHAR | 50 | 0 | V | NULL | |
BIRTHDAY | DATETIME | V | NULL | 出生日期 | ||
PAPERTYPE | VARCHAR | 20 | 0 | V | NULL | 证件类型 |
PAPERNUM | VARCHAR | 30 | 0 | V | NULL | 证件号码 |
TEL | VARCHAR | 20 | 0 | V | NULL | 联系电话 |
VARCHAR | 50 | 0 | V | NULL | 电子邮件 | |
REGDATE | VARCHAR | 50 | 0 | V | NULL | 注册日期 |
OPERATOR | VARCHAR | 30 | 0 | V | NULL | 操作人员 |
REMARK | VARCHAR | 300 | 0 | V | NULL | 备注 |
BORROWNUM | INT | 11 | 0 | V | NULL | 借阅图书本数 |
TOTALS | INT | 11 | 0 | V | NULL | 借阅图书总数量 |
表4 读者类型表(TB_READERTYPE)
字段名 | 类型 | 长度 | 小数位数 | 允许空 | 默认值 | 描述 |
---|---|---|---|---|---|---|
ID | VARCHAR | 19 | 0 | 主键 | ||
NAME | VARCHAR | 50 | 0 | V | NULL | 读者类型名称 |
NUMBER | INT | 10 | 0 | V | NULL | 该类型可借书数量 |