# 分布式飞控决策指挥系统
- 网关Swagger:
- 监控服务:
持续集成结果演示地址:
- 前端:
- 网关Swagger:
- 监控服务:
## 一、开发环境
### 1.1 语言及框架
1. 开发语言
* Java
* JDK:1.8
1. 中间件
* 关系型数据库: Mysql 8
* 内存数据库:Redis
1. 部署环境
* Linux、Docker
### 1.2 开发工具
1. 通用
* 版本控制工具:Git
* Git仓库:GitLab
* 编辑器:VSCode
2. 后端
* 数据库设计:PowerDesigner
* 集成开发环境(IDE):Intellij IDEA
> 必装插件:Lombok Plugin、MybatisX
* Maven 3.3.9+
* 数据库管理:IDEA、Navicat Premium 12.1+
## 二、开发事项
1. 代码生成
在`code-generator`模块内,运行[CodeGenerator.java](server/code-generator/src/main/java/com/c503/htphy/ddcs/codegen/CodeGenerator.java)主类,控制台填相关参数,即可生成代码。
代码生成模板每个项目需要自己按照实际情况,调整部分内容,具体配置文件看: [codegen.properties](server/code-generator/src/main/resources/codegen.properties)
**代码生成模板,请按照实际情况进行调整,模板位置**:[codegen-template](server/code-generator/src/main/resources/codegen-template)
1. 登录
- 登录接口具体直接看`Swagger - uac_Login`章节。包含登录、登出、用户会话列表查询、踢用户下线
- 使用swagger调试接口时,先调用`/login`登录接口获取token,然后将token填入swagger右上角的`Authorize按钮`中。
- 密码前端统一先使用md5普通加密一次,所以直接调用登录接口时,需要使用md5以后的密码。
> 例如初始密码六个1:`111111`,MD5以后为`96e79218965eb72c92a549dd5a330112`,则直接调用接口登陆时,使用的密码即为此MD5码。 UI前端密码输入框自动做了MD5转换,所以直接输入`111111`即可。
1. 分页查询
分页查询,后端统一提供一个参数为PageModel对象的接口,前端传递对象信息作为参数进行查询。
- size: 分页条数,-1时表示查询所有
- page: 分页页数,第几页
- sortName: 排序方式:如多排序条件,分隔符为英文半角逗号:name asc,date desc
- queryConditionJson: 查询条件
前端可以自由定制查询条件,格式如下
```
[{"fieldName":"name","operate":"eq","value":"g"},{},...,{}]
等于:eq,不等于:ne
大于:gt,小于:lt,大于等于:ge,小于等于:le
类似:like,不类似:notLike
区间:between,两个值分别用 value,endValue
包含:in,不包含:notIn
为Null:isNull,不为Null:isNotNull
```
1. 后端内部构造查询条件
任意`Service`内,可以使用以下方式,无需写sql即可创建查询,主要利用到mybatis-plus条件构造器实现。
使用方式例如:
```java
//方式1
public List findAllByLoginId(String value) {
//需要在某service构造其他service的查询条件时,调用对应的 service.createQuery()方法即可。
QueryDetail queryDetail = createQuery();
queryDetail.lambda().eq(User::getLoginId, value);
return findAll(queryDetail);
}
//方式2
public List findAllByLoginIdOrPhone(String value) {
List users = findAll(createQuery().lambda().eq(User::getLoginId, value).or().eq(User::getPhone, value));
return users;
}
```
1. WebSocket支持,右转 [server/enhance/enhance-websocket](server/enhance/enhance-websocket)
使用方式请查看[enhance-websocket/README.md](server/enhance/enhance-websocket/README.md)
1. 前端部署
分离部署:前端单独打包为nginx镜像运行。
合并部署:前端build后,将dist文件夹内容,复制到[server/gateway/src/main/resources/static](server/gateway/src/main/resources/static)
文件夹。
## 三、数据权限控制
数据权限控制功能,一般情况下为根据用户、组织、角色等进行数据查询结果的筛选。
系统已经包含数据权限控制功能,本质上为不同查询接口,需要根据不同的用户角色权限拼接不同的SQL条件。具体用法举例如下:
```java
@Controller
@RequestMapping("/user")
public class UserResource extends DataVOResource {
@DataScope(orgAlias = "o",statementIds = {"com.c503.htphy.ddcs.module.uac.repository.UserRepository.selectById"})
@GetMapping(value = "/")
@ApiOperation(value = "获取用户列表", notes = "根据分页参数获取分页列表")
public ResponseEntity> getPage(PageModel pm) {
service.findVOPage(pm);
JsonNode rs = JacksonUtils.toJsonNodeWithDefaultMapper(pm);
return ResultBuilder.buildObject(rs);
}
}
```
关键点在会调用到数据库访问的方法上,添加`@DataScope`注解,注解具体字段内容,和需要控制的权限对象有关,具体请看:
[DataScope.java](server/common/common-service/src/main/java/com/c503/htphy/ddcs/common/config/datascope/DataScope.java)
相关代码请查看:[com.c503.htphy.ddcs.module.config.config.datascope](server/common/common-service/src/main/java/com/c503/htphy/ddcs/common/config/datascope)
背后利用到Mybatis-plus拦截插件功能。基于注解,增加切面类对所有需要进行权限控制的SQL语句拼接条件。
因此如需自定义更丰富的权限控制条件,请继续拓展[DataScopeAspect.java](server/common/common-service/src/main/java/com/c503/htphy/ddcs/common/config/datascope/DataScopeAspect.java)