Spring Boot 毕设源码 · 论文 · 数据库 · 部署文档

Spring Boot 读书笔记共享平台部署与踩坑记录

这是一套 Spring Boot + MyBatis-Plus 的学生读书笔记共享平台,97 个 Java 文件、10 张表。我把它从建库、改配置到启动访问完整跑了一遍,下面记录过程中遇到的问题和处理方式。

这是一套 Spring Boot + MyBatis-Plus 的学生读书笔记共享平台,97 个 Java 文件、10 张表。我把它从建库、改配置到启动访问完整跑了一遍,下面记录过程中遇到的问题和处理方式。

先说明三个实测下来的行为:

  • 数据库脚本导完就有 35 行演示数据,不用自己造数据截图
  • 前台不用登录,答辩现场网络出问题也能直接演示
  • 权限那章你不用翻代码,token 表一个字段就答完了

目录

一、你是不是也这样 二、这套是什么 三、对你具体有什么用 四、怎么跑起来 五、工程结构和运行效果


一、你是不是也这样

大二接题,老师让找一个 Spring Boot 管理系统。网上的示例项目下载一堆,解压,浏览器打开,能跑。

然后卡住了。

数据库脚本导完,八张表里六张是空的。注册账号进前台,「暂无数据」。想截图放进 PPT,截出来全是空表格。造了两天数据,笔记名还得自己编,答辩老师问一句「这个数据是哪来的」,答不上来。

再往后是权限那章。论文里写了管理员和普通用户两套,代码里到底在哪儿分开的,翻了两个小时没翻明白。被问「你怎么保证普通用户看不到管理员菜单」,只能说「拦截器里判断的」—— 追问一句「判断的什么」,就卡住了。

这套工程的设计正好覆盖了常见的四个卡点。下面按这个顺序讲。

二、这套是什么

一句话:一个学生读书笔记的分享与交流平台,前台公开浏览,后台管理员做内容审核。

规模(逐个数过的):

Java 文件 97 个
代码行数 8752 行
后端入口 11 个 Controller
REST 端点 113 个
数据表 10 张
前端页面 35 个 HTML
演示数据 35 行,分布在 8 张表

技术栈 Spring Boot 2.2.2 + JDK 1.8 + MyBatis-Plus 2.3 + MySQL。前台 layui 手写页,后台 Vue2 + Element-UI。

11 个 Controller 是 8 个业务模块(普通用户、笔记分享、个人笔记、评论、交流互动、公告、收藏、管理员)加 3 个通用模块(动态字典、配置项、文件上传)。

工程规模

三、对你具体有什么用

这一节占四成。跑通只是开头,这四条是你花时间看一套源码真正能换回来的东西。

3.1 导完库直接点着看,截图不用修

db/springbootf3x3h.sql 里 8 条 INSERT,实际 35 行数据,分布在 8 张表:

表 行数 表 行数
bijifenxiang 笔记分享 6 config 轮播图配置 3
discussbijifenxiang 评论 6 forum 交流互动 6
gerenbiji 个人笔记 6 news 公告信息 1
yonghu 普通用户 6 users 管理员 1

头像和笔记配图是真实照片,数据库字段值直接就是文件名,文件就在 static/upload/ 里。导完库打开首页,轮播图、公告配图、用户头像全是正常的,不用修图不用换图。

对你的好处: 省掉造数据的两天。而且造出来的数据被追问来源你答不上来,这套数据的来源就是 db.sql,一句话结束。

⚠️ 有两张表 0 行,这是正常:token 要登录才生成,storeup 要点了收藏才产生。登一次、点几次收藏就有了。看到空表不用慌,不是空壳。

3.2 权限那章,一个字段就答完了

两套用户体系:

表 字段数 装什么
users 5 管理员(id, username, password, role, addtime)
yonghu 10 普通用户(用户名、密码、姓名、性别、头像、手机、邮箱、兴趣标签、添加时间)

关键在登录:两边登进去走同一张 token 表,但记录里多存了一个 tableName 标明「这次是谁登的」,另有一个 role 标明角色。


token 存:userid + username + tablename + role + token + expiratedtime

token 是 32 位随机串,1 小时过期

同一账号重复登录 → 覆盖旧记录,不堆积

对你的好处: 老师问「你怎么区分管理员和普通用户权限」,你指着 token 表的 tablename 和 role 说「登录时记在令牌里,请求进来从会话取出来用」,一张表答完。论文「权限控制」那章配一张字段说明截图,够写两页。

yonghu 每个字段还都带中文注释:


CREATE TABLE yonghu (

  id bigint PRIMARY KEY AUTO_INCREMENT COMMENT 'id',

  addtime timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',

  yonghuming varchar(200) COMMENT '用户名',

  mima varchar(200) COMMENT '密码',

  xingming varchar(200) COMMENT '姓名',

  xingbie varchar(50) COMMENT '性别',

  touxiang varchar(500) COMMENT '头像',

  shouji varchar(200) COMMENT '手机',

  youxiang varchar(200) COMMENT '邮箱',

  xingqubiaoqian varchar(500) COMMENT '兴趣标签'

)

写「数据库设计」章时字段含义直接抄注释,不用回头对着代码猜。

3.3 业务规则有真东西,不是纯 CRUD

笔记分享要管理员审核才能对外展示。 后台笔记分享菜单的按钮权限是「查看、修改、删除、审核、查看评论」—— 只有笔记分享有审核。理由想得到:分享公开给所有人看,个人笔记和收藏是私有的。

这一条建议写进论文「业务规则」小节,比干巴巴写「支持增删改查」值钱得多。

技术上审核走通用接口 /common/sh/{tableName},后面对应一条 SQL:


<update id="sh">

    UPDATE ${table} set sfsh=#{sfsh} where id=#{id}

</update>

对你的好处: 答辩被问「审核怎么扩展到别的模块」,标准答案是「加个 if 判断角色、再写一个 update」—— 老师会皱眉,因为十个模块要写十遍。这套是一个端点 + 一条 SQL,任意带 sfsh 字段的表都能审核。想给交流互动加?表里有 sfsh 字段,前端加个按钮调这个接口,后台零改动。论文里可以写成「通过参数化表名实现审核能力的横向扩展」,比十段重复代码有说服力。

同一个 CommonController 里还有一整套通用查询:

接口 作用
/option/{tableName}/{columnName} 某列去重后的值 → 下台下拉框
/group/{tableName}/{columnName} 按列分组统计 → 柱状图
/value/{tableName}/{x}/{y} 按 x 分组对 y 求和 → 折线图
/value/{tableName}/{x}/{y}/{timeStatType} 同上,加时间维度(日/周/月/年)

对你的好处: 论文要画「本月新增笔记趋势图」,不用专门写一个后端接口,前端传参数就行。要讲「系统的可扩展性」,这四个接口是现成例子。

3.4 前台不用登录,答辩现场断网也能演示


hasBackLogin     是    后台需要登录(abo / abo)

hasBackRegister  否    后台不开放注册

hasFrontLogin    否    ⛔ 前台不需要登录,公开浏览

hasFrontRegister 否

答辩老师坐在下面,你打开前台首页,笔记分享、交流互动、公告直接能看,不用注册、不用登录、不用等接口。

对你的好处: 答辩现场校园网抽风、你换了台没配过的笔记本、临时换个网络环境——这些事我见过不止一次。只要 Tomcat 是本地起的,前台照样有内容给你讲。演示时你还能接一句「前台是公开浏览的,分享内容由管理员审核后展示」,把业务规则和演示连成一句话。

3.5 前台改完刷新就能看到

前台是 layui 手写的 35 个 HTML,能直接用编辑器打开改。不用装 node、不用 npm install、不用编译。后台是 Vue2 + Element-UI 的 dist 产物。

对你的好处: 赶工期最后两天,「改完要重新 build 一遍」是能把你心态搞崩的东西。前台调布局、换配色、加字段展示,刷新就看到了。

3.6 前端接口地址不用你手改

这套源码交付前做过一轮修正。前端原本把 localhost:8080/springbootf3x3h/ 写死在两个文件里——你改端口或改数据库名,所有接口立刻 ERR_FAILED,数据区一片空白,Console 里还看不出所以然。现在改成从当前页面地址自动推算了。

对你的好处: 改端口、改库名、换 IP 访问都不用去翻前端源码。改端口现在只动 application.yml 里 server.port 一处。

3.7 论文和代码对得上

论文里项目名「读书笔记共享平台」出现 36 次,数据库设计章和 db.sql 一致(10 张表),系统实现章和 11 个后端入口对得上。

对你的好处: 答辩往前翻一页论文、往后翻一页代码,指着说「这里」,连得上。

⚠️ 论文是旧版 Word 格式 .doc,5.1 MB,约 20 张图表(不是改后缀的 .docx)。WPS 或 Word 2016 以上能正常打开,有些在线转格式工具会丢图。

3.8 加新业务照着套,不用重写

这套是代码生成器打底 + 业务规则手工补的形态。你要加自己的模块,落点很清楚:


① 加一张表 + 对应的实体类

② 加一个业务类,照抄一个现成的改类名和泛型

③ 后台菜单里加一项,配上查看/新增/修改/删除按钮权限

④ 需要审核的表,字段里带上 sfsh,前端按钮调 /common/sh/{表名}

实际好处: 十个模块的写法一致,读懂一个基本能读懂其余九个。加新模块时工作量的评估也更明确——清楚每一步要改哪几个文件,减少盲目查找的时间。

另外,上传功能现在往本地 static/upload/ 写文件,文件名用时间戳加后缀,原始文件名整个丢掉。中文名、同名覆盖、路径穿越这三个问题一次性躲开,你不用额外操心这个。

功能模块与接口分布

四、怎么跑起来

三步,命令可以直接抄。整段我本地跑过。

4.1 环境要求

组件 版本 说明
JDK 1.8 编译目标是 1.8,别换高版本
Maven 3.6+ 工程自带 mvnw,没装 Maven 也能跑
MySQL 5.7 或 8.0 8.0 要多带两个参数,见 4.4
浏览器 Chrome / Edge 后台是 Vue2 单页应用

工程根目录有 .mvn/、mvnw、mvnw.cmd。Linux / macOS 用 ./mvnw,Windows 用 mvnw.cmd。整个工程 774 个文件(排除 target/、.git/、node_modules/)。

4.2 建库导数据


# 建库

mysql -uroot -p -e "CREATE DATABASE springbootf3x3h DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;"
# 导脚本

cd springbootf3x3h

mysql -uroot -p springbootf3x3h < db/springbootf3x3h.sql
# 验证:应该出 10 张表

mysql -uroot -p springbootf3x3h -e "SHOW TABLES;"
# 验证数据量

mysql -uroot -p springbootf3x3h -e "SELECT COUNT(*) FROM bijifenxiang;"

⛔ token 和 storeup 是 0 行,设计如此:一个要登录才生成,一个要点收藏才产生。导库时没有,正常。

4.3 改配置

打开 src/main/resources/application.yml,真正要动的就一处——数据库密码:


spring:

  datasource:

    driverClassName: com.mysql.cj.jdbc.Driver

    url: jdbc:mysql://127.0.0.1:3306/springbootf3x3h?useUnicode=true&characterEncoding=utf-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8

    username: root

    password: 你的数据库密码          # ← 真正要改的就这一行

    # ⛔ 要是 MySQL 8,在 url 末尾追加:

    # &useSSL=false&allowPublicKeyRetrieval=true
server:

  port: 8080

  servlet:

    context-path: /springbootf3x3h     # ← 改了它,所有 URL 都得跟着改

这两项不用动,但知道在哪有好处:


mybatis-plus:

  global-config:

    id-type: 1                    # 主键由提交方传,不是数据库自增

    field-strategy: 2             # 字段策略:null 字段不参与更新

    db-column-underline: true     # 驼峰 ↔ 下划线自动转换

  configuration:

    map-underscore-to-camel-case: true

field-strategy: 2 对你有直接影响:前端表单没填的字段传 null 过来,不会把数据库里原来的值清空。 改一条笔记的标题,别的字段不会被抹掉。这个坑在没配这一项的工程里很常见,配了的你不用管。

上传大小限制也在这个文件里,需要传大文件时改这里:


spring:

  servlet:

    multipart:

      max-file-size: 300MB

      max-request-size: 300MB

4.4 启动(三选一)


# 方式一:Maven 插件启动(改代码热重启,开发用)

mvn spring-boot:run
# 方式二:工程自带 wrapper(没装 Maven 时用,会自动下载合适版本)

./mvnw spring-boot:run          # Linux / macOS

mvnw.cmd spring-boot:run        # Windows
# 方式三:打 jar 跑(生产用)

mvn clean package -DskipTests

java -jar target/springbootf3x3h.jar

启动成功的标志:


 :: Spring Boot ::        (v2.2.2.RELEASE)
Started SpringbootSchemaApplication in 8.234 seconds

4.5 访问地址和演示账号


前台  http://localhost:8080/springbootf3x3h/front/index.html

后台  http://localhost:8080/springbootf3x3h/admin/dist/index.html

⛔ 后台是 /admin/dist/index.html,不是 /admin/。 包里的目录是 src/main/resources/admin/admin/dist/——dist 前面还夹着一层 admin。访问 /admin/ 会 404。这是最容易踩的一脚。

演示账号(从数据库脚本里读出来的):

角色 账号 密码 来源
管理员 abo abo users 表第 1 行,role=管理员
普通用户 用户名1 ~ 用户名6 123456 yonghu 表 6 行

前台公开浏览不用登录,后台登 abo / abo。

4.6 我真实踩到的四个坑

坑 1:MySQL 8 报「Access denied」,但密码是对的


Access denied for user 'root'@'localhost' (using password: YES)

看着像密码错,其实是 MySQL 8 默认的认证方式跟这个驱动组合不兼容。jdbc url 后面加两个参数:


&useSSL=false&allowPublicKeyRetrieval=true

加上就通了。JDK 1.8 + MySQL Connector/J 8.0.18 这个组合必踩。

坑 2:页面能打开,数据区一片空白,Console 全是 ERR_FAILED

接口地址和实际跑的服务对不上(端口或 context-path 变了)。这套源码的前端已经改成从页面地址自动推算了,你只要确认 application.yml 里 server.port 和 context-path 是你以为的那个。

坑 3:图片全是破图 + 大片灰白

素材包里原本有几处引的是外部图床地址,图床挂了就全是破图。已经换成本项目 static/upload/ 里自带的图片,数据库字段值就是文件名:


轮播图  config.picture      = upload/picture1.jpg

公告图  news.picture        = upload/news_picture1.jpg

用户头像 yonghu.touxiang    = upload/yonghu_touxiang1.jpg

所以你导完库直接就是正常的,不用管这块。

坑 4:端口 8080 被占用


# macOS / Linux

lsof -i:8080

kill -9 <PID>
# Windows

netstat -ano | findstr :8080

taskkill /PID <PID> /F

或者直接改 application.yml 里的 server.port 换个端口,比如 8081,别忘了后面所有 URL 都跟着变。

4.7 Docker 部署

工程里附了 Dockerfile,镜像对应 JDK 1.8:


# 构建

docker build -t dubitshare:1.0 .
# 运行

docker run -d -p 8080:8080 

  --name dubitshare 

  -e SPRING_DATASOURCE_URL="jdbc:mysql://宿主机IP:3306/springbootf3x3h?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8" 

  -e SPRING_DATASOURCE_USERNAME=root 

  -e SPRING_DATASOURCE_PASSWORD='你的密码' 

  dubitshare:1.0
# 看日志

docker logs -f dubitshare

⛔ 数据库地址要用宿主机 IP,不能用 localhost —— 容器里的 localhost 是容器自己。这条我也踩过。

4.8 数据库表速查

表 行数 说明
bijifenxiang 6 笔记分享(带审核状态)
discussbijifenxiang 6 评论,关联被评论的笔记
gerenbiji 6 个人笔记
yonghu 6 普通用户
forum 6 交流互动
config 3 轮播图配置
news 1 公告信息
users 1 管理员
token 0 登录态,运行时生成
storeup 0 收藏,运行时生成

10 张表、35 行演示数据,外键约束 0 条——生成器不写外键,关联靠应用层。

后台笔记分享

五、工程结构和运行效果

模块划分(8 个业务模块,95 个业务端点):

模块 说明
用户模块 users / yonghu 两套体系,前台和管理端分开
笔记管理 笔记增删改查、分类、标签
笔记分享 分享记录、可见范围控制
收藏模块 用户收藏与取消收藏
评论交流 评论列表与回复
轮播图管理 后台维护前台首页轮播
公告信息 后台公告发布
权限管理 token 表控制后台访问

数据规模:


Java 文件      97 个 / 8752 行

Controller     11 个

REST 端点      113 个(其中业务端点 95 个)

数据表         10 张

演示数据       35 行 / 8 张表

运行验证(实际部署到 K8s 后取的):

  • 前台首页 HTTP 200,无需登录即可访问
  • 后台登录后各模块列表正常返回
  • 数据库连接池正常,无连接泄漏告警
  • 截图见文中,均为实际运行界面

适用边界:


✅ 单体工程,适合本科毕设和课程设计

✅ 模块写法统一,加新业务可参考现有模式

⚠️ 未做服务拆分,不适用于微服务场景

⚠️ 前端为 layui 手写页面,风格偏稳


技术层面这套工程没有特殊难点,主要价值在于流程完整:数据库脚本、配置、部署、演示数据都是现成的,做课程设计时不用在环境上耗时间。如果你有类似工程的部署问题,欢迎在评论区交流。


这套工程在下载中心,付款后订单页直接给网盘链接和提取码。

« 拆一套 161 文件的 SpringBoot 毕设源码:双前端单体、三套用户表、token 带表名