# SAAS-UPMS **Repository Path**: ws_developer/nodecollege-upms ## Basic Information - **Project Name**: SAAS-UPMS - **Description**: 基于 Spring cloud、nacos、vue的前后端分离分布式微服务Saas权限管理系统。包含运维/运营、C端用户、B端租户成员三套用户体系的权限管理,切换机构、切换角色,支持四个级别的页面接口访问权限校验、四个级别的数据权限的设置和校验,机构角色和机构用户两种用户授权模式,微服务接口管理、接口访问权限动态设置、接口访问量统计功能,前端工程、前端页面、页面按钮管理配置功能,产品线管理功能,租户开通工单功能,租户预制角色管理功能,系统、用户、机构、租户配置功能,预制配置功能,日志管理功能,任务调度功能,微服接口访问量统计功能,C端用户实时IM功能。 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 199 - **Created**: 2020-12-28 - **Last Updated**: 2020-12-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SAAS权限管理系统 基于 `Spring cloud`、`nacos`、`vue`的前后端分离分布式微服务`Saas`权限管理系统。包含运维/运营、C端用户、B端租户成员三套用户体系的权限管理,切换机构、切换角色,支持四个级别的页面接口访问权限校验、四个级别的数据权限的设置和校验,机构角色和机构用户两种用户授权模式,微服务接口管理、接口访问权限动态设置、接口访问量统计功能,前端工程、前端页面、页面按钮管理配置功能,产品线管理功能,租户开通工单功能,租户预制角色管理功能,系统、用户、机构、租户配置功能,预制配置功能,日志管理功能,任务调度功能,微服接口访问量统计功能,C端用户实时`IM`功能。 ## 演示地址 租的阿里云的服务器,内存有限,只搭了一套正式环境,下面运维/运营只给了查看权限,没有操作权限。更多的功能建议自己下载代码运行后试试吧。 - 运维运营登录地址:http://www.nodecollege.com/admin/login 账号/密码:`admin1 `/`123456aA.` - 用户登录地址:http://www.nodecollege.com/me/login 账号/密码: `15739575703`/`123456aA.` - 多租户成员登录地址:(用租户代码作为三级域名) http://test01.tenant.nodecollege.com/tenant/login 账号/密码:`00001`/`a123456` http://test02.tenant.nodecollege.com/tenant/login 账号/密码:`00001`/`aA123456` - `Gitee`地址:https://gitee.com/tinyLC/nodecollege-upms 基于该权限管理系统,配套开发了C端博客系统。 - 博客地址:http://www.nodecollege.com **如果觉得不错的话,可以给我一个start嘛?** **文件结构** - server:后端工程 - nacos:注册中心 - tools:通用工具包 - operate:运营/用户后端 - gateway:接口网关 - log:日志后端 - sync:任务调度后端 - chat:实时`IM`后端 - tenant:租户管理后端 - ui:前端工程 - common:前端公用组件 - operate:运营/运维前端 - me:个人前端 - tenant:租户权限管理前端 - `nginx`:`nginx`配置文件 - `sql`: 初始化脚本 ## 一、介绍 企业级多租户后台权限管理框架(`SAAS`)。 ![技术架构图.jpg](http://www.nodecollege.com/ncimg/M00/00/02/rBIgzV-r0k-AQsqqAAIWVFU8yDk93.jpeg) ## 二、主要功能: ### 1 后端微服务接口管理->前端工程管理->产品管理 这三个管理功能是依次依赖的,为后期的权限管理提供基础数据,同时也是便于清晰直白的体现整个系统的功能,利于后期系统的维护。 **后端微服务接口管理** 功能: 1)用于管理查看所有的微服务接口信息,用于后期服务增多,接口增多后,进行系统优化时提供参考。 2)进行接口访问权限的设置。 3)接口访问量统计。 4)给前端管理提供接口数据支持。 微服务工程只需要引入`base-client`包,就可以自动添加、更新该微服务所有的接口信息,无需手动操作。在产品管理里进行配置了后,通过**刷新产品授权限制信息**按钮就可以自动完成接口访问授权的设置。 `TODO`: 接口文档自动生成,接口自动化测试。 ![微服务接口管理.png](http://www.nodecollege.com/ncimg/M00/00/03/rBIgzV-r0nSARIdBAAFEFJLg5YY591.png) **前端工程管理** 主要作用:直观的体现系统一共有哪些前端工程,每个前端工程有几个页面,每个页面可以调用哪些接口。 前端和页面数据由前端开发人员将各自前端功能开发完成后,手动进行录入,接口数据从后端服务接口中手动选择。 给产品管理提供页面和按钮数据。 ![前端工程管理.png](http://www.nodecollege.com/ncimg/M00/00/03/rBIgzV-r0qCAD77IAAENCD3_jBY512.png) **产品管理** 产品是面向客户群体的,系统功能是围绕产品进行开发的,所以在这里进行产品的设置和定义,同时将对应的系统功能进行绑定。 产品绑定的菜单中,分类导航菜单需要手动进行创建,菜单页面从前端工程管理里选取。 ![产品管理.png](http://www.nodecollege.com/ncimg/M00/00/03/rBIgzV-r0rCAQzINAAEEL7HsVX4186.png) ### 2 产品管理 [产品管理详细说明](http://www.nodecollege.com/article/info/35) ### 3 角色管理 [角色管理详细说明](http://www.nodecollege.com/article/info/36) ### 4 运营运维、用户、租户三个用户群体的权限管理,数据隔离 三个用户群体的机构、用户、角色单独进行管理。 租户属于`2B`业务,租户之间数据隔离,可以为不同的租户开通不同的`2B`产品。 **TODO:** 租户数据库级别的数据隔离;租户开通产品访问量统计;访问量阈值设定。 ### 5 细粒度接口权限控制 接口调用权限:无限制、只能内部调用、管理员登录|授权访问,用户登录|授权访问,租户成员登录|授权访问。 接口数据权限:所有机构数据、所属机构及下级机构数据、所属机构数据、个人数据 [接口权限控制详细说明](http://www.nodecollege.com/article/info/37) ### 6 自定义数据权限管理控制 在数据权限管理界面,可以根据具体的数据权限,对机构或机构成员进行数据权限授权。 目前控制的数据权限有 1)机构数据 2)数据权限管理的数据权限 3)微服务接口里的微服务数据权限 4)前端工程数据权限 [数据权限详细说明](http://www.nodecollege.com/article/info/69) ### [7 其他功能说明](http://www.nodecollege.com/article/info/34) ## 三、模块化设计与使用 业务概述![业务概述.jpg](http://www.nodecollege.com/ncimg/M00/00/02/rBIgzV-r0g6AREBqAAGZinqlZ8o74.jpeg) 服务对应功能 | 前后端服务 | 对应功能 | 是否开源 | | ------------------------------------------------------ | ------------------------------------------------------------ | -------- | | /server/operate
/server/gateway
/ui/operate | 管理员权限管理
微服务接口管理
前端管理
产品管理
网关管理
配置管理
文件管理 | 是 | | /server/log
/server/sync | 系统日志管理
任务管理
任务日志管理 | 是 | | /ui/me | 用户权限管理 | 是 | | /server/chat | 聊天系统
通讯录 | 是 | | /server/tenant
/ui/tenant | 租户权限管理 | 是 | | /server/worldTree
/ui/web | 世界树和辩论堂相关功能 | 否 | | /server/article
/ui/article
/ui/article-info | 文章相关功能 | 否 | /server/nacos、operate、gateway和/me/operate是基础微服务,只运行这四个服务,即可拥有运维运营及管理员主要功能。 /server/log、sync这两个后端服务,提供日志和任务调度功能,**不启动**这两个微服务的情况下,请确保其他服务配置文件中日志推送标志**不为true**(默认为false) **log.posh=false** ,为true的情况下,每个微服务都会将各自的日志信息存储到redis中,然后靠sync和log服务从redis中取出进行消费。 /ui/me,运行这个前端服务,即可使用C端用户功能。 /server/chat,运行这个后端服务,C端用户即可使用聊天和通讯录功能,前端在/ui/me中 /server/tenant,/ui/tenant,运行这两个服务后,可以使用租户管理相关功能。租户功能除了依赖之前的基础服务外,还依赖C端用户的功能,因为租户成员账号是 C端用户的一个身份,一个C端用户可以有多个租户成员账号。 **注**:当然要使用上述的功能,还得开通相应的权限才行 ## 四、技术技巧 [密码RSA前端加密,后端解密](http://www.nodecollege.com/article/info/38) [vue、nuxt添加百度统计功能](http://www.nodecollege.com/article/info/44) ## 五、运行和部署 server和ui文件内的工程都是独立的,正规公司都是每个工程都单独一个git工程,我这为了方便放一个git里了。 1. 创建数据库、导入数据 2. 启动redis、nacos ``` # redis自行启动,nacos在/server/nacos/bin/ 目录中有配套的启动文件 # 注意linux下单机启动命令如下 sh startup.sh -m standalone ``` 3. 配置启动/server/operate、gateway operate是基础核心服务,gateway是接口网关,所有前端接口调用都走gateway,gateway是动态网关,网关信息从redis中的获取(operate启动时将网关信息从数据库读取然后存储到redis中)。 4. 启动/ui/operate ```nodejs # /ui/operate npm install npm run dev ``` 启动成功后访问 http://localhost:8081/admin/login 登录即可 运维运营用户名/密码 `admin`/`123456aA.` 此时除了日志功能、任务调用功能访问会报404,租户功能不能正常使用外,其他功能都能正常使用了。 5. 启动/ui/me ``` # /ui/me npm install npm run dev ``` 启动成功后访问 http://localhost:8083/me/login 登录 C端用户名/密码 `15739575703`/`123456aA.` 此时处理聊天功能、租户功能外,C端功能都能使用。 6. 配置启动/server/chat 启动成功后,C端聊天功能能够正常使用 7. 配置启动/server/log、sync 启动成功后,运维运营端日志功能和任务调度功能能够正常使用了 8. 配置启动/server/tenant 9. 启动/ui/tenant 启动成功后访问,http://localhost:8084/tenant/login 租户成员账号/密码 `15739575703`/`a123456` 此时,租户功能能够正常使用了。 注意:这是多租户系统,所以每个租户的登录地址都应该是这样的 http://{租户代码}.域名.com/tenant/login,通过二级域名的方式进行登录,然后将二级域名作为一个参数传递给后端服务,用于辨识是那个租户,所以本地启动时,需要在/ui/tenant/config/index.js文件中,将要用于登录的租户成员账号对应的租户代码进行手动填入,模拟二级域名缺失的参数 ```javascript 'use strict' // Template version: 1.3.1 // see http://vuejs-templates.github.io/webpack for documentation. const path = require('path') function onProxyReq (proxyReq, req, res) { // 本地开发时,只能使用 如下设置的 B端租户代码 对应的B端账号进行登录 proxyReq.setHeader('LOGIN-TENANT-CODE', 'applyTenantTest13'); proxyReq.setHeader('ACCESS-SOURCE', 'nc-nginx'); } module.exports = { dev: { // Paths assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: { '/tenantApi': { target: 'http://localhost:1081/', changeOrigin: true, // 代理响应事件 onProxyReq: onProxyReq, pathRewrite: { '^/': '/' } } }, // Various Dev Server settings host: 'localhost', // can be overwritten by process.env.HOST port: 8084, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined ... } ``` ## 六、结束