这次我们来看一个典型的微信小程序全栈项目:基于微信小程序的二手车系统。它并不是一个简单的“展示型小程序”,而是一套覆盖 C 端用户、B 端商家、管理后台三端的完整业务系统。核心功能包括车辆发布、车源检索、预约看车、订单管理、微信支付、个人中心以及运营端的数据统计和内容审核。
这类项目的重点不在于“技术多难”,而在于能不能把微信小程序端、后端服务、数据库、管理后台串成一条可运行的完整链路。如果你正在做毕业设计,或者想学习 Spring Boot 微信小程序全栈开发,又或者你接了一个类似“二手车”、“租房”、“校园跑腿”的横向项目,这篇文章可以直接收藏。
文章会按照“架构拆解 -> 环境准备 -> 部署启动 -> 功能验证 -> 常见坑排查”的顺序展开,重点讲清楚前端小程序要处理哪些交互、后端要提供哪些接口、数据库要如何设计,以及微信支付、图片上传、地图选点、抓包调试这些高频环节怎么落地。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 系统定位 | 二手车信息发布、检索、预约、交易撮合的微信小程序全栈系统 |
| 前端方案 | 微信小程序原生开发,适合直接导入微信开发者工具编译预览 |
| 后端方案 | Spring Boot + MyBatis-Plus / JPA + MySQL,标准前后端分离 |
| 管理后台 | Web 管理端,负责车辆审核、用户管理、订单管理、数据统计 |
| 核心功能 | 车辆发布、车源列表、条件筛选、车辆详情、预约看车、下单支付、收藏、个人中心 |
| 微信能力 | 微信登录、微信支付 v3、订阅消息、地图选点、图片上传 |
| 硬件门槛 | 无特殊硬件要求,普通开发机能跑通后端服务即可 |
| 启动方式 | 后端 Maven/命令行启动,前端微信开发者工具导入 |
| 是否支持 API | 支持,后端提供 HTTP JSON 接口,前端和后台共用 |
| 是否支持批量任务 | 管理后台支持车辆批量导入、批量上下架 |
| 适合场景 | 毕业设计、课程设计、微信小程序全栈实战学习、二手车商城定制 |
从材料来看,这个项目配套的功能点和常见问题基本覆盖了微信小程序开发的高频坑:微信支付 v3 对接、小程序抓包、iOS 端 video 组件全屏错位、顶部导航栏高度适配、手机软键盘遮挡输入框、蓝牙打印、音频缓存路径等等。这些在文章最后一部分统一整理成排查清单。
2. 适用场景与使用边界
先说清楚这套系统适合谁。
第一类是准备做毕设的在校学生。二手车系统是“信息发布 + 交易流程 + 权限管理”的典型代表,业务边界清楚,功能量适中。你可以在基础版本上扩展“估价模型”、“违章查询”、“金融方案”等模块,辨识度一下就上来了。
第二类是想系统学习微信小程序全栈的开发者。这类项目能让你一次接触:微信登录授权、JDK 后端接口设计、MySQL 表设计、图片上传、微信支付、管理后台权限控制。学完这套流程,换个场景(比如租房、校园跑腿、二手书籍)也能快速复制。
第三类是需要交付横向项目的工程师。二手车、二手车租赁、二手车鉴定评估这类系统在接单市场里很多见,技术上可以直接复用这套结构。
使用边界也要说清楚:
- 微信支付必须要有企业主体的小程序 AppID和微信支付商户号,个人开发者无法开通支付。
- 微信小程序的审核要求严格。涉及二手车交易、资金支付,需要提供对应的行业资质,否则容易在小程序审核阶段被驳回。
- 车辆图片、车辆信息、用户手机号都属于敏感数据。开发测试阶段严禁使用真实车主信息和实车照片,建议用测试数据。
- 微信支付 v3 对接时,平台证书和 API 密钥要妥善保管,泄露会导致支付接口被恶意调用。
3. 系统架构与核心功能拆解
3.1 整体架构
整套系统采用前后端分离架构:
微信小程序端(用户 + 商家) -> HTTP/JSON -> Spring Boot 后端 -> MySQL | 管理后台(Web)后端负责业务逻辑和数据处理,小程序端负责展示和交互,管理后台负责运营和审核。
3.2 功能模块划分
从业务的角度,可以拆成四个端:
| 端 | 核心功能 |
|---|---|
| 用户端 | 微信授权登录、浏览车源、条件筛选、车辆详情、收藏、预约看车、下单支付、订单跟踪、意见反馈 |
| 商家端 | 车辆发布、车辆图册管理、车辆上下架、预约处理、订单确认、成交管理 |
| 管理后台 | 车辆审核、商家入驻审核、用户管理、订单管理、数据看板、公告配置 |
| 系统端 | 微信登录态维护、支付回调、订阅消息推送、文件存储 |
3.3 数据库核心表设计
一个二手车系统最少需要这几张表:
-- 用户表 CREATE TABLE `user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `openid` varchar(64) DEFAULT NULL COMMENT '微信openid', `nickname` varchar(50) DEFAULT NULL, `avatar` varchar(255) DEFAULT NULL, `phone` varchar(20) DEFAULT NULL, `role` tinyint(4) DEFAULT '0' COMMENT '0普通用户 1商家 2管理员', `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_openid` (`openid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 车辆表 CREATE TABLE `car` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `title` varchar(100) DEFAULT NULL COMMENT '车辆标题', `brand` varchar(30) DEFAULT NULL COMMENT '品牌', `series` varchar(50) DEFAULT NULL COMMENT '车系', `price` decimal(10,2) DEFAULT NULL COMMENT '售价', `mileage` decimal(10,2) DEFAULT NULL COMMENT '表显里程(万公里)', `reg_date` varchar(20) DEFAULT NULL COMMENT '上牌日期', `gearbox` tinyint(4) DEFAULT NULL COMMENT '变速箱', `cover_image` varchar(255) DEFAULT NULL, `images` text COMMENT '图册JSON', `status` tinyint(4) DEFAULT '0' COMMENT '0待审核 1已上架 2已下架 3已售出', `seller_id` bigint(20) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 订单表 CREATE TABLE `order` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `order_no` varchar(64) DEFAULT NULL, `user_id` bigint(20) DEFAULT NULL, `car_id` bigint(20) DEFAULT NULL, `amount` decimal(10,2) DEFAULT NULL, `status` tinyint(4) DEFAULT NULL COMMENT '0待支付 1已支付 2已取消 3已完成', `pay_time` datetime DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;实际开发时,建议再补充预约看车表、收藏表、意见反馈表和轮播图表。表结构调整的余地很大,关键在于业务主链路要清晰:用户看车 -> 预约/下单 -> 支付 -> 商家确认 -> 交易完成。
4. 本地部署环境准备
4.1 基础软件清单
以下是一套通用的开发环境,具体版本以你本机已安装的为准:
| 依赖 | 版本建议 | 说明 |
|---|---|---|
| JDK | JDK 8 或 JDK 11 | 大多数 Spring Boot 2.x 项目可运行 |
| Maven | Maven 3.6+ | 后端依赖管理 |
| MySQL | MySQL 5.7 / 8.0 | 业务数据存储 |
| Redis(可选) | Redis 6.x | 缓存登录态、热点车源 |
| 微信开发者工具 | 最新稳定版即可 | 小程序前端编译调试 |
| Node.js(可选) | Node 16+ | 如果后台是 Vue 项目,需要用到 |
4.2 微信小程序前置配置
在跑通项目之前,需要到微信公众平台完成以下配置:
- 注册小程序账号,获取 AppID。测试阶段可以使用测试号。
- 在“开发设置”中配置服务器域名。开发阶段可以勾选“不校验合法域名”,方便本地调试。
- 如果涉及微信支付,需要注册微信支付商户号,并完成关联。
- 下载微信开发者工具,导入项目时选择自己的 AppID。
这里有一个容易踩坑的点:微信小程序在真机预览时,wx.request的域名必须是 HTTPS 且备案过的。本地联调时最方便的做法是打开微信开发者工具右上角的“详情 -> 本地设置 -> 不校验合法域名”,否则请求会被拦截。
5. 安装部署与启动方式
5.1 后端服务启动
拿到项目源码后,先看目录结构。典型的后端工程大概长这样:
car-backend/ ├── src/main/java │ └── com/example/car │ ├── controller │ ├── service │ ├── mapper │ ├── entity │ └── config ├── src/main/resources │ └── application.yml └── pom.xml第一步,修改数据库连接配置。打开application.yml,改成你的本地数据库信息:
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/car_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: your_password servlet: multipart: max-file-size: 10MB max-request-size: 100MB第二步,创建数据库并导入 SQL 脚本。大部分项目会在根目录附带sql文件夹,执行里面的建库建表脚本即可。
第三步,启动后端服务:
# 使用 Maven 包装器 ./mvnw spring-boot:run # 或先打包再运行 mvn clean package -DskipTests java -jar target/car-backend.jar启动成功后,控制台会显示 Spring Boot 的启动日志,一般默认端口是8080。如果端口被占用,需要手动改server.port。
5.2 微信小程序前端导入
前端仓库的结构一般是:
car-miniapp/ ├── pages │ ├── index // 首页 │ ├── car-list // 车源列表 │ ├── car-detail // 车辆详情 │ ├── publish // 发布车辆 │ ├── order // 订单 │ └── mine // 个人中心 ├── utils │ ├── request.js // 请求封装 │ └── auth.js // 登录态管理 ├── app.js └── app.json打开微信开发者工具,选择“导入项目”,目录选择到car-miniapp这一层,AppID 填写你自己的。导入后第一件事是修改utils/request.js里的接口地址:
const BASE_URL = 'http://127.0.0.1:8080'; // 本地调试地址 function request(url, method = 'GET', data = {}) { return new Promise((resolve, reject) => { wx.request({ url: BASE_URL + url, method: method, data: data, header: { 'Content-Type': 'application/json', 'Authorization': wx.getStorageSync('token') || '' }, success: (res) => resolve(res.data), fail: (err) => reject(err) }); }); } module.exports = { request, BASE_URL };修改完成后,点击“编译”。如果首页能拉到后端返回的车源数据,说明前后端链路已经打通。
5.3 管理后台启动
管理后台如果是 Vue 项目,典型启动方式:
cd car-admin npm install npm run dev如果后台是 Thymeleaf 模板形式,会打包在 Spring Boot 项目里,直接访问http://127.0.0.1:8080/admin即可。启动前先确认管理端账号已经写入数据库。
6. 核心功能实现要点
6.1 微信登录与登录态维护
小程序端调用wx.login()获取临时 code,后端拿着 code 去微信接口换取 openid:
@PostMapping("/api/auth/login") public Result login(@RequestBody LoginDTO dto) { String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId + "&secret=" + appSecret + "&js_code=" + dto.getCode() + "&grant_type=authorization_code"; String response = restTemplate.getForObject(url, String.class); JSONObject obj = JSONObject.parseObject(response); String openid = obj.getString("openid"); // 查询或创建用户 return Result.ok(token); }登录态建议通过自定义 token 维护,后端生成一个 UUID 或 JWT 返回给小程序,小程序存在wx.setStorageSync中,后续请求放到 header 的Authorization字段里。
6.2 车辆发布与图片上传
车辆发布是系统的核心操作。小程序端先调用wx.chooseImage选择图片,再用wx.uploadFile上传到后端:
wx.chooseImage({ count: 6, success: (res) => { const tempFilePaths = res.tempFilePaths; tempFilePaths.forEach((filePath, index) => { wx.uploadFile({ url: BASE_URL + '/api/file/upload', filePath: filePath, name: 'file', success: (uploadRes) => { const data = JSON.parse(uploadRes.data); imageList.push(data.data.url); } }); }); } });后端上传接口将文件保存到本地磁盘或对象存储服务,返回可访问的 URL。车辆发布时,将标题、价格、里程、图片列表、车况描述一起提交到/api/car/publish。
这里要注意几点:图片大小要控制在合理范围内,后端要做文件类型校验和大小限制;生产环境不要存本地磁盘,要用对象存储来保存图片;车辆发布的表单要加必填校验。
6.3 车源检索与筛选
车源列表页是用户使用最多的页面。筛选条件一般包括品牌、车系、价格区间、车龄、变速箱类型。后端建议使用 MyBatis-Plus 的条件构造器:
LambdaQueryWrapper<Car> wrapper = new LambdaQueryWrapper<>(); if (StringUtils.isNotBlank(dto.getBrand())) { wrapper.eq(Car::getBrand, dto.getBrand()); } if (dto.getMinPrice() != null) { wrapper.ge(Car::getPrice, dto.getMinPrice()); } if (dto.getMaxPrice() != null) { wrapper.le(Car::getPrice, dto.getMaxPrice()); } wrapper.eq(Car::getStatus, 1).orderByDesc(Car::getCreateTime);筛选功能要考虑数据量变大的情况。当车源超过一定数量后,就要引入 Elasticsearch 或者增加数据库索引。初期开发阶段,只要主键索引和状态索引合理,MySQL 完全够用。
6.4 预约看车与订单支付
用户可以在车辆详情页提交预约看车,填写看车时间和联系电话。商家在管理后台或商家端小程序查看预约记录,联系用户确认时间。
交易环节使用微信支付 v3。流程是:
- 用户下单,后端创建订单并返回订单号。
- 后端调用微信支付统一下单接口,返回支付参数。
- 小程序端调用
wx.requestPayment拉起支付。 - 支付成功后,微信回调后端通知接口,后端更新订单状态。
需要注意:微信支付 v3 需要配置商户私钥、商户证书序列号、API v3 密钥,并下载平台证书。这里最容易踩的坑是“无可用的平台证书”和“证书序列号不匹配”。
6.5 地图选点与位置展示
如果车辆信息包含门店位置,小程序端可以使用wx.chooseLocation让用户选择地址,使用map组件展示位置。使用地图能力前,需要在小程序后台配置地图服务的域名。
地图组件在 iOS 端要注意一个兼容问题:video 组件嵌套在 swiper 中时,iOS 上全屏播放容易错位。这类问题一般通过限制 swiper 高度、在 video 播放时隐藏其他元素来规避。
7. 接口安全与调用规范
7.1 接口鉴权
后端接口必须区分“需要登录”和“无需登录”两种类型。
- 公开接口:车源列表、车辆详情、品牌列表。
- 登录接口:收藏、预约、下单、发布车辆、个人中心。
建议定义一个拦截器,在进入 Controller 之前校验 token:
public class AuthInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token == null || !TokenManager.verify(token)) { response.setStatus(401); return false; } return true; } }注意:拦截器要排除/api/auth/login、/api/car/list、/api/car/detail等公开接口。
7.2 参数校验与防刷
- 后端所有新增、修改接口都要做参数校验,不能只依赖前端。
- 发布车辆、提交订单等操作要做频率限制,防止恶意刷接口。
- 涉及到金额计算的接口,金额必须以后端计算为准,不能信任前端传过来的价格字段。
- SQL 查询要使用参数绑定,防止 SQL 注入。
7.3 数据脱敏
在开发测试阶段,车辆图片、电话、位置等信息要使用测试数据。上线后,用户手机号在小程序端建议使用微信手机号快速验证组件获取,不直接让用户手动输入,这样既能提升体验,又能减少隐私合规风险。
8. 管理后台与批量运营能力
管理后台不是一个可有可无的模块。二手车系统如果没有运营端,车辆信息的分发和管理就会变得很混乱。
管理后台至少要包含以下功能:
- 车辆审核:用户或商家发布的车辆,必须经过审核后才能上架展示。
- 车辆批量导入:运营人员可以通过 Excel 批量导入车源,减少手工录入成本。
- 批量上下架:针对到期车辆或问题车辆,支持按条件批量下架。
- 订单管理:查看订单状态、支付金额、退款操作。
- 数据看板:统计每日新增车源、预约量、成交量、成交金额。
- 用户管理:查看用户列表、冻结异常账号。
批量任务设计时,建议后端使用异步线程池或消息队列处理。如果只是 Excel 导入,用 EasyExcel 加简单的事务控制就能完成,不需要引入过于复杂的中间件。
9. 微信小程序二手车系统常见问题与排查方法
以下是这套系统在开发调试中最高频遇到的问题,基本都来自微信小程序开发者实际踩坑的经验总结。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
请求接口报url not in domain list | 域名未配置或域名不合规 | 查看微信开发者工具控制台报错 | 开发环境勾选“不校验合法域名”;上线配置 HTTPS 合法域名 |
| 微信支付提示“无可用的平台证书” | 平台证书未下载或未配置 | 检查商户平台证书目录,确认 API v3 密钥 | 下载最新平台证书,重启支付服务 |
| 支付回调不执行 | 回调地址未配置或回调地址不可外网访问 | 查看微信支付商户平台回调配置,测试回调 URL | 使用内网穿透工具联调,或部署到公网服务器测试 |
| 微信登录拿不到 openid | AppID 与 AppSecret 不匹配,或请求参数错误 | 打印 jscode2session 返回参数 | 核对小程序后台的 AppSecret,检查 code 是否使用了两次 |
| iOS 端 swiper 嵌套 video 全屏错位 | video 组件层级过高,swiper 高度计算异常 | 真机预览复现 | 播放时全屏处理,或自定义播放组件 |
| 顶部导航栏高度异常 | 不同机型状态栏高度不同 | 真机预览对比 | 使用wx.getMenuButtonBoundingClientRect动态计算胶囊位置 |
| 手机软键盘遮挡查询框 | input 组件被键盘遮挡 | 查看页面布局 | 监听bindkeyboardheightchange动态调整容器底部距离 |
| 抓包看不到小程序请求 | 小程序使用证书校验,或抓包工具未安装证书 | 在抓包工具中安装 HTTPS 证书 | 使用支持 HTTPS 解密的抓包工具 |
| 蓝牙打印连接不稳定 | 部分手机蓝牙版本兼容性差异 | 多机型真机测试 | 代码中增加重连机制 |
| 图片上传失败 | 文件过大、后端上传接口异常、域名限制 | 查看后端日志和前端返回码 | 压缩图片、调整上传大小限制 |
| 自定义标题栏不生效 | 页面配置未开启自定义导航,或状态栏高度未适配 | 检查 app.json 和页面 json | 页面配置"navigationStyle": "custom" |
| 反编译现象 | 小程序代码被反编译分析 | 检查代码混淆和包体积 | 上线前代码压缩混淆,敏感逻辑放到后端 |
这只是一部分问题清单。实际开发中遇到最多的其实就三类:登录态问题、支付问题、真机兼容问题。登录态问题可以通过统一封装request.js并在后端打印 token 校验日志来解决;支付问题一定要先区分“统一下单失败”和“拉起支付失败”,分别查看日志和微信返回码;真机兼容问题只能靠多机型测试。
10. 最佳实践与合规提醒
10.1 开发阶段建议
- 第一次跑通项目时,优先验证“微信登录 -> 车源列表 -> 车辆详情 -> 发布车辆”这条主链路,其余功能后续再补。
- 保留一套最小可运行配置。数据库连接、接口地址、AppID 等配置单独拆成配置文件,不要写死在代码里。
- 接口统一返回结构。建议后端所有接口返回
{ code, message, data }三段式 JSON,前端在request.js里统一处理错误提示。 - 批量任务加日志和失败重试。无论是 Excel 导入还是批量上下架,都要记录成功数和失败数,失败数据要能导出查看原因。
- 多人协作时,使用 Git 管理代码,小程序端、后端、管理后台分仓库或分目录管理。
10.2 上线前检查
上线不是一个“编译通过”就结束的事情。你需要确认:
- 小程序后台配置了合法的 HTTPS 请求域名、上传域名、下载域名。
- 微信支付商户号已经关联小程序 AppID,并配置了支付回调地址。
- 隐私协议已经更新,尤其是用户手机号、位置信息的使用目的。
- 车辆信息、用户信息、订单数据做了备份策略。
- 管理后台的默认密码已经修改,接口服务不能被外网随意访问。
10.3 合规与安全提醒
二手车系统涉及车辆信息发布和在线交易,有几条红线必须守住:
- 不得发布盗抢车、抵押车、事故翻新车等不合规车源,平台要有审核机制。
- 用户上传的车辆图片、行驶证、身份信息都涉及隐私,必须声明用途并限制访问权限。
- 微信支付资金流水必须可追溯,不允许使用个人微信收款码代替小程序支付。
- 上线前确认自己的小程序类目和资质是否满足微信平台要求,避免审核被驳回或封禁。
- 开发测试期间使用测试数据,不要导入真实车辆信息和用户数据。
11. 总结与下一步
基于微信小程序的二手车系统,最大的价值不是“功能多”,而是它把微信小程序端、Spring Boot 后端、MySQL 数据库和管理后台完整地串成了一条可运行的全栈业务链路。这类项目能让你在短时间内掌握微信登录、接口鉴权、图片上传、商品信息发布、订单支付、后台管理这些高频开发技能,换个业务场景就能复用。
建议拿到项目后,第一件事是先跑通前后端联通,也就是“小程序首页能拉到车源数据”。这一步通了,说明环境、数据库、接口都没问题,后续开发效率会高很多。最容易踩的坑集中在微信支付 v3 配置和真机调试兼容性上,建议提前准备好测试号和测试手机。
作为下一个阶段的扩展方向,你可以尝试加入二手车估价模型、车辆检测报告上传、在线合同签署、聊天沟通功能、金融分期方案展示等模块,这些都很适合作为毕业设计的差异化亮点。