# SAAS-UPMS **Repository Path**: zl_java/nodecollege-upms ## Basic Information - **Project Name**: SAAS-UPMS - **Description**: SAAS通用权限管理系统,包含多租户权限管理系统和运营管理系统,在线IM系统,后端spring cloud,前端vue - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 199 - **Created**: 2020-08-14 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 通用用户权限系统 ### 文件结构 - server:后端工程 - nacos:nacos服务,端口:8848 - tools:通用工具 - upms:权限管理后端,端口:1081 - chat:聊天室后端,端口:1082,2080 - sync:定时任务后端,端口:1085 - pcgl:批次管理后端(业务),端口:3081 - ui:前端工程 - common:前端公用组件 - upms:权限管理前端 - admin:运营前端 - pcgl:批次管理前端(业务) - nginx:nginx ### 演示地址 - 权限演示地址:http://120.79.216.173:8082/upms 账号/密码: `15739575703`/`123456aA.` - 运营演示地址:http://120.79.216.173:8082/admin 账号/密码:`admin1/admin2/admin3` / `123456aA.` ### 一、介绍 企业级多租户后台权限管理框架,使用前后端分离的方式。后端使用`sping cloud` 用`nacos`作为注册中心,前端使用`vue`。用`nginx`做负载均衡和前端运行环境。 实现了成员拥有多种角色、多个组织机构的菜单显示控制和接口的数据权限控制。可以设置只显示一个角色和一个组织机构的权限菜单,并通过切换角色或者切换组织机构来显示对应的页面和数据,也可以设置同时显示拥有的多个角色的权限菜单和数据,并且可以做到对接口的正确数据权限校验。举个例子,成员A拥有角色A和角色B,角色A可以查询修改 组织A和B的权限,角色B可以查询组织B和C的权限,那么成员A在查询列表上就能查询到组织A、B、C的数据,但是只能修改其中组织A和B的数据,无权修改组织C的数据。 权限前端内置实时`IM`系统,支持多人群聊、单对单好友聊天、好友添加、群组添加、好友消息是否读取等功能。 业务系统前端可以使用`iframe`的方式进行嵌入,也可以使用权限前端的基础模板进行二次开发, 业务系统后端引用一个`upms-client`包,并配置一些参数,即可实现接口基本的数据权限控制。 ### 二、软件架构 1. 后端框架:`spring cloud`、`mybatis`、`netty` 2. 前端框架:`vue`、`ant-design`、`echarts` 3. 缓存:`redis` 4. 数据库: - `mysql`: (需要修改`mapper.xml`中模糊查询语句才能正常使用) - `sqlite`: (目前正在使用) ### 三、主要功能: #### 1 多租户管理 租户属于`2B`业务,租户之间数据隔离,可以为不同的租户开通不同的`2B`应用及相关的菜单权限。 **TODO:** 后期会添加针对租户开通应用及具体菜单的访问量统计功能;添加访问量阈值设定功能;访问量超过阈值,自动进行锁定功能。 **注意:** 新注册的租户默认开通系统权限管理的应用权限,但是没有开通改应用下菜单的权限,需要在租户管理-应用信息中单独进行开通。还可以在运营后台-配置管理界面,配置默认开通应用及预制角色。 #### 2 多应用管理 应用分为 `2B`、`2C`和运营三种类型。 ``` 2B:针对租户,每个租户各自管理各自的成员,实现了对租户的数据隔离,可以设置预制角色及菜单资源信息。 2C:针对该平台用户,可以设置菜单资源。 运营:针对运营人员,可以设置菜单资源,在运营角色管理页面,可以控制运营人员权限。 ``` 菜单分为分类导航、菜单页面、查询按钮、操作类按钮四类,其中查询和操作类按钮会**绑定接口**信息,用以实现接口级别的权限控制。 预制角色实现了页面及接口访问权限和七级数据权限控制。权限挂接在角色中,通过给组织和人员授权不通的角色,来实现不同的人员权限的控制。 ``` 0:可以操作该租户的所有数据 1:可以操作所属机构及下级机构所有数据 2:可以操作所属机构及当前机构所有下级机构数据(感觉这级权限有点脱离需求,虽然实现了) 3:可以操作所属机构的数据 4:可以操作当前机构及下级所有机构数据 5:仅能操作当前机构数据 6:仅能操作用户自己的数据 ``` #### 3 预制角色和自定义角色功能 预制角色在运营后台-应用管理进行创建,自定义角色在租户权限管理后台-角色管理界面进行创建。 预制角色的意义及定位: ``` 1)每个新建立的租户,其超级管理员必须有管理这个租户所有功能的权限,可以通过授予默认预制角色来快速进行授权,该配置可以在运营后台-配置管理页面进行配置。 2)对应人员较少的租户来说,预制角色即可覆盖所有租户成员,方便租户快速掌握使用系统。 ``` 自定义角色意义及定位: ``` 1)每个租户可以自定义专属于自己的角色,用于满足企业自身的个性化权限控制需求。 2)对应人数较多,业务分级较为复杂的租户。 ``` 角色分为**组织角色**和**组织成员角色**。 **组织角色** 给具体的组织机构进行授权,授权后的组织机构下的所有成员都有该角色的权限。 **组织成员角色** 需要先对组织机构进行授权,然后需要对该组织机构下的具体成员进行授权,只有该组织机构下的具体成员授权了这个角色,才会拥有这个角色的权限。 组织角色是为了进行批量授权,不用每个成员都单独进行授权,加快授权速度。 组织成员角色是为管理人员设置的,例如组织机构的司长、局长、部长、组长之类的,他们的权限需要区别于普通的成员。 **注:** 有兴趣的可以去看登陆相关的逻辑,在登陆的时候进行用户菜单的生成和接口数据权限的计算,这块是整个系统最复杂的地方。 #### 4 所有应用的接口管理 引用了`upms-client`包的应用会自动将接口信息进行收集并显示在这,在这可以查看该平台所有应用的所有接口信息。 **TODO:** 1)各个接口的访问量统计信息展示。2)接口文档。3)接口调试。 #### 5 接口访问统计 现实现,小时-接口访问统计、小时-租户即可访问统计、日-接口访问统计,日-租户访问统计,接口访问量`top10`,租户访问量`top10`。 **TODO:** 后期实现`IP`访问量`TOP10`、应用内互相调用统计图及对外接口访问统计图。 **注:** 有兴趣的小伙伴可以仔细看下这个页面的请求信息,这六个统计功能全都是一个后台接口不同的参数实现的。 #### 6 快速实现应用接口的访问控制 后端引入`upms-client`包,配置文件中设置`upms.loginCheck=true`,并在`controller`类上加个注解`@UserLoginAnnotation(checkDataPower = true)`,即可实现接口的自动统计,具体接口访问量的自动统计,在具体的处理方法里使用 `ThreadUserUtils.getLoginUser()` 即可获取到当前请求用户登陆信息,使用 `ThreadUserUtils.getLoginUser().getApiDataPower()` 即可获取到用户具体的数据权限,`apiDataPower`权限规则为 ```java @Data public class ApiDataPower { // 租户id private Long tenantId; // 成员id private Long memberId; /** * 能操作的组织机构列表 * 为null,可以操作租户下所有组织机构数据 * 为空, 只能操作当前登陆人的数据,memberId必填 * 不为空,可以操作列表中组织机构的数据 */ private List orgList; } ``` 这样做的目的是为了分离业务,各个微服务做各个微服务自己的业务,微服务要使用接口权限校验时,直接引包和配参数就行了,不需要自己实现相关的功能。 ​ 当然数据级别的权限是需要根据具体业务具体处理的,我这只是提供了一个方便的方式,在某个具体的是方法里,可以用如下的方式获取具体的数据权限数据进行处理。 ```java @PostMapping("/getList") public NCResult getList(@RequestBody QueryVO queryVO) { ApiDataPower apiDataPower = ThreadUserUtils.getLoginUser().getApiDataPower(); return pcglService.getList(queryVO); } ``` ### 四、详细功能介绍 [详细功能介绍](_docs/详细功能介绍.md) ### 五、运行和部署 [运行部署](_docs/运行部署.md) #### 六、结束 写的比较简略,后期会把文档补齐。 最后,水平有限,欢迎交流。