简介:这是一套基于微信小程序的新生报到系统完整源码与说明文档,主要面向高校计算机专业进行课程设计或毕业设计的学生,也适合需要快速搭建校园迎新报到流程的开发者。系统包含小程序端与管理员端,覆盖新生信息登记、报到进度管理、数据统计等典型功能,可作为前后端分离项目的实践参考。资源包共1548个文件,压缩后约21.73MB,其中Java源码支撑后端接口,Vue文件构成管理端页面,wxml/wxss/js为小程序前端,json用于项目配置,sql脚本包含数据库表结构与初始数据,png等图片素材则用于界面展示。配套说明文档按系统分析、可行性研究、性能需求、功能结构、数据库E/R图、表设计、功能实现、系统测试等章节展开,逻辑完整,能够帮助读者从需求到落地理解整个开发流程。目前已有530人学习下载,适合用来理解完整项目结构、掌握小程序与后端联调思路,或直接基于源码扩展自己的毕业设计课题。
1. 报到季的混乱,正是这套系统存在的理由
离新生报到还有两天,辅导员手里是一张三百多人的 Excel 名单和一摞待接站的电话记录。每年都是同样的场景:体育馆门口排长队,有人上午十点就办完事在旁边刷手机,有人下午四点还在找宿舍楼。新生报到类系统要解决的,就是把“填表、核验、领物资、入住”拆成可查询、可追踪、可统计的线上闭环,而微信小程序是成本最低的载体——学生不用装 App,扫码就能填信息,学院后台能实时看到报到率。这套基于微信小程序的新生报到系统(源码+说明文档),正是为课程设计、毕业设计和实训项目准备的落地样本。前端负责信息采集与现场确认,后端负责状态流转与统计报表,一个月工期,一个人能交付。
2. 先定技术栈再动手:原生小程序还是 uniapp,后端选 Java 还是 Node
很多人拿到这个标题第一反应是“赶紧写代码”,实际上技术栈选错才是后面返工的大头。新生报到系统业务不复杂,但涉及学生信息录入、管理端查询、状态流转,前后端交互超过十个接口。先把选型问题讲透,后面写代码才有安全感。
2.1 小程序端:课程设计场景下原生开发是风险最低的选择
眼下微信小程序开发有两条主流路线:原生小程序和 uniapp。如果你只做微信小程序这一个平台,原生开发是更稳的答案。uniapp 的卖点是“一套代码多端运行”,听起来很美,但等你真正适配安卓、iOS、鸿蒙的时候,各端的兼容问题全得自己扛一遍。课程设计通常只有一个月,时间花在适配不同端上,不如花在把业务逻辑写完整。
原生小程序的另一个好处是调试链路短。微信开发者工具直接预览、真机调试、上传体验版,每个环节都有官方文档兜底;遇到问题在社区里搜,答案几乎全是针对原生语法的。反观 uniapp,它中间夹了一层编译转换,出问题时要先判断是框架问题还是微信端问题,排查成本翻倍。
我一般会在两种情况下推荐你用 uniapp:一是课程设计要求里明确写了“支持多端”,二是你打算以后靠这个项目找工作,想顺带把 Vue 语法练熟。否则就老老实实写原生 WXML + WXSS + JS,答辩时老师问“这段逻辑怎么跑的”,你能直接指着代码讲,不用绕一层框架。
2.2 后端:Java Spring Boot + MySQL 是“最不容易答辩翻车”的组合
后端选型要看你的课程背景。如果你这门课是 Java 课程设计,那 Spring Boot + MyBatis-Plus + MySQL 几乎是最常见的答案。原因很直白:资料多、范例多、老师也熟。哪怕你 Spring Boot 只写过 CRUD,也够应付这个系统了。写完之后把项目打成 jar 包,部署到学校机房或云服务器,说明文档里写清楚 JDK 8+ 环境和 Maven 打包命令即可。
如果你的 Java 基础一般,备选方案是 Node.js + Express 或 Python Flask。这两个框架的代码量更少,跑起来更轻,适合只求“能演示”的同学。但要注意:后端用非 Java 方案时,答辩老师如果问“为什么不用 Spring Boot”,你得准备一个站得住的理由,比如“图床接口用 Node 处理更方便”之类的,别只说“我不会”。这个理由最好在写进说明文档的技术选型章节,答辩时直接翻给老师看。
2.3 数据库设计:一张报到主表撑起整个状态机
新生报到系统数据库设计的好坏,直接决定后面功能好不好加。我的习惯是拆四张表:学生基本信息表、报到记录表、管理员表、字典表。字典表存学院、专业、班级这些枚举值,方便管理端做下拉筛选,也避免在代码里到处写魔法字符串。
报到记录表是整个系统的核心,我通常叫它 enroll_record,它在业务上对每个学生只会有一条有效记录,但为了保留状态变更痕迹,我会设计成可多次插入,查询时取 status 最新的一条。
CREATE TABLE student_base ( id BIGINT AUTO_INCREMENT PRIMARY KEY, student_no VARCHAR(20) NOT NULL COMMENT '学号', id_card VARCHAR(18) NOT NULL COMMENT '身份证号', name VARCHAR(50) NOT NULL, gender TINYINT DEFAULT 0 COMMENT '0男 1女', college_id BIGINT NOT NULL COMMENT '学院id', major_name VARCHAR(100) NOT NULL, class_name VARCHAR(100) NOT NULL, phone VARCHAR(11) NOT NULL, emergency_contact VARCHAR(50), emergency_phone VARCHAR(11), address VARCHAR(255), create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_student_no (student_no), UNIQUE KEY uk_id_card (id_card) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='学生基本信息表'; CREATE TABLE enroll_record ( id BIGINT AUTO_INCREMENT PRIMARY KEY, student_id BIGINT NOT NULL COMMENT '关联student_base.id', status TINYINT DEFAULT 0 COMMENT '0未报到 1已预报到 2现场核验 3完成', report_time DATETIME COMMENT '报到时间', operator_id BIGINT COMMENT '操作管理员id', remark VARCHAR(255), create_time DATETIME DEFAULT CURRENT_TIMESTAMP, KEY idx_student_status (student_id, status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='报到记录表';student_base 里把学号和身份证都设成唯一索引,这是为了防止重复注册。很多人把身份证号只当成普通字段存,结果同一个人用不同手机号注册两条,后台统计报到率直接翻车。enroll_record 的状态字段从 0 到 3 表示报到进度,后续要加“已缴费”“已领物资”这类扩展状态,直接在 TINYINT 上预留位数即可,不用改表结构。
3. 把“报到”拆成四个环节:从登录鉴权到现场确认
功能设计上不要一上来就想做得多花哨。新生报到系统核心就四件事:登录、填信息、报到状态流转、管理端统计。把这四件事串成一条链路,系统就完成了一大半。
3.1 登录鉴权:wx.login 拿到 code 之后后端要做什么
微信小程序的登录和普通网页登录不一样,它依赖微信的开放能力。前端先调用 wx.login 获取一个临时 code,后端拿这个 code 去微信接口换 session_key 和 openid,然后自己签发一个登录态 token 给前端。后续所有接口带着 token 请求即可。
这里有个新手常犯的错:把 session_key 和 openid 直接返回给前端存着。session_key 是用于解密敏感信息的密钥,不该暴露给前端;openid 也不能作为接口鉴权凭证。正确做法是后端生成一个自定义 token(UUID 或 JWT),把 openid 和用户在系统里的角色绑定,token 设置 7 天有效期。
// utils/request.js 请求封装 const BASE_URL = 'https://your-api.example.com/api'; function request(path, method = 'GET', data = {}) { return new Promise((resolve, reject) => { wx.request({ url: BASE_URL + path, method: method, data: data, header: { 'Content-Type': 'application/json', 'token': wx.getStorageSync('token') || '' }, success: (res) => { if (res.statusCode === 200 && res.data.code === 0) { resolve(res.data.data); } else if (res.statusCode === 401) { // token 失效,跳转登录页 wx.removeStorageSync('token'); wx.reLaunch({ url: '/pages/login/login' }); reject(new Error('登录已过期')); } else { reject(new Error(res.data.msg || '请求失败')); } }, fail: (err) => reject(err) }); }); } module.exports = { request };这段封装是让所有接口统一走同一套逻辑:自动携带 token、统一处理业务错误码、401 时跳回登录页。参数说明:BASE_URL 换成你自己后端的域名,必须是已备案且支持 HTTPS 的;token 过期时间我建议后端设 7 天,前端再用 wx.setStorageSync 存一份,配合“微信小程序设置缓存时间”的做法,每次启动时检查当前时间戳,超了就清掉重新登录,避免用户用到一半才被 401 打断。
后端拿到 code 之后,调用微信的 jscode2session 接口,把返回的 openid 拿到数据库里查 student_base,如果查不到就说明这个微信还没绑定学号,返回一个标识让前端跳到绑定页。绑定学号时,学生输入学号和身份证后六位,后端匹配通过后把 openid 写入 student_base 的 openid 字段,完成账号关联。
3.2 学生信息填报:表单校验、自动回显与草稿缓存
报到信息表单是学生打开系统后的第一屏,包含姓名、性别、学院、专业、班级、身份证号、手机号、紧急联系人、家庭住址这些字段。页面布局不用复杂,从上到下排开,分几个分组。性别用 radio-group,即“微信小程序单选框”的标准写法;学院专业用 picker 从字典接口拉数据,不要让学生手填,否则后台统计出来的“专业”五花八门。
表单提交前必须做校验,特别是身份证号和手机号。身份证号支持 15 位旧版和 18 位新版,手机号做 11 位开头校验。我习惯把校验函数放在 utils/validate.js 里,这样登录页、报到页都能复用。
// pages/report/report.js 片段 data: { form: { name: '', gender: 0, idCard: '', phone: '', collegeId: 0, majorName: '', className: '', emergencyContact: '', emergencyPhone: '', address: '' } }, submitReport() { const form = this.data.form; if (!form.name) { wx.showToast({ title: '请填写姓名', icon: 'none' }); return; } if (!/^\d{17}[\dXx]$|^\d{15}$/.test(form.idCard)) { wx.showToast({ title: '身份证号格式不对', icon: 'none' }); return; } if (!/^1[3-9]\d{9}$/.test(form.phone)) { wx.showToast({ title: '手机号格式不对', icon: 'none' }); return; } request('/student/report', 'POST', form) .then(() => { // 提交成功后清理草稿缓存 wx.removeStorageSync('report_draft'); wx.showToast({ title: '提交成功', icon: 'success' }); setTimeout(() => { wx.redirectTo({ url: '/pages/progress/progress' }); }, 800); }) .catch((err) => { wx.showToast({ title: err.message, icon: 'none' }); }); }提交成功后我没有用 wx.navigateTo 跳转,而是用 wx.redirectTo,目的是不让用户在详情页里反复返回上一页导致重复提交。表单填写过程中,每次 blur 事件都把当前表单写进 wx.setStorageSync('report_draft'),下次进入页面时自动回显,这样学生填到一半被电话打断、小程序被杀掉,回来还能接着填。“自动回显草稿”这个功能很小,但答辩时很加分,老师会觉得你考虑了真实使用场景。
3.3 报到进度闭环:状态机实现与防重复提交
报到状态从 0 到 3,正常流程是:学生提交信息后变成 1(已预报到),到现场找辅导员核验身份证和录取通知书后变成 2(现场核验),领取宿舍钥匙和校园卡后变成 3(完成)。这三步必须在后端做状态管制,不能只靠前端传个 status 就给改。
后端更新状态的接口,要接收两个参数:studentId 和目标状态 targetStatus。Service 层先查出当前状态,再判断是否允许从当前状态跳到目标状态。比如一个学生还在状态 0(未报到),管理端直接把他改成 3(完成)就不合理,系统要拦下来并提示“该学生尚未完成信息填报”。
// EnrollRecordServiceImpl.java 关键片段 public boolean updateStatus(Long studentId, Integer targetStatus, Long operatorId) { // 查当前最新记录 EnrollRecord latest = enrollRecordMapper .findLatestByStudentId(studentId); Integer currentStatus = latest == null ? 0 : latest.getStatus(); // 状态机校验:只允许顺序流转 0->1->2->3 if (targetStatus - currentStatus != 1) { // 特殊情况:已报到完成的不允许再改回 throw new IllegalStateException("状态流转非法"); } EnrollRecord record = new EnrollRecord(); record.setStudentId(studentId); record.setStatus(targetStatus); record.setOperatorId(operatorId); record.setReportTime(new Date()); return enrollRecordMapper.insert(record) > 0; }这段代码只允许状态每次递增 1,从 0 到 3 必须按顺序走。这样设计有两个好处:一是流程不可跳过,保证每个环节都被执行;二是每次状态变更都会插入一条新记录,天然留下操作日志。避免重复提交方面,前端做了按钮 loading 限制,后端再靠唯一索引兜底,同一学生同一状态只允许一条有效记录。如果你想让表更严谨,可以把 student_id 和 status 设成联合唯一索引,但要注意这会牺牲日志追溯能力,我一般不加,靠业务校验就够了。
3.4 管理端接住辅导员的需求:条件查询、分页与统计卡片
管理端是典型的后台列表页,辅导员打开要看到“今天谁还没报到”“哪个学院报到率最低”。接口设计上,我通常会做三个接口:按条件分页查询学生列表、统计各学院报到率、单个学生的详情与状态变更记录。前端页面用下拉刷新和触底加载,数据量控制在每页 20 条,避免一次性拉全量。
分页查询接口的入参包括:keyword(学号/姓名)、collegeId、status、pageNum、pageSize。出参是列表数据和 total。管理端首页顶部放四个统计卡片:总人数、已报到、未报到、报到率。报表数据不要求实时精确到秒,缓存 30 秒就够了,减少数据库压力。
// pages/admin/list/list.js 片段 loadList() { const params = { keyword: this.data.keyword, collegeId: this.data.collegeId, status: this.data.status, pageNum: this.data.pageNum, pageSize: 20 }; request('/admin/student/page', 'GET', params) .then((res) => { const list = res.records.map((item) => { item.createTimeText = item.createTime.slice(0, 16); return item; }); this.setData({ students: this.data.pageNum === 1 ? list : this.data.students.concat(list), total: res.total, loading: false }); }); }注意代码里对 createTime 做了切片格式化,这是为了直接在列表上展示可读时间。如果你用云开发或后端返回的是时间戳,前端要用new Date(timestamp).toLocaleString()再格式化一遍。管理端页面里状态筛选我用的是 picker 或 tab,不要让学生用文字搜索“已报到”这种词,直接给状态值 0/1/2/3 的选项列表,查询逻辑更干净。
4. 源码目录与说明文档应该长什么样:照着这套结构写,答辩不慌
“源码+说明文档”这个组合里的另一半注意力,很多人放在“源码”上,其实“说明文档”才是答辩时的后悔药。代码写得好不好老师大概率不会逐行看,但文档写得乱,他翻两页就会质疑你的工程习惯。这里把源码目录和文档结构都讲清楚。
4.1 前端目录结构:pages、components、utils 各司其职
小程序端目录我会严格按功能分页拆分。pages 下每个页面一个文件夹,页面内部只放这个页面相关的逻辑;components 放公共组件,避免在多个页面里复制粘贴同一段表单样式;utils 放请求封装、校验函数、日期格式化工具。这样的好处是,说明文档里写目录结构时,你只需要用一张图解释职责,不需要逐行解释代码。
miniprogram/ ├── app.js # 全局逻辑,onLaunch 里检查登录态 ├── app.json # 页面路由和窗口配置 ├── app.wxss # 全局样式 ├── utils/ │ ├── request.js # 请求封装,统一带上 token │ └── validate.js # 身份证、手机号校验 ├── components/ │ └── status-tag/ # 报到状态标签组件 └── pages/ ├── login/ # 登录与学号绑定 ├── report/ # 新生信息填报 ├── progress/ # 报到进度查询 ├── admin/ │ ├── list/ # 管理端学生列表 │ └── detail/ # 学生详情与状态操作 └── mine/ # 个人中心app.json 里注册所有页面路径,第一个配登录页。路由跳转上,登录页不要用 navigateTo 反复进入,判断到已有 token 就直接 reLaunch 到报到页。components/status-tag 这个组件接收 status 数字,在内部做映射输出对应文案和颜色,这样管理端列表和详情页都能复用,不会出现一处改了三处漏改的情况。
4.2 后端目录与接口列表:让接手的人十分钟看懂项目
后端代码结构我用标准的 Spring Boot 分层:controller 管接收参数,service 管业务逻辑,mapper 管数据库访问。entity 里是数据库表对应的实体类。课程设计规模下,不要引入太复杂的设计模式,Controller 里直接调用 Service,Service 里写状态机校验,足够清晰。
接口文档是说明文档的核心章节,用一张表列清楚就能让老师明白整个系统有多少功能。我一般会把接口按模块分组列出:登录模块、学生报到模块、管理端模块。
| 接口路径 | 方法 | 入参 | 出参 | 说明 |
|---|---|---|---|---|
| /api/login | POST | code | token, isBound | 微信登录,校验是否绑定学号 |
| /api/auth/bind | POST | studentNo, idCardTail | token | 学号绑定 |
| /api/student/report | POST | 学生信息表单 | 无 | 提交报到信息 |
| /api/student/progress | GET | 无 | status, reportTime | 查报到进度 |
| /api/admin/student/page | GET | keyword, collegeId, status, pageNum | 分页数据 | 管理端列表 |
| /api/admin/student/status | POST | studentId, targetStatus | 无 | 管理端更新状态 |
接口表里的入参和出参,写字段名不写完整 JSON,让人看懂调用关系就行。真正详细的数据结构,放在每个接口定义代码的注释里。这一章如果写得好,老师会认为你有接口设计意识。
4.3 说明文档的写作顺序:从安装部署写到答辩预演
说明文档建议按下面这个顺序组织,每一章解决一个答辩时会被问到的问题。第一节写项目概述和功能清单,让老师五分钟内知道你做的是什么;第二节写技术选型及理由;第三节写部署步骤,必须写到能在新电脑上照着跑通;第四节写核心接口与数据库设计;第五节写测试用例和演示脚本;第六节写常见问题。
部署步骤这一节最容易出问题。我见过很多同学写“npm install 即可运行”,但老师换一台电脑跑起来缺依赖、报错,印象分直接打对折。正确写法是:前端写明用微信开发者工具导入哪个目录、填你自己的 AppID、在“详情-本地设置”里把“不校验合法域名”先勾上用于本地调试;后端写明 JDK 版本、Maven 打包命令、MySQL 初始化脚本位置,以及 application.yml 里数据库账号密码要改成什么。每一步配一张截图,截图里的域名和端口要和代码里保持一致,否则就是自己挖坑。
5. 新手部署最常踩的 5 个坑:现象、原因、解决方案
写这套系统的过程中,有几个坑几乎每个学生都绕不过去。我把它们分成前后端和文档三类,按“现象 -> 原因 -> 解决”的方式写出来,你照着排查能省一整天。
5.1 真机预览白屏或请求失败:开发者工具的“不校验合法域名”是双刃剑
现象:在开发者工具里所有接口都通,预览到手机上就白屏,打开调试面板发现 request:fail。原因:开发者工具默认勾选了“不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”,你本地请求 http://localhost:8080 或内网 IP 都能通,但真机上微信要求所有 request 域名必须是在小程序后台配置过的 HTTPS 合法域名。解决:小程序后台的“开发管理-服务器域名”里添加 request 合法域名;如果还没买域名,临时做法是开发者工具里点“真机调试”,它会走本地调试通道,不受域名限制,但只适合开发演示;正式演示最好用已经备案的域名加 HTTPS 证书。前后端分离部署时,后端接口如果挂在 8080 端口,要用 Nginx 做一层反向代理,让请求路径统一走 443 端口。
5.2 wx.login 的 code 只能用一次:token 失效背后的真相
现象:系统跑了一会儿,部分用户突然所有请求都返回 401,退出重新登录又好了;或者连续快速登录时第二次就报“code been used”。原因:微信的 code 是单次有效凭证,wx.login 每次生成的 code,一旦后端拿去换过一次 session_key 就作废。前端如果没做登录态管理,每次 onShow 都调用 wx.login,同一秒内连续触发两次,第二次就拿旧 code 去换,自然失败。另一个关联问题是 token 过期时间设太短,学生填表填了十分钟,回来提交时 token 失效,表单数据全丢。解决:前端只在需要登录时调用 wx.login,拿到 token 后写入 storage 并记录过期时间戳;wx.request 封装里检查剩余有效期,快过期再静默调 wx.login 续期。后端 session_key 有效期其实有官方时长限制,但自定义 token 的过期时间建议设 7 天,配合“微信小程序设置缓存时间”的做法,让用户在会话期内不需要反复登录。
5.3 setData 同步大列表导致页面卡顿
现象:管理端列表滑到后面越来越卡,甚至在真机上直接白屏。原因:一次性把几十上百条学生数据 setData 到 data 里,这些数据会以 JSON 形式通过逻辑层和渲染层之间的通信通道传到视图层,数据量一大,通信开销就会拖垮渲染。解决:后端做分页,前端触底加载下一页,每页控制在 20 条以内;列表项不要把 idCard、address 这些长字段一起渲染,列表里只显示姓名学号手机号,详情页再查全量;状态变更后只更新那一条记录对应的字段,不用重新拉整个列表。还有一个小细节:图片或图标不要直接塞 base64 字符串进 data,要么用 CDN 地址,要么把图片本地静态化。
5.4 图片上传成功但管理端看不到
现象:学生上传了证件照或录取通知书照片,提示上传成功,但管理端列表和详情页都显示空白。原因:wx.chooseImage 拿到的临时文件路径是 wxfile://tmp_xxx,这个路径只在当前小程序生命周期内有效,不持久化;项目里如果用传统后端存储,常见问题还有照片存到了本地磁盘,但图片请求的静态路径没有暴露给管理端域名。解决:使用微信云开发的云存储能力,wx.cloud.uploadFile 上传后拿到 fileID,存到数据库里,管理端通过 cloud:// 协议直接引用;如果坚持用自建后端,把文件存到一个统一的上传目录,后端配置静态资源映射,返回可访问的完整 URL 给前端,注意这个 URL 要在 request 合法域名对应的域名下,否则图片也会被微信拦截。上传前还要做文件类型和大小限制:图片压缩到 2MB 以内,只允许 jpg/jpeg/png 格式。
5.5 说明文档和代码对不上:答辩翻车的重灾区
现象:文档里写的接口叫 /api/student/submit,代码里实际是 /api/student/report,老师照文档测试直接 404,你现场改代码或改文档都很尴尬。原因:开发过程中改过接口名,但文档是最后几天补写的,很多地方直接复制了旧版截图和代码片段。解决:文档写完不是终点,答辩前必须做一遍“文档验收”——照着文档从头部署一次,每个接口用后端 Swagger 页面或前端页面实际调一遍,截图重新截,代码块里入参出参字段逐一核对。这一步确实枯燥,但它是说明文档可信度的唯一保证。我自己的习惯是部署和调试都跑通了再截图,宁可慢两天,也不交一份自己都没验证过的文档。
6. 验收 20 分钟清单:从新生端到管理端走一遍完整报到流程
答辩前最后一天,别急着背稿子,先把下面这个流程完整走一遍。找一个测试微信号,准备两个账号:一个模拟新生,一个模拟管理员。用手机真机预览而不是开发者工具,因为域名校验和缓存策略在真机上表现不一样。按照表格里的顺序操作,每过一步就在心里打个勾:
| 操作步骤 | 预期结果 | 失败排查方向 |
|---|---|---|
| 打开小程序,允许授权 | 出现登录页,按钮可点击 | 检查 AppID 是否填写 |
| 点击登录,输入学号身份证后六位绑定 | 绑定成功进入报到页 | 看后端日志中 code2session 是否正常 |
| 填写完整表单并提交 | 提示提交成功,跳到进度页 | 看是否有入参校验拦截 |
| 退出小程序重新进入 | 仍保持登录态,进度页显示已预报到 | 看 token 缓存是否被清除 |
| 管理端登录,打开学生列表 | 列表出现测试学生,状态为已预报到 | 查分页接口参数是否正确 |
| 管理端点击“现场核验” | 学生端进度变为现场核验 | 查状态机校验逻辑 |
| 到“已完成”状态 | 统计卡片报到率 +1 | 查统计 SQL 是否按状态过滤 |
| 用错误身份证号提交表单 | 前端提示格式错误,不发起请求 | 检查 validate 正则 |
最后这几分钟你可能会遇到一些平时没暴露的边界问题,比如列表加载第二页时数据重复、状态更新后统计卡片没刷新、token 过期后跳转到了错误页面。别慌,这些大概率是缓存和分页参数的问题,优先处理状态和统计卡片,因为它直接影响老师对“系统能不能用”的判断。我习惯在答辩前把手机调到勿扰模式,后台把微信开发者工具和数据库日志都打开,万一现场翻车能第一时间看到报错,而不是对着白屏发呆。
希望这套从选型到部署的流程能帮你少走点弯路,如果你照着写项目,记得把说明文档当代码一样认真对待,它会让你答辩时多一份底气。
本文还有配套的精品资源,点击获取