资讯动态

校园跑腿微信小程序毕业设计:从数据库到订单状态机全流程实现

发布时间:2026/9/3 20:48:14 来源:尧图企业网站定制
最近整理了一套完整的校园跑腿微信小程序毕业设计项目不少同学在复现时卡在前后端联调、登录态维护和订单状态流转这几个环节。这篇文章把整套系统的设计思路、数据库结构、后端接口、小程序端核心代码以及论文写作要点一次讲清楚。无论是用于毕业设计还是课程设计都能直接参照落地。本项目的完整代码、SQL 脚本、万字论文和 PPT 都已经整理好文章末尾会说明获取方式。下面开始正文。1. 项目背景与需求分析1.1 为什么选择校园跑腿系统作为毕业设计校园跑腿服务近年来在高校中需求非常旺盛。大学生课业时间相对集中快递代取、食堂带饭、打印资料、超市代购、临时帮拿快递等场景频繁出现。但校内缺少一个统一的、信息透明的下单和接单平台大多依赖 QQ 群、微信群人工喊单。这种方式有几个明显问题信息分散订单容易被刷屏淹没缺少结构化状态管理。接单者与发单者之间的沟通、金额结算、完成确认都依赖人工容易产生纠纷。缺少评价和信用记录服务质量无法沉淀。微信小程序天然适合这种低频但高频触发的场景。用户不需要下载 App扫码或在聊天记录中下拉即可打开开发门槛相对 App 更低部署审核周期也更短。因此基于微信小程序实现校园跑腿系统从选题角度来说既有实用价值又能在技术层面覆盖前端、后端、数据库、接口设计、状态机流转等知识点非常适合毕业设计或课程设计。从答辩角度来看这个选题可以展开的内容非常丰富小程序的登录授权流程、前端页面与组件设计、后端 RESTful 接口规范、订单状态机的转换逻辑、数据库表结构设计、异常处理与权限控制等每一块都能独立成章。1.2 系统核心功能需求一个完整的校园跑腿系统至少要覆盖以下功能功能模块功能说明角色用户注册登录微信授权登录、绑定手机号、维护基础资料所有用户发单功能发布跑腿订单填写取件地点、送达地点、物品描述、期望价格、截止时间普通用户发单人接单功能浏览可接订单列表查看订单详情确认接单普通用户接单人订单管理查看我发布的订单、我接受的订单、订单状态跟踪所有用户订单状态流转待接单 → 已接单 → 已取件 → 已完成 / 已取消系统个人中心查看个人资料、信用记录、订单统计所有用户管理员后台用户管理、订单管理、数据统计、系统公告管理员实际做毕设时功能不一定要做得特别大但核心链路必须完整发单 → 接单 → 完成。在此基础上再扩展取消、评价、历史订单等次要功能系统的完整度就足够了。1.3 用户角色与权限设计系统涉及三类角色分别是普通用户发单人、普通用户接单人和管理员。这里重点说明一个设计思路发单和接单不能是两种独立用户而是同一个用户在不同场景下扮演的角色。用户发布订单时是发单人看到可接订单后点击接单时是接单人。这样设计可以大幅简化用户体系不需要单独建立发单员、配送员表也符合实际场景——校园跑腿场景下用户身份是动态切换的。管理员角色主要用于后台数据管理和舆情控制比如下架违规订单、禁用恶意用户、查看订单统计报表。在带管理后台的毕设版本中权限校验通常在请求拦截器中完成。2. 技术选型与系统总体设计2.1 技术栈介绍本系统的技术栈围绕“微信小程序原生前端 Java Spring Boot 后端 MySQL 数据库”展开这也是大多数高校毕业设计最常见的技术组合。层级技术选型说明前端微信小程序原生框架使用 WXML、WXSS、JavaScript上手门槛低调试方便后端Spring Boot 2.x快速搭建独立运行的 Java 服务配合 Start 依赖简化配置数据库MySQL 5.7 / 8.0存储用户、订单、评价等结构化数据ORMMyBatis-Plus简化 CRUD 操作自带分页插件和条件构造器接口文档Swagger / knife4j自动生成接口文档方便前后端联调和论文截图构建工具Maven管理依赖和打包版本方面Spring Boot 2.x 目前仍是大部分校园项目的主流选择。如果你用的是 Spring Boot 3.x注意javax.servlet相关的依赖要换成jakarta.servlet。本文示例以相对稳定的 Spring Boot 2.7.x 环境为基础具体版本按自己实际环境调整即可。2.2 系统架构设计系统整体采用前后端分离架构微信小程序端只负责页面展示和用户交互所有业务逻辑统一由后端 API 提供。整个请求流程如下用户在微信小程序端操作触发页面事件。小程序通过wx.request将 HTTP 请求发送到后端接口。后端接口先做参数校验和登录态校验再调用 Service 层完成业务逻辑。Service 层通过 MyBatis-Plus 操作 MySQL 数据库。后端将统一的数据结构JSON返回给小程序端。小程序端拿到数据后渲染页面。这里需要强调的是小程序端不能直接连接数据库所有数据操作都必须通过后端接口完成。这样既是为了安全也是为了让系统具备良好的扩展性——以后如果要做管理后台网页端可以复用同一套后端接口。2.3 功能模块划分为了便于后续开发、写论文和画架构图功能模块可以按下面的方式划分用户模块微信登录、个人信息维护。订单模块发布订单、订单列表、订单详情、接单、送达、取消。消息模块站内消息通知可选加分项。评价模块订单完成后发单人对接单人的评价可选加分项。管理后台模块用户管理、订单管理、数据统计带 admin 项目时专项实现。模块划分越清晰写论文的章节结构就越容易组织代码结构也会跟着规范起来。3. 数据库设计数据库设计是毕业设计答辩时老师关注的重点之一。很多同学在写论文时只贴建表 SQL不解释字段设计的理由这是不够的。下面从核心表结构开始逐表说明设计思路。3.1 数据表总览本系统核心数据表包括user用户表order_info跑腿订单表order_status_log订单状态流转记录表evaluation评价表下面重点讲用户表和订单表的设计这两张表是整个系统的核心。3.2 用户表CREATE TABLE user ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键, openid varchar(64) NOT NULL COMMENT 微信用户唯一标识, nickname varchar(64) DEFAULT NULL COMMENT 昵称, avatar varchar(255) DEFAULT NULL COMMENT 头像地址, phone varchar(20) DEFAULT NULL COMMENT 手机号, student_no varchar(32) DEFAULT NULL COMMENT 学号, real_name varchar(32) DEFAULT NULL COMMENT 真实姓名, role tinyint NOT NULL DEFAULT 1 COMMENT 角色1-普通用户 2-管理员, status tinyint NOT NULL DEFAULT 1 COMMENT 状态1-正常 0-禁用, create_time datetime NOT NULL COMMENT 创建时间, update_time datetime NOT NULL COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uk_openid (openid) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT用户表;关键设计说明openid是微信用户在小程序下的唯一标识后端通过wx.login拿到的 code 向微信接口换取存储后作为用户身份判定的依据不需要用户额外注册账号。role字段虽然有了但管理员通常不是在用户表中手动指定的而是在第一次导入管理员 openid 或在后台设置时写入。手机号一般不是强制绑定可以在用户第一次发单或接单时引导绑定这样体验更顺滑。3.3 订单表CREATE TABLE order_info ( id bigint NOT NULL AUTO_INCREMENT COMMENT 订单主键, order_no varchar(32) NOT NULL COMMENT 订单编号, publisher_id bigint NOT NULL COMMENT 发单人用户ID, receiver_id bigint DEFAULT NULL COMMENT 接单人用户ID, pickup_location varchar(128) NOT NULL COMMENT 取件地点, delivery_location varchar(128) NOT NULL COMMENT 送达地点, item_desc varchar(512) NOT NULL COMMENT 物品描述, reward_amount decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT 跑腿费, expect_time datetime DEFAULT NULL COMMENT 期望送达时间, status tinyint NOT NULL DEFAULT 0 COMMENT 状态0-待接单 1-已接单 2-已送达 3-已完成 4-已取消, remark varchar(255) DEFAULT NULL COMMENT 备注, create_time datetime NOT NULL COMMENT 创建时间, update_time datetime NOT NULL COMMENT 更新时间, PRIMARY KEY (id), UNIQUE KEY uk_order_no (order_no), KEY idx_publisher_id (publisher_id), KEY idx_receiver_id (receiver_id), KEY idx_status (status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT跑腿订单表;订单状态字段status是整个系统的核心状态机取值定义如下状态值状态含义说明0待接单订单刚发布任何用户可查看和接单1已接单有用户接单订单进入执行阶段2已送达接单人已将物品送达指定地点3已完成发单人确认完成订单结束4已取消发单人在待接单状态取消或管理员强制取消3.4 状态流转日志表订单状态的每次变更都应当记录下来这是毕业设计中的一个加分设计。一方面便于论文中展示“订单状态追踪”功能另一方面在实际运营中如果出现纠纷可以追溯状态变更历史。CREATE TABLE order_status_log ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键, order_id bigint NOT NULL COMMENT 订单ID, from_status tinyint DEFAULT NULL COMMENT 变更前状态, to_status tinyint NOT NULL COMMENT 变更后状态, operator_id bigint DEFAULT NULL COMMENT 操作人ID, remark varchar(255) DEFAULT NULL COMMENT 备注, create_time datetime NOT NULL COMMENT 创建时间, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT订单状态流转日志表;4. 后端接口设计与实现4.1 后端项目结构后端项目使用 Maven 构建包结构建议按下面的方式组织com.example.delivery ├── common // 通用类统一返回结果、异常处理、工具类 ├── config // 配置类拦截器、WebMvc 配置、Swagger 配置 ├── controller // 接口层 ├── service // 业务逻辑层 │ └── impl ├── mapper // MyBatis-Plus 的 Mapper 接口 ├── entity // 数据库实体类 └── dto // 前端请求参数对象和返回对象分层是毕业设计代码质量的重要体现至少要把 controller、service、mapper 分开。如果基础比较薄弱至少也要保证 controller 里不写 SQL 语句不直接操作数据库连接业务逻辑统一放到 service。4.2 统一返回结果类接口返回格式统一非常重要。小程序端处理数据时只需要按照约定解析即可。这里定义一个通用返回类Result。package com.example.delivery.common; 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; } // getter/setter 省略 }约定如下code200表示请求成功其他 code 表示业务或系统异常message给出可读的错误原因。小程序端先判断code是否为 200再处理data。4.3 微信登录接口微信小程序登录的核心流程是小程序端调用wx.login获取临时凭证code。小程序把code发送到后端/api/user/login。后端使用code调用微信官方接口https://api.weixin.qq.com/sns/jscode2session。微信返回openid和session_key。后端用openid查询用户如果不存在则自动注册存在则直接登录。后端生成自定义token返回给小程序端之后小程序端每次请求都带上这个 token。package com.example.delivery.controller; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpUtil; import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.example.delivery.common.Result; import com.example.delivery.dto.LoginRequest; import com.example.delivery.dto.LoginResponse; import com.example.delivery.entity.User; import com.example.delivery.service.UserService; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/api/user) public class UserController { Value(${wechat.appid}) private String appid; Value(${wechat.secret}) private String secret; private final UserService userService; public UserController(UserService userService) { this.userService userService; } PostMapping(/login) public ResultLoginResponse login(RequestBody LoginRequest request) { if (StrUtil.isBlank(request.getCode())) { return Result.error(400, code 不能为空); } String url https://api.weixin.qq.com/sns/jscode2session ?appid appid secret secret js_code request.getCode() grant_typeauthorization_code; String responseBody HttpUtil.get(url); JSONObject json JSONUtil.parseObj(responseBody); if (json.containsKey(errcode)) { return Result.error(500, 微信登录失败 json.getStr(errmsg)); } String openid json.getStr(openid); User user userService.findByOpenid(openid); if (user null) { user new User(); user.setOpenid(openid); user.setNickname(微信用户 openid.substring(openid.length() - 6)); user.setStatus(1); userService.save(user); } if (user.getStatus() 0) { return Result.error(403, 账号已被禁用); } LoginResponse response new LoginResponse(); response.setToken(userService.generateToken(user.getId())); response.setUserInfo(user); return Result.success(response); } }这里使用了 Hutool 工具库来发起 HTTP 请求和 JSON 解析简化代码量。实际项目中也可以使用 Spring 的RestTemplate或WebClient效果是一样的。4.4 发布订单接口发布订单是核心业务接口。发布前需要判断用户是否已登录订单参数是否完整。package com.example.delivery.controller; import com.example.delivery.common.Result; import com.example.delivery.dto.CreateOrderRequest; import com.example.delivery.entity.OrderInfo; import com.example.delivery.service.OrderService; import com.example.delivery.utils.UserContext; import org.springframework.web.bind.annotation.*; RestController RequestMapping(/api/order) public class OrderController { private final OrderService orderService; public OrderController(OrderService orderService) { this.orderService orderService; } PostMapping(/create) public ResultOrderInfo create(RequestBody CreateOrderRequest request) { Long currentUserId UserContext.getCurrentUserId(); if (currentUserId null) { return Result.error(401, 请先登录); } if (request.getRewardAmount() null || request.getRewardAmount() 0) { return Result.error(400, 跑腿费必须大于0); } OrderInfo order orderService.createOrder(currentUserId, request); return Result.success(order); } }CreateOrderRequest是接收前端请求参数的 DTO 对象字段包括取件地点、送达地点、物品描述、跑腿费、期望时间等。这里不建议直接用OrderInfo实体接收请求参数因为实体中有些字段如状态、创建时间是后端生成的前端不应该直接传入。4.5 接单接口接单操作涉及并发问题。多个用户同时看到同一个订单时同时点击接单理论上只有一个人能成功。这里在数据库层面用乐观锁处理接单 SQL 使用条件更新UPDATE order_info SET receiver_id #{receiverId}, status 1, update_time NOW() WHERE id #{orderId} AND status 0如果影响行数为 0说明订单已经被抢走。通过这种“条件更新影响行数判断”的方式即使不引入 Redis 分布式锁也能在单服务场景下保证接单的唯一性。Override public boolean acceptOrder(Long orderId, Long receiverId) { OrderInfo order getById(orderId); if (order null) { throw new RuntimeException(订单不存在); } if (order.getPublisherId().equals(receiverId)) { throw new RuntimeException(不能接自己发布的订单); } boolean success orderMapper.acceptOrder(orderId, receiverId); if (success) { // 记录状态流转日志 saveStatusLog(orderId, 0, 1, receiverId, 用户接单); } return success; }这里要注意一个细节不能接自己发布的订单这个判断是必须的不然会出现自己发单自己接单又把跑腿费转了个圈的情况很容易被答辩老师指出逻辑漏洞。4.6 订单状态流转接口订单状态机定义如下待接单(0) → 已接单(1) → 已送达(2) → 已完成(3) ↓ ↓ 已取消(4) 已取消(4)对应的接口发单人取消订单仅限状态为 0 时或者状态为 1 时需与接单人协商后强制取消接单人送达仅限状态为 1 时发单人确认完成仅限状态为 2 时Override Transactional(rollbackFor Exception.class) public boolean completeOrder(Long orderId, Long userId) { OrderInfo order getById(orderId); if (order null || !order.getStatus().equals(2)) { throw new RuntimeException(订单状态不允许完成); } if (!order.getPublisherId().equals(userId)) { throw new RuntimeException(只有发单人可确认完成); } order.setStatus(3); updateById(order); saveStatusLog(orderId, 2, 3, userId, 发单确认完成); return true; }所有状态变更方法上都加了Transactional注解保证状态更新和状态日志写入在同一事务中避免出现订单状态变了但日志没记录的数据不一致问题。5. 小程序端核心功能实现5.1 小程序项目结构小程序端使用微信开发者工具创建原生小程序项目项目结构如下miniprogram/ ├── app.js // 全局逻辑 ├── app.json // 全局配置 ├── app.wxss // 全局样式 ├── utils/ │ ├── request.js // 封装 wx.request 请求 │ └── util.js // 工具函数 ├── pages/ │ ├── index/ // 首页-订单列表 │ ├── publish/ // 发布订单 │ ├── detail/ // 订单详情 │ ├── my/ // 个人中心 │ └── login/ // 登录页可选 └── components/ // 自定义组件5.2 封装请求工具在小程序里直接使用wx.request是可以的但每次都要写成功/失败回调非常繁琐。建议统一封装一个request.js同时把 token 注入到请求头中。// utils/request.js const BASE_URL http://localhost:8080; function request(url, method GET, data {}) { return new Promise((resolve, reject) { const token wx.getStorageSync(token); wx.request({ url: BASE_URL url, method: method, data: data, header: { Content-Type: application/json, Authorization: token || }, success: (res) { if (res.data.code 200) { resolve(res.data.data); } else if (res.data.code 401) { wx.showToast({ title: 登录已过期, icon: none }); wx.navigateTo({ url: /pages/login/index }); reject(res.data); } else { wx.showToast({ title: res.data.message || 请求失败, icon: none }); reject(res.data); } }, fail: (err) { wx.showToast({ title: 网络连接失败, icon: none }); reject(err); } }); }); } module.exports { get: (url, data) request(url, GET, data), post: (url, data) request(url, POST, data) };开发阶段注意一个坑在微信开发者工具中调试时需要勾选“不校验合法域名、web-view业务域名、TLS 版本以及 HTTPS 证书”否则本地http://localhost会被拦截。上线时则必须在小程序后台配置合法域名且接口必须为 HTTPS。5.3 登录流程实现在小程序端通过wx.login获取 code再调用后端/api/user/login接口换取 token。// app.js App({ onLaunch() { this.login(); }, login() { wx.login({ success: (res) { if (res.code) { wx.request({ url: http://localhost:8080/api/user/login, method: POST, data: { code: res.code }, success: (resp) { const data resp.data; if (data.code 200) { wx.setStorageSync(token, data.data.token); wx.setStorageSync(userInfo, data.data.userInfo); } else { console.error(登录失败, data.message); } } }); } else { console.error(登录失败, res.errMsg); } } }); } });5.4 发布订单页面发布订单页是小程序端的核心页面表单字段包括取件地点、送达地点、物品描述、跑腿费和期望时间。// pages/publish/publish.js const { post } require(../../utils/request); Page({ data: { pickupLocation: , deliveryLocation: , itemDesc: , rewardAmount: , expectTime: }, handleInput(e) { const field e.currentTarget.dataset.field; this.setData({ [field]: e.detail.value }); }, submitOrder() { const { pickupLocation, deliveryLocation, itemDesc, rewardAmount } this.data; if (!pickupLocation) { wx.showToast({ title: 请填写取件地点, icon: none }); return; } if (!deliveryLocation) { wx.showToast({ title: 请填写送达地点, icon: none }); return; } if (!itemDesc) { wx.showToast({ title: 请填写物品描述, icon: none }); return; } if (!rewardAmount || Number(rewardAmount) 0) { wx.showToast({ title: 请填写跑腿费, icon: none }); return; } post(/api/order/create, { pickupLocation, deliveryLocation, itemDesc, rewardAmount: Number(rewardAmount), expectTime: this.data.expectTime || null }).then(() { wx.showToast({ title: 发布成功, icon: success }); setTimeout(() { wx.switchTab({ url: /pages/index/index }); }, 1500); }).catch(() { wx.showToast({ title: 发布失败, icon: none }); }); } });5.5 首页订单列表与接单首页展示待接单的订单列表以及当前用户已接单/已发布的订单分类。为了简化这里用一个 tabs 切换来区分不同列表。// pages/index/index.js const { get, post } require(../../utils/request); Page({ data: { tabIndex: 0, orderList: [] }, onShow() { this.loadOrders(); }, switchTab(e) { this.setData({ tabIndex: e.currentTarget.dataset.index }); this.loadOrders(); }, loadOrders() { const urls [/api/order/pending, /api/order/published, /api/order/received]; get(urls[this.data.tabIndex], {}).then((list) { this.setData({ orderList: list }); }); }, acceptOrder(e) { const orderId e.currentTarget.dataset.id; wx.showModal({ title: 确认接单, content: 接单后请按时完成配送任务, success: (res) { if (res.confirm) { post(/api/order/accept, { orderId }).then(() { wx.showToast({ title: 接单成功, icon: success }); this.loadOrders(); }); } } }); } });6. 项目运行与联调验证6.1 后端启动后端启动前需要修改application.yml配置server: port: 8080 spring: datasource: url: jdbc:mysql://localhost:3306/campus_delivery?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto wechat: appid: 你的小程序appid secret: 你的小程序secret其中wechat.appid和wechat.secret需要在微信公众平台申请小程序后获取。首次调试可用测试号代替。然后在 MySQL 中执行建库和建表 SQLmysql -u root -p CREATE DATABASE campus_delivery DEFAULT CHARACTER SET utf8mb4;之后在 IDEA 中直接运行主启动类即可。6.2 小程序端启动下载安装微信开发者工具。导入miniprogram目录。修改utils/request.js中的BASE_URL为后端实际地址。点击编译即可在模拟器中看到小程序页面。6.3 联调验证用例建议按照以下用例逐条验证用例编号操作步骤预期结果01首次打开小程序自动登录后端 user 表新增一条记录02发布一个有效订单订单列表出现该订单状态为待接单03另一个账号进入首页可看到待接单列表点击接单成功04接单后处理送达订单状态变为已送达05发单人确认完成订单状态变为已完成06发单人取消待接单订单订单状态变为已取消7. 常见问题与排查思路7.1 小程序登录失败获取登录后的微信用户失败很多同学在第一次接入微信登录时会遇到获取登录后的微信用户失败:wx1cb4398e1413dce7这类报错。这类错误的常见原因有AppID 没有正确填写。检查小程序项目的 AppID 和后端配置的 appid 是否一致。没有在微信公众平台配置服务器域名。如果使用的是云开发环境或 HTTPS 域名需要在小程序后台添加 request 合法域名。后端没有正确返回 openid。先直接在后端日志中打印请求微信接口的返回结果确认返回的是 openid 还是错误码。代码中获取用户信息的 API 过时。旧版的wx.getUserInfo弹窗授权已经调整目前推荐使用头像昵称填写能力或手机号快速验证组件不建议在登录流程中强制获取微信用户资料。7.2 小程序真机测试 net::ERR_CONNECTION_RESET这个报错通常出现在真机预览时。原因真机上默认校验 HTTPS 和合法域名如果后端不是 HTTPS 接口请求会被拦截。排查步骤在微信开发者工具中勾选“不校验合法域名”后测试确认问题是否仅存在于真机。如果仅存在于真机说明需要配置合法域名且接口必须为 HTTPS。如果是本地后端调试可以关闭域名校验但上线前必须配置正式域名。7.3 接单并发问题如果两个用户同时点击接单可能会出现重复接单的数据异常。解决方案在前面已经提到通过条件更新WHERE status 0来保证同一张订单只能被一个用户接走。7.4 数据库乱码问题如果写入的中文变成??通常是因为数据库连接没有指定characterEncodingutf8或者表结构本身不是utf8mb4。在连接 URL 中加上useUnicodetruecharacterEncodingutf8并确保建表 SQL 使用了utf8mb4。7.5 小程序端请求报 404检查后端接口路径是否与小程序端请求路径完全一致。常见的坑包括没有加/api前缀、单词拼写错误、大小写不一致等。8. 最佳实践与毕业设计写作建议8.1 代码层面的工程建议第一接口要统一返回格式。不要有的接口返回{code:0}有的返回{success:true}这会让前端判断逻辑混乱。第二状态字段不要用字符串。订单状态使用tinyint数字枚举在 Java 代码中定义常量或枚举类。避免在数据库中直接存“待接单”“已接单”这种中文内容后期修改状态名称会很麻烦。第三金额计算使用BigDecimal不要使用Double。跑腿费涉及钱的问题虽然示例中金额不大但从习惯养成和答辩角度使用BigDecimal更加严谨。第四所有状态变更操作加事务。使用Transactional保证订单状态更新和状态日志写入的一致性。第五数据库字段不要出现order这种 MySQL 关键字。如果你建表时用了order作为表名MySQL 5.7 会报错或需要反引号处理。本文使用order_info就是为了规避这个问题。8.2 数据安全与合规建议微信secret绝对不能放在小程序前端代码里必须保存在后端。后端接口要增加 token 鉴权拦截器不能裸奔。拦截器可以通过自定义注解实现比如在需要登录的接口上标记RequireLogin。管理员接口要校验管理员角色避免普通用户通过伪造请求访问后台管理功能。生产环境必须使用 HTTPS 接口MySQL 连接也建议使用低权限账号不要用 root 连接业务数据库。涉及用户隐私信息手机号、学号的存储建议对敏感字段进行加密或脱敏处理。8.3 毕业设计论文写作建议论文的章节结构可以按照以下思路组织第一章 绪论研究背景、意义、国内外研究现状、论文结构。第二章 相关技术介绍微信小程序框架、Spring Boot、MyBatis-Plus、MySQL。第三章 系统需求分析可行性分析、功能需求用例图、非功能需求。第四章 系统设计总体架构、功能模块、数据库设计ER图、表结构。第五章 系统实现分模块展示关键代码和截图。第六章 系统测试功能测试用例、测试结果。第七章 总结与展望。注意几个答辩高频问题为什么选择 MySQL 而不是其他数据库微信小程序的登录流程和 token 机制是怎样的订单状态是如何流转的如何防止超卖/重复接单系统的安全性是怎么保障的如果用户量大了系统如何扩展提前把这些问题想清楚在论文中写清楚答辩时会自信很多。8.4 系统扩展方向如果时间充裕或想拿高分可以在现有系统上增加以下功能消息通知接单后给发单人推送服务通知。用户信用分订单完成后双方互评根据评价调整信用分。跑腿费支付接入微信支付实现线上支付和担保交易。实时定位使用小程序的wx.getLocation实现取件/送达的定位功能。管理后台前端单独做一个 Web 管理后台使用 Vue Element UI。9. 总结到这里基于微信小程序的校园跑腿系统的核心内容就完整梳理了一遍。这个系统麻雀虽小五脏俱全从用户登录、发单、接单到订单状态流转覆盖了毕业设计中常见的前后端交互场景。建议你按照本文的章节顺序先完成数据库建表再实现后端接口最后编写小程序页面逐层推进。真机调试时如果遇到登录失败或网络连接问题优先检查 AppID 配置和请求域名。代码写完后花一点时间把订单状态流转日志记录下来这不仅让系统更健壮写论文时也更有内容可展示。如果本文对你有帮助可以收藏备用也欢迎在评论区留言交流调试中遇到的问题。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价