Digimeta-MultiSaas

基于 Vue3/TypeScript/Ant-Design UI 和 Spring Cloud & Alibaba/Mybatis-Plus 的多租户SaaS开发框架。

## 简介 基于SpringBoot | Spring Cloud & Alibaba | Mybatis-Plus | Vue3 | vite2 | TypeScript | Ant-Design-Vue UI 的微服务多租户SaaS开发框架,为企业级多租户Saas及集团化应用提供快速开发解决方案。 ## 特性 - **多重隔离控制**:物理隔离&&逻辑隔离,共享多租户&&隔离多租户 - **动态多源策略**:动态源增减&&租户动态识别源 - **租户控制优化**:通用数据&&混合租户&&独立租户多种租户模式,自动拦截,开发无感知 - **权限控制优化**:部门&&岗位&&用户多级可控,自动拦截,开发无感知 - **租户可配菜单**:多种混合模式控制租户菜单 - **组织管理优化**:更完善的组织架构操作与管理逻辑 - **微聚合多前端**:公共抽离,降低系统重复冗余 ## 结构 * 采用前后端分离的模式,微服务版本前端。 * 后端采用Spring Boot、Spring Cloud & Alibaba。 * 注册中心、配置中心选型Nacos,权限认证使用Redis。 * 流量控制框架选型Sentinel,分布式事务选型Seata。 ~~~ com.xueyi ├── multi-ui // vue3前端 [3000] ├── xueyi-ui // vue2前端 [80] ├── xueyi-gateway // 网关模块 [8080] ├── xueyi-auth // 认证中心 [9200] ├── xueyi-api // 接口模块 │ ├── xueyi-api-system // 系统接口 │ ├── xueyi-api-tenant // 租户接口 │ └── xueyi-api-job // 调度接口 ├── xueyi-common // 通用模块 │ ├── xueyi-common-cache // 缓存管理 │ ├── xueyi-common-core // 核心模块 │ ├── xueyi-common-datascope // 权限范围 │ ├── xueyi-common-datasource // 多数据源 │ ├── xueyi-common-log // 日志记录 │ ├── xueyi-common-redis // 缓存服务 │ ├── xueyi-common-security // 安全模块 │ ├── xueyi-common-swagger // 系统接口 │ └── xueyi-common-web // 租户核心 ├── xueyi-modules // 业务模块 │ ├── xueyi-file // 文件服务 [9300] │ ├── xueyi-gen // 代码生成 [9400] │ ├── xueyi-job // 定时任务 [9500] │ ├── xueyi-system // 系统模块 [9600] │ ├── authority // 权限模块 │ ├── dict // 参数字典 │ ├── material // 素材模块 │ ├── monitor // 监控模块 │ ├── notice // 公告模块 │ └── organize // 组织模块 │ └── xueyi-tenant // 租管模块 [9700] │ ├── source // 多数据源 │ └── tenant // 租户策略 ├── xueyi-visual // 图形化管理模块 │ └── xueyi-visual-monitor // 监控中心 [9100] └── pom.xml // 公共依赖 ~~~ ## 使用 ### 拉取源代码 ```shell git pull http://git.lecooai.com/develop/digimeta-MultiSaas.git ``` ### 编译源代码 ```shell //根模块上执行 mvn package ``` ### Docker部署与运行 #### 1. 检查docker-compose.yml配置,修改对应的信息,主要是数据库的密码设置 ```shell environment: MYSQL_ROOT_PASSWORD: Digimeta@123 ``` #### 2. 进入./docker目录,修改nacos/conf/application.properties文件,修改对应nacos数据源: ```shell db.url.0=jdbc:mysql://172.17.0.1:3306/xy-config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user=root db.password=Digimeta@123 ``` #### 3. 运行base ```shell sh ./deploy.sh base ``` 确保mysql能远程访问,不然nacos启动会报错,以下可为远程访问mysql提供参考: ```sql #进入容器里执行,登录mysql 查看:select host,user,plugin from user; 删除多余的行:delete from user where user ='root' and host='%'; 设置所有host可以访问:update user set host='%' where user ='root'; 修改密码:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Digimeta@123'; 刷一下,使之生效:FLUSH PRIVILEGES; 退出:exit ``` #### 4. 运行modules ```shell sh ./deploy.sh modules ``` #### 5. 运行monitor ```shell sh ./deploy.sh monitor ``` #### 6. 运行前端ui 代码下执行`npm install` 然后执行 ```shell npm run dev ``` 也可以编译后放在nginx中运行 ```shell npm run build:stage 或生产模式编译 npm run build:prod ``` nginx使用docker部署,nginx相关配置如下: ```shell server { listen 81; server_name localhost; charset utf-8; gzip on; # 不压缩临界值,大于1K的才压缩,一般不用改 gzip_min_length 1k; # 压缩缓冲区 gzip_buffers 16 64K; # 压缩版本(默认1.1,前端如果是squid2.5请使用1.0) gzip_http_version 1.1; # 压缩级别,1-10,数字越大压缩的越好,时间也越长 gzip_comp_level 5; # 进行压缩的文件类型 gzip_types text/plain application/x-javascript text/css application/xml application/javascript; # 跟Squid等缓存服务有关,on的话会在Header里增加"Vary: Accept-Encoding" gzip_vary on; # IE6对Gzip不怎么友好,不给它Gzip了 gzip_disable "MSIE [1-6]\."; location / { # 不缓存html,防止程序更新后缓存继续生效 if ($request_filename ~* .*\.(?:htm|html)$) { add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate"; access_log on; } root /home/vctgo/projects/vctgo-ui/xueyi-ui; try_files $uri $uri/ /index.html index index.html index.htm; } location /dev-api/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://172.17.0.1:8080/; proxy_redirect default; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; } location /stage-api/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://172.17.0.1:8080/; proxy_redirect default; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; } location /prod-api/ { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://172.17.0.1:8080/; proxy_redirect default; add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Headers X-Requested-With; add_header Access-Control-Allow-Methods GET,POST,OPTIONS; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } ``` 81端口则为项目的web访问端口 #### 7. 一些问题 1. 系统接口,流量监控,服务治理,服务监控等目录,需要在数据库中配置好相应的地址,不然页面访问不了; 2. 其他一些问题可以去参考[xueyi](https://gitee.com/xueyitiantang/XueYi-MultiSaas)和[ruoyi](https://gitee.com/y_project/RuoYi-Cloud)框架,在这两个项目中的issue中可能可以获得相应帮助