# JoveFast
**Repository Path**: lwork/jove-fast
## Basic Information
- **Project Name**: JoveFast
- **Description**: 基于若依Cloud的微服务平台
- **Primary Language**: Java
- **License**: MIT
- **Default Branch**: master
- **Homepage**: https://gitee.com/wxjstudy/jove-fast/
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 83
- **Created**: 2023-10-30
- **Last Updated**: 2023-10-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
JoveFast v3.6.3
基于若依Cloud的 Vue/Element UI 和 Spring Boot/Spring Cloud & Alibaba 前后端分离的分布式微服务架构
## 项目简介
基于若依Cloud的Jove-Fast微服务项目,
主要集成了
1. [积木报表](http://jimureport.com/),
1. 工作流[flowable](https://www.flowable.com/),
1. 移动端开源项目扩展[https://gitee.com/yinm/RuoYi-Mobile](https://gitee.com/yinm/RuoYi-Mobile)
**常见问题:**
[https://gitee.com/wxjstudy/jove-fast/wikis/Home](https://gitee.com/wxjstudy/jove-fast/wikis/Home)
**说明:**
* 登录账号密码admin/123456
* naocs账号密码nacos/nacos
* 采用前后端分离的模式
* 后端采用Spring Boot、Spring Cloud & Alibaba。
* 注册中心、配置中心选型Nacos,权限认证使用Redis。
* 流量控制框架选型Sentinel.
* 分布式锁选型redisson.
## Git/Svn提交规范
* feat(新功能):用于描述新增的功能或特性。例如:添加用户注册功能、实现图片上传功能等。
* fix(修复):用于描述修复的bug或错误。例如:修复登录页面无法显示的问题、修复数据保存错误的bug等。
* docs(文档):用于描述文档注释的更改或新增。例如:更新API文档、添加函数注释等。
* style(代码格式):用于描述不影响代码运行的格式调整或变动。例如:调整缩进、统一命名风格等。
* refactor(重构):用于描述重构或优化代码的变动,既不增加新功能,也不修复bug。例如:重构登录模块、优化数据库查询逻辑等。
* perf(性能优化):用于描述对代码进行的性能优化的变动。例如:优化算法、减少内存占用等。
* test(测试):用于描述增加或修改测试代码的变动。例如:添加单元测试、修复测试用例等。
* chore(构建或辅助工具):用于描述构建过程或辅助工具的变动。例如:更新构建脚本、添加代码检查工具等。
* revert(回退):用于描述回退到之前提交的变动。例如:回退到上一个版本、撤销某次提交等。
* build(打包):用于描述打包或构建过程的变动。例如:更新打包配置、修改构建流程等。
*
## 表调整
* 部门表调整,增加了一列 describes,主要作用于积木设置当前登录用户部门描述
```
@Override
public Map getUserInfo(String token) {
// 将所有信息存放至map 解析sql会根据map的键值解析,可自定义其他值
Map map = new HashMap<>(20);
LoginUser loginUser = tokenService.getLoginUser(token);
map.put("sysUserCode",loginUser.getUsername());
//设置当前日期(年月日)
map.put("sysData",DateUtils.getDate());
//设置昨天日期(年月日)
map.put("sysYesterDay",DateUtils.getyesterday());
//设置当前登录用户昵称
map.put("sysUserName",loginUser.getSysUser().getNickName());
//设置当前登录用户部门ID
map.put("deptId",loginUser.getSysUser().getDeptId());
//设置当前登录用户部门描述
map.put("describe",loginUser.getSysUser().getDept().getDescribes());
return map;
}
```

* 实现同一报表,不同角色的人看到的列数据不一样的结果,两个注解解决
```
/**
* 使用示例:在实现类方法上增加@ColAssign,用于标识需要返回修改的注入点
*
* @param params
*/
@Override
@ColAssign
public List getPcbstatement(PcbstatementVO params) {
return engineeringMapper.selectPcbstatement(params);
}
/**
* 使用示例:在bean的属性上增加@Assign,其中roleCallout的值为角色代码,用逗号分割标识多个角色
*
* @param params
*/
@Excel(name = "工程及其它费用",cellType = Excel.ColumnType.NUMERIC)
@Assign(roleCallout = "admin,confidential")
private Double amount;
```
* excel导出增强支持冻结首行以及开启筛选列<均为可选项>
```
@Log(title = "客户组别管理", businessType = BusinessType.EXPORT)
@RequiresPermissions("auxiliary:customergroup:export")
@PostMapping("/customergroup/export")
public void export(HttpServletResponse response, Data9977 data9977)
{
List list = iErpSalesmoduleservice.getCustomerGroupList(data9977);
ExcelUtil util = new ExcelUtil(Data9977.class);
/**
第四个参数是否冻结首行
第五个参数是否筛选列
*/
util.exportExcel(response, list, "客户组别信息",true,true);
}
```
* 菜单表调整,增加了一列 dictionaryId,主要作用于设置菜单国际化字典ID,对应文件夹src/lang/下的语言文件的key名

## 积木报表


## 工作流引擎



## 移动端效果



## 分布式锁
Redisson是Redis官方推荐的Java版的Redis客户端,此处我们只用它的分布式锁功能。使用:
1. 在需要引入分布式锁的模块中pom引入,yml增加配置
```markdown
org.redisson
redisson-spring-boot-starter
# yml配置 redisson
redisson:
address: redis://127.0.0.1:6379
# 选哪个库
database: 9
# 密码,若无密码可删除
password: joveadmin
```
2. 在相应的模块中增加工具类
```markdown
/**
* redis锁工具类
*
* @author Acechengui
*/
@Component
public class RedisLock
{
@Autowired
private RedissonClient redissonClient;
/**
* 获取锁
*
* @param lockKey 锁实例key
* @return 锁信息
*/
public RLock getRLock(String lockKey)
{
return redissonClient.getLock(lockKey);
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @return 锁信息
*/
public RLock lock(String lockKey)
{
RLock lock = getRLock(lockKey);
lock.lock();
return lock;
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @param leaseTime 上锁后自动释放锁时间
* @return true=成功;false=失败
*/
public Boolean tryLock(String lockKey, long leaseTime)
{
return tryLock(lockKey, 0, leaseTime, TimeUnit.SECONDS);
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @param leaseTime 上锁后自动释放锁时间
* @param unit 时间颗粒度
* @return true=加锁成功;false=加锁失败
*/
public Boolean tryLock(String lockKey, long leaseTime, TimeUnit unit)
{
return tryLock(lockKey, 0, leaseTime, unit);
}
/**
* 加锁
*
* @param lockKey 锁实例key
* @param waitTime 最多等待时间
* @param leaseTime 上锁后自动释放锁时间
* @param unit 时间颗粒度
* @return true=加锁成功;false=加锁失败
*/
public Boolean tryLock(String lockKey, long waitTime, long leaseTime, TimeUnit unit)
{
RLock rLock = getRLock(lockKey);
boolean tryLock = false;
try
{
tryLock = rLock.tryLock(waitTime, leaseTime, unit);
}
catch (InterruptedException e)
{
return false;
}
return tryLock;
}
/**
* 释放锁
*
* @param lockKey 锁实例key
*/
public void unlock(String lockKey)
{
RLock lock = getRLock(lockKey);
lock.unlock();
}
/**
* 释放锁
*
* @param lock 锁信息
*/
public void unlock(RLock lock)
{
lock.unlock();
}
}
```
3.调用
```markdown
@Autowired
private RedisLock redisLock;
// lockKey 锁实例key waitTime 最多等待时间 leaseTime 上锁后自动释放锁时间 unit 时间颗粒度
redisLock.lock(lockKey);
redisLock.tryLock(lockKey, leaseTime);
redisLock.tryLock(lockKey, leaseTime, unit);
redisLock.tryLock(lockKey, waitTime, leaseTime, unit);
redisLock.unlock(lockKey);
redisLock.unlock(lock);
```
## 目录结构
~~~
com.jovefast
├── jovefast-gateway // 网关模块
├── jovefast-mobile // 移动端
├── jovefast-auth // 认证中心
├── jovefast-flowable // 工作流中心
├── jovefast-api // 接口模块
│ └── jovefast-api-system // 系统接口
├── jovefast-common // 通用模块
│ └── jovefast-common-core // 核心模块
│ └── jovefast-common-datascope // 权限范围
│ └── jovefast-common-datasource // 多数据源
│ └── jovefast-common-i18n // 国际化
│ └── jovefast-common-log // 日志记录
│ └── jovefast-common-redis // 缓存服务
│ └── jovefast-common-seata // 分布式事务
│ └── jovefast-common-security // 安全模块
│ └── jovefast-common-swagger // 系统接口
├── jovefast-modules // 业务模块
│ └── jovefast-system // 系统模块
│ └── jovefast-gen // 代码生成
│ └── jovefast-job // 定时任务
│ └── jovefast-file // 文件服务
│ └── jovefast-report // 报表服务
├── jovefast-visual // 图形化管理模块
│ └── jovefast-visual-monitor // 监控中心
├──pom.xml // 公共依赖
~~~
## 架构图
## 摸鱼交流
本人普通码农一枚,产生了想搞开源项目的想法,虽能力有限,但竭尽所能,说干就干~~
欢迎大家进群交流,本项目将一直开源。
点击链接加入群聊【Java/Vue摸鱼交流群】:
[](https://jq.qq.com/?_wv=1027&k=Y2XSJ0BC) 