ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

在线小说阅读平台毕设全攻略:从技术选型到部署上线

在线小说阅读平台毕设全攻略:从技术选型到部署上线 每年到这个时间点后台就会收到一大波关于毕设的私信问的问题都差不多老师给的选题太老网上找的代码跑不起来论文写完发现和系统对不上……作为一个带过不少学生、也帮人审过不少毕设的老开发我特别理解这种感觉。今天拿一个比较典型的毕设选题——在线小说阅读平台来聊聊这一整套东西应该怎么做。这不算一个“高大上”的题目但胜在务实功能边界清楚、技术点覆盖全面、演示效果好而且无论是走传统的 Spring Boot 还是微服务方向都有很大的发挥空间。最关键是这类平台型 Web 项目最容易展示“完整业务闭环”答辩时老师问起来你也有东西可讲。下面我会从选题定位、技术栈、功能模块、实操步骤、论文写作、部署上线到常见问题一条龙梳理把源码、lw论文、部署文档这些交付物背后真正要紧的东西说透。1. 选题定位为什么“在线小说阅读平台”是毕设的稳妥之选好多学生选毕设题目第一反应是“要新颖”于是冲着一堆炫酷词汇去结果做到一半发现数据、算法、算力全都跟不上最后只能拿demo糊弄。我个人的建议很直白除非你已经有明确的工作或科研方向否则毕设题目最重要的不是“新”而是“能完整做出来、能讲清楚、能经得起问”。在线小说阅读平台正好满足这三点。1.1 核心需求解析先把题目拆开看它的业务内核其实是一个“内容在线阅读系统”跟视频网站、知识付费平台、专栏阅读系统本质上是同一套骨架。围绕“小说阅读”这个词用户的痛点无非是不知道看什么所以需要分类、排行、搜索、推荐入口。看书要有连贯体验所以需要书架收藏、阅读历史、章节翻页。看了之后想表达所以需要评论、评分、点赞。想要完整账号体系所以需要注册、登录、个人信息管理。而运营者管理员的诉求则是怎么能把书和章节管起来怎么了解用户活跃情况怎么控制内容发布权限。这些都是可以在论文里写清楚的业务需求也是答辩时最容易展开的“需求分析”章节素材。1.2 毕设场景下的适配优势把“在线小说平台”放进毕设场景里看它的好处体现在几个层面。一是技术栈覆盖面广且不过度复杂。一个常规实现会用到 Spring Boot后端框架、MySQL关系型数据库、Redis缓存可以做阅读排行榜、会话管理、Vue/Thymeleaf前端或模板、Nginx反向代理与静态资源。这些技术在招聘 JD 里出现频率很高写在简历上不丢人面试官也愿意聊。二是工作量可视化程度高。小说的“书籍列表—书籍详情—章节列表—阅读页”是一跳比一跳深的完整用户路径再加上管理后台的 CRUD、数据统计图表页面数量天然就够论文里的界面截图、功能测试表格都不愁没有内容。三是灵活性高方便差异化。你想加分可以加入全文搜索Elasticsearch / MySQL 全文索引、阅读时长统计、用户行为分析或者做一个基于协同过滤的“猜你喜欢”你时间紧可以砍掉推荐系统做成“人工置顶 按点击量排行”。上下限都很好控制不会出现“做不完砸手里”的情况。提示这里说一个多数人容易忽略的点。毕设项目的第一目标不是“生产可用”而是“逻辑完整、演示充分”。哪怕只做一个 MVP 级别的内容管理加阅读链路只要需求分析、系统设计、测试过程齐全照样能拿不错的分数。1.3 需要规避的“毕设经典大坑”既然要做就得知道坑在哪。我审过的毕设里最常见的翻车原因有三个第一代码不是自己写的连跑起来报错都看不懂。网上确实能下到各种“源码lw部署文档”的打包资源但如果你只是改了文件名和学号就交上去老师随便一问“你的 lambda 表达式什么意思”就露馅。第二论文和代码脱节。论文里吹得天花乱坠说实现了分布式 Session结果代码里全是单机 HttpSession这种矛盾在答辩时非常扎眼。第三部署环境一团糟。本地能跑、换台电脑就打不开数据库脚本缺表、端口配置写死、Redis 没有安装说明导致演示时现场翻车。所以后面讲实操的时候我会特别强调“自己动手走一遍流程”这件事。源码可以借鉴但环境搭建、数据库初始化、打包部署这些步骤一定要亲自动手过。2. 技术选型为什么我给你推荐这套方案技术选型没有标准答案但有一套在毕设场景下“最优性价比”的组合。你要记住一个原则能上主流框架就上主流框架能减配置就减配置学习成本高但又体现不出核心价值的组件能砍就砍。2.1 后端框架对比与选择现在 Java 系后端的主流选择其实就是 Spring Boot。SSHStruts Spring Hibernate那个时代的东西不建议再碰了SSMSpring SpringMVC MyBatis也不算最优解因为你用 Spring Boot 也能一键整合 SpringMVC 和 MyBatis还省去大量 XML 配置。具体到 Spring Boot 版本建议用 2.7.x 或 3.x。2.7.x 更稳定网上资料最多遇到问题容易搜到答案3.x 要求 JDK17 以上如果你对 Java 新特性不熟悉就别给自己增加额外负担。我用得最多的是 Spring Boot 2.7 JDK8/11这个组合在学业和实际开发之间非常平衡。持久层选 MyBatis-Plus 而不是原生 MyBatis。理由很简单单表 CRUD 它几乎全包了你可以把时间省下来写真正有区分度的业务逻辑比如阅读排行、连续阅读奖励、章节内容缓存。对于论文而言MyBatis-Plus 的多租户、乐观锁、分页插件也都拿得出手。权限认证方面能上 Spring Security JWT 当然好但对大多数毕设来说略重。我更推荐用 Sa-Token 或者手写一个简单的 JWT 拦截器。我的建议是手写 JWT 拦截器因为这个过程能帮你把“认证、授权、Token 刷新”讲得头头是道答辩加分很多。2.2 前端方案分离式还是服务端渲染前端有两种主流选择Vue 3 Element Plus 做前后端分离或者 Thymeleaf 做服务端渲染。我的判断是如果你对前端有兴趣或者以后想走全栈选 Vue 3 Element Plus。代码结构清晰组件化开发接口用 Axios 调后端打包后丢到 Nginx 里很符合企业开发习惯。如果你的前端基础偏弱、时间也紧那就老老实实用 Thymeleaf Bootstrap。一个模板引擎搞定所有页面后端 ModelAndView 直接渲染数据没有跨域问题部署也简单。但要注意当前毕设整体风向是“前后端分离”因为论文里可写的内容更多前端工程化、接口设计、跨域处理、JWT 鉴权流程每一块都能展开。如果答辩老师比较较真你也能给出更多技术细节。所以除非时间真的不够否则建议走 Vue 分离式。2.3 数据库与中间件搭配数据库毫不犹豫选 MySQL版本建议 8.0。相比 5.78.0 的窗口函数、通用表表达式、JSON 功能更强论文里“数据统计与分析”部分能用得上。数据库连接池用 Druid 或 HikariCP前者有监控页面演示时可以拿出来晒一晒。缓存中间件选 Redis用来存三种东西登录 Token 的临时状态、小说详情的热点数据、阅读排行榜的 ZSet 数据。如果你的推荐功能做到了协同过滤离线计算结果也可以放 Redis 加速加载。这里要特别注意Redis 必须在你部署文档里写明安装步骤和启动命令很多学生本地能跑就是因为 Redis 没启动才报错。文件存储方面小说封面、作者头像这类图片往本地磁盘存就行在配置里写一个虚拟路径映射。如果想让项目看起来更“工业化”搭一个 MinIO 对象存储服务提供文件的统一上传和访问接口论文里可以写“实现了文件服务与业务解耦”。2.4 开发与部署工具清单把工具链列全能避免你到最后缺东少西用途推荐工具后端开发IntelliJ IDEA社区版足够前端开发Visual Studio Code数据库管理Navicat / DataGrip / 命令行接口测试Postman / Apifox版本管理Git Gitee / GitHub远程部署阿里云 / 腾讯云轻量服务器 FinalShell / Xshell反向代理Nginx项目管理Maven文档 / 绘图Typora draw.io / ProcessOn接下去的所有实操我都默认你已经装好了这些工具。如果你还没装建议先把 MySQL、Redis、JDK、Maven、Node.js 装好后面每一步都会依赖它们。3. 功能模块设计从用户端到管理端的完整闭环功能设计是毕设项目的灵魂也是论文“需求分析”和“系统设计”的基础。在线小说阅读平台的核心模块我认为至少应该包括三类用户端阅读链路、管理端内容管理、辅助的数据统计与检索模块。下面分别拆开讲。3.1 用户端阅读链路是主心骨别被边角功能带偏用户端最容易犯的错是堆功能。有的学生做毕设一上来就想要“签到、积分、金币打赏、道具屋、评论区盖楼”结果核心的阅读体验做得稀烂答辩时老师让演示翻页居然一页一页加载还要转圈。真没必要。用户端四个模块必须做好账号登录注册手机号/邮箱 密码是基本款最好加一个 JWT 登录态保持。如果想展示亮点可以做“验证码登录”用 Redis 存验证码这个实现简单但演示效果很好。书城展示首页轮播图、分类导航、热门榜单、最新上架、推荐位。列表页要有分页、搜索、按分类筛选。书籍详情与阅读页封面、作者、简介、最新章节、书评区然后进入章节列表、阅读页。阅读页要有字体大小切换、上一章/下一章、目录抽屉、进度记忆。这里尤其要处理“上次读到哪一章”的续读功能这是用户体验的核心。个人中心书架列表、阅读历史、设置。书架用来收藏未读或连载中的书阅读历史按时间倒序展示最近读过的章节。我在自己的项目里还会加一个“阅读统计”的小页面记录你每天读了多久、读了几章一周一个柱状图。这个功能工作量不大但论文里可以归纳为“用户行为可视化模块”面试聊起来也很有意思。3.2 管理端以内容管理为主配一个仪表盘管理端是体现“系统完整性”的重要阵地核心是让管理员能维护整个平台的内容。导航结构可以这样规划仪表盘用 ECharts 展示每日新增用户、每日小说阅读量、小说热度 Top10、分类占比饼图。小说管理新增、修改、上下架书籍上传封面维护分类、作者、简介等信息。章节管理选择小说后维护章节目录支持新增章节、调整顺序、删除章节、预览正文。用户管理查询用户列表、禁用/启用账号、重置密码。评论管理查看最新评论、删除违规评论、按小说/用户筛选。系统设置轮播图管理、公告管理、管理员账号维护。这里有一个细节管理端和用户端要共用一套后端接口但通过角色权限做访问控制。你不需要单独写一套“管理端后端”而是在接口层加权限注解或者拦截器校验。这样代码量干净论文里也能说“系统采用 RBAC 权限模型设计”。3.3 数据检索与统计模块区分“必做”与“加分”检索功能如果数据量不大用 MySQL 的 LIKE 查询就行但在性能上肯定有硬伤。你可以做一个简单但有效的方案在小说表和章节表上建全文索引用 MATCH...AGAINST 做全文检索或者更轻量地把书名、作者、简介导到 Elasticsearch定期同步。综合考虑毕设时间我建议用 MySQL 全文索引 IK 分词器思路来写论文里可以讲“轻量级检索引擎设计”不需要真的引入 ES 那套重架构。统计模块则是很好的加分项。你可以基于用户阅读记录表和用户行为日志表用 SQL 按天/按周聚合做成“阅读趋势图”。因为只有你能在一张表里同时拿到 user_id、book_id、chapter_id、阅读时间这些字段做统计分析有天然的数据基础。任务重的话可以引入简单的定时任务Spring 的 Scheduled每天凌晨计算一次前一日热门榜把结果存到 Redis ZSet 里查询时直接取前 N 条。注意千万不要把统计做成实时计算毕设没有那个数据规模也没必要。定时任务 缓存预聚合是性价比最高的方案。4. 实操过程从空项目到能跑的完整平台现在进入关键环节。我会把从环境搭建到前后端联调的全过程过一遍尽量细化到命令级别方便你直接照着操作。整个流程我一般分成六个步骤环境准备、数据库建表、后端工程初始化、核心接口开发、前端工程搭建、联调与打包。4.1 环境准备与版本确认开工之前先在命令行里确认以下工具的版本避免装到高版本后跟框架不兼容java -version # 推荐 JDK 8/11/17 mvn -version # Maven 3.6 以上 node -v # Node 14/16/18 均可 npm -v mysql --version # MySQL 8.0 redis-server --version如果你在 Windows 上开发推荐用包管理器或者直接去官网下载安装包。注意安装 MySQL 8.0 时初始化密码要记住后面连接配置需要用到。接着创建数据库名称建议为 novel_dbCREATE DATABASE IF NOT EXISTS novel_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;用 utf8mb4 而不是 utf8是为了存 emoji 评论和生僻字书名这个坑我踩过。4.2 数据库表设计9张基础表跑通核心链路表是整个系统的基础设计得好后面写代码能省一半时间。我建议从以下 9 张表起步表名用途关键字段user用户表id, username, password, nickname, avatar, status, create_timebook小说表id, book_name, author_id, category_id, cover, intro, status, click_count, create_timecategory分类表id, category_name, sort, statusbook_chapter章节表id, book_id, chapter_index, title, content, word_count, create_timebookshelf书架表id, user_id, book_id, last_chapter_id, update_timeread_history阅读历史表id, user_id, book_id, chapter_id, progress, create_timecomment评论表id, user_id, book_id, chapter_id, content, like_count, create_timebanner轮播图表id, image, link_url, sort, statusadmin_user管理员表id, username, password, role, create_time有的表可以再精简比如轮播图不是必须的如果没有配置内容可以在前端做静态占位。但书、章、用户、书架、历史、评论这6张表是核心中的核心必须存在。字段类型上小说正文 content 用 LONGTEXT简介 intro 用 TEXT封面 cover 用 VARCHAR 存 URL 或路径。注意给 book.book_name、book.author_id、book_chapter.book_id 建索引否则到后期数据量稍微上来一点联表查询就会肉眼可见地变慢。建表时时间字段建议都用 datetime 类型create_time 默认值写 CURRENT_TIMESTAMP避免在 Java 代码里手动 set 时间。4.3 后端工程初始化与核心配置后端我用 Spring Boot MyBatis-Plus 搭工程。可以用 Spring Initializr 生成项目依赖选择 Web、MySQL Driver、Lombok、Validation。生成后手动在 pom.xml 里添加 MyBatis-Plus 和 JWT 依赖。核心配置文件 application.yml这里直接把关键部分写给你server: port: 8080 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/novel_db?useUnicodetruecharacterEncodingutf8zeroDateTimeBehaviorconvertToNullserverTimezoneAsia/Shanghai username: root password: 你的数据库密码 hikari: maximum-pool-size: 10 redis: host: localhost port: 6379 database: 0 mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true jwt: secret: your-secret-key-please-change-me expire: 604800 # 7天这里有两个容易报错的点。第一MySQL 8.0 驱动是 com.mysql.cj.jdbc.Driver不是 com.mysql.jdbc.Driver。第二url 里必须带 serverTimezone否则会有时区报错。Redis 密码项如果你本机 Redis 没设密码可以留空但部署文档里一定要标明。启动类加上 MapperScan 扫描 mapper 包然后写一个 HealthController 测试“hello world”接口能返回 JSON 就说明后端骨架通了。4.4 核心接口与关键业务逻辑实现后端接口建议按模块来组织比如AuthControllerPOST /api/auth/register、POST /api/auth/login、GET /api/auth/infoBookControllerGET /api/book/hot、GET /api/book/category/{id}、GET /api/book/detail/{id}、GET /api/book/search?keywordChapterControllerGET /api/chapter/list/{bookId}、GET /api/chapter/content/{chapterId}BookshelfControllerGET /api/bookshelf/list、POST /api/bookshelf/add、POST /api/bookshelf/removeHistoryControllerGET /api/history/list、POST /api/history/recordCommentControllerGET /api/comment/list?bookId、POST /api/comment/addAdminControllerPOST /api/admin/login、GET /api/admin/stats、POST /api/admin/book/save、POST /api/admin/chapter/save其中有三个点是区分“能跑”和“写得好”的分水岭一是分页查询。MyBatis-Plus 的分页插件一定要配置章节列表、评论列表、书架列表都需要分页。分页参数统一为 pageNum 和 pageSize前端传参。二是小说阅读量的更新。不要每次点详情都直接 UPDATE click_count click_count 1这样并发高了容易行锁可以先写 Redis 计数器每 5 分钟批量同步一次。但如果你的毕设展示时没有并发压力直接 update 也行这个可以按自己的时间取舍。三是章节内容的加载。小说章节正文通常几千到几万字如果每次请求都从数据库把整段 text 查出来响应会变慢。我的做法是查章节列表时只查章节标题、id、index不带 content点击阅读章节时再查 content同时把 content 存入 Redis过期时间设置为 2 小时。这样第二次进入同一章时走缓存速度非常快。在论文中可以把这写成“基于缓存的热点章节加速方案”。下面是一个简化版的关键代码示意说明章节阅读接口的缓存处理逻辑Service public class ChapterServiceImpl implements ChapterService { Autowired private StringRedisTemplate redisTemplate; Autowired private BookChapterMapper chapterMapper; Override public ChapterContentVO getChapterContent(Long chapterId) { String cacheKey chapter:content: chapterId; String contentJson redisTemplate.opsForValue().get(cacheKey); if (StringUtils.hasText(contentJson)) { return JSON.parseObject(contentJson, ChapterContentVO.class); } BookChapter chapter chapterMapper.selectById(chapterId); ChapterContentVO vo new ChapterContentVO(); vo.setTitle(chapter.getTitle()); vo.setContent(chapter.getContent()); redisTemplate.opsForValue().set(cacheKey, JSON.toJSONString(vo), 2, TimeUnit.HOURS); return vo; } }当然写完后一方面要注意 Redis 中的 JSON 转义问题另一方面为了防缓存击穿可以加一个空值缓存。但对毕设而言这点程度已经足够。4.5 前端工程搭建与联调前端我用 Vue 3 Vite Element Plus这部分要确保和后端接口能对得上。项目初始化npm create vitelatest novel-web -- --template vue cd novel-web npm install npm install element-plus axios vue-router pinia页面结构上我一般这样安排src/router/index.js配置路由分用户端和管理端两套布局。src/api/request.js封装 axios 实例加请求拦截器把 JWT 放到 Header加响应拦截器统一处理 401 跳转登录。src/views/user/Login.vue、Register.vue、Home.vue、BookDetail.vue、BookReader.vue、Bookshelf.vue、History.vuesrc/views/admin/Dashboard.vue、BookManage.vue、ChapterManage.vue、UserManage.vue、CommentManage.vue联调阶段最容易出的问题是跨域。在 Vue 里可以通过 vite 配置代理解决server: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }这样前端请求 http://localhost:5173/api/xxx 就会被代理到后端 8080避免跨域。生产环境则通过 Nginx 反向代理配置 /api 转发。记住这个思路前端部署和本地联调两不误。4.6 数据初始化与演示数据准备演示的时候最怕空数据库没有任何书籍和章节页面白花花一片老师根本看不出你的系统能干什么。一定要提前准备一批像样的演示数据。我自己的做法是写一个 DataInitializer 类实现 CommandLineRunner 接口在项目启动时检查数据库是否为空如果为空就自动插入以下内容10 本不同分类的小说每本封面用网络图片 URL 或本地静态资源路径。每本书至少 20 个章节正文内容用一段可重复的模板文本填充保证每章字数差不多。3 个测试账号admin/admin123管理员、user1/user123、user2/user123普通用户。若干条评论用于展示评论列表。这样做的好处太多了你平时开发调试时有数据可用演示时随时换个浏览器也能登录进去并展示完整内容甚至论文的测试章节可以直接截图。不要等到部署完才手动往数据库里塞数据那样既慢又容易出错。5. 论文lw写作怎么把项目“讲成”一篇合格毕设论文很多人以为代码跑通了论文随便写写就行。实际上论文所占的分数比重非常大它考察的是你对整个系统的理解、分析和总结能力。在线小说阅读平台的论文结构我建议按下面这几章来组织。5.1 论文结构建议第一章 绪论写背景、目的意义、国内外研究现状。不要写得太虚可以从“移动阅读用户规模持续增长”切入引用一两篇知网文献即可。第二章 相关技术介绍把用到的 Spring Boot、MyBatis-Plus、Vue、Redis、MySQL、JWT 逐一介绍每项写清楚是什么、为什么选它。第三章 需求分析分功能需求、非功能需求安全性、性能、易用性、系统用例图。用例图用 draw.io 画非常直观。第四章 系统设计总体架构图、功能模块图、数据库 ER 图、主要表结构、接口设计。这一章是重点建议多用图表每张图配一段文字说明。第五章 系统实现按用户端、管理端、核心功能模块来写每个功能点附页面截图 关键代码 逻辑描述。注意截图需要用正式数据别把开发调试时的断点或报错信息截进去。第六章 系统测试写测试环境、测试用例表、测试结果分析最好包含功能测试和性能测试用 JMeter 打个简单并发。对毕设来说测试用例表越细越好。第七章 总结与展望说自己完成了什么、不足有哪些、未来可以如何改进两三百字就够。5.2 论文素材怎么攒平时开发过程中就要注意留存素材。每做完一个模块截图保存到一个专门文件夹里每改完一个 bug顺手在印象笔记或者 Typora 里记录下来画好的架构图、流程图原文件也统一管理。不要等到最后一个月再集中补图、补数据那样容易时间不够而且很多流程细节已经忘了。这里还有个实用技巧在代码里写注释时用“用途 参数 返回值”的方式后面贴进论文就是现成的接口设计说明。比如/** * 获取书籍详情 * param bookId 书籍ID * return 包含书籍基本信息、章节数量、作者信息的VO对象 */5.3 查重与降重的小经验论文写完后一定会查重。我的建议是专业名词和图表可以用但描述性的语句尽量用自己的话写。尤其是“相关技术介绍”那一章不要整段从官网或者博客复制那是最容易被标红的区域。可以改成“在这类场景下我们更注重……”、“与 XX 框架相比XX 更适合本次项目的原因是……”写成带有个人分析的口吻。另外代码是不计入查重的但设计思路和注释要自己写。如果你从网上 copy 了大量代码至少把核心代码的命名风格、注释方式改成自己的习惯否则导师拿代码一对比又是麻烦事。6. 部署文档与架构讲解把项目真正“跑在服务器上”毕设答辩之前最好把项目部署到一台云服务器上。这不仅能让你演示的时候不依赖自己电脑也意味着你的“部署文档”真正有内容。很多同学把部署文档写成“本地启动说明”这是不准确的至少应该包含从服务器初始化到访问网站的全流程。6.1 服务器准备与基础环境安装如果你的服务器是全新的首先用 SSH 工具连上去然后安装基础软件。以 CentOS 7 / 8 为例# 安装 JDK yum install -y java-1.8.0-openjdk # 安装 MySQL 8可用 yum 源或 docker # 安装 Redis yum install -y redis systemctl start redis # 安装 Nginx yum install -y nginx systemctl start nginx如果你用的是宝塔面板或者 1Panel安装这些软件会更简单点击几下即可。对于毕设场景我不反对用面板因为它能极大地降低你的部署难度让你把精力放在系统本身。但面试时如果被问到部署细节你至少要能说出软件安装在哪个目录、项目日志在哪看、Nginx 配置在哪改。6.2 后端打包与启动命令后端打包成 jar 包常规操作用 Maven 打包mvn clean package -DskipTests生成的目标文件通常是 target/novel-server-0.0.1-SNAPSHOT.jar然后上传到服务器用下面命令启动nohup java -jar novel-server.jar --spring.profiles.activeprod app.log 21 这里的重点是生产环境的配置不能跟本地一样把密码明文写在 application.yml 里至少要把密码通过环境变量或者启动参数注入。你可以在服务器上放一个 application-prod.yml然后设置环境变量 DB_PASSWORD、REDIS_HOST 等再从配置里读取spring: datasource: password: ${DB_PASSWORD}这样你的部署文档就能体现“配置与代码分离”的思想论文的安全设计章节也有素材写。6.3 前端构建与 Nginx 配置前端打包npm run build打包后输出 dist 目录上传到服务器的 /opt/novel-web 目录。Nginx 配置的核心是把静态文件指到 dist把 /api 反向代理到后端端口server { listen 80; server_name your_domain_or_ip; location / { root /opt/novel-web; index index.html; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://127.0.0.1:8080/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }这里 try_files 的配置非常关键否则 Vue Router 的 history 模式刷新页面会 404。如果你不想折腾也可以在 Vue 路由里使用 hash 模式但为了更像正式项目我建议还是配 history try_files 这组方案。6.4 部署文档应该包含哪些要素一份好的部署文档至少要让一个完全不了解项目的人照着文档能把系统完整跑起来。我列的目录是这样的环境要求JDK、MySQL、Redis、Node 版本数据库初始化步骤执行 SQL 脚本、修改 root 密码后端部署步骤打包、配置修改、启动命令前端部署步骤构建、Nginx 配置常见问题端口被占用、数据库连接失败、Redis 连接失败、跨域问题运行效果说明默认账号密码、访问地址、管理员入口写完部署文档后自己照着跑一遍这个过程能暴露大量问题。我曾经有学生部署时发现 Nginx 配了 location /api/ 但 proxy_pass 带了多余的路径结果接口全部 404找了好久才发现是结尾多了个斜杠。像这种坑自己踩一遍才知道在文档里怎么提醒别人。7. 常见问题与排查技巧实录做这类项目一定会遇到一些“教科书里没有但实际操作特别普遍”的问题。我把这些年见过、踩过的问题整理成一个速查表希望能帮你省下大量找 bug 的时间。7.1 启动与连接类问题第一类是项目启动报错比如 MySQL 连接不上。先确认数据库服务启动了再看 url 配置里有没有带 serverTimezone。如果是 MySQL 8.0 的加密方式问题需要在控制台执行 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 密码或者把 allowPublicKeyRetrievaltrue 加到 url 后面。第二类是 Redis 连接超时。大概率是 Redis 服务没启动或者绑定的 IP 是 127.0.0.1远程访问连不进去。开发环境直接本地启动 Redis 即可生产环境如果想远程访问要把 bind 0.0.0.0 并设置 requirepass否则会有安全风险。第三类是端口被占用。Spring Boot 默认 8080如果已经被占用启动会报 Address already in use。Windows 下用 netstat -ano | findstr 8080 找到 PID然后在任务管理器结束进程Linux 下用 lsof -i:8080 或 netstat -tunlp | grep 8080然后 kill 掉。7.2 前端联调与打包类问题最经典的问题是生产环境接口 404。本地联调时前端用了 Vite 代理看起来挺正常但打包部署到 Nginx 后发现所有 /api 开头的请求都不通。这通常是 Nginx 的 proxy_pass 路径写错了或者后端 jar 包启动的端口跟 Nginx 转发目标不一致。排查思路是先 curl http://127.0.0.1:8080/api/auth/login 看后端是否正常再看 Nginx 的 error.log。另一个常见问题是 build 后刷新页面 404原因就是 Vue Router history 模式没有配合 try_files 配置。你再怎么刷新Nginx 都会把请求交给后端而后端没有 /user/bookshelf 这样的路由。把 try_files 加回去即可。页面能打开但样式丢失这一般是静态资源路径问题。在 vite.config.js 里设置 base: ./这样打包后的资源走相对路径不会因为部署到子目录而找不到 CSS 和 JS。7.3 业务逻辑与性能排查类问题书城首页打开很慢多半是查询没有走索引或者没有加缓存。最粗暴有效的方法是给 book 表的分类、状态字段建联合索引然后首页热门榜用 Redis 缓存设置 5 分钟过期。如果还想优化可以把书籍的封面图缩略图放到 Nginx 的静态目录然后通过 CDN 或浏览器缓存加速访问。阅读页翻页加载慢跟章节内容表每次查询全文有关。可以把章节 content 拆成独立表或独立字段列表查询时 select 不包括 content只有在阅读接口时才查询全文。内容 2 万字的章节首次请求大概 30ms加上本地缓存后可以降到 5ms 以下。评论接口偶尔报主键冲突这多半是因为你用了数据库自增主键但插入时又手动传了 id。尽量让主键由数据库生成或者用 MyBatis-Plus 的雪花算法生成。如果表里已经有重复 id先清理数据再重试。系统里时间显示成了 UTC 时间且比北京时间晚 8 小时。解决方案是数据库连接 url 加 serverTimezoneAsia/ShanghaiSpring Boot 的 jackson 时区也设置为 GMT8或者在实体类的日期字段上统一用 JsonFormat(pattern yyyy-MM-dd HH:mm:ss, timezone GMT8)。7.4 答辩现场容易踩的坑最后额外赠送几条答辩时的保命经验。演示的时候尽量用一台配置还行的电脑开好 Wi-Fi录屏软件提前预备。如果现场网络不好数据库和 Redis 环境一定要提前确认启动了不然点开登录页就报 500。建议在演示之前把核心链路走两遍尤其是浏览器缓存清空后的首次访问保证没有空白页。被问“你这个项目的架构图怎么画”时不要再说是网上找的模板。建议提前用 draw.io 自己画一张包含浏览器、Nginx、前端、后端、MySQL、Redis 的架构图并且能张嘴讲清每个组件的作用。这一张图几乎能镇住很多追问。被问“你的项目有什么亮点”时不要只说 CRUD。可以说“实现了基于 Redis 的缓存加速方案”或者“用 ZSet 实现了排行榜”或者说“阅读进度记忆让用户做到断点续读”。哪怕实现很简单只要你能把思路和代码细节讲清楚老师一般不会太为难。提示如果时间特别紧优先保证“登录、书城列表、书籍详情、章节阅读、书架、管理端图书管理”这 6 条主链路稳定其他功能可以弱化或暂时隐藏。答辩时只要主流程不翻车分数就有保障。8. 写在最后一些实实在在的个人体会我见过太多人把做毕设理解成“拿一份源码改改名字交差”结果到答辩前一周才发现连数据库脚本都跑不通。这个项目本身不难但它要求你动手走完全流程需求分析、设计表结构、写后端接口、做前端页面、测试、部署、写论文每一步都在逼着你把课堂上学过的零散知识串成一条线。我个人的建议是不管你是从零开始写还是基于网上的源码二次开发一定要把“部署流程”和“核心业务代码”吃透。至少你要能回答这三个问题登录接口做了什么书架怎么判断有没有重复收藏小说详情为什么查得快能讲清楚这三点再配合一份你自己能复现的部署文档这个毕设就稳了。如果你准备选这个题目别犹豫直接开干。先不要想着一步到位写出完美代码先跑通主链路再一步步往里面加细节。等你把第一个接口在 Postman 里调通把第一个页面在浏览器里渲染出来你就知道剩下的路该怎么走了。
返回列表