# scaffold 项目

# 简介

自用的项目骨架

有任何问题,或者想要的功能,可以在博客首页联系作者

  • 管理后台的电脑端:Vue3 提供 element-plus
  • 后端采用 Spring Boot 多模块架构、MySQL + MyBatis Plus、Redis + Redisson
  • 数据库可使用 MySQL、Oracle、PostgreSQL、SQL Server、MariaDB、国产达梦 DM、TiDB 等
  • 权限认证使用 Spring Security & Token & Redis,支持多终端、多种用户的认证系统,支持 SSO 单点登录
  • 支持加载动态权限菜单,按钮级别权限控制,本地缓存提升性能
  • 支持 SaaS 多租户,可自定义每个租户的权限,提供透明化的多租户底层封装
  • 工作流使用 Flowable,支持动态表单、在线设计流程、会签 / 或签、多种任务分配方式
  • 高效率开发,使用代码生成器可以一键生成前后端代码 + 单元测试 + Swagger 接口文档 + Validator 参数校验
  • 集成微信小程序、微信公众号、企业微信、钉钉等三方登陆,集成支付宝、微信等支付与退款
  • 集成阿里云、腾讯云等短信渠道,集成 MinIO、阿里云、腾讯云、七牛云等云存储服务
  • 集成报表设计器、大屏设计器,通过拖拽即可生成酷炫的报表与大屏
  • 集成 liquibase 实现数据库版本控制

# 项目关系

# 后端项目

项目Star简介
scaffold基于 Spring Boot 多模块架构

# 前端项目

项目Star简介
scaffold-ui-admin基于 Vue3 + element-plus 实现的管理后台

# 内置功能

系统内置多种多种业务功能,可以用于快速你的业务系统:

  • 通用模块(必选):系统功能、基础设施
  • 通用模块(可选):工作流程、支付系统、数据报表、会员中心
  • 业务系统(按需):ERP 系统、CRM 系统、商城系统、微信公众号、AI 大模型

友情提示:本项目基于 RuoYi-Vue-Pro 修改,重构优化后端的代码,美化前端的界面。

  • 额外新增的功能,我们使用 🚀 标记。
  • 重新实现的功能,我们使用 ⭐️ 标记。

🙂 所有功能,都通过 单元测试 保证高质量。

# 系统功能

功能描述
用户管理用户是系统操作者,该功能主要完成系统用户配置
在线用户当前系统中活跃用户状态监控,支持手动踢下线
角色管理角色菜单权限分配、设置角色按机构进行数据范围权限划分
菜单管理配置系统菜单、操作权限、按钮权限标识等,本地缓存提供性能
部门管理配置系统组织机构(公司、部门、小组),树结构展现支持数据权限
岗位管理配置系统用户所属担任职务
租户管理配置系统租户,支持 SaaS 场景下的多租户功能
租户套餐配置租户套餐,自定每个租户的菜单、操作、按钮的权限
字典管理对系统中经常使用的一些较为固定的数据进行维护
短信管理短信渠道、短息模板、短信日志,对接阿里云、腾讯云等主流短信平台
邮件管理邮箱账号、邮件模版、邮件发送日志,支持所有邮件平台
站内信系统内的消息通知,提供站内信模版、站内信消息
操作日志系统正常操作日志记录和查询,集成 Swagger 生成日志内容
登录日志系统登录日志记录查询,包含登录异常
错误码管理系统所有错误码的管理,可在线修改错误提示,无需重启服务
通知公告系统通知公告信息发布维护
敏感词配置系统敏感词,支持标签分组
应用管理管理 SSO 单点登录的应用,支持多种 OAuth2 授权方式
地区管理展示省份、城市、区镇等城市信息,支持 IP 对应城市
🚀数据库版本控制可以控制项目的数据库版本,并且可以在线升级
🚀动态线程池管理检测控制每一个线程池的情况,当线程池中的线程超出阈值进行预警动态分配,可以动态最大限度的利用资源

# 工作流程

历经头部企业生产验证,工作流引擎须标配仿钉钉 / 飞书 + BPMN 双设计器!!!

前者支持轻量配置简单流程,后者实现复杂场景深度编排

功能列表功能描述是否完成
SIMPLE 设计器仿钉钉 / 飞书设计器,支持拖拽搭建表单流程,10 分钟快速完成审批流程配置
BPMN 设计器基于 BPMN 标准开发,适配复杂业务场景,满足多层级审批及流程自动化需求
会签同一个审批节点设置多个人(如 A、B、C 三人,三人会同时收到待办任务),需全部同意之后,审批才可到下一审批节点
或签同一个审批节点设置多个人,任意一个人处理后,就能进入下一个节点
依次审批(顺序会签)同一个审批节点设置多个人(如 A、B、C 三人),三人按顺序依次收到待办,即 A 先审批,A 提交后 B 才能审批,需全部同意之后,审批才可到下一审批节点
抄送将审批结果通知给抄送人,同一个审批默认排重,不重复抄送给同一人
驳回(退回)将审批重置发送给某节点,重新审批。可驳回至发起人、上一节点、任意节点
转办A 转给其 B 审批,B 审批后,进入下一节点
委派A 转给其 B 审批,B 审批后,转给 A,A 继续审批后进入下一节点
加签允许当前审批人根据需要,自行增加当前节点的审批人,支持向前、向后加签
减签(取消加签)在当前审批人操作之前,减少审批人
撤销(取消流程)流程发起人,可以对流程进行撤销处理
终止系统管理员,在任意节点终止流程实例
表单权限支持拖拉拽配置表单,每个审批节点可配置只读、编辑、隐藏权限
超时审批配置超时审批时间,超时后自动触发审批通过、不通过、驳回等操作
自动提醒配置提醒时间,到达时间后自动触发短信、邮箱、站内信等通知提醒,支持自定义重复提醒频次
父子流程主流程设置子流程节点,子流程节点会自动触发子流程。子流程结束后,主流程才会执行(继续往下下执行),支持同步子流程、异步子流程
条件分支(排它分支)用于在流程中实现决策,即根据条件选择一个分支执行
并行分支允许将流程分成多条分支,不进行条件判断,所有分支都会执行
包容分支(条件分支 + 并行分支的结合体)允许基于条件选择多条分支执行,但如果没有任何一个分支满足条件,则可以选择默认分支
路由分支根据条件选择一个分支执行(重定向到指定配置节点),也可以选择默认分支执行(继续往下执行)
触发节点执行到该节点,触发 HTTP 请求、HTTP 回调、更新数据、删除数据等
延迟节点执行到该节点,审批等待一段时间再执行,支持固定时长、固定日期等
拓展设置流程前置 / 后置通知,节点(任务)前置、后置通知,流程报表,自动审批去重,自定流程编号、标题、摘要,流程报表等

# 支付系统

功能描述
🚀应用信息配置商户的应用信息,对接支付宝、微信等多个支付渠道
🚀支付订单查看用户发起的支付宝、微信等的【支付】订单
🚀退款订单查看用户发起的支付宝、微信等的【退款】订单
🚀回调通知查看支付回调业务的【支付】【退款】的通知结果
🚀接入示例提供接入支付系统的【支付】【退款】的功能实战

# 基础设施

功能描述
🚀代码生成前后端代码的生成(Java、Vue、SQL、单元测试),支持 CRUD 下载
🚀系统接口基于 Swagger 自动生成相关的 RESTful API 接口文档
🚀数据库文档基于 Screw 自动生成数据库文档,支持导出 Word、HTML、MD 格式
表单构建拖动表单元素生成相应的 HTML 代码,支持导出 JSON、Vue 文件
🚀配置管理对系统动态配置常用参数,支持 SpringBoot 加载
⭐️定时任务在线(添加、修改、删除) 任务调度包含执行结果日志
🚀文件服务支持将文件存储到 S3(MinIO、阿里云、腾讯云、七牛云)、本地、FTP、数据库等
🚀WebSocket提供 WebSocket 接入示例,支持一对一、一对多发送方式
🚀API 日志包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题
MySQL 监控监视当前系统数据库连接池状态,可进行分析 SQL 找出系统性能瓶颈
Redis 监控监控 Redis 数据库的使用情况,使用的 Redis Key 管理
🚀消息队列基于 Redis 实现消息队列,Stream 提供集群消费,Pub/Sub 提供广播消费
🚀Java 监控基于 Spring Boot Admin 实现 Java 应用的监控
🚀链路追踪接入 SkyWalking 组件,实现链路追踪
🚀日志中心接入 SkyWalking 组件,实现日志中心
🚀服务保障基于 Redis 实现分布式锁、幂等、限流功能,满足高并发场景
🚀日志服务轻量级日志中心,查看远程服务器的日志
🚀单元测试基于 JUnit + Mockito 实现单元测试,保证功能的正确性、代码的质量等

# 数据报表

功能描述
🚀报表设计器支持数据报表、图形报表、打印设计等
🚀大屏设计器拖拽生成数据大屏,内置几十种图表组件

# 微信公众号

功能描述
🚀账号管理配置接入的微信公众号,可支持多个公众号
🚀数据统计统计公众号的用户增减、累计用户、消息概况、接口分析等数据
🚀粉丝管理查看已关注、取关的粉丝列表,可对粉丝进行同步、打标签等操作
🚀消息管理查看粉丝发送的消息列表,可主动回复粉丝消息
🚀自动回复自动回复粉丝发送的消息,支持关注回复、消息回复、关键字回复
🚀标签管理对公众号的标签进行创建、查询、修改、删除等操作
🚀菜单管理自定义公众号的菜单,也可以从公众号同步菜单
🚀素材管理管理公众号的图片、语音、视频等素材,支持在线播放语音、视频
🚀图文草稿箱新增常用的图文素材到草稿箱,可发布到公众号
🚀图文发表记录查看已发布成功的图文素材,支持删除操作

# 商城系统

# 会员中心

功能描述
🚀会员管理会员是 C 端的消费者,该功能用于会员的搜索与管理
🚀会员标签对会员的标签进行创建、查询、修改、删除等操作
🚀会员等级对会员的等级、成长值进行管理,可用于订单折扣等会员权益
🚀会员分组对会员进行分组,用于用户画像、内容推送等运营手段
🚀积分签到回馈给签到、消费等行为的积分,会员可订单抵现、积分兑换等途径消耗

# ERP 系统

# CRM 系统

# AI 大模型

# 技术栈

# 模块

项目说明
scaffold-dependenciesMaven 依赖版本管理
scaffold-frameworkJava 框架拓展
scaffold-server管理后台 + 用户 APP 的服务端
scaffold-module-system系统功能的 Module 模块
scaffold-module-member会员中心的 Module 模块
scaffold-module-infra基础设施的 Module 模块
scaffold-module-bpm工作流程的 Module 模块
scaffold-module-pay支付系统的 Module 模块
scaffold-module-mall商城系统的 Module 模块
scaffold-module-erpERP 系统的 Module 模块
scaffold-module-crmCRM 系统的 Module 模块
scaffold-module-aiAI 大模型的 Module 模块
scaffold-module-mp微信公众号的 Module 模块
scaffold-module-report大屏报表 Module 模块

# 框架

框架说明版本
Spring Boot应用开发框架3.5.5
MySQL数据库服务器5.7 / 8.0+
DruidJDBC 连接池、监控组件1.2.27
MyBatis PlusMyBatis 增强工具包3.5.12
Dynamic Datasource动态数据源4.3.1
Rediskey-value 数据库5.0 / 6.0 /7.0
RedissonRedis 客户端3.35.0
Spring MVCMVC 框架6.2.9
Spring SecuritySpring 安全框架6.5.2
Hibernate Validator参数校验组件8.0.2
Flowable工作流引擎7.0.0
Quartz任务调度组件2.5.0
SpringdocSwagger 文档2.8.9
SkyWalking分布式应用追踪系统9.5.0
Spring Boot AdminSpring Boot 监控平台3.5.2
JacksonJSON 工具库2.30.14
MapStructJava Bean 转换1.6.3
Lombok消除冗长的 Java 代码1.18.38
JUnitJava 单元测试框架5.12.2
MockitoJava Mock 框架5.17.0

# 项目讲解

# 项目结构和表结构规范

  1. 项目结构

    a

  2. 表结构

    对应的模块对应表前缀, 如系统相关的表,前缀为:system_

    基础设施服务就是: infra_

# 功能权限

基于 RBAC 权限模型(Role-Based Access Control)的角色访问控制

具体说明查看文档:scaffold 项目之功能权限

# 数据权限

# 用户体系

# 三方登陆

# 部署流程

# 后端项目

docker:

dockerfile 方式启动, 如果访问不到国外镜像,可以看这里使用 github 配合阿里云仓库拉取国外镜像

## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性
FROM registry.cn-guangzhou.aliyuncs.com/tzting/eclipse-temurin:21-jre
## 创建目录,并使用它作为工作目录
RUN mkdir -p /scaffold-server
WORKDIR /scaffold-server
## 将后端项目的 Jar 文件,复制到镜像中
COPY scaffold-server.jar app.jar
## 设置 TZ 时区
ENV TZ=Asia/Shanghai
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV JAVA_OPTS="-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom"
## 应用参数
ENV ARGS=""
## 暴露后端项目的 48080 端口
EXPOSE 48080
## 启动后端项目
CMD java ${JAVA_OPTS} -jar app.jar $ARGS

目录结构:

-rw-r--r-- 1 root root       676 Jul 26 20:45 application.yml
drwxrwxrwx 2 root root      4096 May  5 21:49 backup
drwxrwxrwx 2 root root      4096 May  5 21:46 build
-rwxrwxrwx 1 root root       548 May  5 23:13 deploy.sh
-rw-r--r-- 1 root root       951 Jul 26 20:37 Dockerfile
-rwxrwxrwx 1 root root       758 May  5 21:34 Dockerfile_bak_20240726
-rw-r--r-- 1 root root 239261495 May 20 21:01 scaffold-server.jar

构建镜像:

docker build -t scaffold-server .

新建 Shell 脚本 deploy.sh ,使用 Docker 启动后端项目

#!/bin/bash
set -e
## 第一步:删除可能启动的老 scaffold-server 容器
echo "开始删除 scaffold-server 容器"
docker stop scaffold-server || true
docker rm scaffold-server || true
echo "完成删除 scaffold-server 容器"
## 第二步:启动新的 scaffold-server 容器 \
echo "开始启动 scaffold-server 容器"
docker run -d \
--name scaffold-server \
-p 48080:48080 \
-e "SPRING_PROFILES_ACTIVE=dev" \
-v /home/software/scaffold-server:/root/logs/ \
scaffold-server
echo "正在启动 scaffold-server 容器中,需要等待 60 秒左右"

构建进行运维命令

docker restart scaffold-server
docker start scaffold-server
docker stop scaffold-server

# 前端项目

npm run build:prod ## 打包 prod 生产环境
npm run build:stage ## 打包 stage 预发布环境

# 商城部署

# 发布为 Web 网站

① 修改项目根目录的 .env 配置文件,修改 SHOPRO_BASE_URLSHOPRO_STATIC_URLSHOPRO_H5_URL 为你的域名地址。

② 阅读 HBuilder 的官方文档 https://zh.uniapp.dcloud.io/quickstart-hx.html 的「发布为 Web 网站」小节。

③ 打包按成后,它其实就是一个静态网站,可以通过 Nginx 进行转发。具体的转发配置,参考 https://juejin.cn/post/7310980511453839375 文章

# 发布为微信小程序

① 修改项目根目录的 .env 配置文件,修改 SHOPRO_BASE_URLSHOPRO_STATIC_URLSHOPRO_H5_URL 为你的域名地址。

② 阅读 HBuilder 的官方文档 https://zh.uniapp.dcloud.io/quickstart-hx.html 的「发布为微信小程序」小节。

注意,微信有各种白名单要配置,可参考 https://blog.csdn.net/weixin_45966674/article/details/133280890 文章

# 仪表盘设计器

下载项目 scaffold-ui-go-view

执行下面的命令

# 安装 pnpm,提升依赖的安装速度
npm config set registry https://registry.npmmirror.com
npm install -g pnpm
# 安装依赖
pnpm install
# 启动服务
npm run dev

打包好将 dist 放到 nginx 的 html 目录下

# nginx 配置

server { ## 后端项目
    listen       80;
    server_name  scaffold.tzzfj.cn; ## 重要!!!修改成你的外网 IP / 域名
    ## 不要使用 location / 转发到后端项目,因为 druid、admin 等监控,不需要外网可访问。或者增加 Nginx IP 白名单限制也可以。
    location /admin-api/ { ## 后端项目 - 管理后台
        proxy_pass http://127.0.0.1:48080/admin-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IP
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location /app-api/ { ## 后端项目 - 用户 App
        proxy_pass http://127.0.0.1:48080/app-api/; ## 重要!!!proxy_pass 需要设置为后端项目所在服务器的 IP
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    
    location / { ## 前端项目
        root   /home/software/nginx-1.25.5/html/scaffold-ui-admin;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}

推荐使用 nginxWebUi 工具管理, 直接将上面的 nginx 导入, 在将域名改成自己的

# S3 文件服务

# 七牛云

只需要注册,添加一个桶,然后在获取对应的 key 就好, 如果需要自定义域名上传访问文件则可以参考这篇文章: https://blog.csdn.net/weixin_44955793/article/details/130313810

# minio

# 总结

# 参考资料