尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于SpringBoot+微信小程序+AI的智能快递代收系统设计与实现

基于SpringBoot+微信小程序+AI的智能快递代收系统设计与实现 高校毕设选题年年都在变但最近两年有一个非常明显的趋势SpringBoot 写后端、微信小程序做前端、AI 大模型加亮点。这三个关键词组合在一起几乎就是当前计算机毕业设计项目的“顶配”——既能体现传统后端开发功底又能展示全栈工程能力还能踩中 AI 时代的技术热点。但问题是很多同学选了类似的题目之后做着做着就卡住了。要么是 SpringBoot 和微信小程序之间数据对接不通要么是 AI 功能不知道怎么和业务场景结合要么是功能做了不少但答辩时讲不出技术深度。这篇文章就以“基于 SpringBoot 微信小程序 AI 的智能快递代收系统”为例子把这类项目的完整设计思路、核心代码实现、AI 落地方式以及答辩准备要点全部拆开讲一遍。如果你正准备做外卖、校园跑腿、快递代取、社区服务类小程序这套思路同样可以直接复用。1. 为什么“智能快递代收”适合做计算机毕业设计先说一个核心判断快递代收系统是一个“业务场景真实、技术覆盖全面、AI 结合自然”的毕业设计选题。它不像纯商城系统那样同质化严重也不像纯算法项目那样脱离工程实践而是把硬件场景快递柜/驿站、移动端应用、后台管理、智能决策四个层面串在了一起。从业务角度看校园和社区场景里快递代收的需求是真实存在的快递员把包裹放到代收点但需要手动录入取件信息效率低且容易出错。用户取件时需要报手机号或取件码高峰期排队严重。包裹滞留无人取占用货架资源代收点需要手动提醒。用户不知道包裹什么时候到、在哪里取、找谁问。从技术角度看这个题目天然覆盖了计算机专业毕业设计最常见的考察点后端SpringBoot 框架、RESTful API、MyBatis/MyBatis-Plus、JWT 鉴权、定时任务。前端微信小程序原生开发或 uni-app 跨端开发、微信登录、扫码、消息通知。数据库MySQL 表设计、索引优化、事务处理。AIOCR 面单识别、智能取件码生成、AI 客服问答、滞留包裹预测。更关键的是这个项目不依赖实体硬件也能完整演示。不需要真的做一台快递柜只需要在小程序端模拟“存件、取件、扫码”的流程然后用 AI 能力把智能化亮点体现出来。对毕设来说这非常重要——很多同学想做物联网项目但一涉及硬件就失控而纯软件系统则没有这个风险。如果只看表面很多人会误以为快递代收系统就是“快递 CRUD 微信小程序列表页”。但真正做下去你会发现这个项目的核心难点和价值点在于怎么用 AI 把传统代收流程里的低效环节替换掉。这也是这篇文章想重点展开的地方。2. 系统功能模块拆解智能快递代收系统不是一个单端应用而是典型的“管理端 用户端 服务端”三端结构。在做需求分析时建议按角色来拆分功能。2.1 用户端微信小程序用户端面向普通收件人核心操作链路是“查快递 - 收到取件通知 - 取件 - 评价反馈”。主要功能模块如下微信授权登录通过 wx.login 获取 code后端向微信接口换取 openid作为用户唯一标识。快递列表展示用户当前所有待取包裹包含快递公司、单号、入库时间、取件码、存放位置。取件详情展示包裹的完整物流状态和时间线。扫码取件用户到代收点后扫描包裹面单上的条形码或二维码系统自动核销取件码。一键呼叫点击后通知代收点管理员用户正在取件可接入 WebSocket 或订阅消息。滞留提醒包裹超过设定时间未取系统自动推送提醒。AI 智能客服用户输入“我的包裹在哪”“XX快递到了吗”等自然语言AI 返回个性化结果。历史记录已取包裹查询。2.2 管理端Web 管理后台管理端面向快递代收点管理员核心目标是提升上架、查找、核销效率。主要功能模块如下快递入库支持手动录入和 AI 识别两种方式。手动录入是管理员输入快递公司和单号AI 识别是拍照上传面单OCR 自动提取关键字段。快递出库用户取件后管理员在小程序或后台点击出库或通过扫码枪自动核销。货架管理按货架编号、层数、格口维度管理包裹存放位置。滞留统计统计超过 N 天未取的包裹列表支持批量发送提醒。用户管理查看注册用户、取件频次、异常记录。数据看板展示今日入库量、出库量、滞留量、趋势图。管理员权限通过账号密码登录JWT 认证。2.3 服务端SpringBoot 后端服务端是系统的中枢职责包括提供 RESTful API 给小程序和管理后台调用。对接微信登录、订阅消息、支付如果需要。对接 AI 服务OCR、对话、预测。统一异常处理、参数校验、日志记录。从开发节奏上建议先打通“用户登录 - 快递入库 - 快递列表 - 取件核销”这条主链路然后再逐步加入 AI 功能和管理端能力。MVP最小可行产品思路在毕设项目里同样适用先跑通主流程再谈亮点。3. SpringBoot 微信小程序 AI 技术栈选型技术栈选型是一个毕业设计项目中最容易出问题但也最好展示思考深度的部分。很多同学一上来就用最新版本结果依赖冲突、配置不兼容浪费大量时间。下面是这套项目推荐的选型搭配。层次技术选型说明后端框架SpringBoot 2.7.x 或 3.x版本以实际项目为准优先稳定版本避免过高版本带来的兼容问题ORM 框架MyBatis-Plus简化单表 CRUD分页查询非常好用数据库MySQL 8.x业务数据存储权限认证JWT 拦截器无状态认证适合前后端分离微信小程序原生开发 或 uni-app原生上手快uni-app 可跨端AI 能力云厂商 OCR API 大模型知识库/对话 API不要自己训练模型业务场景直接调 API 最快接口文档Knife4j / Swagger方便调试和答辩演示部署云服务器 / 本地毕设演示本地 内网穿透即可这里需要重点提醒一个普遍问题SpringBoot 版本太高导致的各种诡异报错是最近几年毕设项目里出现频率最高的问题。如果你对版本兼容没有把握不要一上来就选最新版本稳定版本往往踩坑最少。同时SpringBoot 3.x 要求 JDK 17 及以上如果你的环境是 JDK 8务必保持 SpringBoot 2.x 版本否则就会出现编译失败、依赖注入不生效等问题。另外关于数据库不要为了“显得高级”而引入 Redis、MQ 等中间件。对一个毕设系统来说MySQL 完全够用。如果项目里确实需要缓存可以以“预留扩展”的方式在论文中说明而不是在代码里硬上。4. 系统架构与数据库设计4.1 分层架构整个系统的架构遵循经典的前后端分离结构后端按 Controller - Service - Mapper 三层组织。微信小程序 (前端) ↓ HTTPS/JSON SpringBoot 后端 ├── Controller 层接收请求、参数校验 ├── Service 层业务逻辑、事务管理 ├── Mapper 层数据库交互 ├── AI 服务模块OCR/对话 API 对接 └── 定时任务模块滞留包裹检测 ↓ MySQL 数据库这里有一个设计建议AI 能力一定要独立成一个 Service 模块比如AiOcrService、AiChatService。不要在 Controller 里直接写调用大模型接口的逻辑否则后续替换厂商、切换模型、或者做 Mock 测试都会很麻烦。4.2 数据库表设计数据库表不用贪多核心表控制在 6 到 8 张即可但每一张表的设计都要说得清楚。推荐包含以下表user用户表存储 openid、昵称、手机号、角色普通用户/管理员。admin管理员表存储登录账号、密码BCrypt 加密。express_order快递单表存储快递公司、单号、用户 ID、入库时间、取件码、状态待取/已取/滞留、货架位置。cabinet_slot货架格口表存储格口编号、状态空闲/占用、当前包裹 ID。pickup_record取件记录表存储取件时间、取件方式扫码/手动、操作人。notification_log通知记录表存储订阅消息发送结果。ai_chat_logAI 对话记录表存储用户问题、AI 回复、耗时。以快递单表为例核心 DDL 如下CREATE TABLE express_order ( id BIGINT NOT NULL AUTO_INCREMENT COMMENT 主键, user_id BIGINT DEFAULT NULL COMMENT 用户ID未认领时可空, express_company VARCHAR(50) NOT NULL COMMENT 快递公司, tracking_no VARCHAR(64) NOT NULL COMMENT 快递单号, pickup_code VARCHAR(10) DEFAULT NULL COMMENT 取件码, slot_code VARCHAR(20) DEFAULT NULL COMMENT 货架格口, status TINYINT NOT NULL DEFAULT 0 COMMENT 0待取 1已取 2滞留 3异常, in_time DATETIME DEFAULT NULL COMMENT 入库时间, pickup_time DATETIME DEFAULT NULL COMMENT 取件时间, qr_code VARCHAR(255) DEFAULT NULL COMMENT 面单条码/二维码内容, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (id), KEY idx_tracking_no (tracking_no), KEY idx_user_id (user_id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT快递单表;这里真正容易踩坑的是取件码的生成逻辑。很多同学会把取件码直接存在数据库然后随机生成但实际场景里取件码有更合理的设计方式取件码是在快递入库时由系统随机生成的 4-6 位数字或字母组合必须保证同时段内不重复。更稳妥的做法是用“随机数 Redis 去重”或者查库校验唯一性。5. SpringBoot 后端核心代码实现5.1 项目初始化与依赖配置以 SpringBoot 2.7.x JDK 8 为例如果你用 JDK 17可以直接选择 SpringBoot 3.x注意 javax 和 jakarta 包名差异pom.xml的核心依赖如下dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies配置文件application.yml使用如下server: port: 8080 servlet: context-path: /api spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/express_db?useUnicodetruecharacterEncodingutf8mb4serverTimezoneAsia/Shanghai username: root password: your_password servlet: multipart: max-file-size: 10MB mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0注意连接串中characterEncodingutf8mb4而不是utf8否则小程序端提交中文内容时可能出现乱码。5.2 统一返回结果封装建议不要直接返回 Map 或裸实体而是一个统一的结果对象。这样前端处理逻辑统一后端异常管理也统一。// 文件路径com/example/express/common/Result.java Data public class ResultT { private Integer code; private String message; private T data; public static T ResultT success(T data) { ResultT result new Result(); result.setCode(200); result.setMessage(success); result.setData(data); return result; } public static T ResultT error(Integer code, String message) { ResultT result new Result(); result.setCode(code); result.setMessage(message); return result; } }5.3 微信登录接口实现微信小程序登录的流程是小程序端wx.login拿到临时 code将它传给后端后端用 code 向微信接口换取 openid再用 openid 去数据库查用户不存在则自动注册。// 文件路径com/example/express/controller/AuthController.java RestController RequestMapping(/auth) public class AuthController { Resource private AuthService authService; PostMapping(/wx-login) public ResultLoginVO wxLogin(RequestBody WxLoginRequest request) { return Result.success(authService.wxLogin(request.getCode())); } }// 文件路径com/example/express/service/impl/AuthServiceImpl.java Service public class AuthServiceImpl implements AuthService { Value(${wechat.appid:}) private String appid; Value(${wechat.secret:}) private String secret; Resource private UserMapper userMapper; Resource private JwtUtil jwtUtil; Override public LoginVO wxLogin(String code) { // 1. 用 code 换 openid String url String.format( https://api.weixin.qq.com/sns/jscode2session?appid%ssecret%sjs_code%sgrant_typeauthorization_code, appid, secret, code ); RestTemplate restTemplate new RestTemplate(); String response restTemplate.getForObject(url, String.class); JSONObject json JSONObject.parseObject(response); String openid json.getString(openid); if (openid null) { throw new BusinessException(微信登录失败 json.getString(errmsg)); } // 2. 查库不存在则注册 User user userMapper.selectOne(new LambdaQueryWrapperUser() .eq(User::getOpenid, openid)); if (user null) { user new User(); user.setOpenid(openid); user.setNickname(微信用户); user.setRole(0); userMapper.insert(user); } // 3. 生成 JWT String token jwtUtil.generateToken(user.getId(), user.getRole()); LoginVO vo new LoginVO(); vo.setToken(token); vo.setUserId(user.getId()); vo.setRole(user.getRole()); return vo; } }关于“小程序获取登录后的微信用户失败”这个问题它在最近的热搜词里出现频率很高。需要特别提醒wx.getUserProfile 需要用户主动点击触发而直接使用微信头像昵称填写的 API 现在已经改为chooseAvatar和nickname输入框组件。也就是说在 2022 年之后的新版基础库中不能再直接用wx.getUserInfo获取用户头像昵称必须使用头像昵称填写能力。这是一个毕设项目里非常常见的“坑”答辩时讲清楚这一点反而能加分。5.4 快递入库与取件码生成快递入库是核心业务流程。管理员提交快递信息后后端生成取件码、分配货架格口、设置状态为待取。// 文件路径com/example/express/service/impl/ExpressOrderServiceImpl.java Override Transactional(rollbackFor Exception.class) public ExpressOrder createOrder(ExpressCreateRequest request) { // 1. 生成唯一取件码 String pickupCode generatePickupCode(); // 2. 分配货架格口 CabinetSlot slot cabinetSlotMapper.selectOne(new LambdaQueryWrapperCabinetSlot() .eq(CabinetSlot::getStatus, 0) .last(LIMIT 1)); if (slot null) { throw new BusinessException(货架已满请先释放格口); } slot.setStatus(1); cabinetSlotMapper.updateById(slot); // 3. 创建快递单 ExpressOrder order new ExpressOrder(); order.setExpressCompany(request.getExpressCompany()); order.setTrackingNo(request.getTrackingNo()); order.setPickupCode(pickupCode); order.setSlotCode(slot.getSlotCode()); order.setStatus(0); order.setInTime(LocalDateTime.now()); expressOrderMapper.insert(order); // 4. 如果表格里有 user_id则同时触发订阅消息 if (request.getUserId() ! null) { order.setUserId(request.getUserId()); expressOrderMapper.updateById(order); sendPickupNotify(order); } return order; } private String generatePickupCode() { // 生成 6 位数字取件码查库确保唯一 for (int i 0; i 5; i) { String code String.valueOf((int) ((Math.random() * 9 1) * 100000)); Long count expressOrderMapper.selectCount(new LambdaQueryWrapperExpressOrder() .eq(ExpressOrder::getPickupCode, code) .in(ExpressOrder::getStatus, 0, 2)); if (count 0) { return code; } } throw new BusinessException(取件码生成失败请重试); }这端代码的关键点有三个用Transactional保证快递单创建和货架占用两个操作原子性避免出现包裹入库了但货架没占用、或者货架被占用但订单创建失败。取件码确保唯一防止用户取错包裹。订阅消息是在订单创建成功之后触发的不要把它放进事务里太久否则微信接口响应慢会影响主流程。5.5 定时任务滞留包裹自动提醒复杂业务系统中定时任务非常常见在 SpringBoot 中实现也非常方便。利用Scheduled注解每天扫描一次滞留超过 3 天的包裹。// 文件路径com/example/express/job/ExpressJob.java Component public class ExpressJob { Resource private ExpressOrderMapper expressOrderMapper; Resource private WxSubscribeMessageService wxSubscribeMessageService; Scheduled(cron 0 0 10 * * ?) public void handleOverdueOrders() { LocalDateTime deadline LocalDateTime.now().minusDays(3); ListExpressOrder overdueOrders expressOrderMapper.selectList( new LambdaQueryWrapperExpressOrder() .eq(ExpressOrder::getStatus, 0) .lt(ExpressOrder::getInTime, deadline) ); for (ExpressOrder order : overdueOrders) { order.setStatus(2); expressOrderMapper.updateById(order); if (order.getUserId() ! null) { wxSubscribeMessageService.sendOverdueRemind(order); } } } }启动类记得加上EnableSchedulingSpringBootApplication EnableScheduling public class ExpressApplication { public static void main(String[] args) { SpringApplication.run(ExpressApplication.class, args); } }6. 微信小程序端设计与实现6.1 小程序项目目录结构小程序端建议用原生开发结构简单、调试方便也便于答辩时逐行讲解。miniprogram/ ├── pages/ │ ├── index/ # 首页快递列表 │ ├── detail/ # 快递详情 │ ├── scan/ # 扫码取件 │ ├── profile/ # 个人中心 │ └── chat/ # AI 客服聊天 ├── utils/ │ ├── request.js # 封装 wx.request │ ├── auth.js # 登录与 token 管理 │ └── util.js ├── app.js ├── app.json └── app.wxss6.2 登录流程实现小程序端启动时先检查本地是否有 token没有则调用wx.login换取 code 传给后端。// 文件路径miniprogram/utils/auth.js const BASE_URL http://localhost:8080/api; function login() { return new Promise((resolve, reject) { wx.login({ success: (res) { wx.request({ url: ${BASE_URL}/auth/wx-login, method: POST, data: { code: res.code }, success: (resp) { if (resp.data.code 200) { wx.setStorageSync(token, resp.data.data.token); wx.setStorageSync(userId, resp.data.data.userId); resolve(resp.data.data); } else { reject(resp.data); } }, fail: reject }); }, fail: reject }); }); } module.exports { login, BASE_URL };6.3 扫码取件实现扫码取件是小程序端最贴近真实场景的功能。用户点击“扫码取件”小程序调用wx.scanCode将扫码结果发送给后端核验。// 文件路径miniprogram/pages/scan/scan.js const { BASE_URL } require(../../utils/auth); Page({ handleScan() { wx.scanCode({ onlyFromCamera: false, success: (res) { const qrContent res.result; wx.request({ url: ${BASE_URL}/express/scan-pickup, method: POST, header: { Authorization: Bearer ${wx.getStorageSync(token)} }, data: { qrContent }, success: (resp) { if (resp.data.code 200) { wx.showToast({ title: 取件成功, icon: success }); setTimeout(() wx.switchTab({ url: /pages/index/index }), 1500); } else { wx.showToast({ title: resp.data.message, icon: none }); } } }); } }); } });这里需要强调一个容易踩坑的地方扫码取件 URL 中包含特殊字符时需要先 encodeURIComponent 再传给后端。很多同学实测时报“查询不到快递”排查半天发现是二维码内容里带了换行或特殊符号。6.4 小程序端 API 封装所有请求通过utils/request.js统一封装自动带 token、统一处理错误码。这样后续每页的代码会非常干净。// 文件路径miniprogram/utils/request.js const { BASE_URL } require(./auth); function request(options) { return new Promise((resolve, reject) { wx.request({ url: ${BASE_URL}${options.url}, method: options.method || GET, data: options.data || {}, header: { Content-Type: application/json, Authorization: Bearer ${wx.getStorageSync(token)} }, success: (res) { if (res.data.code 200) { resolve(res.data.data); } else if (res.data.code 401) { wx.removeStorageSync(token); wx.navigateTo({ url: /pages/index/index }); reject(res.data); } else { wx.showToast({ title: res.data.message, icon: none }); reject(res.data); } }, fail: reject }); }); } module.exports { request };7. AI 能力落地从“包装”到真实业务增强这个项目标题里有“AI 大模型”所以在答辩时不能只是简单接入一个聊天 API 就完事。评审老师越来越熟悉 AI他们真正关心的是AI 在业务中解决了什么问题、解决了多少效率、有没有数据支撑。因此 AI 部分要设计得“小而真实”。7.1 AI 能力一快递面单 OCR 识别传统入库需要管理员手动输快递公司、单号、收件人手机号效率低。而 AI 面单识别方案是管理员用小程序拍照OCR 自动提取这些字段后端自动匹配用户。这既是一个真实痛点也是一个非常清晰的 AI 应用。推荐接入云厂商的通用 OCR 能力申请 API Key 后调用即可不需要自己训练模型。这里用一个「先通过大模型接口做通用信息抽取」的思路或者直接用 OCR 服务返回结构化结果两种方式都可以。关键点是在业务代码里做字段映射和容错OCR 识别失败时要允许管理员手动修正。// 文件路径com/example/express/service/impl/AiOcrServiceImpl.java Service public class AiOcrServiceImpl implements AiOcrService { Value(${ai.ocr.api-key:}) private String apiKey; Value(${ai.ocr.url:}) private String ocrUrl; Override public ExpressOcrResult recognize(byte[] imageBytes) { // 1. 调用 OCR API返回原始识别文本 String rawText callOcrApi(imageBytes); // 2. 从原始文本中提取关键字段复杂场景可交给大模型做信息抽取 ExpressOcrResult result new ExpressOcrResult(); result.setExpressCompany(parseCompany(rawText)); result.setTrackingNo(parseTrackingNo(rawText)); result.setReceiverPhone(parsePhone(rawText)); result.setRawText(rawText); return result; } }注意为了演示效果即便 OCR 识别成功也要在界面上保留“可编辑”入口让管理员校对。AI 辅助人工而不是 AI 完全替代人工这个设计观感更成熟。7.2 AI 能力二智能取件码生成与路径规划这在技术上加不了多少分但在场景描述上可以做文章。比如系统根据货架当前占用情况推荐最优的格口分配方案让高频包裹放在出口附近货架降低取件时的寻找时间。实现上可以用一个简单的“根据包裹体积 货架位置分桶”的算法然后落到货架分配模块。7.3 AI 能力三大模型智能客服这一个是最能体现“AI 大模型”亮点的部分。用户在小程序里输入“我的包裹在哪里”“中通快递到了吗”“我什么时候能取件”大模型不是直接给一句通用百科式回答而是结合当前用户的快递数据生成个性化回复。这里的关键技术是 RAG检索增强生成的思路先将用户的 openid 对应的快递数据查出来拼进 Prompt 上下文再调用大模型接口生成答案。// 文件路径com/example/express/service/impl/AiChatServiceImpl.java Service public class AiChatServiceImpl implements AiChatService { Value(${ai.llm.api-key:}) private String apiKey; Value(${ai.llm.url:}) private String llmUrl; Resource private ExpressOrderMapper expressOrderMapper; Override public String chat(Long userId, String userMessage) { // 1. 查询该用户的快递上下文 ListExpressOrder orders expressOrderMapper.selectList( new LambdaQueryWrapperExpressOrder() .eq(ExpressOrder::getUserId, userId) .orderByDesc(ExpressOrder::getCreateTime) .last(LIMIT 5) ); // 2. 构建 Prompt StringBuilder context new StringBuilder(); context.append(以下是当前用户的最近快递信息请基于这些信息回答问题\n); for (ExpressOrder order : orders) { context.append(快递公司).append(order.getExpressCompany()) .append(单号).append(order.getTrackingNo()) .append(状态).append(order.getStatus() 0 ? 待取 : 已取) .append(取件码).append(order.getPickupCode() null ? 无 : order.getPickupCode()) .append(\n); } context.append(用户问题).append(userMessage); // 3. 调用大模型对话接口 return callLlmApi(context.toString()); } }这个设计的好处是答辩时你可以明确地说“我用的不是通用问答而是把用户快递数据注入 Prompt让大模型实现个性化问答。这正是 RAG 的最简实践。”7.4 AI 能力四滞留预测利用历史数据做一个简单统计规则超过 3 天未取的用户发送提醒超过 5 天未取的系统直接标记异常并通知管理员处理。如果时间充裕可以引入简单的机器学习模型做“滞留概率预测”但这不是必须的。从实际效果来看规则 定时任务在这个场景下的表现已经足够好而且更可控。7.5 AI 能力选型建议如果是毕业设计AI 部分做到“2 个真实能力 1 个模拟能力”是比较稳妥的配置真实能力 1OCR 面单识别入库时使用。真实能力 2大模型智能客服个性化快递查询。模拟能力 3滞留预测规则引擎 数据展示。不要在论文里夸大“模型训练”“微调”等内容除非你真的做了。答辩评委最反感的就是把“调用 API”包装成“自主研发模型”。8. 系统运行与效果验证8.1 本地启动 SpringBoot 后端环境要求JDK 8、Maven 3.6、MySQL 8.x、微信开发者工具。# 1. 创建数据库 mysql -uroot -p CREATE DATABASE express_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; # 2. 导入 SQL 脚本如果有 mysql -uroot -p express_db db/init.sql # 3. 启动后端项目根目录执行 mvn spring-boot:run看到类似日志说明启动成功Tomcat started on port(s): 8080 (http) Started ExpressApplication in 8.32 seconds (JVM running for 9.01)8.2 重启小程序打开微信开发者工具导入miniprogram目录修改utils/auth.js中的BASE_URL为http://localhost:8080/api。注意微信开发者工具默认不允许访问非 HTTPS 接口需要在“详情 - 本地设置”中勾选“不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”。这一步不做小程序请求会直接报url not in domain list。8.3 功能验证清单验证功能操作步骤预期结果微信登录点击小程序首页自动登录控制台输出 openid 和 token快递入库管理端录入快递生成 6 位取件码货架状态变占用快递列表用户端查看展示待取快递及取件码扫码取件点击扫码取件快递状态变为已取滞留提醒修改数据库 in_time 为 4 天前等待定时任务包裹状态变为滞留并触发通知AI 客服输入“我的包裹在哪”返回包含具体快递信息的回答9. 常见问题与排查方法问题现象可能原因排查方式解决方案小程序请求报url not in domain list未配置合法域名或未勾选本地设置查看控制台报错开发阶段勾选“不校验合法域名”微信登录失败返回 40001code 过期或 appid/secret 配置错打印 wechat.appid 和 secret 是否为空核对小程序后台的 AppID 和 AppSecret中文乱码数据库连接串未指定 utf8mb4查看 MySQL 表字符集连接串加characterEncodingutf8mb4SpringBoot 启动失败显示版本冲突依赖版本不一致或 JDK 不匹配查看异常堆栈、执行mvn dependency:tree统一 SpringBoot 与 JDK 版本避免过高版本扫码取件提示查询不到快递二维码内容中包含特殊字符在请求前打印 qrContent使用encodeURIComponent编码定时任务不执行启动类没加EnableScheduling检查启动类注解加上EnableScheduling图片上传被拒绝SpringBoot 默认单文件 1MB 限制查看报错日志spring.servlet.multipart.max-file-size调大电脑能访问手机访问不了后端绑定在 localhost查看启动日志地址后端启动使用--server.address0.0.0.0手机与电脑同一局域网10. 项目亮点提炼与答辩准备做毕业设计项目最后一步往往是答辩。同一套系统有人能讲出亮点有人只能讲“我做了增删改查”。差别在于你有没有提前提炼项目的“技术叙事”。建议从三个方面准备10.1 工程能力叙事前端微信小程序如何封装请求、管理登录态、处理扫码。后端SpringBoot 分层架构、JWT 认证、全局异常处理、事务管理。数据库表结构设计、索引设计、状态字段流转。10.2 AI 能力叙事不要一上来就讲“我用了大模型 API”而是讲“AI 在业务中的具体位置和价值”OCR 面单识别让快递入库时间缩短了多少如果没实测就说“目标是将录入时间从 60 秒降到 10 秒内”并说明这是设计目标。大模型客服如何结合实际快递数据做个性化回复而不是通用对话。滞留预测规则如何降低包裹逾期率。10.3 常见答辩问题预演“为什么用 SpringBoot 而不是 SSM”自动配置、生态完善、内置服务器、适合快速开发。“小程序为什么不用 uni-app”项目规模不大原生开发性能和调试体验更好如果提到跨端需求可说明 uni-app 是备选方案。“AI 模型是你训练的吗”不是调用的是成熟 API但我在业务代码中做了 Prompt 构建、数据上下文注入和容错处理属于应用层创新。“系统有什么不足”一是缺少高并发场景的压力测试二是 AI 能力依赖第三方接口后续可替换为本地部署大模型或自训练模型三是暂未接入支付功能。11. 总结与后续学习方向这套智能快递代收系统表面上是“毕业设计”但实际上它覆盖了后端开发、小程序开发、AI 应用三个重要方向。走完一个完整项目你收获的不仅是代码更是“从需求分析到系统落地再到答辩表达”的全流程经验。如果你已经在动手做类似项目我给你的最实际建议是先跑通主流程再叠加 AI 能力最后打磨答辩叙事。不要试图一开始就把所有模块做到完美。快递入库、用户登录、取件核销这三个主流程通了项目骨架就稳了。后续如果你想继续深化有四个方向值得探索把微信订阅消息替换成 WebSocket 实时通知提高消息触达体验。引入 Redis 缓存用户 token 和取件码降低数据库压力。将本地规则引擎替换成简单机器学习模型做滞留概率预测。增加多商户支持让同一个系统服务多个快递代收点。希望这篇文章能帮你把“自定义快递代收系统”这个题目做透。如果你正在准备选题或卡在某个技术环节可以收藏备用一步一步对照着来。
返回列表