
简介本资源是一套面向高校计算机专业学生与Java全栈初学者的校园跑腿小程序完整开发方案聚焦课程设计、毕业设计及前后端分离实战场景解决校园内即时任务委托、资讯分发与轻量级服务对接等实际需求。压缩包共1109个文件涵盖440张界面截图png、220个前端逻辑脚本js、112个Vue3组件vue、82个Spring Boot后端控制器与实体类java、50个配置与数据结构文件json、以及SQL建表脚本与微信小程序样式/模板文件wxml/wxss整体仅9.49MB轻量易部署。已有57人学习下载资源附带完整前后端分离架构、MyBatis Plus动态查询封装、文件上传下载服务、任务与菜单智能排序、客服投诉闭环流程等核心功能实现同时包含main.css等多版本样式备份与development/production环境配置便于理解工程化构建细节与调试策略。 在校园里“代取快递”“帮带饭”“帮忙排队”这类需求一直都很旺盛尤其在高峰期快递驿站排长队、食堂排队动辄二十分钟时间成本实在太高。这个A108校园跑腿小程序就是把线下的这种零散需求搬到了线上用平台化的方式把发单人和接单人连接起来。整个项目是基于Spring Boot Vue3 微信小程序的前后端分离架构数据库用的是MySQL附带完整的SQL脚本属于一套可以直接落地的全栈项目。它解决的问题很具体学生有跑腿需求时快速发布订单有空闲时间的学生可以接单赚点零花钱平台方则能通过管理端做订单审核、用户管理和数据统计。这套系统适合谁参考如果你是刚学完Spring Boot和Vue3想找一个综合性实战项目来练手这个项目的技术栈覆盖面很合适如果你在学校做课程设计或毕业设计这套前后端分离的架构也能直接用就算你已经工作想快速了解微信小程序生态下从登录、下单、接单到支付的一套完整业务闭环这个项目也有参考价值。1. 项目整体定位与需求分析先说清楚这个项目到底做了什么以及为什么它长这样。这部分能帮你快速建立全局观后面看代码才不会迷路。1.1 原始需求与目标用户原始需求其实很朴素校园里有大量“没时间跑腿”的场景快递到了人在上课、食堂人多懒得排队、超市东西太重搬不动。过去大家靠发微信群、QQ群喊人帮忙但这种方式没法管理订单状态也说不清费用和责任。跑腿小程序的本质就是把这些线下随机撮合变成标准的平台流程发单人发布任务、设定价格和地址接单人接单、完成后确认收款平台记录整个过程中的状态变化。目标用户很明确就是校园内的学生。这里有个特点用户群体密集地理范围小基本就是校区、宿舍区、食堂、快递点订单距离短配送靠步行或骑车就能完成。这种场景决定了核心功能不需要复杂的LBS配送调度也不需要跨城物流重点反而在于订单流程的清晰度、诚信机制和操作便捷性。所以项目里对用户做了身份区分普通用户可以发单、接单管理员可以在后台管理整个平台的秩序。1.2 功能架构与角色梳理整个系统分成三个端这是前后端分离架构下最常见的三角色结构。微信小程序端面向普通学生功能包括微信授权登录、发布跑腿订单、浏览可接订单、接单、查看订单详情、确认完成、订单评价、个人中心、余额查看等。Vue3管理端面向平台管理员功能包括管理员登录、用户管理封禁/解封、订单管理、订单审核、分类管理、统计报表订单量趋势、用户增长等、基础系统配置。Spring Boot后端提供所有接口服务处理小程序端和管理端的请求负责微信登录凭证校验、JWT令牌发放与校验、订单状态流转、文件上传、数据统计聚合等。业务闭环是这样的用户A在小程序发布一个订单比如代取快递报酬5元订单进入“待接单”状态所有用户在小程序里都能看到这个订单用户B觉得顺路点击接单订单状态变为“进行中”B完成跑腿后在订单详情里点“确认完成”A端收到消息确认无误后确认完成这笔钱从A的余额或者平台代收中结算给B。整个流程涉及的状态机转换是这个项目最值得研究的点之一。2. 技术选型与总体架构技术选型上项目用的是一套非常主流又稳妥的组合后端Spring Boot、前端管理端Vue3、用户端微信小程序原生。为什么选这套组合背后是有讲究的。2.1 选型背后的具体考量Spring Boot在Java生态里几乎是事实标准。它把配置简化到了极致内嵌Tomcat开发时不需要单独部署应用服务器配合Spring MVC做RESTful接口非常顺手。校园跑腿这种业务后端核心就是CRUD加状态流转Spring Boot默认的部门拆分方式已经足够用而且相关的资料多、面试也常问性价比很高。Vue3选它是因为管理端需要快速开发Vue3的组合式APIComposition API在组件逻辑复用上比Vue2舒服很多。配合Element Plus或者Naive UI把表格、表单、弹窗这些后台管理常用组件一拖就能用。管理端本身是纯后台系统不需要SEO所以前端直接构建成静态文件丢到Nginx下就行。微信小程序端不用uni-app而是原生开发原因也很实际这个项目用到的都是小程序基础能力比如wx.login、wx.request、wx.uploadFile、wx.chooseImage原生开发足够而且原生渲染在小程序里的调试和性能表现最稳定。热搜词里那个“uniapp在微信开发者工具上白屏”的问题我在别人的项目里也见过很多是编译版本和基础库不匹配造成的用原生写可以少踩一层这种坑。2.2 前后端分离的架构优势前后端分离这个词听着大落到这个项目上就是后端只提供JSON格式的接口不关心页面长什么样前端小程序端和管理端只管调用接口渲染页面。好处是两端可以并行开发后端定义好接口文档小程序端和管理端对着同样的接口各自实现。目录结构上后端按经典分层来controller、service、mapper、entitycontroller只做参数接收和结果封装业务逻辑全部下沉到service层。前端管理端按页面和组件划分api层单独抽出来封装请求这样页面里不会到处都是axios.get这种裸请求。小程序的请求封装了request方法统一处理token注入和错误提示。从部署角度看前后端分离也更灵活。后端打个jar包扔到服务器管理端构建后的dist文件挂到Nginx小程序代码直接在微信开发者工具里上传。三个部分互不干扰出问题也好排查。3. 数据库设计与SQL脚本要点数据库是这套系统的地基。拿到SQL脚本后不要急着直接跑先花半小时把表结构看明白后面写接口或改需求时心里就有数了。3.1 核心表结构拆解这个项目的表设计基本覆盖了跑腿业务的全部核心实体user用户表user_id、openid微信唯一标识、nickname、avatar、phone、role普通用户/管理员、status正常/封禁、create_time。openid是用户在小程序体系里的身份证整个登录鉴权都围绕它展开。category分类表跑腿订单分类比如快递代取、美食代买、其他代办方便用户快速筛选。order订单表这是核心中的核心。字段包括order_id、order_no订单编号给用户看的、user_id发单人、receiver_id接单人初始为空、category_id、title、description、pickup_address取货地点、delivery_address送达地点、reward酬劳、status订单状态、create_time、accept_time、finish_time等。wallet钱包表用户余额信息。这个设计可以很简洁一个user_id对应一条余额记录交易流水单独放一张transaction表。transaction交易流水表记录每一笔钱的变动包括充值、发单扣款、接单收入、退款等。有流水才能对账这是真实项目里不能省的。feedback评价表订单完成后双方互评可以存评分和内容作为平台诚信体系的数据基础。admin管理员表管理端登录用独立于普通用户维护成本低也更安全。SQL脚本里除了建表语句一般还会带一部分初始数据。比如分类表里的快递代取、美食代买、超市代购管理员账号以及一个用于测试的普通用户。这些初始数据对快速跑通项目帮助很大尤其是没有微信开发者工具的时候直接用测试账号也能看效果。3.2 订单状态机与关键约束订单状态的变化是整个业务最核心的逻辑。建议在写代码之前先在纸上画出状态流转图待接单0发单人发布成功后的初始状态接单人可以在广场看到此订单。进行中1有接单人点击接单订单绑定接单人此时双方都能看到彼此的昵称和联系方式。待确认2接单人点击完成发单人还没确认。这个状态是给发单人一个检查的时间防止接单人“假完成”。已完成3发单人确认完成酬劳从发单人侧结算给接单人订单流程结束。已取消4发单人在待接单状态下取消或者管理员介入取消。数据库设计上订单表可以通过status字段加索引来优化列表查询。如果业务量大了还要考虑软删除和分页查询的字段设计。这个项目面向校园单日订单量撑死几千单索引只要建在status、user_id、create_time这几个高频查询字段上就够了。另一个容易忽略的点是金额字段的类型建议用decimal(10,2)不要用float或double。线上真实项目里因为浮点精度问题搞出金额误差的案例太多了这种基础问题在SQL脚本阶段就能规避。4. 后端核心实现与业务逻辑后端部分用Spring Boot实现我会挑三个核心链路来拆解微信登录、订单发布与接单、文件上传。这三个点写清楚了整条业务线就通了。4.1 微信登录与JWT鉴权机制小程序的登录流程和传统账号密码登录完全不一样。小程序端调用wx.login拿到一个临时code后端拿着这个code去微信接口换取openid和session_key。openid是用户唯一标识session_key用于解密手机号等信息。后端拿到openid后先去user表查一下这个用户是否存在不存在就自动注册一个然后生成JWT令牌返回给前端之后所有请求都带上这个令牌。JWT的好处是服务端不需要存session令牌本身就是身份凭证。签发JWT时可以把userId、role放进去服务端通过拦截器解析令牌取出用户信息。这个项目的拦截器只拦截需要登录的接口小程序和管理端的接口分开处理权限管理端接口额外校验role是不是管理员。有个细节要注意小程序端的session_key不要返回给前端它只在后端使用。明文返回有安全风险而且业务上也不需要。JWT的过期时间建议设短一点比如7天管理端可以设置更短的过期时间比如2小时安全性更好。4.2 订单发布与抢单的并发控制订单发布逻辑相对简单发单人需要传标题、描述、取货地址、收货地址、分类、酬劳。后端需要校验的是酬劳不能为负数、地址不能为空、用户状态必须正常。发布成功后就进入“待接单”池。接单接口是整个项目里最考验细节的地方。因为可能存在多个用户同时点接单同一个订单的情况要防止“一单多接”。实现方式有几种最简单的就是乐观锁UPDATE order SET receiver_id #{userId}, status 1 WHERE order_id #{orderId} AND status 0这个UPDATE语句自带原子性status 0作为条件能更新成功说明抢到了影响行数为0说明被别人抢了。这是最高效的防并发方案比“先select再update”安全得多避免超卖问题。我在代码里优先推荐这个方式因为实现简单、性能好、不会引入分布式锁的复杂度。订单完成后资金流转稍微复杂一点。如果发单人下单时就冻结了余额把reward从可用余额冻结到冻结余额接单人完成后平台需要做两件事扣减发单人的冻结余额同时给接单人的可用余额增加reward。这两个操作必须放在一个事务里要么都成功要么都失败。4.3 文件上传与图片处理跑腿订单经常会拍照上传比如快递单照片、商品照片。小程序端用wx.chooseImage选图然后通过wx.uploadFile传到后端。后端用Spring Boot接收MultipartFile保存到服务器本地指定目录然后把访问URL返回给前端。这里的坑在于本地磁盘路径和前端访问URL必须能对得上。建议项目里配置一个虚拟路径映射把/upload/**映射到物理磁盘的上传目录。如果用Nginx部署也可以直接把上传目录交给Nginx做静态资源映射Spring Boot只管保存文件Nginx负责访问。文件大小也要限制一下Spring Boot的spring.servlet.multipart.max-file-size默认才1MB这里要调大一般设成5MB或者10MB不然传个清晰点的快递照片都会失败。5. 小程序端核心功能实现小程序端是用户最直接接触的部分代码量不大但页面逻辑要仔细理清楚。我按用户操作路径来拆解。5.1 订单发布到接单的完整链路首页一般分几个模块轮播图、分类导航、订单列表。订单列表支持按分类筛选也支持下拉刷新。列表页的数据来自后端的分页接口接口返回{ records, total }结构小程序端配合onReachBottom做触底加载。发布订单页面有几个必填项分类、标题、需求描述、取货地点、收货地点、酬劳。这里比较容易被忽略的是地址选择。小程序里可以用wx.chooseLocation来调起地图选点用户选好位置后直接把经纬度和地址名称都带过来。但要注意wx.chooseLocation需要在小程序后台配置接口权限并且开发者工具里的模拟定位经常不准真机调试才靠谱。订单列表里的每一单都显示标题、酬劳、距离如果有距离的话、发布人昵称。接单入口就在订单详情页里点击“立即接单”会调后端接口成功后页面状态变为“进行中”同时展示接单人的联系方式和取货码。取货码的设计很实用发单人发布订单时生成一个随机码接单人取货时出示给发单人核验避免拿错东西。个人中心页面除了展示用户头像昵称还要能看到我发布的单子、我接收的单子和我的钱包。钱包页面显示余额可以发起提现申请。后台管理员在管理端审核提现并打款。5.2 小程序端与后端联调注意点联调时最容易出的问题是request域名校验。微信开发者工具里可以勾选“不校验合法域名”但真机上必须把后端接口域名配到小程序后台的request合法域名里而且必须是HTTPS。本地调试可以走局域网IP但要记得在小程序后台把局域网IP也临时加进去不然真机请求直接报错。另一个是token失效的处理。小程序请求统一封装在request.js里每次请求前从storage里读取token放在header的Authorization字段里。后端返回401时前端应该做统一处理清掉本地token跳转回登录页并提示用户重新登录。不要在业务代码里到处写401判断统一拦截才是正解。还有接口返回格式要统一。建议后端统一返回{ code, msg, data }格式code为200表示成功其他为失败。前端request封装里直接对code做判断业务代码只需要关心data部分。这个在多人协作时尤其重要前后端约定好契约联调效率能翻倍。6. Vue3管理端实现与前后端联调管理端是运营人员的工具核心诉求是效率和数据可视化。Vue3配合Element Plus搭建这类后台非常顺手。6.1 管理端功能设计管理端最核心的页面是订单管理。订单列表要支持多条件筛选订单号、用户昵称、订单状态、时间范围。表格列展示基本信息点“详情”弹出抽屉可以查看完整订单信息和用户信息。管理员在订单异常时可以操作“取消订单”或“强制完成”。用户管理页面主要做两部分工作查看用户列表、对违规用户封禁/解封。封禁操作直接改变user表的status字段后端在登录校验和下单校验时都会检查这个字段被拉黑的用户无法再发单接单。统计功能对运营很重要。管理端首页放几个统计卡片总用户数、今日订单数、总订单量、交易总金额。下面配一个折线图展示近7天订单趋势。图表库选EChartsVue3下用echarts配合vue-echarts组件封装一下就行。统计接口需要写多条聚合SQL比如SELECT DATE(create_time) as date, COUNT(*) as cnt FROM order WHERE create_time DATE_SUB(CURDATE(), INTERVAL 7 DAY) GROUP BY DATE(create_time)这种接口数据量小直接查MySQL没问题。但如果订单量起来了建议加一层Redis缓存低频刷新的统计数据根本不用每次都查库。6.2 跨域配置与打包部署前后端分离开发时最烦的就是跨域。Vue3开发环境通过Vite的server.proxy代理解决生产环境部署时通过Nginx反向代理解决。开发环境的proxy配置server: { port: 3000, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }这样前端请求/api/order/list时开发服务器会把请求转发到后端的http://localhost:8080/api/order/list浏览器的请求是同源的就不会跨域。生产环境更简单Nginx配置一个location转发location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }后端本身也建议在Spring Boot里配一下CORS用CrossOrigin或全局CORS配置两边都做好开发调试时就能少很多环境问题。Vue3管理端构建时有个容易踩的坑默认路由用的是history模式部署到Nginx后刷新页面很容易404。解决办法是Nginx配置try_fileslocation / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; }如果你不想处理这个配置也可以直接换成hash模式省心不易出问题。7. 常见问题与排查技巧实录这部分是过来人的经验总结。原版项目里没有明说的地方我基于实际部署和联调中遇到的真实场景整理了一份问题速查表。7.1 高频问题速查表问题现象可能原因排查思路微信登录一直失败code失效、AppSecret错误、IP白名单限制后端打印code换取openid的响应对照微信官方错误码排查小程序真机请求超时合法域名没配置或没走HTTPS小程序后台配置request合法域名生产环境必须HTTPS管理端登录后刷新404history路由模式未配置try_filesNginx加try_files回退到index.html上传图片失败文件大小超限、目录没有写权限检查Spring Boot上传配置确认上传目录权限一单多接接单SQL没有带status0条件检查接单UPDATE语句使用乐观锁更新金额对不上事务没提交或者用了浮点类型检查流水表确认金额字段是decimal订单状态错乱状态流转判断逻辑不严谨按状态机逐一核对接口里的状态变更条件Vue3打包后接口404接口地址是相对路径或代理失效检查API请求路径确认Nginx代理规则7.2 几个印象深刻的坑第一个是微信小程序端在开发者工具里正常但真机上图片加载不出来。排查了一圈发现是上传返回的图片URL写死了localhost:8080真机访问时指向的是用户自己的手机自然无法访问。正确做法是把上传URL改成服务器的实际IP或域名。第二个是发布订单时偶尔出现“订单创建成功但列表查不到”。原因是订单表和流水表不在同一个事务里订单创建了但钱包扣款失败回滚了订单部分结果数据不一致。后来在service层加了Transactional整个创建订单加扣款流程才保持一致。第三个是Vue3管理端登录后刷新页面用户信息丢失。因为用户信息只存了内存变量刷新后自然没了。完善方案是登录成功后把用户信息和token存到localStorage每次进入项目先读取缓存恢复登录状态再调用一次/getUserInfo接口校验token是否仍然有效。8. 后续延展方向与个人实操心得如果这个项目你跑通了想再继续深入有几个方向值得做。接入微信支付是最自然的下一步这个项目目前可能只是模拟支付或者余额抵扣接入微信支付可以让商业闭环更完整但要申请微信商户号企业主体才方便开通。消息推送也值得做用微信小程序的订阅消息在订单状态变更时给用户推送提醒能显著提升用户体验。如果想提高订单匹配效率可以做简单的派单策略比如按地理位置距离最近的用户优先推荐这就用到了经纬度计算距离。长期来看如果用户量大了后台的管理和风控系统也可以再加强比如实名认证、信用分体系、投诉举报处理流程等。根据我个人实际操作这套项目的经验有几点体会想分享给你。第一不要一上来就急着看代码细节先用半小时把SQL脚本跑起来看看数据库表结构再配合项目里的接口文档理解业务闭环效率会高很多。第二校园跑腿类项目和电商项目有一个本质区别就是订单状态机更复杂存在“发单—接单—完成—确认”的多角色多状态流转这是最容易出错的地方也是面试官最爱问的地方建议把状态流转图画清楚。第三代码写完之后一定要自己完整走一遍流程发布订单、模拟接单、确认完成、评价。我见过太多人代码写完了但主流程根本没跑通这个只要花10分钟测试一遍就能发现千万不能省。第四微信开发者工具里调试比较方便但一定要坚持每天或每隔几天做一次真机预览。很多问题在模拟器上是看不出来的比如定位不准、网络慢、图片加载失败真机上才会暴露。开发和调试时尽量用真机别犯懒。这套项目麻雀虽小五脏俱全从架构到业务到部署把Web全栈开发里最常用的技术都串起来了。希望这篇拆解能帮你在跑通项目的同时把背后的设计逻辑也吃透这样无论用于学习、面试还是实际开发都能更有底气。本文还有配套的精品资源点击获取