简介:这是一套面向计算机专业本科生的毕业设计与期末大作业实战资源,聚焦游戏攻略网站的全流程开发实践,解决学生缺乏可运行、可扩展、文档完备的SSM+Vue全栈项目参考的痛点。资源包共774个文件,24.08MB,涵盖156个JavaScript前端逻辑文件、87个Java后端业务代码、38个Vue组件、46个CSS样式文件、2个SQL数据库脚本及2个Word论文文档,辅以SVG图标、GIF动效、MP4演示视频等增强可读性与实用性。已有35人学习下载,适合中等技术基础的学习者快速上手——不仅提供本地已编译通过、含完整注释的前后端源码,还包含系统设计文档、用户手册、E-R图、数据表结构说明及bat一键启停脚本(如2-run.bat),目录模块清晰(含IndexHeader、BreadCrumbs等标准化布局组件),便于理解工程化组织方式与响应式交互实现逻辑。 去年帮一个学弟审过一套“游戏攻略网站”的毕设项目,压缩包名字就叫“游戏攻略网站的设计与实现+vue(源码、论文、说明文档、数据库文档).zip”。说实话,这种打包形式一看就是典型的毕设/课设交付物,但里面东西的完整度比多数人自己赶工出来的要高不少,前端Vue、后端接口、数据库脚本、论文文档全齐。这篇文章就基于这类项目,把游戏攻略网站从前端到后端、从数据库到文档材料,拆开讲清楚,给正在做类似项目或者想拿这种项目练手的人一个能直接参考的路线。
如果你是准备做毕设、打算接外包项目、或者单纯想通过一个完整的前后端分离项目入门Vue实战,这篇都值得看完。我会先把需求定位讲清楚,然后说技术选型,再走一遍数据库设计、核心接口实现,最后聊一聊最容易卡住人的部署问题和论文/文档怎么配合着写。
1. 为什么这类项目一直有人做:需求拆解与功能边界
游戏攻略网站不是个新鲜概念,从早期的NGA、游民星空,到现在各种垂直攻略站,本质都是内容社区。但放到毕设、课设场景里,“游戏攻略网站”其实是一种很稳定的项目原型:它既有前台内容展示,又有后台管理,还牵扯用户体系、内容生产、交互行为,能覆盖一个完整Web系统的大部分知识点,但又不会复杂到一个人做不完。
真正动手之前,应该先把功能边界画清楚,这决定了你后面建表、写接口、画原型的工作量。
1.1 用户角色与权限边界
游戏攻略网站通常分三种角色:游客、注册用户、管理员。很多新手拿到项目就直接开写代码,结果到最后又说权限乱了、后台进不去,根源就是一开始没把这三类人的能做什么界定好。
- 游客:浏览首页、看攻略列表、搜攻略、打开攻略详情。
- 注册用户:在游客基础上可以登录,能点赞、收藏、评论,也能在个人中心发攻略、管理自己发的攻略。
- 管理员:拥有后台管理页面,能审核/下架攻略、管理分类、管理用户、删评论。
这里有个容易被忽视的点:攻略发布需不需要审核?很多简单项目会把用户发的攻略直接上架,省掉审核这一步。但做游戏攻略站,内容质量参差不齐,管理员审核是个很合理也很有存在感的功能,写论文时还能多写一章节,建议保留。
1.2 核心功能清单
按模块拆分,大概是下表这样:
| 模块 | 子功能 | 说明 |
|---|---|---|
| 用户模块 | 注册、登录、退出、修改资料 | 登录用Token认证,密码加密存储 |
| 攻略模块 | 攻略列表、搜索、按分类筛选、攻略详情、发布/编辑/删除攻略 | 详情页展示富文本内容,支持浏览量统计 |
| 互动模块 | 点赞、收藏、评论、回复评论 | 防止重复点赞/收藏,需要有唯一约束 |
| 分类模块 | 分类展示、分类管理 | 前台按分类刷攻略,后台维护分类 |
| 后台管理 | 攻略审核、用户管理、评论管理、数据统计 | 独立路由,管理端与前台分离 |
| 辅助功能 | 浏览量统计、热门排行、最新发布 | 常见但很加分的点 |
图片上传也要考虑。攻略内容里的配图、用户头像,如果不上传图片,只填URL,功能会弱不少。建议把图片上传做成独立接口,前端用Element Plus的Upload组件对接,后端存本地静态目录或OSS,毕设场景存本地就够了。
1.3 为什么功能边界要提前锁定
我见过太多做这类项目的人,需求文档写得模棱两可,做完主流程后又想加这加那,最后设计论文里的功能列表和实际系统对不上。锁边界不是为了限制你,是为了让项目在有限时间内可交付。游戏攻略网站的核心是“内容生产+内容消费”,围绕这个主轴把攻略、分类、用户、互动做扎实,次要功能(私信、好友、充值等)都可以砍掉,它们对评分和面试帮助不大,反而会拖慢进度。
2. 技术栈选型的逻辑:Vue 3 + Spring Boot这套组合为什么经久不衰
“+vue”出现在项目标题里,说明这套项目的前端选型是Vue。Vue在国内教学和毕设场景里的统治地位由来已久:中文资料全、上手平滑、模板语法对后端同学友好,Vue 3 + Element Plus的组件生态又非常成熟。
2.1 前端技术栈具体怎么搭
一套标准的Vue 3前端通常包含这几样:
- Vue 3(Composition API +
<script setup>) - Vue Router 4:路由管理与路由守卫
- Pinia:状态管理,替代Vuex实现用户状态共享
- Element Plus:UI组件库
- Axios:HTTP请求封装
- ECharts:后台数据统计图表
Node版本建议用16或18,Vite构建比Webpack快很多,配好镜像源后npm install基本不会卡。
2.2 后端技术栈的选择
后端选Spring Boot是最主流的方案。Vue做前端、Spring Boot做接口、MySQL存数据,这套前后端分离架构是当前工作里最常见的一种形态,做毕设或者面试讲项目都可以直接套用。
- Spring Boot 2.7.x 或 3.x(根据自己JDK版本选,JDK8用2.x,JDK17用3.x)
- MyBatis-Plus:简化单表CRUD,分页好用
- MySQL 5.7 或 8.0
- JWT:做登录认证
- Lombok:减少实体类样板代码
这套技术栈不需要额外写太多重复代码,MyBatis-Plus可以扛住90%的单表操作,联表查询自己写SQL即可。
2.3 选型的“为什么”比“是什么”更重要
写论文、准备答辩的时候,老师大概率会问“你为什么选这套框架”。如果你自己心里没有答案,现场会非常拉胯。
比如:为什么用Vue不用React?因为Vue的模板语法对新手更友好、社区资料中文丰富、国内企业使用率也高。为什么用MyBatis-Plus不用JPA?因为MyBatis-Plus学习成本低、分页好用、SQL可控性强,毕设项目里性能要求不高,反而需要把SQL逻辑写清楚给老师看。为什么用JWT不用Session?因为前后端分离后后端不存会话状态,Token无状态、扩展性好、移动端也能用同一套接口。
这些理由不是背出来的,而是你真的理解了这套选型的取舍后自然能说出来的东西。技术选型没有绝对好坏,能解释清楚“为什么”就成功了一半。
3. 数据库建模:攻略网站的核心表结构与设计思路
数据库设计是这类项目最见功力的部分。一套合理的表结构,能让前后端开发顺畅很多;表设计不合理,写SQL的时候就会到处不得劲。这里分享一套我验证过多次的设计方案。
3.1 核心表清单与字段说明
一般来说,游戏攻略网站至少要包含以下这些表:
用户表 user
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键自增 |
| username | varchar(50) | 用户名,唯一 |
| password | varchar(100) | BCrypt加密后的密码 |
| nickname | varchar(50) | 昵称 |
| avatar | varchar(255) | 头像URL |
| role | tinyint | 1-用户,2-管理员 |
| status | tinyint | 0-禁用,1-正常 |
| create_time | datetime | 注册时间 |
分类表 category
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| name | varchar(50) | 分类名,如“角色扮演”“射击竞技” |
| sort | int | 排序值 |
| create_time | datetime | 创建时间 |
攻略表 article
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| title | varchar(100) | 标题 |
| cover | varchar(255) | 封面图 |
| content | longtext | 富文本正文 |
| summary | varchar(255) | 摘要 |
| category_id | bigint | 所属分类 |
| user_id | bigint | 作者ID |
| view_count | int | 浏览量(冗余字段) |
| like_count | int | 点赞数(冗余字段) |
| favorite_count | int | 收藏数(冗余字段) |
| status | tinyint | 0-待审核,1-已发布,2-已下架 |
| create_time | datetime | 发布时间 |
| update_time | datetime | 更新时间 |
评论表 comment
| 字段 | 类型 | 说明 |
|---|---|---|
| id | bigint | 主键 |
| article_id | bigint | 攻略ID |
| user_id | bigint | 评论人 |
| content | varchar(500) | 评论内容 |
| parent_id | bigint | 父评论ID,用于楼中楼回复 |
| create_time | datetime | 评论时间 |
点赞表 like_record、收藏表 favorite:结构类似,主键自增,加user_id、article_id、create_time,并且对两列建唯一索引uk_user_article(user_id, article_id)。这个唯一索引用处很大,能防止同一用户重复点赞/收藏。
3.2 设计时的几个关键决策
首先是冗余计数字段。浏览数、点赞数、收藏数直接存在article表里,而不是每次实时count。攻略站的数据是读多写少,列表页要展示这些数字,如果每条记录都left join统计,SQL会非常繁琐。每次点赞或收藏时对对应字段做+1/-1即可,代价极小,收益却很直观。
其次是逻辑删除 vs 物理删除。用户删除自己发的攻略、后台下架攻略,建议用status状态字段控制,而不是真删行。原因有二:一是评论表还引用着article_id,物理删除会导致评论成为孤儿数据;二是保留数据有利于论文里写数据统计和分析。类似地,用户禁用用status控制,也不建议物理删。
第三是外键问题。很多教材会教你建物理外键,但实际工程里反而很少用。我建议表设计上不建物理外键,只建普通索引,逻辑关联在代码层保证。原因很简单:ORM框架和分库分表场景下物理外键会带来额外约束和维护成本,毕设项目尤其没必要。但是ER图里要把逻辑关系画清楚,论文里数据库设计部分会需要。
第四是索引设计。article表的category_id、create_time建索引,支持分类筛选和按时间排序;status字段也要索引,因为前台只查已发布的攻略。搜索功能如果用title LIKE '%关键字%',走不了索引,但数据量不大时可接受。
3.3 初始化数据怎么造
光有表结构不够,开发阶段还得有演示数据。我的做法是写一个data.sql或者直接在项目启动时用CommandLineRunner插入初始数据。内容包括:一个管理员账号、十几个普通用户、5~8个游戏分类、每个分类下3~5篇攻略文章。
攻略文章的富文本内容不能是空壳,得写点像样的游戏攻略正文。可以从游戏官网、百科找一些公开的资料,整理成几段带小标题、带列表格式的内容,这样前台详情页渲染出来才好看,截图和演示视频也有说服力。千万别拿100字的占位符糊弄,答辩的时候老师下拉页面看到内容很干,印象分直接降一个档次。
4. 前端Vue实现的关键环节:路由守卫、富文本与组件通信
前端是整个项目的门面,也是Vue技术的核心展示区。这一节挑几个最容易出错也最值得写进技术亮点的部分展开。
4.1 路由设计与权限控制
Vue Router 4的路由表建议分成三块:公开路由、需要登录的路由、管理端路由。
公开路由包括首页(攻略列表)、攻略详情、搜索结果、登录页、注册页。需要登录的路由包括个人中心、发布攻略、我的收藏。管理端路由统一挂在/admin路径下,单独做一套后台布局。
权限控制通过路由守卫实现:
router.beforeEach((to, from, next) => { const token = localStorage.getItem('token') if (to.path.startsWith('/admin')) { const user = JSON.parse(localStorage.getItem('userInfo') || '{}') if (token && user.role === 2) { next() } else { next('/login') } } else if (to.meta.requiresAuth && !token) { next('/login') } else { next() } })这段代码的逻辑是:访问管理端必须同时满足“已登录”和“是管理员”两个条件;访问个人中心、发布页等需要登录的页面,没token就踢回登录页。
白屏问题也要注意。刷新页面时如果动态路由没有重新加载,会出现“刷新后404”的经典坑。处理办法是路由守卫里做动态路由复检,或者干脆不使用动态路由,而用后端返回的按钮权限来控制页面内容。毕设场景用固定路由表加守卫控制就够了,复杂度低、演示稳定。
4.2 富文本编辑与回显
攻略编辑是前端的一个技术亮点。直接用textarea写纯文本,效果太差,展示不了“图文并茂”的攻略页。要用富文本编辑器。
目前Vue 3下比较好用的是wangEditor和Quill。wangEditor的坑在于对分辨率比较敏感,如果你按官方demo配置完字很小,多半是样式没引入完整。Quill的坑则在工具栏定制和图片上传回调。
我的推荐是wangEditor:
npm install @wangeditor/editor npm install @wangeditor/editor-for-vue@next编辑器组件里核心处理两件事:一是图片上传回调,上传完把返回的图片URL插到编辑区;二是编辑回显时把HTML字符串赋值给编辑器,注意用editor.setHtml()而不是v-model直接绑。
富文本回显到详情页时用v-html。这里有一个安全坑:如果模板渲染<script>标签里的内容,存在XSS风险。虽然富文本图片地址和正文来自用户提交,但上线项目要用dompurify做白名单过滤。毕设项目可以简单提一下,写论文时作为系统安全性的一个点写出来。
4.3 点赞、收藏与评论的交互状态
攻略详情页的点赞和收藏,交互上有一个注意点:页面刷新后要能正确回显“我是否已经点赞/收藏”。做法是详情接口返回两个字段:liked(当前用户是否已点赞)、favorited(是否已收藏)。后端根据当前登录用户ID去查like_record和favorite表,避免前端拿本地状态硬凑。
按钮的异步处理也很关键。用户快速连点两次点赞按钮,如果前端没有加节流或loading状态,会发出两次请求,第二次可能因为唯一索引直接报错。我的做法是点击后先禁用按钮,等接口返回成功再更新状态、恢复点击。这个小细节很加用户体验分,答辩演示的时候也不会尴尬。
4.4 组件通信的几个常见场景
很多前端新手会在组件通信上卡壳。实际开发中总结下来就三种场景:
- 父子组件传参:
props向下传,emit向上通知。比如首页列表组件把当前分页数据传给分页组件,分页组件切换页码时emit给父组件重新发请求。 - 非父子组件通信:用Pinia。比如登录成功后,头像栏和用户信息弹窗都要更新,用Pinia存userInfo,两个组件分别从store读取即可。
- 刷新页面数据同步:个人中心修改昵称后,导航栏应该同步显示新昵称。把用户信息放Pinia,配合localStorage持久化,任何组件里改完store就能自动同步。
4.5 搜索栏的防抖处理
搜索功能如果做成输入一个字就请求一次,既浪费资源又容易触发竞态。用watch加防抖:
import { watch, ref } from 'vue' import { useDebounceFn } from '@vueuse/core' const keyword = ref('') const search = useDebounceFn(() => { fetchSearchList(keyword.value) }, 500) watch(keyword, search)输入停止500毫秒后才发请求,体验顺畅,代码量也不大。
5. 后端核心模块拆解:从登录鉴权到攻略发布接口
后端部分,沿着一个请求的完整链路来部署实现:前端发请求到Controller,Controller调Service,Service调Mapper,Mapper操作数据库,结果原路返回。
5.1 统一返回体与全局异常处理
所有接口统一返回结构是后端开发的基本功:
@Data public class Result<T> { private Integer code; private String message; private T data; public static <T> Result<T> success(T data) { Result<T> r = new Result<>(); r.setCode(200); r.setMessage("操作成功"); r.setData(data); return r; } public static <T> Result<T> error(Integer code, String message) { Result<T> r = new Result<>(); r.setCode(code); r.setMessage(message); return r; } }配合@RestControllerAdvice做全局异常处理,业务代码里抛BusinessException,统一由处理器转成JSON返回给前端。这样做的好处是前端Axios拦截器可以统一判断code,不用每个接口单独写错误处理。
Axios拦截器典型写法:
service.interceptors.response.use( response => { const res = response.data if (res.code !== 200) { Message.error(res.message) if (res.code === 401) { router.push('/login') } return Promise.reject(new Error(res.message)) } return res }, error => { Message.error(error.message) return Promise.reject(error) } )401统一踢回登录页,前端只需要在意请求成功的数据,错误一律交给拦截器。
5.2 登录鉴权:JWT + 拦截器
登录流程是后端最核心的模块。用户提交用户名密码,后端先查用户是否存在、密码是否正确(PasswordEncoder.matches验证BCrypt密文),验证通过后生成JWT,存到本地指定过期时间,返回给前端。
String token = Jwts.builder() .setSubject(user.getId().toString()) .claim("username", user.getUsername()) .claim("role", user.getRole()) .setExpiration(new Date(System.currentTimeMillis() + 7 * 24 * 60 * 60 * 1000)) .setIssuedAt(new Date()) .signWith(SignatureAlgorithm.HS256, secretKey) .compact();拦截器里校验Token:
@Component public class JwtInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token == null || !token.startsWith("Bearer ")) { return error(response, 401, "未登录"); } try { Claims claims = Jwts.parser() .setSigningKey(secretKey) .parseClaimsJws(token.replace("Bearer ", "")) .getBody(); UserContext.set(claims); return true; } catch (Exception e) { return error(response, 401, "登录已过期"); } } }Token解析出的用户信息放进ThreadLocal(UserContext),后续Service里直接取当前用户ID。注意拦截器注册时排除登录注册接口和攻略浏览接口,否则游客没法看攻略了。
5.3 攻略发布与图片上传
发布攻略的接口设计:
POST /api/article Content-Type: application/json { "title": "只狼全Boss无伤攻略", "summary": "从蝴蝶夫人到苇名一心,全Boss打法详解", "cover": "http://localhost:8080/uploads/cover.png", "categoryId": 1, "content": "<p>开头先说一下...</p>" }图片上传接口使用MultipartFile接收,存储到本地目录并拼接访问URL。注意配置静态资源映射,把本地目录映射成可访问的URL路径:
spring: web: resources: static-locations: file:D:/upload/,classpath:/static/攻略发布后的状态是待审核。前台只查status=1的攻略,后台管理端查status=0的待审核列表,管理员点击审核通过后,status改为1,攻略上架。这个流程让评论和浏览的权限控制更加清晰。
5.4 点赞收藏的并发问题
点赞收藏接口虽然逻辑简单,但并发场景下有一个问题:用户同时点赞,count字段会不会脏?对毕设项目来说,在数据库层加唯一索引,先insert后会报重复错误,捕获后返回“请勿重复操作”即可。真正需要做幂等的地方是遇到重复请求时不要让count加两次,可以通过先查后插来兜底。
开发时一个小技巧:点赞前后端都加限制,前端按钮状态防重,后端唯一索引做最终保障,双保险不会出大问题。
6. 论文、说明文档和数据库文档:项目之外的“隐形分”
这个压缩包名字里特别标注了论文、说明文档、数据库文档,说明这套东西的完整度非常关键。很多搞技术的人重代码轻文档,结果毕设论文写到一半发现系统和论文章节对不上,回头改系统,效率极低。
正确的顺序是:先定需求、再建表、再写文档骨架,最后开发代码。这样写论文时每部分都有实际内容支撑。
6.1 论文的章节结构怎么安排
游戏攻略网站的论文一般按这个章节框架走:
- 绪论:项目背景、国内外研究现状、研究意义、论文结构安排
- 相关技术介绍:Vue、Spring Boot、MySQL、MyBatis-Plus简介
- 需求分析:功能性需求、非功能性需求、用例图
- 系统设计:总体架构设计、功能模块设计、数据库设计(ER图+表结构)
- 系统实现:分模块截图+核心代码+说明
- 系统测试:功能测试用例、测试结果
写系统实现部分的核心技巧是:每个功能模块配1~2张清晰截图,核心代码只贴关键片段,不要整段粘贴。比如登录模块贴JwtUtil和拦截器的核心代码,攻略发布贴Controller接口和Service方法,配合文字说明业务逻辑。老师最关注的是“你写的代码你能不能讲明白”,而不是代码有多少行。
6.2 说明文档怎么才能让别人按步骤跑起来
说明文档通常是接手项目的人第一个打开的文件,它的质量决定了别人对你的第一印象。建议包含这些内容:
- 环境要求:JDK版本、Node版本、MySQL版本、Maven版本
- 初始化数据库:如何执行项目里的
init.sql,需要修改哪些配置 - 后端启动步骤:改
application.yml里的数据库连接、启动Spring Boot、确认端口 - 前端启动步骤:
npm install、npm run dev、访问地址 - 默认账号:管理员账号密码、测试用户账号密码
- 常见问题:端口冲突、npm install报错、跨域配置、图片上传路径不存在
有些项目甚至会写一个启动顺序的说明图,这个在小项目里是加分项。
6.3 数据库文档的写法
数据库文档的价值在于让阅读者不需要打开Navicat就能看清全貌。用心去写的话包含以下内容:
- ER图:用PowerDesigner或者draw.io画,标注表之间的关联关系。
- 每张表的结构说明:字段名、类型、是否为空、默认值、备注。
- 关键索引说明:哪些字段建了索引、为什么建索引。
- 示例数据说明:初始化脚本里有哪些分类、哪些测试账号。
这个数据库文档不只是给答辩老师看的,也是给后期接手者看的。你写完这套文档,相当于把整个项目的持久层设计彻底梳理了一遍,出问题的概率也会低很多。
7. 跑通项目的完整步骤与高频踩坑
很多同学拿到项目第一步就卡在环境上。这里给一套从零到一跑通这个项目包的流程,每一步都写清楚,避坑为主。
7.1 环境准备
必须装的环境工具:
- JDK 8 或 11(对应Spring Boot 2.x)
- Maven 3.6+
- Node.js 16 或 18
- MySQL 5.7 或 8.0
- Navicat 或 MySQL Workbench(用来导数据库)
- IDEA 和 VSCode(后端和前端开发)
建议先检查一下命令版本,很多时候问题出在版本不匹配。Node 17以上版本跑Vite会有OpenSSL错误,解决方案是修改构建命令:
# package.json 里 script 部分 "scripts": { "dev": "vite", "build": "vite build" }如果还是报error:0308010C:digital envelope routines::unsupported,可以设置环境变量NODE_OPTIONS=--openssl-legacy-provider,或用nvm切换到Node 16。
7.2 数据库初始化的顺序
先用Navicat创建数据库(如game_guide),字符集选utf8mb4,然后执行项目里的init.sql或者database.sql脚本。执行完毕后检查一下表是否都建出来了,用户表里是否有一条管理员账号。
检查点:如果启动后端时报“Table 'xxx' doesn't exist”,一般是SQL脚本没有完整执行;如果报“Access denied for user”,则要检查application.yml里的数据库用户名密码是否正确。
7.3 后端启动步骤
后端启动前确认三件事:
application.yml里数据库地址jdbc:mysql://localhost:3306/game_guide?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8是否准确。mapper-locations指向的XML目录是否存在。- 端口是否被占用,默认一般是8080。
用IDEA打开项目后,等待Maven下载依赖。如果网络不好,可以在~/.m2/settings.xml里配置阿里云镜像:
<mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>启动成功日志里出现Tomcat started on port(s): 8080 (http)就算过了。
7.4 前端启动步骤
前端项目用VSCode打开,先在根目录执行:
npm install如果卡在node-sass或者python相关依赖,说明项目大概率用的node-sass太老,建议用npm install --force跳过冲突,或者用npm config set registry https://registry.npmmirror.com切换镜像再试。
依赖装完启动:
npm run dev默认Vite端口是5173,浏览器打开访问。如果前端请求后端接口出现跨域报错,两种改法都行:
在Vite的vite.config.js里配置代理:
export default defineConfig({ server: { proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } } })或者在Spring Boot里写一个CORS配置类,放行所有来源:
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*") .allowCredentials(true); } }两种用哪种都可以,我更推荐Vite代理的方式,因为生产环境和开发环境的访问路径一致,不用改前端代码。
7.5 一些高频启动报错整理
| 报错信息 | 原因 | 解决办法 |
|---|---|---|
| Access denied for user 'root'@'localhost' | 数据库密码错误 | 检查application.yml里的spring.datasource.password |
| Unknown database 'game_guide' | 数据库没创建或名字不对 | 在Navicat创建相同名字的数据库 |
| Port 8080 was already in use | 端口被占用 | netstat -ano查占用进程,kill掉或改端口 |
| Failed to execute goal org.apache.maven.plugins | Maven依赖下载失败 | 配阿里云镜像后重新mvn clean install |
| error:0308010C digital envelope routines | Node版本过高 | 用Node16,或设NODE_OPTIONS环境变量 |
| Failed to resolve import ... | npm包没装全 | 删node_modules和package-lock.json,重新npm install |
| 图片上传后访问404 | 静态资源映射没配置 | 确认spring.web.resources.static-locations配置正确 |
8. 从跑通到加分的几个扩展方向
基础功能都做完之后,如果还有时间,有几个性价比非常高的扩展点,能给论文和答辩加分不少。
8.1 数据可视化:后台统计面板
用ECharts画一个后台统计页面,展示几种数据:每日新增攻略数量折线图、分类占比饼图、用户增长柱状图。后端对应写几个统计接口:
// 按分类统计攻略数量 SELECT category_id, COUNT(*) AS cnt FROM article GROUP BY category_id // 按日期统计用户注册数量 SELECT DATE(create_time) AS day, COUNT(*) AS cnt FROM user GROUP BY DATE(create_time)前端用ECharts的option配置就能渲染出图。这个功能代码量不大,但演示效果非常直观,而且论文系统实现部分可以直接放图表截图,比纯列表好看得多。
8.2 浏览量异步更新
攻略详情页每打开一次就UPDATE article SET view_count = view_count + 1 WHERE id = ?,会拖慢详情接口。可以做优化:先更新Redis中的计数,定时批量刷到数据库。对毕设来说,如果项目里没引Redis,直接在详情接口里同步更新也能接受;但如果你在论文里把Redis方案写进去,作为一个优化点,是会加分的。
8.3 数据导入导出
管理员后台可以按分类导出攻略列表为Excel,或者支持CSV导入。用EasyExcel或Apache POI实现,代码量不会超过100行,但属于“系统实用性”的证明。面试讲项目时提到数据导入导出,也正好能引出POI使用经验和分批次读取大数据量文件的考虑。
8.4 多角色权限细化
如果想把权限做得更细,可以在用户表加permissions字段或单独建角色权限表,用自定义注解控制接口权限。但对攻略网站来说,管理员和普通用户两种角色已经足够覆盖场景,不需要过度设计。
最后分享几个实际操作中的体会
做这类前后端分离项目,最耗时间的往往不是写代码本身,而是环境配置和联调阶段的排查。我自己上手这类项目包时,第一件事永远是先看README或说明文档,再看数据库脚本,最后才看代码。没有说明文档时,按“数据库 → 后端 → 前端”的顺序去试错,能省下大量时间。
另外一点很实用:项目包里如果自带论文,一定先把论文的目录和系统实现章节读一遍,看它描述的功能与代码是否一致。很多时候毕设代码本身没Bug,但论文里写的功能你找不到入口,或者论文里的截图跟当前代码长得不一样,这就要在答辩前统一起来。
游戏攻略网站这个题目本身不难,但要做到完整、美观、能演示、能讲清楚,工程量并不小。按这篇文章的思路走一遍,从需求、数据库、后端接口、前端页面到论文文档,每一步都踏实做完,你会发现答辩时手上的底气完全不一样。
本文还有配套的精品资源,点击获取