Skip to content

moshowgame/SpringBootCMS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

55 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SpringBootCMS

Spring Boot Java MyBatis MySQL License Security PRs Welcome

基于 Spring Boot 3 的现代化企业级内容管理系统(CMS) 安全可靠、开箱即用、易于扩展,适用于政府/协会/中小企业官网及内部知识库

👤 Author


项目简介

SpringBootCMS 是一套面向内容管理场景的开箱即用型 Web 平台,专注于解决以下痛点:

  • 🏢 政府/协会/企业官网搭建:内置多频道、动态表单、活动签到等业务模块,无需从零开发
  • 🛡️ 安全合规要求:通过全系统安全审计(SQL 注入/XSS/CSRF/SSRF/RBAC 等 14 类风险全部加固)
  • 快速交付:前后台开箱即用、自带 SEO 优化、模板化页面配置、数据库 DDL + 示例数据一键导入
  • 🔧 易于扩展:原生 MyBatis XML Mapper、清晰的代码分层、丰富的工具类、完整的中文注释

项目自 2020 年发布以来已迭代多个版本,v2.0 大版本采用 Spring Boot 3 + Jakarta EE + Spring Security 6 等现代技术栈重构,从零重写了安全体系与审计体系。

✨ 核心特性一览

🎯 现代化技术栈 Spring Boot 3.x + Java 17 + MyBatis 3 + MySQL 8
🎨 双端 UI 后台:jQuery 3 + Bootstrap 5;前台:Bootstrap 5 + AOS 动画
📝 内容管理 文章/频道/标签/封面图/浏览量/URL Slug/定时发布
📋 动态表单 字段类型自由配置、提交审核流程、匿名提交、专项表单
🎫 活动管理 活动发布、签到/请假、前台匿名签到
🔍 全文搜索 文章/活动/表单三类搜索 + LIKE 通配符转义
🖼️ 媒体库 图片/音视频/文档管理、网络图片转存(防 SSRF)
📊 站点配置 全局配置项分组管理(general/seo/email/upload)
🔐 安全防护 14 类攻击面全部加固,审计报告见 SECURITY_AUDIT.md
🌐 SEO 友好 页面级 meta 标签、Open Graph、JSON-LD 结构化数据
📝 完整审计 audit_log 表 + 17 表全字段审计 + 逻辑删除
🇨🇳 国内优化 Bootstrap/jQuery/Bootstrap Icons/AOS/TinyMCE 全部本地化

🏗️ 系统架构

┌─────────────────────────────────────────────────────────────────┐
│                          浏览器 (PC/Mobile)                       │
└────────────┬────────────────────────────────────┬───────────────┘
             │ HTTPS (TLS 1.2+)                   │
             │ HSTS / CSP / X-Frame-Options      │
┌────────────▼────────────────────────────────────▼───────────────┐
│              Spring Security 6 (认证/授权/CSRF 防护)              │
│  ┌──────────────────────────────────────────────────────────┐   │
│  │ AttackDetectionFilter (全局攻击检测 Filter)                 │   │
│  │   ├─ URL Query 参数                                         │   │
│  │   ├─ Form body                                              │   │
│  │   └─ JSON body (递归展开)                                    │   │
│  └──────────────────────────────────────────────────────────┘   │
└────────────┬────────────────────────────────────────────────────┘
             │
┌────────────▼────────────────────────────────────────────────────┐
│                  Spring MVC (DispatcherServlet)                 │
│  ┌─────────────┬─────────────┬─────────────┬──────────────┐   │
│  │ /admin/**   │ /page/**    │ /file/**    │  ...         │   │
│  │ 后台API     │ 前台API     │ 文件API     │  业务API     │   │
│  └─────────────┴─────────────┴─────────────┴──────────────┘   │
└────────────┬────────────────────────────────────────────────────┘
             │
┌────────────▼────────────────────────────────────────────────────┐
│   Service Layer (业务层)  +  AttackDetectionUtil (二级校验)       │
└────────────┬────────────────────────────────────────────────────┘
             │
┌────────────▼────────────────────────────────────────────────────┐
│   MyBatis 3 (XML Mapper, 100% #{} 参数化, 0 个 ${} 拼接)        │
└────────────┬────────────────────────────────────────────────────┘
             │
┌────────────▼────────────────────────────────────────────────────┐
│   MySQL 8.x (InnoDB, utf8mb4, 17 张表) + HikariCP 连接池         │
└─────────────────────────────────────────────────────────────────┘

📦 适用场景

场景 说明
🏛️ 政府/行业协会官网 内置频道、文章、表单、活动等模块,符合政府协会的庄重、正式风格
🏢 中小企业官网 快速搭建企业宣传、新闻发布、产品展示、留言咨询
📚 内部知识库 内部文章、标签分类、文档管理、权限控制
🎓 培训/教育机构 活动发布、报名签到、动态表单收集
🛒 活动门户 活动管理、签到统计、表单收集

技术栈

模块 技术
后端框架 Spring Boot 3.x (Jakarta EE)
ORM MyBatis (原生XML Mapper)
安全框架 Spring Security + Session
密码存储 BCrypt Hash
缓存 Caffeine
数据库 MySQL 8.x (InnoDB, utf8mb4)
模板引擎 FreeMarker
连接池 HikariCP
JSON Jackson
验证码 Kaptcha
前端UI(后台) jQuery 3 + Bootstrap 5 + Bootstrap Icons
前端UI(前台) jQuery 3 + Bootstrap 5 + Bootstrap Icons + AOS (动画)
富文本编辑器 TinyMCE

功能模块

核心功能

  • 用户管理:用户CRUD、角色权限、BCrypt密码加密
  • 菜单管理:二级菜单、角色权限控制
  • 文章管理:文章CRUD、频道分类、标签、封面图、浏览量统计、定时发布、URL Slug
  • 频道管理:二级频道、频道类型(列表/单页/外链)、URL Slug
  • 模板管理:页面模板值动态配置、#+文章id 引用文章链接

扩展功能

  • 标签系统:标签管理、文章-标签多对多关联
  • 媒体资源管理:文件/图片上传管理、媒体类型分类(image/video/audio/document)、网络图片转存
  • 站点配置:全局配置项、分组管理(general/seo/email/upload)
  • 操作日志:审计日志记录与查询、IP/UA追踪
  • 活动管理:活动发布与签到、签到统计、请假管理
  • 表单管理:动态表单定义与提交、字段类型(text/number/select/file/date等)、审核流程、专项表单

前台展示

  • 首页:Hero Banner + 统计计数器 + 服务卡片 + 最新动态 + 合作伙伴
  • 频道页:频道文章列表、面包屑导航、分页
  • 文章页:文章详情、相关推荐、SEO meta 标签
  • 搜索页:文章/活动/表单三类搜索
  • 表单页:动态字段渲染、匿名提交、提交结果展示
  • 活动页:活动详情、签到表单

安全特性

认证与授权

  • Spring Security + Session 认证(已迁移自 JWT)
  • BCrypt 密码 Hash 存储与校验
  • RBAC 角色基础访问控制:管理员专属接口(/user/**/menu/**/siteConfig/**/template/**/auditLog/**)限制 hasRole("ADMIN")
  • 登录失败锁定:连续 5 次失败锁定 10 分钟
  • 图形验证码(Kaptcha)防爆破
  • 会话固定防护:登录后 migrateSession() 重新生成 Session ID
  • 单点登录maximumSessions(1)

注入攻击防护

  • SQL 注入:MyBatis 全量参数化(#{}),16 个 Mapper 零 ${} 拼接
  • XSS(存储型):所有 FreeMarker value="" / <textarea> 动态值使用 ?html 转义
  • XSS(反射型 JS)CmsUtil.escapeHtml() / CmsUtil.escapeAttr() 统一转义用户可控字段
  • SSRF 四层防护:内网 host 校验 + DNS IP 校验 + 重定向目标校验 + 超时控制

CSRF

  • CookieCsrfTokenRepository(前端 JS 可读,自动附加 X-XSRF-TOKEN
  • 公开接口(/page/**/file/files/*/formSubmitValue/submit/activitySign/save 等)已豁免

文件上传/下载

  • 五层防护(上传):扩展名白名单 + MIME 校验 + 文件魔数 + 大小限制 + UUID 命名
  • 路径遍历防护(下载):拒绝 .. 等非法字符 + 解析后绝对路径根目录二次校验
  • MIME 黑名单(下载):禁止 HTML/SVG/XML/JS 可执行类型
  • X-Content-Type-Options: nosniff 响应头防浏览器嗅探

安全响应头

  • Content-Security-Policy(CSP)
  • X-Content-Type-Options: nosniff
  • X-Frame-Options: SAMEORIGIN(防 clickjacking)
  • Strict-Transport-Security(HSTS,HTTPS 环境生效)
  • 401/403 JSON 响应:自定义 AuthenticationEntryPointAccessDeniedHandler,AJAX 请求不重定向

审计与日志

  • 审计日志表audit_log)只增不删,记录用户/IP/UA/操作
  • 17 张业务表全部含审计字段(create_timeupdate_timecreate_user_id 等)
  • 逻辑删除deleted 字段软删除,保留数据历史)

📋 详细审计报告见 SECURITY_AUDIT.md

数据库表结构 (v2.0)

共 17 张表,全部使用 InnoDB 引擎 + utf8mb4 字符集:

表名 说明 逻辑删除 审计字段
user 用户表
role 角色表
menu 菜单表
channel 频道/栏目表
article 文章表
tag 标签表
article_tag 文章-标签关联表 -
template 模板配置表
activity 活动表
activity_sign 活动签到表
form 表单模板表
form_item 表单字段表
form_submit 表单提交表
form_submit_value 表单提交值表
media 媒体资源表
audit_log 操作日志表 只增不删
site_config 站点全局配置表

快速开始

环境要求

  • JDK 17+
  • MySQL 8.x
  • Maven 3.6+

安装步骤

  1. 克隆项目

    git clone https://github.com/moshowgame/SpringBootCMS.git
    cd SpringBootCMS
  2. 创建数据库

    CREATE DATABASE springbootcms DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  3. 导入表结构

    • 表结构:src/main/resources/sql/ddl/schema.sql
    • 示例数据(可选):src/main/resources/sql/data/sample-data.sql
  4. 修改配置

    • 编辑 src/main/resources/application-dev.yml,修改数据库连接信息
  5. 启动项目

    mvn spring-boot:run
  6. 访问系统

    • 后台:http://localhost:8888/cms/admin/login
    • 前台:http://localhost:8888/cms/
    • 默认账号:admin / 123456(仅 dev 环境自动登录可用 devLogin

常见问题

  • Q:启动后访问 404? A:检查 server.servlet.context-path=/cms 配置,所有 URL 需带 /cms 前缀
  • Q:上传目录权限错误? A:编辑 application-dev.ymlfile.upload.path 指向有写权限的目录(如 /home/xxx/upload-files/
  • Q:静态资源 404? A:所有第三方库已本地化在 src/main/resources/static/lib/,确保 maven 编译时复制到 target/classes/static/lib/
  • Q:忘记 admin 密码? A:使用 BCryptPasswordEncoder 重新生成哈希值,SQL 替换 user.password 字段

📁 项目结构

SpringBootCMS/
├── src/main/java/com/softdev/cms/
│   ├── config/          # 配置类 (Security, Cache, Kaptcha, Jackson, AttackFilter)
│   ├── controller/      # 控制器 (18 个:前后台 + 文件 + 表单)
│   ├── entity/          # 实体类 (16 个 + DTO)
│   ├── mapper/          # Mapper 接口 (16 个)
│   ├── service/         # 服务类 (UserDetails, FrontEnd, Storage)
│   └── util/            # 工具类 (Result, AttackDetectionUtil, CmsUtil)
│
├── src/main/resources/
│   ├── mapper/          # MyBatis XML Mapper (16 个,全部 #{} 参数化)
│   ├── sql/             # SQL 脚本
│   │   ├── ddl/         #   - DDL: schema.sql
│   │   └── data/        #   - 示例数据: sample-data.sql
│   ├── static/          # 静态资源
│   │   ├── lib/         #   - 第三方库 (jQuery/Bootstrap/Bootstrap Icons/AOS/TinyMCE)
│   │   ├── js/          #   - 自定义 JS (admin-common.js 含 CmsTable/CmsApi/CmsUtil)
│   │   ├── css/         #   - 样式 (admin.css, frontend.css)
│   │   └── img/         #   - 图片
│   ├── templates/       # FreeMarker 模板
│   │   ├── cms/         #   - 后台模板 (16 个 list/edit)
│   │   ├── frontend/    #   - 前台模板 (index, channel, article, search, form, activity)
│   │   └── common/      #   - 公共模板
│   ├── application.yml
│   └── application-dev.yml
│
├── SECURITY_AUDIT.md    # 安全审计报告 (14 类攻击面全部加固)
└── README.md            # 本文档

🆚 为什么选择 SpringBootCMS?

特性 SpringBootCMS 通用 CMS WordPress
中文友好 ✅ 完整中文注释+中文 UI 视项目而定 ❌ 需汉化
政府协会风格 ✅ 内置模板 ❌ 需定制 ❌ 需定制
代码所有权 ✅ 100% 开源 Apache 2.0 视项目而定 ❌ GPL
安全审计 ✅ 14 类风险全部加固 视项目而定 ⚠️ 第三方插件多
易于扩展 ✅ 原生 MyBatis + 清晰分层 视项目而定 ❌ 插件机制复杂
国内部署 ✅ 全部静态资源本地化 视项目而定 ❌ 需替换 CDN
部署难度 ✅ 一键启动 (java -jar) 中等 需 PHP+MySQL+Apache
技术栈现代化 ✅ Spring Boot 3 + Java 17 视项目而定 ❌ PHP 7+

🤝 贡献

欢迎提交 PR / Issue!提交前请确保:

  • 代码符合项目编码规范
  • 新增功能附中文注释
  • 安全相关变更同步更新 SECURITY_AUDIT.md

更新日志

变更类型图例:🆕 新增 | ⚡ 优化 | 🐛 修复 | 🔒 安全 | ♻️ 重构 | 📝 文档

🚀 v2.1.0 (2026-06-28) — 安全加固与攻击检测

🔒 安全

  • 🆕 攻击检测体系:实现三层防御(客户端预检 + 全局 Filter + 业务 endpoint),共 56+ 条规则覆盖 9 大类(SQL/XSS/SVG/命令/路径遍历/LDAP/NoSQL/XXE/SSRF)
  • 🆕 AttackDetectionFilter:全局 HTTP 请求体攻击检测,支持 URL/Form/JSON 三种参数类型
  • 🆕 AttackDetectionUtil:业务层攻击检测工具,与全局 Filter 协同工作
  • 🆕 CmsUtil.showAttackWarning():攻击拦截后自动弹出警告横幅(8 秒自动消失)
  • 🆕 RBAC 角色基础访问控制/user/**/menu/**/siteConfig/**/template/**/auditLog/** 等管理接口限制为 hasRole("ADMIN")
  • 🆕 登录失败锁定:连续 5 次失败锁定 10 分钟,防止暴力破解
  • 🆕 攻击检测审计日志:每次攻击拦截记录用户/IP/UA/URI/方法到 audit_log
  • CSRF 防护增强:使用 CsrfTokenRequestAttributeHandler 解决懒加载问题,确保 Cookie 立即下发
  • 文件下载存储型 XSS 防护:MIME 黑名单(HTML/SVG/XML/JS)+ X-Content-Type-Options: nosniff
  • 路径遍历防护加固:从 .. 字符检查升级为绝对路径根目录二次校验
  • 🐛 修复 FreeMarker 模板 ?html 应用于 Date 对象导致的渲染异常
  • 🐛 修复 401/403 异常时 response is already committed 错误

⚡ 优化

  • 🆕 后台/前台前端 UI 统一:从 Layui 迁移到 jQuery 3 + Bootstrap 5 + Bootstrap Icons
  • 🆕 日期格式兼容性:HTML datetime-local 提交格式 (yyyy-MM-dd'T'HH:mm) 全局支持,新增 FlexibleDateDeserializer 自动识别 7 种日期格式
  • 🆕 搜索功能增强:Activity/Form/ActivitySign Mapper 新增 searchParam 字段过滤,支持多字段全文搜索
  • 🆕 搜索攻击检测 UI:4 个搜索页面(前台文章/活动/表单 + 后台签到)添加客户端预检和服务端警告
  • 🆕 LIKE 通配符转义:搜索条件中 % _ \ 自动转义,防止通配符注入
  • 🆕 安全审计报告:SECURITY_AUDIT.md(14 类攻击面全部加固)
  • 🆕 README.md 大幅扩充:增加项目简介、核心特性、系统架构图、横向对比、Roadmap、FAQ 等章节

🐛 修复

  • 🐛 修复后台表单字段名与实体字段名不匹配(17 个 list/edit 模板)
  • 🐛 修复 pageAll 缺少分页参数导致的 LIMIT null, null SQL 错误
  • 🐛 修复后台模板 <th>序号</th> 缺失导致列错位
  • 🐛 修复 form_submit.status 插入 NULL 违反 NOT NULL 约束
  • 🐛 修复 form_submit_value 模板 XSS 漏洞(添加 ?xhtml 转义)
  • 🐛 修复 TinyMCE 图片路径 @@@ 占位符处理(支持 5 种格式)
  • 🐛 修复 ServletInputStream 一次性消费导致 Controller 拿不到 body
  • 🐛 修复 CORS/ContextPath/上传路径等技术细节

🚀 v2.0.0 (2025-06) — 大版本重构

♻️ 重构

  • Spring Boot 2 → 3.x:升级到 Jakarta EE 命名空间
  • MyBatis-Plus → MyBatis 原生 XML:100% #{} 参数化查询,零 ${} 拼接
  • JWT → Spring Security Session:移除 JWT,回归传统 Session 认证
  • EhCache → Caffeine:现代化本地缓存
  • 数据库引擎 → InnoDB:全部 17 张表使用 InnoDB + utf8mb4
  • 物理删除 → 逻辑删除deleted 字段软删除,保留数据历史

🆕 新增

  • 🆕 媒体资源管理:图片/音视频/文档统一管理
  • 🆕 操作日志(audit_log):所有写操作记录到审计日志表
  • 🆕 站点全局配置(site_config):分组管理(general/seo/email/upload)
  • 🆕 标签管理:标签 CRUD + 文章-标签多对多关联
  • 🆕 BCrypt 密码 Hash:替换明文密码存储
  • 🆕 全表审计字段:17 张表全部含 create_timeupdate_timecreate_user_id
  • 🆕 dev/prod 环境拆分:配置文件按环境隔离

🚀 v1.3.0 (2020-07) — 模板与图片

🆕 新增

  • 🆕 首页模板值 #+文章id 引用文章链接
  • 🆕 图片地址转换 @@@+图片名 占位符机制
  • 🆕 dev/prod 环境配置拆分

🚀 v1.2.0 (2020-06) — 业务扩展

🆕 新增

  • 🆕 活动管理页面(活动发布、签到、请假)
  • 🆕 表单管理页面(动态字段、提交、审核)
  • 🆕 文章全文搜索
  • 🆕 频道分页

🚀 v1.0.0 (2020-05) — 初始版本

🆕 新增

  • 🆕 核心模块:文章/频道/模板/用户/菜单 5 大模块 CRUD
  • 🆕 认证授权:Spring Security + JWT
  • 🆕 缓存:EhCache
  • 🆕 数据库:MySQL 5.x(MyISAM 引擎,utf8mb4 字符集)
  • 🆕 后台 UI:Layui + layuimini
  • 🆕 前台 UI:原生 HTML + jQuery 1.x

📋 完整安全审计报告见 SECURITY_AUDIT.md

📄 License

Apache License 2.0 — 商业友好,可自由使用、修改、分发

About

SpringBootCMS 是一套面向内容管理场景的开箱即用型 Web 平台,专注于解决以下痛点: 🏢 政府/协会/企业官网搭建:内置多频道、动态表单、活动签到等业务模块,无需从零开发 🛡️ 安全合规要求:通过全系统安全审计(SQL 注入/XSS/CSRF/SSRF/RBAC 等 14 类风险全部加固) ⚡ 快速交付:前后台开箱即用、自带 SEO 优化、模板化页面配置、数据库 DDL + 示例数据一键导入 🔧 易于扩展:原生 MyBatis XML Mapper、清晰的代码分层、丰富的工具类、完整的中文注释。采用 Spring Boot 3 + Mybatis + Spring Security等现代技术栈重构

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors