基于 Spring Boot 2.1 + MyBatis + Spring Security + Thymeleaf 的后台管理系统,采用 RBAC(基于角色的访问控制)权限模型,实现了从菜单级别到操作级别的细粒度动态权限管理。
| 技术 | 版本 | 说明 |
|---|---|---|
| Spring Boot | 2.1.12.RELEASE | 基础框架 |
| MyBatis | 2.1.3 (starter) | ORM 持久层 |
| Spring Security | 5.1.x (随 Boot 管理) | 认证与授权 |
| Thymeleaf | 3.0.x (随 Boot 管理) | 服务端模板引擎 |
| MySQL | 8.0.31 (connector) | 关系型数据库 |
| Druid | 1.1.23 | 数据库连接池 |
| Lombok | 1.18.28 | 代码简化 |
- JDK: 8+
- Maven: 3.6+
- MySQL: 8.0+
- IDE: IntelliJ IDEA(推荐)或 Eclipse
# 1. 创建数据库
mysql -u root -p < DB/MyShop.sql
# 2. 修改数据库配置(按需)
# 编辑 src/main/resources/application.properties
# 设置环境变量 DB_PASSWORD 或直接修改配置中的密码
# 3. 启动项目
mvn spring-boot:run
# 4. 访问
# http://localhost:9527
# 默认账号: admin / adminsrc/main/java/com/study/myshop/
├── Application.java # 启动类
├── controller/ # 控制层
│ ├── AdminController.java # 员工管理(CRUD + 分页检索)
│ └── IndexController.java # 首页与菜单导航
├── service/ # 业务接口层
│ ├── IAdminService.java
│ ├── IIndex.java
│ ├── IRoleService.java
│ └── impl/ # 业务实现层
│ ├── AdminServiceImpl.java
│ ├── AdminDetailServiceImpl.java # UserDetailsService 实现
│ ├── IndexServiceImpl.java
│ └── RoleServiceImpl.java
├── repository/ # 数据访问层 (MyBatis Mapper)
│ ├── AdminMapper.java
│ ├── MenuMapper.java
│ └── RoleMapper.java
├── po/ # 持久化对象(对应数据库表)
│ ├── AdminPO.java # 管理员
│ ├── RolePO.java # 角色
│ ├── MenuPO.java # 菜单
│ ├── PermissionPO.java # 权限
│ ├── OperatePO.java # 操作
│ └── ...关联表 PO(5 张)
├── vo/ # 视图对象(表单/展示)
│ ├── AddAdminVo.java
│ ├── AdminVo.java
│ ├── AdminInfoVo.java
│ └── MenuVo.java
├── security/ # Spring Security 模块
│ ├── SecurityConfig.java # 安全配置(入口)
│ ├── PermissionInterceptor.java # 动态权限元数据源
│ ├── PermissionValid.java # 访问决策管理器
│ └── handler/ # 认证/授权事件处理器
└── exception/ # 异常处理
└── ExceptionCenter.java # 全局异常处理
src/main/resources/
├── application.properties # 应用配置
├── mapper/ # MyBatis XML 映射文件
├── templates/ # Thymeleaf 页面模板
│ ├── admin/ # 员工管理页面
│ ├── index/ # 首页(header + sidebar)
│ └── error/ # 错误页面
└── static/assets/ # 前端静态资源 (Dashgum 模板)
DB/
└── MyShop.sql # 数据库建表脚本 + 初始数据
admin (管理员) ──M:N── role (角色)
│
M:N │
▼
permission (权限) ──M:N── menu (菜单)
│
M:N │
▼
operate (操作)
| 数据库表 | 说明 |
|---|---|
admin |
管理员表(用户名、BCrypt 加密密码、昵称、状态) |
role |
角色表(系统管理员、IT管理员、销售经理等 19 种预置角色) |
admin_role |
管理员-角色多对多关联 |
permission |
权限表 |
role_permission |
角色-权限多对多关联 |
menu |
菜单表(支持两级树形结构,pid 自关联) |
permission_menu |
权限-菜单多对多关联 |
operate |
操作表(按钮级权限) |
permission_operate |
权限-操作多对多关联 |
- 用户登录 → Spring Security 调用
AdminDetailServiceImpl加载用户信息及角色 - 请求到达 →
PermissionInterceptor根据请求 URL 查询数据库获取所需角色 - 访问决策 →
PermissionValid对比当前用户角色与所需角色,决定放行或拒绝 - 菜单渲染 → 根据用户角色动态生成侧边栏菜单(Thymeleaf
th:each遍历)
- 用户认证(Spring Security 表单登录 + BCrypt 密码加密)
- 动态 URL 级别权限控制(基于数据库配置)
- 员工管理 CRUD(增删改查)
- 分页查询 + 关键字搜索
- 基于角色的动态菜单系统(两级树形)
- 登录/登出/权限不足事件处理
- 客户管理模块
- 产品管理模块
- 订单管理模块
- 站点管理模块
spring.datasource.url=jdbc:mysql://localhost:3306/myshop?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=${DB_PASSWORD}数据库密码通过环境变量 DB_PASSWORD 注入,启动前需设置:
# Linux / macOS
export DB_PASSWORD=your_password
# Windows CMD
set DB_PASSWORD=your_passwordapplication.properties 中提供了完整的 Druid 连接池参考配置(已注释),包含初始连接数、最大活跃连接、空闲检测、SQL 防火墙等参数。生产环境建议取消注释并根据实际情况调整。
项目使用 Dashgum 免费 Bootstrap 后台管理模板,包含响应式布局、Font Awesome 图标、数据表格样式等。
遵循 Conventional Commits 规范:
<type>(<scope>): <description>
[optional body]
| 类型 | 说明 | 示例 |
|---|---|---|
feat |
新功能 | feat(admin): add batch delete function |
fix |
修复缺陷 | fix(mapper): correct role permission SQL join |
docs |
文档更新 | docs: add RBAC model explanation |
style |
代码格式调整 | style: format controller imports |
refactor |
重构(不改变功能) | refactor(security): extract password encoder to bean |
test |
测试相关 | test(service): add admin service unit tests |
chore |
构建/配置变更 | chore: update druid connection pool config |
perf |
性能优化 | perf(mapper): add index for admin_role query |
- 标题使用祈使句、首字母小写、不加句号,长度不超过 50 字符
- 正文用
-列出变更点,每行一个独立变更 - 对特定模块的修改添加 scope 标识,如
feat(security): ...
# 1. 从主干切出功能分支
git checkout main
git pull
git checkout -b feat/模块名-功能描述
# 2. 开发并提交(可多次提交)
git add <修改的文件>
git commit -m "feat(admin): add export function"
# 3. 切回主干,快进合并(不产生额外 merge commit)
git checkout main
git merge --ff-only feat/模块名-功能描述
# 4. 删除已合并的分支
git branch -d feat/模块名-功能描述# 切出修复分支
git checkout -b fix/问题描述
# 修复并提交
git add <修改的文件>
git commit -m "fix(security): disable CSRF for API endpoints"
# 合并到主干
git checkout main
git merge --ff-only fix/问题描述
# 删除分支
git branch -d fix/问题描述| 前缀 | 用途 | 示例 |
|---|---|---|
feat/ |
新功能开发 | feat/order-management |
fix/ |
缺陷修复 | fix/login-redirect-loop |
refactor/ |
代码重构 | refactor/menu-tree-builder |
docs/ |
文档变更 | docs/update-readme |
test/ |
测试相关 | test/admin-service-coverage |
- 合并使用
--ff-only快进模式,保持 git 历史线性整洁 - 功能分支完成后再合并,避免半成品代码进入主干
- 推送前确保本地主干已更新:
git pull --ff-only
# 推送到远程
git push origin main
# 如果分支也需要推送到远程协作
git push -u origin feat/模块名-功能描述MIT License