ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

社团管理系统毕设实战:业务建模、数据库设计、权限与部署答辩避坑

社团管理系统毕设实战:业务建模、数据库设计、权限与部署答辩避坑 1. 毕设选题的坑我替你们先踩了一遍每年到了毕业季计算机专业的同学都在纠结同一件事毕设到底做什么。数据库管理系统老掉牙纯前端项目撑不起篇幅算法类题目又怕自己搞不定。这时候社团管理系统这类题目就成了香饽饽——听起来像个完整项目做起来难度适中而且有现成的参考可以学。但恰恰是这种看起来简单的题目最容易做出四不像的东西页面是用模板套的数据库是随便设计的代码复制粘贴到自己都不认识最后答辩被老师一问三哑。我为什么敢这么说因为这几年代做指导、帮人看毕设代码的活儿我没少干见过太多看起来很努力、实际很空洞的提交物。社团管理系统这个题目本身没有任何问题问题出在大多数人对它的理解太浅了。你以为是做个网页管理社团实际上老师想看的是你有没有完整的业务闭环思维——从用户登录、角色权限到社团创建、成员审核、活动发布、经费审批再到数据统计展示这一整条链路你有没有想清楚。这篇博文我打算从一个能直接落地、可复现的项目角度把社团管理系统的设计与实现完整拆开来讲。无论你选JavaSpring Boot、PHPThinkPHP/Laravel、PythonDjango/Flask还是C#.NET Core、微信小程序甚至是单片机门禁签到这种扩展方向核心思路都是通用的先把业务模型吃透再谈技术栈。内容会覆盖数据库设计、权限模型、核心功能模块、前后端联调、部署答辩以及我在实际指导过程中总结的避坑经验。如果你正在为毕设发愁或者想做一个能写进简历的项目这篇应该能帮你少走很多弯路。我会尽量说得直白一点毕竟毕设的核心目标是自己能讲清楚而不是看起来特别高级。2. 社团管理系统到底在管什么业务模型先于技术选型很多人一上来就纠结到底用Spring Boot还是SSM要不要上Vue说实话选型的问题我放到下一节讲。你先要想明白一件事这个系统里有哪些角色每个角色分别要干什么事。2.1 角色拆解四种身份四条业务线一个典型的社团管理系统最少要有四种角色超级管理员管全站。用户禁封、社团注销、全局公告、数据看板权限最大但操作频率最低。社团管理员一般是某个社团的会长或副会长。负责本社团的信息维护、成员审核、活动发起、经费申请和通告发布。普通学生社员系统的绝大多数用户。可以浏览社团列表、提交入社申请、报名活动、查看通知、提交退社申请。可选指导教师/团委老师在高校场景下社团活动通常需要指导老师审批所以经费和大型活动可以多加一道老师审核节点。这四条业务线对应出来就是系统的四个核心模块用户与权限、社团管理、活动管理、经费管理。如果再把公告通知、数据统计、消息提醒加上一个功能完整的毕设项目已经超出及格线不少了。2.2 数据库设计的核心表没想清楚这些后面写代码全是坑我见过太多把数据库设计得乱七八糟的毕设最典型的错误就是社团、成员、活动三张表打天下外键全靠心情时间字段全是字符串。聊一下我用下来比较顺手的一套表结构设计你可以根据自己的功能实现做裁剪。第一组用户与角色sys_user用户表: id, username, password, nickname, avatar, email, phone, status, create_timesys_role角色表: id, role_code, role_name, descriptionsys_user_role用户角色关联表: id, user_id, role_id第二组社团与成员club社团表: id, name, category, logo, intro, president_id, status, create_timeclub_member社团成员表: id, club_id, user_id, role_in_club, join_time, statusclub_join_log入社申请记录表: id, club_id, user_id, reason, auditor_id, audit_status, audit_time第三组活动与经费activity活动表: id, club_id, title, content, location, start_time, end_time, max_people, status, creator_idactivity_signup活动报名表: id, activity_id, user_id, signup_time, statusclub_expense经费表: id, club_id, item_name, amount, expense_type, apply_reason, audit_status, auditor_id, apply_time你可能会问为什么不把社团和成员合并成一张表原因很简单人归属于哪个社团和人以什么身份加入社团是两个概念。前者是静态关系后者是动态过程。把申请记录单独拆一张club_join_log出来好处是你可以回溯这个人什么时候申请的、谁审批的、审批结果是什么答辩的时候讲审批流就有数据支撑了。**第三组里为什么把activity_signup单独拆开**因为活动的报名和社团的成员关系不是一回事。任何用户可以跨社团报名活动如果业务上允许所以活动报名表要独立出来跟club_member解耦。再说一个很多人忽略的点时间字段统一用datetime而不是varchar。这一点在写活动查询时极其重要——查询本月活动筛选正在进行中的活动直接用 SQL 的时间函数就能搞定存字符串的话你只能在 Java/PHP 代码里自己做字符串比较又慢又容易出 bug。2.3 权限模型为什么我推荐用简单的RBAC而不是自己造轮子社团结社管理系统的权限需求其实并不复杂不同角色访问不同菜单和接口。最稳妥的做法就是经典的 RBAC基于角色的访问控制模型用五张表实现用户表、角色表、菜单表、用户角色关联表、角色菜单关联表。有的同学喜欢在代码里硬编码角色判断写一堆if(user.getRole().equals(admin))。短期看确实少建了几张表但后期你会疯——每加一个接口就要判断一次而且一旦角色调整代码要全局搜索修改。用 RBAC 的思路是用户的角色决定了能访问的菜单菜单决定了能调用的接口。后台管理系统菜单树直接根据用户角色动态加载前端高权限按钮做 v-permission 指令控制改了角色配置就生效完全不用动代码。权限这块不用求大求全能实现登录用户只能看到自己有权限的菜单和操作按钮就已经超过大多数毕设作品了。答辩的时候导师如果追问你是怎么控制权限的你就把 RBAC 的五张表和前端路由守卫讲一遍基本就能拿下。3. 技术选型不是越新越好而是越稳越好技术栈的选择直接决定了你的开发效率和后续调试的舒适度。我的建议很明确**选你最熟的而不是最流行的。**现在网上的毕业设计神器满天飞Java 的 Spring Boot 居多其次是 Python 的 Django还有 PHP 的 ThinkPHP。每一个选项都有大量现成代码和学习资料关键是你自己上手能不能写明白。3.1 前后端分离 or 不分离这是个选择题前后端分离Vue Spring Boot是现在企业开发的主流写进简历也好看。但代价是你要懂跨域处理、Token 认证、前端路由折腾一圈下来周期会长不少。如果你前端基础一般我的建议是后端用模板引擎比如 Thymeleaf 或者 JSP或者干脆一个 PHP 文件一个页面地写。毕设答辩看的是你的系统能不能跑通、逻辑能不能讲清而不是你用了多新的架构。举个例子Spring Boot Thymeleaf 的方式后端 Controller 直接返回 ModelAndView页面里用${}语法渲染数据。没有跨域没有 TokenSession 天然管理登录态开发效率高得不是一点半点。等你把这套流程吃透了以后再学前后端分离也不迟。3.2 选型对比Java、PHP、Python怎么选我把三种主流语言在毕设场景下的表现做了个对比你自己对号入座选型优势劣势适合人群Java Spring Boot资料最多、企业认可度高、面试常问环境配置繁琐、上手门槛略高想兼顾毕设和求职的人PHP ThinkPHP/Laravel开发极快、文档全、部署简单简历含金量略低时间紧迫、追求快速交付的人Python Django代码简洁、开发快、数据分析能力强国内企业岗位相对少有 Python 基础的同学说实话我不太建议为了毕设从零学一门新语言。系统花时间最多的不是写代码而是业务逻辑的梳理和测试调试。选熟悉的技术栈能把更多精力花在功能完整度上。3.3 为什么我推荐你单独扩展一个小程序端现在毕设题目里经常带上了小程序三个字原因是高校场景下学生用手机访问的频率远高于电脑。微信小程序端的业务定位应该是面向普通学生的轻量查询和报名入口后台管理仍然放在Web端。小程序不用做完整的管理功能——学生能浏览社团列表、查看详情、提交入社申请、查看活动列表并报名就够了。这里有个重要的开发顺序问题**先完成后端接口再做Web管理端最后扩展小程序端。**后端的接口设计要同时满足Web端和小程序端的需求所以接口尽量设计成通用风格——返回JSON、鉴权通过Token、接口按资源命名如/api/club、/api/activity/{id}避免为某一端写死逻辑。小程序端的登录态建议用wx.login拿 code后端通过 code 换 openidopenid 作为用户唯一标识。注意小程序没有浏览器 Session 概念所以 Token 方案是标配。你可能会遇到的一个坑小程序的wx.request请求域名必须是 HTTPS并且在微信公众平台后台配置合法域名。本地联调可以用开发工具里的不校验合法域名选项但真正演示的时候建议用一个已经配置好域名的云服务器这个我在后面部署章节细讲。4. 核心功能实现最容易出彩也最容易翻车的三个模块如果你按上面的表结构把数据库建好剩下的工作就是用代码把一个个功能填进去。但填的方式有讲究——功能实现的好坏关键看细节。4.1 登录认证与密码安全千万别明文存密码这是评审老师第一眼看的地方。密码存储最低标准是BCrypt或SHA-256加盐。Spring Boot 里直接引入spring-security-crypto依赖用BCryptPasswordEncoder加密PHP 里可以用password_hash()和password_verify()Python 的 Django 自带的用户系统本身就是加盐哈希的直接用auth模块就行。明文存密码的后果不用我多说了哪怕是个毕设也接受不了。登录逻辑再补一个细节**多次登录失败要锁定账号。**实现方式很简单在用户表加一个login_fail_count字段连续失败5次就锁定15分钟。这不难写但加上去之后整个系统的安全设计部分就有了内容答辩时可以主动讲这个点。4.2 社团创建与成员审核状态机思维社团创建后状态应该是待审核审核通过才变为正常否则是已驳回。成员申请也同理提交申请是待审批社团管理员审批通过变为已加入拒绝则变为已拒绝。这串状态流转本质上就是个小状态机。用代码实现时我的建议是**每个状态变更都要记录操作人和时间。**入社申请表里的auditor_id和audit_time字段就是干这个的——谁审的、什么时候审的、通过没有全部留痕。这样做还有个额外的好处社团管理员如果误操作超级管理员可以根据记录追溯问题不用翻日志。前端交互上社团管理员的审批列表页面应该一眼看到待审批数量和每条申请的提交理由。这里有个实用的设计申请人的最近一条入社申请理由用列表页的更多展开显示避免卡片过长找不到重点。4.3 活动报名与人数控制并发下的数据一致性活动模块最大的坑是超卖——报名人数超过max_people。比如活动上限50人第51个人点击报名时系统怎么处理如果你只是先查出count 50然后插入报名记录在高并发下虽然毕设场景几乎不会真的并发逻辑上就是错的。正确做法是**数据库层面做约束。**在activity表加一个字段current_people每次报名执行一条 UPDATEUPDATE activity SET current_people current_people 1 WHERE id #{activityId} AND current_people max_people受影响行数为0说明名额已满这次报名就返回活动人数已满。这个操作是原子性的不需要事务嵌套和锁即使未来真有人并发点报名也不会超。这个写法比先 SELECT 再 INSERT可靠得多而且写进论文里也是一个亮点。活动状态字段建议用整型枚举0未开始、1进行中、2已结束、3已取消。在列表查询时直接用 SQL 按开始时间判断并更新状态或者在后端定时任务里扫描避免页面显示错误。4.4 文件上传与图片处理别让用户传什么你都存社团 Logo、活动海报以及用户头像都会涉及文件上传。很多毕设的做法是把文件直接存服务器本地路径数据库里存一个相对路径字符串。这样没问题但有三个坑要提前规避限制文件类型。不能只靠前端限制后端必须校验文件的 MIME 类型、扩展名、文件头。保险起见可以用简单白名单限制只允许 jpg、png、gif、webp 四种格式。重命名文件。上传的文件名一律改成yyyyMMddHHmmss 随机串避免中文名、特殊字符引发的路径问题。限制文件大小。前后端都要配通常单文件不超过 5MB。springboot 里改spring.servlet.multipart.max-file-sizePHP 改php.ini里的upload_max_filesize和post_max_size。图片数据要不要做缩略图社团 Logo 和活动海报建议做因为列表页如果加载原始大图页面会非常卡。Java 可以用thumbnailator库Python 用PillowPHP 用GD库裁一张 300x300 的缩略图存到thumb/目录列表页用缩略图详情页用原图体验会好很多。5. 从前端到后端联调那些看起来没什么、实际坑死人的细节把各个模块单独写完接下来是工作量最大的环节——联调和测试。很多毕设死在这一步单个接口测没问题一页面上数据就乱了管理端好好的小程序端拿到的数据对不上。以下是我在联调时反复踩过的几类问题。5.1 返回给前端的接口千万别直接裸奔现在前后端分离的项目越来越多接口的安全性就变得很关键。毕业设计至少要做到的底线是**所有需要登录才能访问的接口统一校验 Token。**Java 可以用拦截器HandlerInterceptor校验请求头里的 TokenPHP 可以写一个中间件Python Django 可以用自定义认证类。小程序端就更不用说了没有 Session 兜底Token 校验必须做。Token 怎么设计用 JWTJSON Web Token是最省心的方案。用户登录成功后后端生成一个 Token 返回给前端后续每次请求都放在请求头里。JWT 自带过期时间属性配合 Redis 做黑名单的话用户注销也能立即生效。如果你用的 Session 方案那就要注意 CORS 配置里allowCredentials和allowedOrigins必须配套前后端端口不同的时候会话是保存不住的。5.2 联调里的典型翻车现场时间格式问题后端返回的Date序列化成了时间戳前端new Date(时间戳)没法直接显示。统一在后端把时间格式化为yyyy-MM-dd HH:mm:ss字符串返回省去前端三千行代码。分页问题列表页没有分页一次性查询全部数据。活动记录一多前端渲染几百条 DOM 直接卡死。后端接口统一返回当前页、每页条数、总条数、数据列表这四个字段前端组件才好做分页。跨域问题如果你的前端跑在localhost:8080后端跑在localhost:9090必须要配跨域。Spring Boot 里加一个CorsFilter配置类或者在 Controller 上加CrossOriginPHP 后端在入口文件里设置响应头。不然后端永远收不到前端的请求你还会以为是代码写错了。空值问题null字段在 JSON 序列化后变成null前端渲染报错。统一在实体类上用JsonInclude(Include.NON_NULL)或者在 DTO 里处理JS 那边再做一个兜底判断。这些都是基础问题但基础问题解决得干净项目的完成度立刻就上去了。评审老师的普遍预期是功能完整、界面正常、代码有点小问题但能跑通——你把联调坑都填平项目质量自然脱颖而出。5.3 测试用例怎么设计别只测能跑要测异常毕设答辩现场老师最喜欢干的事就是输入异常数据看你的系统崩不崩。比如用户名直接传入空值、活动报名人数超过上限、上传一个超大的文件、删除一个已被引用的社团……这些你都要在开发阶段自己先造一遍。我的建议是至少覆盖以下异常场景未登录直接访问管理页面 → 跳转登录页普通用户直接调用管理员接口 → 返回 403 或无权限重复提交入社申请 → 提示你已经申请过删除社团时该社团有成员和活动 → 给出二次确认并限制删除修改密码时老密码错误 → 给出明确提示把这些场景在答辩前全测一遍比你把系统架构吹得天花乱坠都管用。因为老师就会挑这些地方问你的系统有没有防双重提交审核流程有没有边界处理6. 从开发到交付文档、部署、演示一个都不能少程序员容易犯的毛病是代码写完了就觉得万事大吉但毕业设计不是写代码是交付一个完整作品。交付物至少包含可运行的系统、完整的数据库脚本、项目文档、演示录像如果需要以及代码清晰可读。6.1 写数据库设计文档把为什么写清楚论文里的数据库设计章节不要只粘贴建表语句要解释每张表的用途、字段的设计理由、以及表之间的关系。比如社团表和成员表为什么要分开、活动报名表的status枚举是什么含义。把设计思路讲清楚论文的原创性和工作量就出来了。顺带说一句数据库脚本一定要单独导出一份.sql文件并且加上DROP TABLE IF EXISTS前缀方便别人在你代码上直接跑起来。有的同学数据库脚本只在自己电脑上能跑换一台机器就报错字符集不对——建议建库时统一用utf8mb4兼容性最好。6.2 部署本地运行 vs 云服务器选哪种最稳妥答辩有两种演示方式本地直接跑或者部署到云服务器。我的建议是**能力和时间允许的话优先部署到云服务器。**理由很简单本地跑容易出现环境问题数据库没启动、端口占用、内存不够答辩现场手忙脚乱找问题特别影响评分。部署到服务器之后你只需要打开浏览器输入网址就能演示稳定性高得多。部署方案上Java 项目用mvn package打成 jar 包服务器装一个 MySQL 和 JDK用nohup java -jar xxx.jar跑起来就行。PHP 项目更简单压缩代码传到服务器导入 SQL配一下 Apache 或 Nginx 就行。但注意开放端口安全组只放行80和443之类的必要端口不要把数据库的3306端口暴露到公网。小程序端的部署要提一嘴小程序后台管理页面要求配置request合法域名且必须是 HTTPS。所以如果要做小程序演示一个带 HTTPS 证书的域名基本刚需。可以用某些平台提供的免费 SSL 证书有效期三个月答辩期间完全够用。如果实在没有域名可以录一段演示视频备用视频演示配合本地运行也能起到很好的效果。6.3 梳理答辩项目展示主线讲清楚这五件事答辩现场最考验人的不是代码量而是你能不能用最短时间讲清楚项目的核心逻辑。我建议你准备一个5分钟的主线讲解项目背景和需求分析为什么做这个系统解决了什么问题系统架构和技术选型用了什么框架为什么这么选数据库设计核心表结构和关键设计思路核心功能演示走一遍完整流程登录→创建社团→发布活动→报名→审批难点及解决方案挑一个最有技术含量的点重点讲比如并发下的人数控制准备 PPT 的时候把关键截图贴上去尤其是数据库表关系图、接口调用流程图流程图画在 PPT 里不要用 Mermaid 在文章里堆。流程图可以用 ProcessOn 或者 Visio画得清晰一点答辩的时候逐个指给老师看。7. 避坑经验我看了上千个毕设后才总结出的几个高频雷区这部分是纯经验分享前面讲的都是怎么做才对这里讲讲多数人是怎么做错的。每个雷区背后都是一次翻车现场希望你能绕开。7.1 Excel 式的数据增删查改不是系统大量毕设作品给人的感觉是一个带界面、能增删改查的Excel。功能有但没有任何业务逻辑社团可以被随便删除——哪怕有活动的社团也照样删留下外键约等于没有活动报名不检查时间——报名结束后还能报名用户密码明文存数据库——一眼假。想把系统做出系统感只需要在三处做文章一是状态流转二是关联完整性三是数据约束。社团有关联活动不能杀青活动报名截止时间到了就不能再报密码必须加密。这三条加进去你的系统就已经从玩具进化到可用了。7.2 只堆功能不写注释自己写的代码两个月后也不认识我代码写得很急来不及注释是我听过最多的一句话。但毕设不是上线生产是给老师看的而且你答辩的时候可能要现场改需求没有注释的代码自己都会迷路。关键类、关键方法、复杂的业务逻辑至少写清楚这段代码是干什么的、为什么这么写这两件事。变量命名也别用a/b/data1这种统一下来用studentService、activityMapper这种见名知意的风格。我记得有个同学代码里全是String s1 社团; String s2 活动;String s3 成员;最后他自己都混了删错了字段整个模块直接崩。7.3 答辩前不测多角色流程一个人演四个角色手忙脚乱社团系统至少有管理员、社团管理员、普通用户三个角色。答辩现场你肯定是要现场演示的可实际上很多同学开发时只用一个超管账号测了所有功能从来没有真正用社团管理员身份走过一遍审核流程。结果现场一测发现社团管理员看不到审核菜单或者根本没有这个菜单的权限当场社死。解决办法很简单准备三个账号在答辩前正式走一遍完整流程——普通学生注册登录、浏览社团、提交申请社团管理员登录、审核成员、发布活动超管登录、审核社团、查看数据看板。每一步都截图保存一旦现场紧张操作失误你至少还能切到截图继续讲不耽误整体节奏。7.4 不会回答为什么的项目等同于白做最后提醒一点毕设答辩大概率会被追问为什么这么设计。为什么数据库要拆成这几张表为什么用 Token 不用 Session为什么活动报名用 UPDATE 而不是先 SELECT这些问题不是为了刁难你而是检验你写的东西是不是自己做的有没有真正理解。所以开发过程中每做一个技术决策就顺手记录下来遇到了什么问题、为什么选这个方案、这个方案有什么优点和局限。写文档的时候这些内容就是最宝贵的素材答辩的时候它们也会成为你的底气。8. 从毕设到简历这个项目能给你带来什么怎么讲出亮点如果你选的毕业设计是社团管理系统那么这个项目天然就带有完整业务闭环的属性写进简历是完全可以的。但简历上不能只写一句开发了社团管理系统——要拆开把你做的事情讲清楚尤其是那些体现你思考能力的技术点。8.1 简历上的项目描述怎么组织我的建议是按项目规模 核心职责 关键技术 难点攻关四段式来写社团管理系统面向高校学生社团的整合管理平台基于 Spring Boot Vue 的前后端分离架构采用 RBAC 权限模型实现多角色访问控制。承担后端整体设计与开发核心模块覆盖社团管理、成员审核、活动报名、经费申请审批全流程。技术要点MyBatis Plus MySQL 实现数据持久层JWT 拦截器实现登录认证与接口鉴权自定义注解实现操作日志审计使用数据库原子更新解决活动报名并发超员问题通过 Redis 缓存社团热度数据降低高频接口压力。扩展负责微信小程序端研发通过微信登录获取 openid 实现免密登录完成报名与查询场景的移动端闭环。注意最后那条扩展的描述哪怕实际开发中小程序只做了三五个页面这个经历在简历上也算真实的。因为小程序端确实是支撑了核心业务闭环的一部分只要有代码、能跑通说做过完全不算夸大。8.2 面试被问这个项目遇到最大的困难是什么怎么答这道题是面试经典题回答不好会直接扣分。千万不要说没遇到什么困难或者部署的时候环境配置花了点时间这种显得没有含金量的话。我给你准备一个方向在实现活动报名功能的时候我发现了并发场景下的人数超限问题。最开始我用先查询人数再插入记录的逻辑后来想如果两个用户同一毫秒提交count 结果都是少一最终报名人数就会超过上限。最后我把报名逻辑改成数据库原子更新UPDATE activity SET current_people current_people 1 WHERE id ? AND current_people max_people通过影响行数判断是否报名成功彻底解决了这个问题。这段话里有问题意识、有分析过程、有解决方案、有技术深度比我说一万句这项目很完整都有效。哪怕你觉得这个问题的代码就十行它依然是一个亮眼的项目难点。8.3 还有哪些值得延伸的方向如果你学有余力建议在基础项目上加一些别人没有的小功能哪怕实现得粗糙一点也没关系答辩和面试的时候都能讲出亮点。我见过比较成功的延伸方向有这几个数据可视化看板用 ECharts 画社团活跃度趋势图、各类型社团占比、活动参与率排行。加一个前端图表页视觉冲击力直接拉满。消息通知活动报名成功、审核通过时给用户发送系统消息或邮件通知。可以用 WebSocket 做实时通知也可以土一点用站内信表轮询核心是把通知闭环补全。导入导出Excel 批量导入社团成员、导出活动报名名单。用 EasyExcel 或 PHPExcel 都行这个功能教室申请场景里非常实用。定时任务活动结束后自动给参与者发评价问卷活动未达到最低人数自动取消并通知报名者。Java 用Scheduled注解就能实现很简单但很容易加印象分。这些功能每个都可以单独作为一段项目亮点去讲成本不高收益却很实在。最后的最后说点实在的毕设这个东西本质上不是为了做出一个惊天地泣鬼神的作品而是证明一件事你有能力独立完成一个中等复杂度的完整项目。社团管理系统这个题目选得好是因为它业务清晰、模块分明又足够展现你的工程能力。回过来看我每次指导的毕设里真正拿到高分的同学往往不是技术最炫的而是那些把基础功能做得扎实、把文档写得清楚、答辩能自信讲出设计思路的人。代码可以简单点但逻辑不能糊涂功能可以少一点但流程必须闭环界面可以不惊艳但交互必须顺手。能做到这几点你的毕设就已经在一半人以上了。如果你准备选这个题或者已经在做希望这篇内容能给你提供一套可落地的思路参考。先画业务流程图再设计数据库然后选技术栈写代码——按这个顺序走不要跳步。遇到报错就慢慢查遇到设计不清楚就回来看你的角色拆解和状态流转思路通了代码自然就通了。祝顺利。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进