SpringBoot 2.7 + Vue3 前后端分离的快速开发框架
项目简介
本项目为一款持续更新、完全免费开源的企业级应用开发框架,采用前后端分离架构,专注于提升业务开发中的非功能性需求支持。前端基于 Vue 和 Element UI 构建,后端采用 Spring Boot、Spring Security、Redis 和 JWT 等技术栈,集成了完善的权限认证机制,支持多终端登录与身份验证。
系统面向互联网场景设计,兼顾 B 端与 C 端用户需求,具备高度可扩展性与适配性。通过插件化方式集成企业开发中常用的中间件与组件,模块设计遵循高内聚、低耦合原则,结构清晰、易于扩展。代码规范整洁,架构简洁明确,既适合学习参考,也可用于企业实际项目开发。
内置模块
用户管理:管理系统操作人员,完成用户账号的创建、权限分配和信息维护。
部门管理:配置公司、部门的多级组织架构,以树形结构直观展示,并支持按数据权限进行隔离。
菜单管理:配置系统导航菜单、操作功能权限及按钮级权限标识,实现精细化访问控制。
角色管理:为不同角色分配菜单和操作权限,支持按组织架构划分数据权限范围。
字典管理:维护系统中常用且相对固定的分类、标签等基础数据,提升数据一致性和可维护性。
参数管理:对系统运行所需的动态参数进行集中配置与管理,支持实时调整和生效。
通知公告:发布并维护系统内的通知和公告信息,确保用户及时获取重要动态。
操作日志:记录和查询系统的正常操作日志与异常信息日志,便于审计与故障排查。
登录日志:查询用户登录记录,包括成功与异常的登录行为,保障系统安全可控。
在线用户:实时监控系统中当前活跃用户的登录状态和操作行为。
开发说明
运行环境
| 工具 | 版本 |
|---|---|
| Java | 1.8、17 |
| Maven | 3.6.3 + |
| Redis | 5 + |
| PostgreSQL | 12.16 |
| IDE | IDEA、Eclipse 、VS Code |
工程结构
├── java
│ └── net
│ └── vjsp
│ ├── common -- 通用文件
│ │ ├── constant -- 全局常量
│ │ ├── enums -- 全局枚举
│ │ ├── exception -- 全局异常
│ │ ├── model -- 通用封装对象实体
│ │ └── util -- 静态工具类
│ ├── framework -- 系统框架
│ │ ├── aspectj -- 业务注解
│ │ │ ├── annotation -- 注解实现
│ │ ├── config -- 配置类
│ │ ├── filter -- 过滤器
│ │ ├── handler -- 配置文件中引用的执行器
│ │ ├── model -- 框架对象实体
│ │ ├── security -- 权限框架组件和实现
│ │ └── service -- 全局动态工具类和通用方法
│ ├── modules -- 业务模块
│ │ ├── controller -- 控制层
│ │ ├── domain -- 实体类
│ │ │ ├── convert -- 转换类,用于跨层交互传递
│ │ │ ├── dto -- 三方调用数据封装
│ │ │ ├── form -- 提交表单对象
│ │ │ ├── po -- 持久层对象
│ │ │ ├── query -- 查询对象
│ │ │ └── vo -- 查询列表实体
│ │ ├── mapper -- 持久化实现
│ │ └── service -- 业务逻辑实现
│ ├── system -- 系统模块
│ │ ├── common -- 通用控制层:登录、上传、下载、验证码
│ │ ├── controller -- 控制层
│ │ ├── domain -- 实体类
│ │ │ ├── convert -- 转换类,用于跨层交互传递
│ │ │ ├── dto -- 三方调用数据封装
│ │ │ ├── form -- 提交表单对象
│ │ │ ├── po -- 持久层对象
│ │ │ ├── query -- 查询对象
│ │ │ └── vo -- 查询列表实体
│ │ ├── mapper -- 持久化实现
│ │ └── service -- 业务逻辑实现
│ ├── workflow -- 工作流
│ └── VjspApplication.java -- 系统启动类
└── resources -- 配置文件结构规范
| 一级包名路径 | 说明 |
|---|---|
| common | 通用文件包,全局变量,异常类,枚举类,静态工具类等和业务无关的全局文件 |
| framework | 系统文件包,权限框架,配置文件,拦截器,依赖注入工具类 |
| system | 系统模块,用户,角色,菜单,日志,登录等 |
| modules | 业务模块,除系统自带模块外其他功能模块 |
| workflow | 工作流模块 |
| resources | 配置文件 |
Maven规范
使用springboot主版本提供依赖的jar包,不需要写版本号,非springboot主版本提供依赖得jar包, 版本号声明提取到属性文件中
当前系统中使用到得非springboot主版本提供依赖得jar包如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<skipTests>true</skipTests>
<java.version>1.8</java.version>
<mapstruct.version>1.5.1.Final</mapstruct.version>
<springdoc.version>1.7.0</springdoc.version>
<postgresql.version>42.2.20</postgresql.version>
<mybatis-plus-boot-starter.version>3.5.1</mybatis-plus-boot-starter.version>
<commons.io.version>2.19.0</commons.io.version>
<jasypt.version>3.0.5</jasypt.version>
<bcprov.version>1.73</bcprov.version>
<poi.version>4.1.2</poi.version>
<jjwt.version>0.9.0</jjwt.version>
<fastjson.version>2.0.58</fastjson.version>
<fastdfs.version>1.27.2</fastdfs.version>
<s3.version>1.11.792</s3.version>
</properties>spring-boot-starter-parent版本号为:2.7.0,不建议更换其他版本,存在配置兼容性问题。
JAR包清单
| 名称 | 版本 | 用途 |
|---|---|---|
| spring-boot | 2.7.0 | 框架主版本 |
| spring-boot-starter-web | 同主框架版本 | Web容器 |
| spring-boot-starter-test | 同主框架版本 | 测试 |
| spring-boot-configuration-processor | 同主框架版本 | 元数据补全 |
| spring-boot-starter-aop | 同主框架版本 | 拦截器 |
| spring-boot-devtools | 同主框架版本 | 热编译工具 |
| spring-boot-starter-security | 同主框架版本 | 安全认证 |
| spring-boot-starter-data-redis | 同主框架版本 | 数据缓存 |
| spring-boot-starter-validation | 同主框架版本 | 校验框架 |
| lombok | 1.18.24 | 开发工具库 |
| mybatis-plus-boot-starter | 3.5.1 | 持久层框架 |
| mybatis-plus-extension | 3.5.1 | 持久层框架 |
| mybatis-plus | 3.5.1 | 持久层框架 |
| postgresql | 42.3.5 | 数据库驱动 |
| springdoc-openapi-ui | 1.7.0 | 文档工具 |
| springdoc-openapi-security | 1.7.0 | 文档工具 |
| jasypt-spring-boot-starter | 3.0.5 | 配置加密工具 |
| bcprov-jdk15to18 | 1.73 | 加密库 |
| fastjson2 | 2.0.58 | json解析器 |
| mapstruct | 1.5.1.Final | 代码生成工具 |
| mapstruct-processor | 1.5.1.Final | 代码生成工具 |
| poi-ooxml | 4.1.2 | excel工具 |
| commons-io | 2.19.0 | 常用工具类 |
| commons-lang3 | 3.12.0 | 常用工具类 |
| jjwt | 0.9.0 | JWT支持 |
| fastdfs-client | 1.27.2 | 文件存储 |
| aws-java-sdk-s3 | 1.11.792 | 文件存储 |
命名规范
所有对象类名使用大驼峰命名法(PascalCase),不允许使用下划线、小驼峰、缩写等非标准命名。
| 对象 | 使用场景 | 命名规范 |
|---|---|---|
| Form | 接收前端 POST/PUT 请求的 JSON 数据,配合 @Validated 校验 | 已Form结尾 |
| DTO | 用于服务间调用、复杂逻辑封装或跨层数据传输 | 已DTO为后缀 |
| PO | 持久层对象,由 MyBatis 映射 | 已PO为后缀 |
| Query | 封装分页查询条件,必须继承 BaseQuery | 已Query为后缀 |
| VO | 返回给前端的数据视图对象 | 已VO为后缀 |
| Convert | 负责 PO ↔ DTO ↔ VO 之间的转换 (MapStruct实现) | 已Convert为后缀 |
| Mapper | 持久层,定义数据库操作方法 | 已Mapper为后缀 |
| Service | 业务逻辑接口 | 已Service为后缀 |
| ServiceImpl | 业务逻辑实现类,调用 Mapper 并处理事务 | 已ServiceImpl为后缀 |
| Controller | 提供 RESTful API 接口,调用 Service,返回 CommonResult<?> | 已Controller为后缀 |
| Filter | 过滤器对象 | 已Filter为后缀 |
| Config | 系统配置类对象 | 已Config为后缀 |
| Aspect | 逻辑切面实现对象 | 已Aspect为后缀 |
| Properties | 属性配置文件 | 已Properties为后缀 |
| Constants | 常量对象 | 已Constants为后缀 |
| Enum | 枚举对象 | 已Enum为后缀 |
接口规范
设计 RESTful API 时需要遵循的主要规范
GET /users/123-> 获取 ID 为 123 的用户信息。POST /users-> 创建一个新用户。PUT /users/123-> 完整更新 ID 为 123 的用户信息。DELETE /users/123-> 删除 ID 为 123 的用户。
API命名规范
资源命名规则:资源应该是名词,不允许动词。
方法命名规则:
POST save-> 新增方法DELETE remove-> 删除方法DELETE batchRemove-> 批量删除方法UPDATE edit-> 修改方法GET get-> 查询详情GET page-> 分页查询GET listAll-> 查询全部(不分页)GET export-> 导出方法
请求头格式
身份验证使用JWT实现,已查询用户为例,传递格式:
POST http://127.0.0.1/system/users/listAll
Content-Type: application/json
Authorization: Bearer <jwt_token>
{
"loginName": "zhangsan"
}代码规范【未完】
控制层
- 映射规则 全局,每个方法
- 审计日志
- 表单校验
- 返回对象格式
- 权限控制
- 文档注解
- 方法定义
- 异常处理
- 访问限流
- 错误码
- 数据脱敏
业务层
- 继承关系
- IService方法清单
- 全局通用service添加
- 业务service添加
- 事务控制
- 分页
- 异常处理
- 缓存注解
持久层
- 继承关系
- BaseMapper方法清单
- 全局通用Mapper添加
- 业务Mapper添加
- Mappper中使用自定义SQL
- 在XML中使用自定义SQL
- 幂等新增和保存
权限规范【未完】
- 三种使用场景
- 登录并需要授权
- 登录不需要授权
- 不需要登录(链接:白名单的使用说明)
- 注解格式
- 资源标识的维护和表对应关系
- 权限拦截方法的注入
- 权限拦截的函数
开发规范
- 隶属于用户个人的页面或者功能必须进行权限控制校验
- 用户敏感数据禁止直接展示,必须对展示数据进行脱敏
- 用户请求传入的任何参数必须做有效性验证和长度校验
- 配置文件中的密码需要加密
- 上传文件定义大小限制和头部特征码检测
数据库规范
建表规范
表名、字段名必须使用小写字母或数字,禁止出现数字开头
表名不允许使用复数名词
业务表必须包含默认字段
业务表默认字段,实体继承SuperEntity,由框架完成数据填充
非业务表,如用户角色绑定表,不需要单独记录操作人、时间等信息的表,实体继承SuperBaseEntity
字段名称 数据类型 是否必填 默认值 描述 id int8 是 主键 create_user_id int8 是 now() 创建人ID create_time timestamp(6) 是 创建时间 update_user_id int8 修改人ID update_time timestamp(6) 修改时间 del_flag int2 是 0 删除标志(0正常 1删除) 在数据库中不能使用物理删除操作,要使用逻辑删除。
表单是与否的字段不允许使用
is_xxx的方式命名,数据类型:int2(1 表示 是,0 表示否)业务唯一字段必须创建索引
常用字段类型
以下为常用字段的类型设置
| 字段名称 | 数据类型 | Java类型 | 描述 |
|---|---|---|---|
| id | int8(64) | Long | 主键,保存雪花ID |
| login_name | varchar(100) | String | 登录账号,字符串 |
| sex | int2(16) | Integer | 用户性别(0男 1女 ) |
| sort_by | int4(32) | Integer | 排序 |
| brithday | date | java.util.Date | 日期类型 |
| create_time | timestamp | java.util.Date | 时间类型 |
| account_balance | numeric(15,2) | BigDecimal | 货币余额 |
| details | text | String | 大文本,访问日志 |
系统配置类
数据脱敏配置(SensitiveJsonSerializer.java)
- 使用场景
- 注解说明
- 代码实例
过滤器配置(FilterConfig.java)
注册
XSS过滤器## 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /wechat/callback # 匹配链接 urlPatterns: /*注册
Referer过滤器## 防盗链配置 referer: # 防盗链开关 enabled: false # 允许的域名列表 allowed-domains: localhost,127.0.0.1
跨域配置(GlobalCorsConfig.java)
- 使用场景
- 配置指定域名的跨域
序列化配置(JacksonConfig.java)
- 使用场景 时间字符串
- 主键精度丢失处理
MybatisPlus的自动填充配置(MybatisPlusAutoConfigure.java)
- 自动填充属性说明
- 增加填充字段
- 执行填充的逻辑
MybatisPlus配置(MyBatisPlusConfig.java)
- 设置扫描路径
- 插件注册
Redis配置(RedisConfig.java)
设置RedisTemplate序列化方式
使用String序列化key,使用JSON序列化value。具体使用方式见。。。Redis工具类
设置限流脚本
这是一个基于时间窗算法的脚本,具体使用方式见。。。访问限流
local key = KEYS[1] -- 限流的资源KEY local now = tonumber(ARGV[1]) -- 当前时间戳(通常由客户端传入,如 `unixtime * 1000`) local ttl = tonumber(ARGV[2]) -- 一个时间窗口的毫秒数,用于设置Key的过期时间 local expired = tonumber(ARGV[3]) -- 过期时间点的时间戳(now - 时间窗口大小) local max = tonumber(ARGV[4]) -- 时间窗口内的最大限额 -- 1. 清除所有过期的数据(得分在 0 到 expired 之间的成员) redis.call('zremrangebyscore', key, 0, expired) -- 2. 获取当前窗口中剩余的元素数量(即最近一个时间窗口内的请求数) local current = tonumber(redis.call('zcard', key)) local next = current + 1 -- 3. 判断是否超限 if next > max then return 0; -- 0 表示被限流 else -- 4. 没有超限,则将当前请求的时间戳作为成员和得分添加到zset中 redis.call("zadd", key, now, now) -- 5. 刷新整个zset的过期时间 redis.call("pexpire", key, ttl) return next -- 返回当前计数 end设置注解缓存时间
设置使用注解的TTL时间,具体使用方式见。。。缓存注解
## redis缓存规则 redis: cache: configs: # 缓存key为:vjsp_dict的时候有效期为3600秒 - key: vjsp_dict second: 3600 # 缓存vjsp_config为:vjsp_dict的时候有效期为3600秒 - key: vjsp_config second: 3600
SpringDoc配置类(SpringDocConfig.java)
开启和关闭
配置参数说明
## SpringDoc 配置 springdoc: api-docs: path: /api-docs enabled: true swagger-ui: path: /swagger-ui.html enabled: true # 标签排序方式 tags-sorter: alpha # 操作排序方式 operations-sorter: alpha # 保持认证状态 persistAuthorization: true # 隐藏models default-models-expand-depth: -1 packages-to-scan: net.vjsp paths-to-match: /** # SpringDoc自定义配置 app: info: title: VJSP API description: VJSP管理后台开发框架 version: 1.0.0 contact: name: VJSP email: service@vjsp.cn url: https://www.vjsp.net
线程池配置(ThreadPoolConfig.java)
- 使用场景
- 系统默认线程池的名称和参数
- 调用代码示例
安全配置(VjspSecurityConfig.java)
- 注入内容
依赖注入工具类
Redis操作类
- 使用场景
- 方法清单+代码示例
密码工具类
- 注入位置,有哪些加密方式
- 方法清单+代码示例
静态方法工具类
对象转换工具(Convert.java)
脱敏工具(DesensitizedUtils.java)
字典工具(DictUtils.java)
HTML转义工具(EscapeUtils.java)
XSS过滤工具(HtmlUtils.java)
Http请求工具(HttpHelper.java)
字符串工具(StringUtils.java)
日期工具(DateUtils.java)
文件工具(FileUtils.java)
IP工具(IpUtils.java)
Json工具(JsonUtils.java)
JWT工具(JwtUtils.java)
认证工具(SecurityUtil.java)
Base64工具(Base64.java)
密钥工具(KeyGeneratorUtils.java)
MD5工具(Md5Utils.java)
RSA工具(RsaUtils.java)
SM4工具(SM4Utils.java)
反射工具(ReflectUtils.java)
Excel工具(ExcelUtils.java)
Spring工具(SpringUtils.java)
Servlet工具(ServletUtils.java)
User-Agent工具(UserAgentUtils.java)
演示图
![]() | ![]() |


