
最近在带毕设学生报得最多的题目就是各种“XX管理系统”说实话答辩时老师连翻页的欲望都没有。但有个学生把题目报过来“Java基于SSM的中国大陆乙女游戏资料平台”我一下就觉得这题有味道。资料平台这个方向既避开了千篇一律的增删改查又能把SSM框架的技术点几乎全用上还能正大光明地讨论用户画像、内容聚合、搜索推荐这些偏工程的话题。这篇文章就围绕这个题从需求拆解到数据库设计从SSM整合到论文答辩把能想到的坑和能直接抄的代码都摊开讲。先说清楚这个项目是干什么的。乙女游戏女性向恋爱模拟游戏近几年在国内市场越做越大玩家基数上来了但信息分散的问题也跟着来了某个角色的生日、某条攻略线的触发条件、某段剧情的完整记录散落在各大社区、视频弹幕、个人博客里想系统查一次资料得翻半天。这个平台就是把这些资料集中起来做一个包含游戏库、角色图鉴、攻略文章、玩家收藏和评价的资料站让玩家能按游戏、按角色、按关键词快速查到想要的内容。对做毕设的学生来说它同时覆盖了Java、SSM框架、数据库设计、前后端交互、权限设计、论文写作是一个非常完整的训练项目。1. 项目定位与需求拆解1.1 别急着写代码先想清楚这个平台到底服务谁很多学生拿到题目就开写结果做到一半发现需求反复改根源在于没做角色分析。资料平台和普通的“XX管理系统”最大的不同是它天然有“内容消费者”和“内容运营者”两类人。一类是普通玩家。她们来平台的核心诉求是“查得到、看得懂”查角色资料看攻略文章了解某款游戏值不值得入坑。这类用户对浏览体验、搜索准确度、信息完整性敏感她们不需要复杂的操作登录后能收藏、能评论就够。另一类是管理员。毕设里通常只有这一个后台角色负责游戏入库、角色信息维护、攻略审核、用户管理。这个角色要的是操作效率能批量导入最好不能批量导入也至少要有清晰的增删改查界面。还有一类容易被忽略——游客。游客能不能看列表和详情能不能搜索我的建议是可以。游客能浏览所有公开资料但触发收藏、评论时必须先登录。这样既照顾了体验又给了“登录拦截”这个技术点展示空间答辩时能讲的东西又多了一层。所以需求拆解下来核心功能就六块用户注册登录、游戏库展示、角色图鉴、攻略文章管理、收藏评论、后台数据维护。如果学有余力再往上加“游戏热度排行”或“角色标签云”都是很好的加分项。1.2 三个角色和六类核心功能的边界做毕设最容易犯的错是功能铺太大最后每个模块都做得很浅。乙女游戏资料平台看起来功能多但收敛一下边界非常清晰游客浏览首页、游戏列表、角色详情、攻略列表、搜索。注册用户在游客基础上增加收藏游戏/角色/文章、发表评论。管理员管理游戏信息、角色信息、攻略文章、用户封禁或解封以及审核评论。我建议把后台单独拆成一个模块前缀用/admin和前台分离。原因很简单资料平台前台是为玩家设计的界面要清爽、信息密度要高后台是为管理员设计的界面要表格化、操作要直接。两者混在一起代码乱不说论文里的图也不好画。1.3 为什么是SSM而不是Spring Boot这个问题答辩必问。学生报题时写了“基于SSM”那就必须能说清楚“为什么不用Spring Boot”。SSM是Spring、SpringMVC、MyBatis三个框架的组合。Spring管对象和事务SpringMVC管请求分发和参数绑定MyBatis管数据库操作。这三层各管一摊边界非常明确非常适合用来理解Java Web开发的底层套路。Spring Boot把这些东西自动装配好了配置简化到只要一个类写起来是快但对毕设而言很多东西就被“黑盒化”了答辩时老师问一句“自动配置原理是什么”容易答不上来。所以我的观点是毕设选SSM不是技术落后而是刻意选一条能讲清楚原理的路线。你要在论文里明确写出这个选型理由这本身就是一个加分点。2. 技术栈、环境准备与工程结构2.1 SSM的分工逻辑谁管对象谁管请求谁管数据很多初学者背了框架名字但说不清三个框架分别干嘛动手就乱。我用最简单的话梳理一下。Spring是容器工厂所有对象的创建、依赖注入DI、事务管理都由它来管。可以把它理解成一个大仓库仓库里摆着各种Bean谁要用就去取。SpringMVC是Web层的调度员。浏览器发来一个请求DispatcherServlet先接住然后找对应的Controller方法把请求参数绑定成Java对象方法执行完再跳转或返回JSON。它干的是“翻译”和“分发”的活。MyBatis是数据库操作的执行者。我们通过Mapper接口定义方法在XML文件里写SQLMyBatis负责把结果集映射成Java实体。它干的是“把数据库表和Java对象之间搭桥”的活。三者串起来就是一条链路Controller接收请求 → 调用Service处理业务 → Service调用Mapper操作数据库 → Mapper返回结果给Service → Service封装给Controller → Controller响应给前端。2.2 开发环境版本选型经典组合才不容易翻车环境版本这块我建议直接照着一个成熟组合抄不要追求新版因为毕业后答辩环境就够用。组件推荐版本说明JDK1.8稳定、资料多、兼容所有SSM组件IDEIntelliJ IDEA 2020社区版也够用构建工具Maven 3.6管理依赖和打包Web容器Tomcat 8.5或9.0注意和JDK版本配套数据库MySQL 5.7或8.05.7对新手更友好8.0注意驱动版本数据库工具Navicat / MySQL Workbench建表、看数据、导出ER图JDK环境变量JAVA_HOME PATH 配置好具体配置见下文2.3 工程目录与依赖配置SSM项目虽然可以手工建但强烈建议用Maven依赖统一管理论文里写“使用Maven进行依赖管理”也是一个技术点。典型的目录结构如下ssm-bg-platform/ ├── pom.xml ├── src/main/java │ └── com/example/platform │ ├── controller // SpringMVC控制层 │ ├── service // 业务接口 │ │ └── impl // 业务实现类 │ ├── dao // MyBatis的Mapper接口 │ ├── entity // 实体类 │ ├── common // 常量、统一返回结果 │ ├── interceptor // 登录/权限拦截器 │ └── config // 配置类如 Druid 数据源配置 ├── src/main/resources │ ├── jdbc.properties // 数据库连接配置 │ ├── spring-dao.xml // Spring MyBatis 整合 │ ├── spring-service.xml // 事务和Service扫描 │ ├── spring-mvc.xml // SpringMVC配置 │ ├── mapper // MyBatis的XML映射文件 │ ├── log4j.properties // 日志配置 │ └── sql // 建表SQL文件 ├── src/main/webapp │ ├── WEB-INF/web.xml // 项目入口配置 │ ├── jsp // 前台JSP页面 │ └── static // CSS、JS、图片pom.xml 里核心依赖就这么几个spring-webmvc、spring-jdbc、mybatis、mybatis-spring、mysql-connector-java、druid、jstl、servlet-apiprovided再加一个 lombok 可以省去写 getter/setter。分页插件 PageHelper 建议加上毕设里列表页分页是刚需。2.4 本地环境配置避坑JDK环境变量是第一个坑。很多人配置完JAVA_HOME后忘了把%JAVA_HOME%\bin加到PATH命令行输java -version直接报错。Win11配置时注意系统环境变量里新建JAVA_HOME值填JDK安装根目录不要带bin一层然后编辑Path添加%JAVA_HOME%\bin。配置完记得重开命令行窗口再验证。Maven的坑是下载依赖特别慢。在settings.xml里加阿里云镜像这个技巧很实用mirror idaliyunmaven/id mirrorOfcentral/mirrorOf name阿里云公共仓库/name urlhttps://maven.aliyun.com/repository/public/url /mirror搞完这些环境基本就通了。先把一个空的Maven Web工程跑起来再逐步加SSM依赖比一次性复制整套工程再到处报错要省心得多。3. 数据库设计资料平台的“地基”3.1 从业务流程到ER设计数据库设计是论文里的大头也决定后面代码好不好写。做ER分析时不要急着画表先把业务链路写一遍用户注册登录 → 浏览游戏列表 → 查看游戏详情包含角色信息 → 查看文章 → 收藏内容 → 发表评论 → 管理员维护所有资料。沿着这条链路实体自然浮出来用户user、游戏game、角色character、攻略文章article、评论comment、收藏favorite。游戏和角色之间是1对多一篇文章归属一个游戏且可选关联某个角色用户和评论、收藏都是1对多。这里我特别提醒不要把“角色”和“用户”混为一谈。游戏角色是资料实体描述的是这款游戏里的虚拟人物系统角色普通用户/管理员是权限实体。两者虽然都叫“角色”但必须分开建表连字段类型都不一样。3.2 核心表结构与关键字段说明我给出几张三张核心表的字段设计参考其他的按同样思路扩展。用户表CREATE TABLE t_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL COMMENT 登录名, password VARCHAR(128) NOT NULL COMMENT 加盐后的密码, nickname VARCHAR(50) DEFAULT COMMENT 昵称, avatar VARCHAR(255) DEFAULT COMMENT 头像URL, role_type TINYINT DEFAULT 1 COMMENT 1普通用户 2管理员, status TINYINT DEFAULT 1 COMMENT 1正常 0封禁, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_username (username) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;游戏资料表CREATE TABLE t_game ( id BIGINT PRIMARY KEY AUTO_INCREMENT, game_name VARCHAR(100) NOT NULL COMMENT 游戏名称, developer VARCHAR(100) DEFAULT COMMENT 开发商, cover_url VARCHAR(255) DEFAULT COMMENT 封面图, intro TEXT COMMENT 游戏简介, publish_date DATE COMMENT 上线日期, status TINYINT DEFAULT 1 COMMENT 1上架 0下架, view_count BIGINT DEFAULT 0 COMMENT 浏览量, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;角色资料表CREATE TABLE t_character ( id BIGINT PRIMARY KEY AUTO_INCREMENT, game_id BIGINT NOT NULL COMMENT 所属游戏, char_name VARCHAR(50) NOT NULL COMMENT 角色名, cv_name VARCHAR(50) DEFAULT COMMENT 配音演员, birthday VARCHAR(30) DEFAULT COMMENT 生日, char_desc TEXT COMMENT 角色介绍, char_image VARCHAR(255) DEFAULT COMMENT 角色立绘, is_main_love TINYINT DEFAULT 1 COMMENT 1可攻略 0不可攻略, sort_order INT DEFAULT 0 COMMENT 展示排序, KEY idx_game_id (game_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;密码字段一定要留心。毕设里很多人直接存明文答辩老师问一句“密码安全性怎么考虑”就卡住。建议用MD5加固定盐的方式做哈希虽然不算最安全但起码能展示你考虑了安全问题。3.3 索引与常用SQL写法索引设计别贪多覆盖高频查询即可。我给几个建议用户表的 username 建唯一索引保证用户名不重复。游戏表的 game_name 建普通索引支持名称模糊搜索。角色表的 game_id 建索引游戏详情的角色列表会频繁按这个字段查。收藏表建联合唯一索引(user_id, target_type, target_id)天然防止重复收藏。分页查询是列表页最常见操作用PageHelper插件一行代码搞定还是手写LIMIT都要会。手写分页SQL长这样SELECT * FROM t_game WHERE status 1 ORDER BY view_count DESC LIMIT #{offset}, #{pageSize}搜索的SQL要注意LIKE关键字和用户输入拼接时必须用#{}参数化不能直接拼字符串。MyBatis中写成WHERE game_name LIKE CONCAT(%, #{keyword}, %)这样能防SQL注入。${}不是不能用但只适合排序列名这类固定白名单绝不能用在用户输入的模糊查询上。3.4 数据一致性收藏不重复、删除不脏留这部分是毕业论文里体现“数据一致性”思考的好地方。帖子热词里有“java怎么保证数据一致性”放在这个项目里就是两个场景一是用户重复点击收藏按钮怎么保证不产生重复记录二是管理员删除了游戏相关角色和文章怎么处理。第一个场景收藏表加联合唯一索引就够了点击收藏时先查后插也行但最靠谱的是捕获DuplicateKeyException然后回滚提示。第二个场景我建议用逻辑删除也就是不物理删只有status字段置0。原因是游戏与角色、文章存在外键关联硬删会把所有依赖数据都带崩而且运营平台一般也不希望彻底丢失历史数据。论文里把这段写清楚比单纯写“我建了5张表”高级得多。4. 核心功能模块落地4.1 三层调用链路一个列表请求是怎么走完的以“前台游戏列表”为例完整链路是这样的浏览器 → GameController.list(pageNum,pageSize) → GameService.list(pageNum,pageSize) → GameMapper.selectGamePage(pageNum,pageSize) → MySQL 返回ListGame → 逐层返回 → Controller 设置到ModelAndView → /WEB-INF/jsp/game/list.jsp 渲染 → 浏览器展示写代码时要注意Controller只做参数接收和结果转发不写SQL也不写业务逻辑Service层写业务判断比如下架游戏不展示Mapper只做数据查询。这样分层干净论文里的“系统架构图”也好画。4.2 登录与权限控制Session 拦截器方案毕设考勤登录不需要上Spring Security用Session加拦截器就够了简单、可控、好解释。登录成功后把用户对象放进Session比如session.setAttribute(loginUser, user)。登录状态的校验用一个HandlerInterceptor实现public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session request.getSession(); Object loginUser session.getAttribute(loginUser); if (loginUser null) { // 未登录AJAX请求和页面跳转分开处理 String type request.getHeader(X-Requested-With); if (XMLHttpRequest.equals(type)) { response.setStatus(401); } else { response.sendRedirect(request.getContextPath() /login); } return false; } return true; } }在spring-mvc.xml里注册拦截器并配置路径mvc:interceptors mvc:interceptor mvc:mapping path/user/**/ mvc:exclude-mapping path/user/login/ mvc:exclude-mapping path/user/register/ bean classcom.example.platform.interceptor.LoginInterceptor/ /mvc:interceptor /mvc:interceptors管理员权限可以再做一层校验。注意一个细节Session里的用户如果被管理员封禁了登录状态仍然有效所以每次请求时应该重新查一次用户状态而不是完全信任Session。这个小点写进论文就是“状态校验的严谨性”。4.3 收藏与评论功能的实现细节收藏功能比想象中麻烦。前端用户点击“收藏游戏”后端要做三件事先检查登录状态再检查是否已收藏最后插入收藏记录。前面说过用唯一索引兜底但Service层的判重逻辑还是要写毕竟要给用户明确的提示信息。评论功能的要点在排序和层级。毕设里不用做多级嵌套一条评论加个parent_id字段留作扩展就行。展示时按时间倒序新评论在前。评论内容一定要做长度限制和HTML转义这是防脚本攻击XSS的最基础手段。JSP里用${fn:escapeXml(comment.content)}就能转义别嫌麻烦。4.4 后台管理与图片上传后台管理就是标准CRUD但图片上传值得认真做一下。毕设里常见两种方案一种是存本地磁盘另一种是存数据库的BLOB字段。BLOB不要选数据库会很臃肿操作也不方便。本地磁盘存储的做法是上传接口接收MultipartFile用UUID重命名文件防止重名保存到指定目录然后把访问路径存到数据库。关键是SpringMVC的资源映射配置否则Tomcat访问不到磁盘文件mvc:resources mapping/upload/** locationfile:E:/bg-platform/upload/ /这样页面里直接写img src${pageContext.request.contextPath}/upload/xxx.jpg就能显示图片。论文里可以对比一下“本地存储”和“对象存储”的取舍虽然不是必选项目但能体现你对生产环境的认知。5. SSM常用注解与整合细节5.1 必会注解清单这些注解背着写都能写出来SSM常用注解是面试题里的高频内容也是论文“关键技术介绍”那一章的主要素材。我按层整理了一个清单注解应用位置作用易错点Controller类声明控制器忘了在spring-mvc.xml扫描RequestMapping类/方法映射URL类和方法上的路径会拼接ResponseBody方法返回JSON返回String时容易误加RequestBody参数把JSON绑定成对象前端必须传content-type是jsonRequestParam参数绑定请求参数参数缺失时报错可设置requiredfalsePathVariable参数绑定URL路径参数REST风格URL时要写对占位符Service类声明业务层Bean实现类上标接口不用标Repository类声明DAO层Bean需要被Mapper扫描覆盖Autowired属性/构造器依赖注入默认按类型注入存在多个实现时按QualifierResource属性依赖注入默认按名称注入Transactional方法/类事务控制同类内调用不会生效DateTimeFormat参数日期字符串转Date忘记配置会导致400一条条看下来不难发现注解本身不复杂难的是注解背后的配置要配合上。类上标了Controller但spring-mvc.xml的组件扫描没包到那注解就是不生效。这类问题在第六章要专门排查。5.2 三份Spring配置文件的分工SSM整合最让人头疼的是配置分散。我习惯用三份配置来分解spring-dao.xml负责数据源、SqlSessionFactory、Mapper扫描。spring-service.xml负责Service层Bean的扫描和事务管理器。spring-mvc.xml负责Controller扫描、视图解析器、拦截器、静态资源处理。web.xml里通过监听器加载前两份配置通过DispatcherServlet加载spring-mvc.xml。这样分层的好处是职责单一DAO层配置失效不会影响MVC层排查范围。数据源我推荐用阿里的Druid配置文件加上连接池参数jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/bg_platform?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8mb4 jdbc.usernameroot jdbc.password你的密码 jdbc.initialSize5 jdbc.maxActive20如果用MySQL 5.7驱动用com.mysql.jdbc.Driver即可如果是8.0必须用com.mysql.cj.jdbc.Driver这两个驱动类是新人最容易踩的坑。5.3 MyBatis映射几件容易翻车的事MyBatis整合时我见过太多低级错误写出来帮大家绕开。第一件Mapper.xml的namespace必须和Mapper接口全类名完全一致。com.example.platform.dao.GameMapper多一个字符就报绑定异常。第二件实体类的下划线字段映射。数据库字段是create_timeJava属性是createTime如果不在MyBatis全局配置里开启驼峰映射查询结果就是null。在spring-dao.xml的SqlSessionFactoryBean中加上property nameconfiguration bean classorg.apache.ibatis.session.Configuration property namemapUnderscoreToCamelCase valuetrue/ /bean /property第三件写SQL时#{}和${}的区别。#{}预编译占位符能防SQL注入${}会直接拼接字符串。ORDER BY之类没法用预编译的地方用${}一定要穷举白名单校验。6. 常见问题排查与避坑实录6.1 中文乱码四层都要查中文乱码是SSM项目的头号问题我把它拆成四个层面层面检查位置处理方法数据库连接URL加characterEncodingutf8mb4数据库表建表语句ENGINE默认CHARSETutf8mb4Tomcatserver.xmlURIEncodingUTF-8SpringMVC编码过滤器CharacterEncodingFilter设为UTF-8SpringMVC的编码过滤器需要在web.xml第一个位置配置filter filter-nameencodingFilter/filter-name filter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class init-param param-nameencoding/param-name param-valueUTF-8/param-value /init-param init-param param-nameforceEncoding/param-name param-valuetrue/param-value /init-param /filter filter-mapping filter-nameencodingFilter/filter-name url-pattern/*/url-pattern /filter-mapping四个地方都检查一遍乱码基本能解决。顺序别搞反先改数据库连接再看过滤器。6.2 数据库连接失败看这三个现象SSM项目报数据库连接错误无外乎三种ClassNotFoundException: com.mysql.jdbc.Driver说明驱动依赖没引入或者版本不对去pom.xml确认mysql-connector-java是否在且版本对应的驱动类名是否写对。Communications link failure说明连不上MySQL服务器检查MySQL服务是否启动、端口是否是3306、防火墙是否拦截。Access denied for user说明用户名或密码不对去jdbc.properties核对。这些日志看多了就条件反射了。启动失败的排查顺序永远是看完整异常栈 → 定位第一行报错 → 对照配置文件检查 → 最后才上网搜。6.3 页面404/500可能是Maven部署问题页面404大概率是请求路径没匹配但也可能是另外一种情况刷新项目后WEB-INF/lib下没有jar包Tomcat启动后找不到Spring相关类。IDEA里明明Maven依赖列表有包但运行时Tomcat就是报ClassNotFound原因通常是“Artifacts部署时没有把依赖打包进去”。可以在Project Structure → Artifacts → WEB-INF/lib里检查一下是否包含所有依赖。500错误则要优先看Tomcat控制台日志。Controller里抛了NullPointerException或者参数绑定失败都能从完整堆栈里找到具体是哪个文件的第几行。SSM项目调试最忌讳不看日志瞎改日志是唯一的真相。6.4 事务失效与分页失效Transactional标在方法上但事务没生效最常见的原因是同类内部调用比如this.doSomething()这样调用代理对象拦截不到。正确写法是通过自注入或者拆分到两个Service来绕过。PageHelper分页失效多半是分页插件版本和MyBatis版本不兼容或者PageHelper.startPage()后面紧跟的不是第一条查询语句。牢记一句话startPage之后必须是该接口的第一次数据库查询。数据一致性还有个小坑收藏表用逻辑删除但配合唯一索引时如果同一个用户曾经收藏又取消再收藏而之前那条记录是逻辑删除状态唯一索引就会和新插入记录冲突。解决方案是唯一索引改成(user_id, target_type, target_id, is_delete)或者在收藏时先物理删除同一条旧的收藏记录再插入。这个细节很偏门但踩过一次就记住了。7. 论文写作与答辩准备7.1 论文结构怎么组织页数和图表怎么安排毕设论文讲究“图多字不少”。我建议按这个结构和篇幅来章节内容重点建议页码摘要项目背景、开发技术、实现功能300字内讲完1页第一章 绪论研究背景乙女游戏市场、研究意义、国内外现状3-5页第二章 相关技术SSM三个框架的原理与优势可以画架构分层图4-6页第三章 需求分析可行性分析、用户角色、功能需求、非功能需求6-8页第四章 总体设计系统架构图、功能模块图、数据库ER图、表结构设计8-10页第五章 详细设计与实现核心模块的流程图、关键代码、界面截图12-16页第六章 系统测试测试用例表、测试结果、兼容性说明4-6页第七章 总结与展望结论、不足、后续改进方向2页图表工具直接用ProcessOn、draw.io就行画架构图不要花哨分层清晰最重要。数据库表的设计截图用Navicat导出即可。7.2 测试用例与演示脚本答辩演示不能乱点测试章节最容易写成“系统运行良好”这种废话要写就写具体用例。比如输入正确的用户名和密码点击登录系统跳转到首页。游客访问收藏接口系统弹出登录提示并且不写入数据。搜索不存在关键词“不存在的角色”系统提示无结果且不报错。管理员新增游戏信息页面提示成功列表出现新记录。答辩演示按脚本走1分钟登录 → 1分钟首页浏览 → 1分钟搜索“某角色” → 1分钟查看详情 → 1分钟收藏和评论 → 2分钟后台管理演示。预先把数据准备好答辩现场不要花太多时间现敲命令。7.3 答辩高频问题与应答参考答辩老师的提问方向基本绕不开这几个提前准备好应答思路提问方向应答思路为什么选SSM分层清晰、适合教学、能深入理解Spring的IOC/AOP机制SpringMVC执行流程DispatcherServlet → HandlerMapping → Controller → ModelAndView → 视图解析MyBatis的#{}和${}区别预编译和字符串拼接防SQL注入要选前者数据库几张表关系按实体介绍画ER图说话事务怎么控制的Transactional配了DataSource事务管理器用户密码安全怎么考虑MD5加盐存储不做明文如果数据量大怎么办先谈索引再谈分页再谈读写分离是生产环境的事有哪些现存的不足没有做推荐系统没有做全文检索引擎这些都是改进方向最后说点实际的我个人在带这样的项目中体会最深的一点是SSM项目真正的分水岭不在代码量而在数据库设计和权限边界划分。代码写得多不难难的是把数据库表设计得整洁、把用户角色边界设计得清晰、把每个模块的“为什么”想清楚。做这个乙女游戏资料平台如果能把“玩家需要什么资料”作为出发点来反推表结构论文答辩就有源源不断的素材。实操上再多留一份心眼所有页面记得统一加上自己的信息展示截图的时候用真实数据填充答辩前连续跑三遍完整流程一个Demo成功演示一遍不算本事连演三遍不出问题才算合格。