JKoalaFly 低代码开发平台
===============
当前最新版本: 1.0.0(发布日期:20200911)
欢迎各位体验并反馈使用过程中的问题
项目组成员:张坚(jianzhang11)、冀军(junji)、王乐(lewang4)、霍源治(yzhuo)
## 后端技术架构
- 基础框架:Spring Boot 2.3.4.RELEASE
- 持久层框架:[Mybatis-plus_3.1.2](https://baomidou.com/)
- 安全框架:Apache Shiro 1.5.2,Jwt_3.7.0
- 数据库连接池:阿里巴巴Druid 1.1.10
- Excel操作: [AutoPoi](https://github.com/zhangdaiscott/autopoi)
- 缓存框架:redis
- 日志打印:logback
- 其他:jackson,poi,Swagger-ui, lombok(简化代码)等。
## 集成功能
- 集成sso单点登录
- 集成uap认证授权、数据权限过滤
- 集成fastdfs
- 数据字典、分类字典
- excel导入导出
- 统一待办推送
## JKoalaFly开发规范
- **强制**
在application.yml中配置jkoala.system.id属性,用于redis隔离、uap集成,配置app.id用于apollo 配置中心的集成
- **强制**
对于密码必须使用加密字符串,不得使用明文展示
- **强制**
不得引入FastJson工具类,请使用Jackson进行json相关操作。
- **强制**
后端接口需要使用restful风格即get,post,put,delete。接口名使用推荐前缀
* 查询:`@GetMapping`,推荐前缀:`get`,`query`,`list`,`find`
* 新增:`@PostMapping`,推荐前缀:`add`,`save`,`insert`
* 修改:`@PutMapping`,推荐前缀:`edit`,`update`
* 删除:`@DeleteMapping`,推荐前缀:`delete`,`remove`
对于`post`,`put`操作,前端使用json传参,后端使用`@RequestBody`注解接收
- **强制**
后端返回的数据必须使用`com.ifly.jkoala.common.api.vo.Result`封装,不得使用其他格式的实体返回。
- **强制**
生产环境必须关闭swagger在线文档。
```
swagger:
enable: false
```
- **建议**
建议单独创建独立的业务模块,在system模块下引入建立的模块。
如果在创建的业务模块中需要引用system模块的服务,通过在common模块`ISysBaseAPI`中增加对应的接口,由system模块负责实现。
## 常见问题
* 如何获取用户信息
```
LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal();
```
* 免登陆配置,后台取消token验证机制
修改配置文件:`com.ifly.jkoala.config.ShiroConfig`的方法shiroFilter,排除你的请求。
```
filterChainDefinitionMap.put("/actuator/redis/**", "anon");
```
- 常见问题: [入门常见问题大全](http://bbs.jeecg.com/forum.php?mod=viewthread&tid=7816&extra=page%3D1)
## 专项文档
### 一、查询过滤器用法
```
QueryWrapper
queryWrapper = QueryGenerator.initQueryWrapper(software, req.getParameterMap());
```
代码示例:
```
@GetMapping(value = "/list")
public Result> queryPageList(Software software,@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(software, req.getParameterMap());
//默认按照‘显示顺序’降序排列
if(oConvertUtils.isNotEmpty(software.getSoftCategory())){
queryWrapper.eq("SOFT_CATEGORY",software.getSoftCategory());
}
//软件属性 B收费,A免费
if(oConvertUtils.isNotEmpty(software.getSoftAttribute())){
queryWrapper.eq("SOFT_ATTRIBUTE",software.getSoftAttribute());
}
queryWrapper.eq("RISE_STATUS", CommonConstant.HAS_SEND);
Page page = new Page<>(pageNo, pageSize);
IPage pageList = softwareService.findListPage(page, software.getSoftCategory(),software.getSoftAttribute());
return Result.OK(pageList);
}
```
- 查询规则 (本规则不适用于高级查询,高级查询有自己对应的查询类型可以选择 )
| 查询模式 | 用法 | 说明 |
|---------- |-------------------------------------------------------|------------------|
| 模糊查询 | 支持左右模糊和全模糊 需要在查询输入框内前或后带\*或是前后全部带\* | |
| 取非查询 | 在查询输入框前面输入! 则查询该字段不等于输入值的数据(数值类型不支持此种查询,可以将数值字段定义为字符串类型的) | |
| \> \>= < <= | 同取非查询 在输入框前面输入对应特殊字符即表示走对应规则查询 | |
| in查询 | 若传入的数据带,(逗号) 则表示该查询为in查询 | |
| 多选字段模糊查询 | 上述4 有一个特例,若某一查询字段前后都带逗号 则会将其视为走这种查询方式 ,该查询方式是将查询条件以逗号分割再遍历数组 将每个元素作like查询 用or拼接,例如 现在name传入值 ,a,b,c, 那么结果sql就是 name like '%a%' or name like '%b%' or name like '%c%' | |
### 二、敏感配置加密
1. 使用单元测试中`com.ifly.jkoala.JasyptTest#getPassword()`方法对敏感配置加密
2. 在配置文件中使用生成的密文去替换原明文,并使用关键字ENC进行包裹。如:ENC(kCGYyIB7ba1KQnKrStoM5g==)
### 四、编码排重使用示例
重复校验效果:
![输入图片说明](https://static.oschina.net/uploads/img/201904/19191836_eGkQ.png "在这里输入图片标题")
1.引入排重接口,代码如下:
```
import { duplicateCheck } from '@/api/api'
```
2.找到编码必填校验规则的前端代码,代码如下:
```
code: {
rules: [
{ required: true, message: '请输入编码!' },
{validator: this.validateCode}
]
},
```
3.找到rules里validator对应的方法在哪里,然后使用第一步中引入的排重校验接口.
以用户online表单编码为示例,其中四个必传的参数有:
```
{tableName:表名,fieldName:字段名,fieldVal:字段值,dataId:表的主键},
```
具体使用代码如下:
```javascript
validateCode(rule, value, callback){
let pattern = /^[a-z|A-Z][a-z|A-Z|\d|_|-]{0,}$/;
if(!pattern.test(value)){
callback('编码必须以字母开头,可包含数字、下划线、横杠');
} else {
var params = {
tableName: "onl_cgreport_head",
fieldName: "code",
fieldVal: value,
dataId: this.model.id
};
duplicateCheck(params).then((res)=>{
if(res.success){
callback();
}else{
callback(res.message);
}
})
}
}
```
### 五、集成统一待办
默认已经集成统一待办,如果不需要可以删除`ifly-jkoala-message-starter` 模块代码,并从父类pom文件中删除引用即可。
使用步骤:
1. 引入统一待办组件模块
```xml
com.ifly.jkoala
ifly-jkoala-message-starter
```
2. 在业务中封装 `TodoContent` 消息体,使用`UnifiedTodoClient` 工具类进行创建、已办、删除操作。
具体代码可以参考`com.ifly.jkoala.message.UnifiedTodoTest`类,接口文档可以参考《消息中心服务平台-集成待办-IT服务-接口设计说明书1.0.0》-rest版