# 分布式飞控决策指挥系统 - 网关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)