校验租户账号数量

This commit is contained in:
fengcheng
2025-01-08 10:48:28 +08:00
parent 6d605e6f90
commit 5337871276
6 changed files with 78 additions and 35 deletions

View File

@@ -3,7 +3,7 @@
## 平台简介
基于RuoYi-Vue + Flowable一套全部开源快速开发平台,毫无保留给个人及企业免费使用。
基于RuoYi-Vue + Flowable一套全部开源多租户快速开发平台,毫无保留给个人及企业免费使用。
* 前端采用Vue、Element UI。
* 后端采用Spring Boot、Spring Security、Redis & Jwt。
@@ -14,36 +14,39 @@
## 内置功能
1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
3. 岗位管理:配置系统用户所属担任职务
4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等
5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分
6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护
7. 参数管理:对系统动态配置常用参数
8. 通知公告:系统通知公告信息发布维护。
9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询
10. 登录日志:系统登录日志记录查询包含登录异常
11. 在线用户:当前系统中活跃用户状态监控
12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志
13. 代码生成前后端代码的生成java、html、xml、sql支持CRUD下载
14. 系统接口根据业务代码自动生成相关的api接口文档
15. 服务监控监视当前系统CPU、内存、磁盘、堆栈等相关信息
16. 缓存监控:对系统的缓存信息查询,命令统计等
17. 在线构建器拖动表单元素生成相应的HTML代码
18. 连接池监视监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈
19. 流程分类:流程的分类
20. 流程菜单:菜单关联流程
21. 表单配置:在线表单设计
22. 模型模板:实现流程模板,进行统一管理
23. 流程模型:在线流程设计
24. 部署管理:流程的版本的切换等
25. 发起流程:发起指定流程
26. 我的流程:查看自己发起的流程
27. 代办任务:获取审批的任务
28. 代签任务:任务的接收
29. 办任务:获取自己审批过的流程
30. 抄送我的:流程的抄送
1. 套餐管理:系统内租户所能使用的套餐管理 如:套餐内所包含的菜单等
2. 租户管理:系统内租户的管理 如:租户套餐、过期时间、用户数量、企业信息等
3. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
4. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限
5. 岗位管理:配置系统用户所属担任职务
6. 菜单管理:配置系统菜单,操作权限,按钮权限标识等
7. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分
8. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
9. 参数管理:对系统动态配置常用参数
10. 通知公告:系统通知公告信息发布维护
11. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询
12. 登录日志:系统登录日志记录查询包含登录异常
13. 在线用户:当前系统中活跃用户状态监控
14. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志
15. 代码生成前后端代码的生成java、html、xml、sql支持CRUD下载
16. 系统接口根据业务代码自动生成相关的api接口文档
17. 服务监控监视当前系统CPU、内存、磁盘、堆栈等相关信息
18. 缓存监控:对系统的缓存信息查询,命令统计等
19. 在线构建器拖动表单元素生成相应的HTML代码。
20. 连接池监视监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈。
21. 流程分类:流程的分类
22. 流程菜单:菜单关联流程
23. 表单配置:在线表单设计
24. 模型模板:实现流程模板,进行统一管理
25. 流程模型:在线流程设计
26. 部署管理:流程的版本的切换等
27. 发起流程:发起指定流程
28. 我的流程:查看自己发起的流程
29. 办任务:获取审批的任务
30. 代签任务:任务的接收
31. 已办任务:获取自己审批过的流程
32. 抄送我的:别人抄送给我流程
33. 我的抄送:我抄送流程
## 在线体验
@@ -75,6 +78,10 @@
## 演示图
<table>
<tr>
<td><img src="https://www.helloimg.com/i/2025/01/08/677de3f452c1b.png"/></td>
<td><img src="https://www.helloimg.com/i/2025/01/08/677de4063c722.png"/></td>
</tr>
<tr>
<td><img src="https://www.helloimg.com/i/2024/12/30/67725bc908c48.png"/></td>
<td><img src="https://www.helloimg.com/i/2024/12/30/67725c037a705.png"/></td>
@@ -105,6 +112,7 @@
</tr>
</table>
## 推荐
大家在使用本项目时,推荐结合贺波老师的书 [《深入Flowable流程引擎核心原理与高阶实战》](https://gitee.com/link?target=https%3A%2F%2Fitem.jd.com%2F14804836.html)学习。这本书得到了Flowable创始人Tijs Rademakers亲笔作序推荐对系统学习和深入掌握Flowable的用法非常有帮助。 ![img](https://foruda.gitee.com/images/1727432593738798662/46c08088_2042292.png)

View File

@@ -12,10 +12,8 @@ import com.ruoyi.common.enums.CommonWhether;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysPostService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.system.domain.SysTenant;
import com.ruoyi.system.service.*;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -47,6 +45,9 @@ public class SysUserController extends BaseController {
@Autowired
private ISysPostService postService;
@Autowired
private ISysTenantService sysTenantService;
/**
* 获取用户列表
*/
@@ -132,6 +133,12 @@ public class SysUserController extends BaseController {
public AjaxResult add(@Validated @RequestBody SysUser user) {
deptService.checkDeptDataScope(user.getDeptId());
roleService.checkRoleDataScope(user.getRoleIds());
// 判断租户是否超过用户数量 (-1不限制)
if(sysTenantService.selectSysTenantByTenantId(SecurityUtils.getLoginUser().getTenantId()).getAccountCount() <= userService.selectUserCount()){
return error("新增用户'" + user.getUserName() + "'失败,租户用户数量已达到上限");
}
if (!userService.checkUserNameUnique(user)) {
return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
} else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {

View File

@@ -168,4 +168,11 @@ public interface SysUserMapper {
* @return 结果
*/
int resetTenantPwd(SysUser user);
/**
* 获取用户总数
*
* @return 用户总数
*/
int selectUserCount();
}

View File

@@ -252,4 +252,11 @@ public interface ISysUserService {
* @return 结果
*/
int resetTenantPwd(SysUser user);
/**
* 获取用户总数
*
* @return 用户总数
*/
int selectUserCount();
}

View File

@@ -566,4 +566,14 @@ public class SysUserServiceImpl implements ISysUserService {
public int resetTenantPwd(SysUser user) {
return userMapper.resetTenantPwd(user);
}
/**
* 获取用户总数
*
* @return 用户总数
*/
@Override
public int selectUserCount() {
return userMapper.selectUserCount();
}
}

View File

@@ -214,6 +214,10 @@
where u.user_id = #{userId} and u.tenant_id = #{tenantId}
</select>
<select id="selectUserCount" resultType="java.lang.Integer">
select count(1) from sys_user u where u.del_flag = '0'
</select>
<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
insert into sys_user(
<if test="userId != null and userId != 0">user_id,</if>