|
@@ -13,20 +13,20 @@ Maven 配置 (用户配置)
|
|
|
./configuration/.m2/settings.xml
|
|
|
```
|
|
|
|
|
|
-### 手动部署
|
|
|
-> 目前项目使用自动部署
|
|
|
-#### 打包
|
|
|
-第三方JAR包在 `./configuration/.m2/repository` 目录,使用命令添加到本地 Maven 仓库
|
|
|
+### 部署
|
|
|
+#### 1.自动打包
|
|
|
+目前项目使用自动部署
|
|
|
+#### 2.手动打包
|
|
|
+第三方JAR包放在 `./configuration/.m2/repository` 目录,并使用命令添加到本地 Maven 仓库
|
|
|
```
|
|
|
mvn install:install-file -Dfile=configuration/.m2/repository/ziniao-sdk-java-5.1.0.jar -DgroupId=com.ziniao -DartifactId=ziniao-sdk-java -Dversion=5.1.0 -Dpackaging=jar
|
|
|
-// 如果出现拒绝访问,则需要使用管理员权限执行命令
|
|
|
```
|
|
|
|
|
|
首次部署需在 pom.xml 中去除 `copy-dependencies` 注释,启用分包功能 (将包分离到 `libs` 文件夹中),像这样:
|
|
|
```
|
|
|
/home/www/project/BackendSys/libs
|
|
|
```
|
|
|
-将分离出来的文件,上传到远程服务器目录
|
|
|
+将分离出来的文件,然后上传到远程服务器目录
|
|
|
|
|
|
执行打包命令:
|
|
|
```
|
|
@@ -47,136 +47,77 @@ sh backendsys.sh start
|
|
|
tail -f backendsys.log
|
|
|
```
|
|
|
|
|
|
-#### 工具类
|
|
|
-##### SecurityUtil
|
|
|
+### 开发指南
|
|
|
|
|
|
-|Method|Descript|
|
|
|
-|-|-|
|
|
|
-|SecurityUtil.getUserId()|获得当前登录用户ID|
|
|
|
-|SecurityUtil.hasPermission("3.2.1")|判断当前用户是否具备权限|
|
|
|
-|SecurityUtil.hasPermission("3.2.1")|判断当前用户是否具备权限|
|
|
|
+#### 自定义工具类
|
|
|
|
|
|
+###### SecurityUtil
|
|
|
|
|
|
+注意:`@Anonymous` 下不可调用,否则会抛出错误
|
|
|
+```java
|
|
|
+/*
|
|
|
+ * 权限工具类
|
|
|
+ * SecurityUtil.hasPermission("3.2.1")
|
|
|
+ * SecurityUtil.hasPermissions(Arrays.asList("3.2.1", "3.2.2"))
|
|
|
+ * SecurityUtil.hasPermissions(Arrays.asList("3.2.1", "3.2.2"), MatchType.OR)
|
|
|
+ *
|
|
|
+ * 权限注解
|
|
|
+ * @PreAuthorize("@sr.hasPermission('3.2.1')")
|
|
|
+ * @PreAuthorize("@sr.hasPermissions(T(java.util.Arrays).asList('3.2.1', '3.2.2'))")
|
|
|
+ */
|
|
|
+ ```
|
|
|
|
|
|
-### 项目开发指南
|
|
|
-#### 主要目录说明
|
|
|
-* (database/) 存放数据库.sql文件的目录
|
|
|
-* (config/Security/SecurityConfig/) Security放行白名单/跨域资源配置
|
|
|
-* (config/SwaggerConfig/) Swagger文档配置
|
|
|
-* (filter/JwtAuthenticationFilter/) JWT放行白名单配置
|
|
|
-* (exception/GlobalExceptionHandler/) 全局异常处理类
|
|
|
+#### 自定义注解
|
|
|
|
|
|
-#### 更改项目名称
|
|
|
-- cmd + Shift + F 将 com.xxx 名称进行全局替换;
|
|
|
-- 将 src/main/java/com/xxx 名称进行修改
|
|
|
-
|
|
|
-### 约束与规范
|
|
|
-
|
|
|
-- controller 控制器层,包含 `权限`
|
|
|
-- service 业务逻辑层,包含 `查询`、`关联查询`、`参数/返回值格式化`
|
|
|
-
|
|
|
-#### 1.变量
|
|
|
-1) 所有返回值的输出字段,使用 `蛇形命名法` (单词之间使用下划线 _ 分隔,所有字母一般都小写)
|
|
|
-2表字段的初始值及赋值,尽量不为 0,以及不从 0 开始
|
|
|
-
|
|
|
-### 2.常用
|
|
|
-#### 1) 实体类
|
|
|
-创建实体类时,创建 id 的同时必须要创建多一个 类id,比如 (article_id),
|
|
|
-在 {编辑} 与 {删除} 操作时,传参和返回值 必须使用该 类id
|
|
|
-
|
|
|
-#### 2) 分页
|
|
|
-页码从1开始,分页使用 PageHelper 插件,
|
|
|
-Service 写法参考:
|
|
|
-com.backendsys.service.System.SysUserServiceImpl.queryUser
|
|
|
-```spring
|
|
|
-public Map<String, Object> queryUser(Integer pageNum, Integer pageSize, SysUserDTO sysUserDTO) {
|
|
|
- // 分页查询
|
|
|
- if (pageNum != null && pageSize != null) {
|
|
|
- PageHelper.startPage(pageNum, pageSize);
|
|
|
- }
|
|
|
- // 分页输出 (自定义)
|
|
|
- List<Map<String, Object>> list = sysUserMapper.queryUserList(sysUserDTO);
|
|
|
- PageInfoResult pageInfoResult = new PageInfoResult(list);
|
|
|
- return pageInfoResult.toMap();
|
|
|
-}
|
|
|
-```
|
|
|
-#### 3) `增删改` 操作必须要加 `redisson` 分布式锁,锁的命名为小驼峰格式 (aA)
|
|
|
-#### 4) 提示文字
|
|
|
-```"message": "该用户不存在 (flag)"```
|
|
|
-提示出现 flag 字眼的代表是 逻辑删除,字段 del_flag
|
|
|
-#### 5) GetMapper
|
|
|
-不要在 Controller class 上面写路由,要在每个方法上面写上完整路径 (方便检索)
|
|
|
-#### 6) Token
|
|
|
-如果想在 token 加字段,在 JwtUtil.createSystemToken 中增加
|
|
|
-
|
|
|
-### 3.数据库 / Mybatis
|
|
|
-#### 1) 外键
|
|
|
-建表,禁止使用外键
|
|
|
-#### 2) 字段
|
|
|
-2.1) Mybatis.xml 在 `非必填`,`空值` 的情况下,要在查询语句加入空值转义:
|
|
|
-```
|
|
|
-COALESCE(uf.nickname, '') nickname,
|
|
|
-```
|
|
|
-
|
|
|
-2.2) SQL时间字段创建统一按照以下
|
|
|
-```
|
|
|
-`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
-`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
|
+- 免登录权限 (No token)
|
|
|
```
|
|
|
-
|
|
|
-2.3) COUNT 返回值默认是 Long 类型
|
|
|
-```
|
|
|
-COUNT(us.id) AS user_count
|
|
|
+@Anonymous
|
|
|
+@GetMapping("/api/getAuthDemo")
|
|
|
+public Result getAuthDemo() {
|
|
|
..
|
|
|
-Long user_count = (Long) sysUserRole.get("user_count");
|
|
|
```
|
|
|
+另外, `/api/public/**` 也是免登录可访问的接口
|
|
|
+
|
|
|
+#### 开发规范
|
|
|
|
|
|
-2.4) Mapper/Service
|
|
|
-- 查,列表、详情,定义变量不使用实体类,统一使用:
|
|
|
-`List<Map<String, Object>>` 或 `Map<String, Object>`
|
|
|
-- 增/删/改时,接收参数使用实体类;返回值使用Long类型或Map类型;
|
|
|
+###### MySQL
|
|
|
|
|
|
-2.5) Mapper/Service/Entity/Controller 统一使用目标的`单数`命名
|
|
|
+- 禁止使用外键
|
|
|
|
|
|
-#### 3) 关联查询 / 嵌套查询
|
|
|
-使用 集合类型 时:
|
|
|
+###### Mybatis
|
|
|
+- 禁止使用 where 1=1 (`update` 操作)
|
|
|
+- 字段非空时:
|
|
|
```
|
|
|
-// 列表使用 LinkedHashMap 类型,详情使用实体类
|
|
|
-<resultMap id="resultMapUser" type="java.util.LinkedHashMap">
|
|
|
-<resultMap id="resultMapUserDetail" type="com.xxx.UserDTO">
|
|
|
-..
|
|
|
-<select id="queryUser" resultMap="resultMapUserList">
|
|
|
+SELECT COALESCE(uf.nickname, '') nickname, ..
|
|
|
```
|
|
|
-或
|
|
|
+
|
|
|
+- SQL时间字段创建统一规范:
|
|
|
```
|
|
|
-<resultMap id="resultMapUserRoleDetail" type="com.backendsys.entity.System.SysUserRoleDTO">
|
|
|
- <collection property="modules" javaType="java.util.List" ofType="java.util.LinkedHashMap" select="queryModulesByRoleId" column="id">
|
|
|
-..
|
|
|
-<select id="queryUserRoleDetail" resultMap="resultMapUserRoleDetail">
|
|
|
+`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
|
|
+`update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
|
|
```
|
|
|
-#### 4) 更新操作
|
|
|
-更新操作之前,需要手动判断该次更新的记录是否存在,并返回相关错误提示
|
|
|
+
|
|
|
+- 命名为 `*_count` 的统计字段,值是 Long 类型,例如:
|
|
|
```
|
|
|
-public Result updateUserRole(@Validated(SysUserRoleDTO.Update.class) @RequestBody SysUserRoleDTO sysUserRoleDTO) {
|
|
|
- // 判断是否存在
|
|
|
- Map<String, Object> sysUser = sysUserMapper.queryUserByIdOrName(sysUserDTO.getUser_id(), null);
|
|
|
- if (sysUser == null) {
|
|
|
- return Result.error(ResultEnum.DATABASE_OPERATION_FAILED.getCode(), "用户不存在");
|
|
|
- }
|
|
|
- //
|
|
|
+Long user_count = Convert.toLong(sysUserRole.get("user_count"));
|
|
|
```
|
|
|
|
|
|
-### 4.文档
|
|
|
-#### 1) 名词解释
|
|
|
-* `获得` 前缀表示从数据库获取数据;
|
|
|
-* `查询` 前缀表示从远程第三方直接获取数据;
|
|
|
+###### 其他规范
|
|
|
+- 创建实体类时,要创建多一个 `Id` 字段,比如 `article_id`,在进行 {查询详情/编辑/删除} 操作时,必须使用该 `article_id` 作为必填参数;
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
|
|
|
+### 其他
|
|
|
+##### 项目名称更换
|
|
|
+- cmd + Shift + F 将 com.xxx 名称进行全局替换;
|
|
|
+- 将 src/main/java/com/xxx 名称进行修改
|
|
|
+
|
|
|
+
|
|
|
### Future (待加功能)
|
|
|
1.sys_dictionary.sql 字典表重构
|
|
|
- 字段:{ id, dictionary_key, dictionary_value, lang }
|
|
|
- 使用 JSON 作为储存值,例如:{ dictionary_key: "Gender", dictionary_value: "[{\"label\":\"男\",\"value\":1},{\"label\":\"女\",\"value\":2}]" }
|
|
|
- 接口1:查询接口,首次调用Service时,将该值保存到Redis长效缓存
|
|
|
- 接口2:手动更新缓存的接口
|
|
|
-
|