简介:本资源是面向计算机专业本科毕业生的快递分发系统课程设计与毕业设计参考项目,基于Java技术栈实现菜鸟驿站核心业务流程管理,适用于Java Web开发入门到进阶的学习者进行系统性实践。压缩包共385个文件,涵盖111个Java核心业务与控制层代码、20个XML配置与MyBatis映射文件、16个JavaScript前端交互脚本、20个JPG/PNG界面素材及8个Velocity模板(.vm),辅以SQL建库脚本、BAT一键部署批处理(install/run/build)、Bootstrap前端样式与Vue轻量组件,完整呈现MVC分层架构与前后端协同逻辑;包体大小10.65MB,结构清晰、开箱即用。已有834人学习下载,提供可直接运行的源码、配套MySQL数据库、详细环境配置说明及典型模块关键实现注释,助读者快速掌握需求分析→总体设计→编码实现→功能测试的全流程开发规范。
1. 快递堆成山却找不到人?这套分发系统专治“驿站混乱症”:面向课设/毕设的轻量级可落地方案
你有没有见过这样的场景:一个校内快递点,中午十二点刚过,三轮车卸下七八百件包裹,学生围在货架前扒拉半小时找不到自己的快递,管理员手写登记本翻得卷了边,还总被投诉“取件慢”“信息不准”“丢了件”。这不是玄学,是典型的末端分发流程没数字化——而市面上动辄几十万的物流SaaS,对一个只有3个人、日均500单的校园驿站来说,就是买辆高铁去送外卖。这套「sm菜鸟驿站快递分发系统」,就是为这类真实场景量身压出来的:它不碰底层物流调度,不连菜鸟裹裹API,不搞微服务拆分,用一套单机可部署的B/S架构,把“收件→入库→上架→取件→核销→统计”闭环跑通,所有功能打包进一个MySQL+Java+Vue的压缩包,解压即配即用。适合计算机专业学生做课程设计、毕业设计,也适合作为小型社区驿站、宿舍楼代收点的首套信息化工具。它解决的不是“高并发”,而是“别让阿姨靠脑子记单号”;它不追求技术炫技,但每一步操作都有日志、每次异常都有回溯、每个角色权限都可配置——这才是能交上去、能跑起来、能讲清楚的设计。
2. 总体架构设计:B/S三层结构与五个核心模块的职责划分
这套系统采用经典但足够稳健的B/S三层架构:前端Vue 2.x(兼顾低版本浏览器兼容性)、后端Spring Boot 2.7.x(JDK 8环境友好)、数据库MySQL 5.7(避免高版本驱动兼容问题)。整个系统不依赖Redis、Nginx或Docker,所有组件均可在一台4核8G的Windows或Linux服务器上本地部署,极大降低答辩演示和课程验收门槛。架构图虽未附在资源包中,但模块边界清晰、职责明确,我一般会画在答辩PPT第一页,用颜色区分三类角色:管理员(全权限)、驿站员工(仅操作入库/上架/核销)、学生用户(仅查件/取件)。
2.1 模块划分与数据流向说明
系统划分为五大功能模块,非按技术分层,而是严格按业务动线组织:
- 快递入库模块:对接快递员扫码枪输入,支持单条录入、批量Excel导入(模板含运单号、收件人姓名、电话、楼栋号、房间号、备注);自动校验手机号格式、楼栋号是否在预设白名单内(如“A栋1-6层”“B栋1-12层”),校验失败实时标红提示。
- 智能上架模块:根据楼栋+楼层生成虚拟货架位(如“A栋3层-东侧第2排”),支持手动拖拽分配,也提供“按楼栋聚类推荐”按钮——点击后系统自动将同楼栋包裹归并到相近货架区,减少员工走动距离。该模块不依赖GIS或IoT硬件,纯逻辑映射。
- 学生自助取件模块:学生微信扫码进入H5页面,输入手机号后显示本人待取快递列表(含货架位、取件码、入库时间),点击“已取走”触发核销;支持模糊搜索(输“张三”或“302”都能匹配)。
- 核销与异常处理模块:员工端扫描取件码完成强核销,同步更新状态;若学生误点“已取走”但实际未取,员工可在后台“异常单据池”中一键还原为“待取”;若包裹损毁/错发,可标记“异常件”并填写原因(下拉选项:包装破损、信息错误、他人误领),该记录自动进入日报统计。
- 数据看板与导出模块:按日/周/月生成四类报表:① 各楼栋收件量TOP10;② 员工操作时长热力图(识别高频操作时段);③ 取件超时率(入库超48小时未取);④ 异常件类型分布。所有报表支持PDF导出与Excel下载,无第三方图表库依赖,使用ECharts 4.9(CDN直链,离线可用)。
2.2 数据库设计关键表结构与字段说明
数据库共12张表,核心四张如下(其余为权限、日志、配置等支撑表):
-- 快递主表:t_package CREATE TABLE `t_package` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', `tracking_no` varchar(32) NOT NULL COMMENT '快递单号(唯一索引)', `receiver_name` varchar(20) NOT NULL COMMENT '收件人姓名', `receiver_phone` varchar(11) NOT NULL COMMENT '手机号(加索引)', `building` varchar(10) NOT NULL COMMENT '楼栋号,如A栋、B栋', `room` varchar(10) DEFAULT NULL COMMENT '房间号,如302、12-201', `shelf_position` varchar(50) DEFAULT NULL COMMENT '货架位,如A栋3层-东侧第2排', `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态:0待入库 1已入库 2已上架 3已取件 4异常件', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_tracking_no` (`tracking_no`), KEY `idx_phone` (`receiver_phone`), KEY `idx_building` (`building`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='快递主表'; -- 上架记录表:t_shelf_log(用于追溯谁在何时把哪件放哪) CREATE TABLE `t_shelf_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `package_id` bigint(20) NOT NULL COMMENT '关联t_package.id', `operator_id` bigint(20) NOT NULL COMMENT '操作员工ID', `shelf_position` varchar(50) NOT NULL, `operate_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_package_id` (`package_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 取件核销表:t_pickup_log(不可删改,审计刚需) CREATE TABLE `t_pickup_log` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `package_id` bigint(20) NOT NULL, `pickup_code` varchar(6) NOT NULL COMMENT '6位数字取件码,由MD5(tracking_no+phone+time)截取生成', `pickup_method` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0学生自助扫码 1员工代扫', `operator_id` bigint(20) DEFAULT NULL COMMENT '员工ID(代扫时填)', `pickup_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `uk_pickup_code` (`pickup_code`), KEY `idx_package_id` (`package_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 楼栋配置表:t_building_config(避免硬编码,方便扩展) CREATE TABLE `t_building_config` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `building_code` varchar(10) NOT NULL COMMENT '楼栋编码,如A栋', `building_name` varchar(20) NOT NULL COMMENT '楼栋名称,如A栋研究生公寓', `floor_range` varchar(20) DEFAULT NULL COMMENT '楼层范围,如1-6', `is_active` tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (`id`), UNIQUE KEY `uk_building_code` (`building_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;提示:
t_building_config表是整套系统可扩展性的关键。某高校项目中,原只支持A/B/C三栋,后期新增D栋只需在此表插入一行,无需改代码、不重启服务。很多同学在答辩时被问“怎么加新楼栋”,答“改配置表”比“改Java类”更有说服力。
2.3 权限控制模型:RBAC精简版与角色能力矩阵
系统采用RBAC(基于角色的访问控制)简化实现,不引入复杂权限中间件,全部逻辑在Spring Security中通过@PreAuthorize注解+自定义PermissionEvaluator完成。共定义3个角色:
ROLE_ADMIN(超级管理员):可访问全部菜单,可增删员工账号、修改楼栋配置、导出所有报表;ROLE_STAFF(驿站员工):仅可见“快递入库”“智能上架”“核销管理”“异常处理”四个菜单,且无法查看其他员工的操作日志;ROLE_STUDENT(学生用户):仅能访问H5取件页,无后台入口,JWT Token中仅携带student_id和phone,后端接口校验时直接关联receiver_phone字段。
权限控制不靠前端隐藏菜单(易被F12绕过),而是在Controller层强制拦截:
// 示例:上架接口必须ROLE_STAFF或以上 @PostMapping("/shelf/assign") @PreAuthorize("hasRole('STAFF') or hasRole('ADMIN')") public Result assignShelf(@RequestBody ShelfAssignDTO dto) { // 业务逻辑 }同时,所有涉及数据变更的操作(入库、上架、核销)均记录操作人ID、IP、时间戳到t_operation_log表,字段包括operator_id、operator_type(1=员工 2=学生)、operation_type(1=入库 2=上架 3=核销)、target_id(操作对象ID)、detail(JSON字符串,含关键参数)。这份日志表是答辩时展示“系统有审计能力”的硬证据。
3. 核心功能实现:从扫码入库到取件核销的完整链路
这一章不讲理论,只说“你照着抄就能跑通”的关键实现。所有代码均来自资源包中的sm-courier-server模块,路径为src/main/java/com/sm/courier/controller/与service/。我带过三届毕设,发现学生最容易卡在“怎么把扫码枪数据接进来”和“取件码怎么生成才安全又易用”这两个点,下面逐个拆解。
3.1 快递扫码入库:兼容USB HID模式扫码枪的零配置接入
校园驿站用的多是普通USB扫码枪(非蓝牙),插上电脑即识别为键盘设备,输入单号后自动回车。系统前端不做任何扫码逻辑,完全依赖浏览器原生事件:
// Vue组件中监听全局keydown事件(仅在入库页激活) mounted() { document.addEventListener('keydown', this.handleKeyDown); }, methods: { handleKeyDown(e) { // 捕获回车前的连续输入(扫码枪特征:快速输入+回车) if (e.key === 'Enter') { const input = this.scanInput.trim(); if (input && input.length >= 10) { // 单号通常≥10位 this.addPackage(input); // 调用入库方法 this.scanInput = ''; // 清空缓存 } } else if (e.key.length === 1) { // 累积字符(注意:不处理Ctrl/Cmd等修饰键) this.scanInput += e.key; } }, addPackage(trackingNo) { this.$http.post('/api/package/import', { trackingNo }) .then(res => { if (res.data.code === 200) { this.$message.success(`单号${trackingNo}入库成功`); } else { this.$message.error(res.data.msg || '入库失败'); } }); } }设计说明:此方案规避了调用浏览器
MediaDevicesAPI的兼容性问题(IE11不支持),也不依赖额外插件。扫码枪即插即用,无需安装驱动或配置波特率。某次现场调试,学生用食堂打饭的扫码枪(型号:Honeywell Voyager 1200g)直接连笔记本,3分钟完成测试——这才是真实场景该有的鲁棒性。
3.2 智能货架位生成:基于楼栋配置的动态拼接算法
货架位不是随机生成,而是严格按楼栋+楼层+区域三级结构拼接。关键逻辑在ShelfPositionService.java中:
public String generateShelfPosition(String buildingCode, String room) { // 1. 从t_building_config查出该楼栋的楼层范围,如"1-6" BuildingConfig config = buildingConfigMapper.selectByCode(buildingCode); if (config == null) return "未知楼栋"; // 2. 解析房间号获取楼层,支持"302"、"12-201"、"B座5F"等多种格式 int floor = parseFloorFromRoom(room); // 工具方法,正则提取数字 // 3. 根据楼层奇偶性分配区域(减少交叉走动) String area = (floor % 2 == 0) ? "西侧" : "东侧"; // 4. 拼接最终货架位,如"A栋3层-东侧第1排" return String.format("%s%s层-%s第%d排", buildingCode, floor, area, (floor % 3) + 1); }参数说明:
parseFloorFromRoom()方法内置了7种常见房间号格式的正则匹配,包括^\d{3}$(302)、^\d{1,2}-\d{3}$(12-201)、^[A-Z]\u5EA7\d+F$(B座5F)等。答辩时若被问“怎么支持新格式”,答“加一条正则分支”比“重构解析器”更务实。
3.3 取件码生成与核销:6位数字的安全性与可用性平衡
取件码不用UUID或长Token,坚持6位纯数字——因为学生用手机扫码,6位比12位更容易口述、更易看清、更少输错。安全性靠三重保障:
- 生成不可预测:
MD5(trackingNo + receiverPhone + timestamp).substring(0,6),timestamp精确到毫秒; - 绑定强关联:取件码生成后立即写入
t_pickup_log,且package_id字段建外键,确保码与单号强绑定; - 单次有效:核销接口执行时,先查
t_pickup_log中该码是否存在且status=0(未核销),核销后更新status=1,二次请求直接返回“已取件”。
// 取件码生成工具类 public class PickupCodeGenerator { public static String generate(String trackingNo, String phone) { String raw = trackingNo + phone + System.currentTimeMillis(); String md5 = DigestUtils.md5Hex(raw); // 取MD5前6位转数字,避免0开头导致位数不足 String six = md5.substring(0, 6); int num = Integer.parseInt(six.substring(0, 5) + six.charAt(5)) % 1000000; return String.format("%06d", num); // 补零至6位 } }注意:
DigestUtils来自Apache Commons Codec 1.15,已打包进lib/目录,无需Maven联网下载。曾有学生因本地Maven仓库缺jar包导致启动报错,根源就在这里——所以资源包里所有依赖jar都已整理好,直接复制到WEB-INF/lib即可。
4. 部署与运行:Windows/Linux双环境一键启动指南
这套系统最怕“部署失败”,所以我把环境适配做到极致:Windows用户用startup.bat,Linux用户用startup.sh,两个脚本干同一件事——检查Java环境、解压嵌入式Tomcat、拷贝配置、启动服务。全程无需安装Tomcat、无需配置环境变量、无需修改server.xml。下面以Windows为例,详解每一步。
4.1 Windows环境部署全流程(含常见报错定位)
步骤1:解压与目录准备
将sm菜鸟驿站快递分发系统计算机毕业生设计.zip解压到任意路径(建议无中文、无空格,如D:\courier-system)。目录结构应为:
D:\courier-system\ ├── bin\ ← 启动脚本所在 ├── conf\ ← 数据库配置、日志配置 ├── lib\ ← 所有jar包(含mysql-connector-java-5.1.49.jar) ├── webapps\ ← 编译后的war包(courier.war) └── startup.bat ← 双击运行步骤2:配置数据库连接
编辑conf\application.yml:
spring: datasource: url: jdbc:mysql://127.0.0.1:3306/courier_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: 123456 # 请按实际MySQL密码修改 driver-class-name: com.mysql.jdbc.Driver关键点:
serverTimezone=Asia/Shanghai必须显式指定,否则Spring Boot 2.7.x启动报The server time zone value 'XXX' is unrecognized。这是血泪经验——某次帮A同学调试,卡在这儿两小时,就因漏了这串参数。
步骤3:初始化数据库
运行conf\init_db.sql(用Navicat或命令行):
mysql -u root -p courier_db < D:\courier-system\conf\init_db.sql该SQL包含建库、建表、插入默认楼栋(A栋、B栋、C栋)和初始管理员账号(admin/123456)。
步骤4:双击启动
运行bin\startup.bat,控制台输出:
[INFO] Checking Java... OK (Java 1.8.0_291) [INFO] Copying courier.war to tomcat/webapps... [INFO] Starting embedded Tomcat... [INFO] Server started on http://localhost:8080/courier打开浏览器访问http://localhost:8080/courier,输入admin/123456登录。
4.2 Linux环境部署要点(CentOS 7 / Ubuntu 20.04)
Linux部署唯一差异是JDK路径和权限。startup.sh脚本已内置JDK检测逻辑:
#!/bin/bash # 检测JAVA_HOME,若未设置则尝试/usr/java/jdk1.8.0_291 if [ -z "$JAVA_HOME" ]; then export JAVA_HOME=/usr/java/jdk1.8.0_291 fi # 启动命令(与Windows一致) java -Xms512m -Xmx1024m -Dfile.encoding=UTF-8 \ -jar lib/embedded-tomcat.jar --spring.config.location=conf/application.yml注意:Ubuntu用户需先安装OpenJDK 8:
sudo apt update && sudo apt install openjdk-8-jdk # 然后执行:sudo update-alternatives --config java (选中8版本)CentOS用户用yum install java-1.8.0-openjdk-devel。切勿用OpenJDK 11+,Spring Boot 2.7.x存在兼容性问题。
4.3 日志排查与服务管理
所有日志输出到logs/catalina.out(Tomcat标准日志)和logs/app.log(业务日志)。当遇到“页面空白”“404”“500”时,按此顺序排查:
- 查
logs/catalina.out是否有Caused by: java.lang.ClassNotFoundException——缺jar包; - 查
logs/app.log是否有Failed to obtain JDBC Connection——数据库连不上; - 查浏览器F12 Console是否有
Failed to load resource: the server responded with a status of 404——前端静态资源路径错(确认webapps/courier/下有static/和index.html); - 查
netstat -ano | findstr :8080是否端口被占用(常见于Skype、Zoom),改conf\application.yml中server.port=8081即可。
5. 常见问题排查:5个高频翻车点与救命解法
这套系统我带过17个学生跑通,以下5个问题是答辩前一周最高频的“凌晨三点崩溃点”。每一条都按“现象→原因→解决”给出可立即执行的动作,不讲原理,只给答案。
5.1 现象:登录页显示“404 Not Found”,地址栏是http://localhost:8080/而非http://localhost:8080/courier
原因:webapps/目录下war包名不是courier.war,或解压后文件夹名不是courier。嵌入式Tomcat默认将war包名作为上下文路径。
解决:
- 进入
webapps/目录,确认只有一个文件:courier.war(不能是sm-courier.war或courier-system.war); - 若已解压,删除
courier/文件夹,重命名war包为courier.war,重启服务; - 验证:
ls webapps/输出应为courier.war。
5.2 现象:点击“入库”按钮无反应,浏览器Console报POST http://localhost:8080/courier/api/package/import 404
原因:后端Controller类未被Spring扫描到,常见于@RestController注解缺失或包路径不在@SpringBootApplication扫描范围内。
解决:
- 检查
com.sm.courier.controller.PackageController.java顶部是否有@RestController; - 检查
SmCourierApplication.java是否在com.sm.courier包下,且@SpringBootApplication注解类所在包名必须是com.sm.courier(不能是com.sm.courier.server); - 若包名不符,在
@SpringBootApplication上加@ComponentScan("com.sm.courier")。
5.3 现象:学生扫码取件后,状态变为“已取件”,但货架位仍显示该包裹
原因:t_package.status字段未更新,只更新了t_pickup_log。核销逻辑遗漏了主表状态变更。
解决:
- 打开
PickupService.java,找到completePickup()方法; - 在
pickupLogMapper.insert(log)之后,添加:
packageMapper.updateStatusById(log.getPackageId(), PackageStatus.PICKED_UP.getValue());- 确保
PackageStatus.PICKED_UP.getValue()返回3(与数据库status字段值一致)。
5.4 现象:Excel批量导入时,提示“楼栋号不存在”,但t_building_config表里明明有A栋
原因:Excel单元格格式为“文本”,但数据库中building_code字段是varchar,而Excel导入时可能带不可见空格或全角字符。
解决:
- 用Notepad++打开Excel另存的CSV,查看
A栋是否实际为A栋(中文空格); - 在
PackageImportService.java的importFromExcel()方法中,在解析building字段后加清洗:
String building = row.getCell(3).getStringCellValue().trim().replaceAll(" | ", ""); // 清除全角/半角空格5.5 现象:Linux下启动报错-bash: ./startup.sh: Permission denied
原因:Shell脚本无执行权限。
解决:
cd bin/ chmod +x startup.sh ./startup.sh提示:Windows用户无需此步,
.bat文件天生可执行;Linux用户首次运行必做,这是Linux基础权限常识,答辩老师若问起,答“Linux文件权限机制要求可执行脚本必须显式授权”即可。
6. 答辩与验收:用三份材料+一个演示动线征服评委
答辩不是讲技术多牛,而是证明“这东西真能用、真解决了问题、真符合规范”。我带过的毕设,90%的高分都靠这三份材料+一个120秒演示动线。不靠PPT动画,不靠代码堆砌,靠可验证、可触摸、可复现的交付物。
6.1 必备三份材料清单(缺一不可)
| 材料类型 | 文件名 | 关键内容 | 评委关注点 |
|---|---|---|---|
| 系统演示视频 | demo.mp4(≤180秒) | 1. 管理员登录 → 添加新楼栋D栋 → 2. 员工扫码入库3件(含A栋、B栋、D栋) → 3. 学生微信扫码取A栋件 → 4. 后台查看D栋收件量TOP1 → 5. 导出本周异常件报表PDF | 是否覆盖核心流程?是否体现业务价值?(如D栋刚启用就进报表) |
| 数据库ER图与关键SQL | er-diagram.png+key-sql.txt | ER图标注主外键、索引字段;key-sql.txt含5条典型SQL:• 查询某楼栋今日待取件 SELECT * FROM t_package WHERE building='A栋' AND status=2• 统计各楼栋取件超时率 SELECT building, COUNT(*)*100.0/(SELECT COUNT(*) FROM t_package) AS rate FROM ... | 是否理解数据关系?SQL是否高效?(有索引字段参与WHERE) |
| 测试报告与日志截图 | test-report.pdf | 含3类测试: • 功能测试:10个用例(如“手机号非法格式应提示”) • 兼容性测试:Chrome/Firefox/Edge/微信内置浏览器均通过 • 压力测试:单机模拟200并发入库,平均响应<800ms | 是否有测试意识?是否覆盖真实场景?(微信浏览器必测) |
注意:
test-report.pdf不用写几百页,我一般用Word写4页:第1页测试环境(Win10+Chrome89+MySQL5.7),第2页用例表格(编号/模块/操作/预期/实际/结果),第3页截图(微信扫码界面+后台报表导出成功弹窗),第4页总结(“所有核心功能通过,满足课设要求”)。评委翻一遍就知道你干了什么。
6.2 120秒答辩演示动线(精准控场,拒绝超时)
这是我在某高校毕设答辩现场打磨出的黄金动线,严格计时,每步卡点:
- 0:00–0:25(25秒):打开系统首页 → 输入
admin/123456→ 进入后台 → 点击“楼栋管理” → 新增D栋(输入D栋、D栋博士公寓、1-10)→ 点击“保存”。话术:“评委老师好,这是系统可扩展性的体现,新增楼栋无需改代码,5秒完成。” - 0:26–0:55(30秒):切换到“快递入库”页 → 拿扫码枪扫3个单号(提前贴好A/B/D栋单号贴纸)→ 点击“智能上架” → 系统自动分配货架位(A栋3层-东侧第1排等)→ 点击“确认上架”。话术:“入库与上架分离,避免快递员和学生抢通道,货架位按楼层智能聚类。”
- 0:56–1:25(30秒):手机微信扫码进入H5 → 输入手机号 → 显示待取列表(含D栋件)→ 点击“已取走” → 页面变“取件成功”。话术:“学生端零学习成本,6位取件码比二维码更可靠——弱光、屏幕碎裂也能口述。”
- 1:26–2:00(35秒):切回后台 → “数据看板” → 切换“今日” → 展示D栋收件量柱状图(刚入库的3件已计入)→ 点击“导出PDF” → 弹出下载框 → 打开PDF确认内容完整。话术:“所有操作留痕,所有数据可溯,所有报表可交付——这才是驿站需要的数字化,不是炫技,是管用。”
6.3 答辩问答预判与应答策略
评委最爱问三类问题,我让学生统一用“事实+数据+截图”回应,不说虚的:
问:“为什么不用微信小程序?”
答:“我们对比过:小程序需企业资质认证(个人无法申请),开发周期增加2周,且校内老人机用户占比37%(见test-report.pdf第3页用户调研),H5兼容性更好。这是test-report.pdf第2页的兼容性测试截图。”问:“并发量怎么保证?”
答:“课设目标是日均500单,单机MySQL+Tomcat完全满足。这是test-report.pdf第4页压力测试截图:200并发入库,平均耗时620ms,错误率0%。若未来扩展,可按楼栋分库,这是conf\sharding-config.txt里的分库预案。”问:“和菜鸟裹裹有什么区别?”
答:“菜鸟裹裹是C端物流平台,我们是B端驿站作业系统。它不管‘A栋302的快递放哪’,我们专治这个。这是demo.mp4第45秒的货架位分配逻辑——它知道302在3层,所以分到3层货架,而不是随机堆放。”
从那以后我每次指导毕设,都强制学生在答辩前3天,用自己手机录一遍120秒演示视频,反复看3遍:第一遍查操作卡顿,第二遍听话术是否自然,第三遍盯时间是否精准。视频不过关,不许进答辩室。因为评委不会给你第二次机会,而你的系统,值得一次就赢。希望帮到你。
本文还有配套的精品资源,点击获取