1. 项目概述与背景
校园二手交易平台是大学生群体中极具实用价值的应用场景。每年毕业季,大量教材、电子产品、生活用品被低价转卖或直接丢弃;而新生入学时又需要购置这些物品。传统的QQ群、贴吧交易方式存在信息杂乱、交易风险高、缺乏担保机制等问题。基于微信小程序的二手交易平台恰好能解决这些痛点——无需下载安装,依托微信生态的社交属性,结合实名认证体系,打造安全便捷的校园二手交易闭环。
本项目采用UniApp跨端框架开发,一次编码可同时发布到微信小程序、H5等多端。后端使用SpringBoot+MySQL技术栈,兼顾开发效率与系统性能。作为毕业设计项目,它完整涵盖了需求分析、技术选型、数据库设计、前后端开发、测试部署等全流程,具有典型的教学参考价值。
2. 技术架构解析
2.1 前端技术栈选型
UniApp框架优势:
- 跨端能力:使用Vue.js语法编写代码,通过条件编译适配不同平台。本项目主要输出微信小程序端,但保留扩展H5/App的能力
- 开发效率:基于HBuilderX的智能提示和真机调试功能,比原生小程序开发效率提升40%以上
- 生态丰富:兼容微信小程序原生API,同时可使用uni-ui组件库加速界面开发
ColorUI选择考量:
- 设计风格符合年轻用户审美,提供卡片式商品展示模板
- 内置动画效果库(如商品上架时的弹性动画)
- 特别优化了图片懒加载组件,适合商品列表场景
2.2 后端技术方案
SpringBoot关键配置:
yaml复制# application.yml 核心配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/campus_trade?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
servlet:
multipart:
max-file-size: 10MB # 允许上传的商品图片大小
mybatis-plus:
mapper-locations: classpath:mapper/*.xml
MySQL表设计要点:
- 商品表添加
campus_id字段实现多校区隔离 - 采用软删除设计(
is_deleted标记位) - 消息表使用
msg_type区分系统通知/私信
3. 核心功能实现
3.1 用户认证体系
微信登录流程优化:
- 前端调用
wx.login()获取临时code - 向后端发送code+用户基本信息(头像昵称等)
- 后端通过微信API服务换取openid和session_key
- 生成自定义token并关联用户角色(学生/管理员)
java复制// JWT token生成示例
public String createToken(String openid, String role) {
Map<String, Object> claims = new HashMap<>();
claims.put("openid", openid);
claims.put("role", role);
return Jwts.builder()
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + 30 * 24 * 60 * 60 * 1000L)) // 30天有效期
.signWith(SignatureAlgorithm.HS256, "your-secret-key")
.compact();
}
3.2 商品交易闭环
商品发布流程:
- 表单验证:检查标题长度、价格格式、图片数量(限制最多9张)
- 图片上传:使用uni.uploadFile API分片上传至云存储
- 敏感词过滤:调用阿里云内容安全API进行实时检测
- 自动归类:基于标题关键词匹配商品分类(教材/数码/服饰等)
订单状态机设计:
mermaid复制stateDiagram
[*] --> 待付款
待付款 --> 已取消: 超时未支付
待付款 --> 待发货: 支付成功
待发货 --> 待收货: 卖家发货
待收货 --> 已完成: 确认收货
待收货 --> 退款中: 发起退款
退款中 --> 已取消: 退款成功
4. 性能优化实践
4.1 数据库优化
索引策略:
- 商品表:联合索引
(campus_id, category, status) - 订单表:
buyer_id和seller_id单独索引 - 搜索表:FULLTEXT索引优化标题关键词搜索
缓存方案:
java复制@Cacheable(value = "goods", key = "#id")
public GoodsVO getGoodsDetail(Long id) {
// 数据库查询逻辑
}
@CacheEvict(value = "goods", key = "#goodsId")
public void updateGoodsStatus(Long goodsId, Integer status) {
// 更新操作
}
4.2 小程序端优化
首屏加载加速:
- 使用分包加载,将非核心页面(如"我的收藏")放入子包
- 商品列表实现虚拟滚动,只渲染可视区域内容
- 图片使用WebP格式并设置CDN加速
网络请求优化:
- 合并基础配置请求(如校区列表、商品分类)
- 实现请求重试机制,自动处理微信网络波动
- 重要操作(如支付)采用二次确认防误触
5. 典型问题解决方案
5.1 微信登录失败排查
常见场景:
- code无效:检查AppID配置,确保前后端一致
- session_key泄露:避免在前端存储敏感信息
- 用户信息解密失败:确认加密算法模式为AES-128-CBC
关键检查点:微信开发者工具-项目配置-域名白名单是否包含后端地址
5.2 图片上传异常处理
稳定性增强方案:
- 分片上传:大文件切割为1MB的chunk
- 断点续传:记录已上传分片信息
- 失败重试:设置最多3次自动重试
javascript复制// uni-app分片上传示例
const uploadTask = uni.uploadFile({
url: 'https://your-api.com/upload',
filePath: file,
name: 'file',
formData: {
chunkIndex: index,
totalChunks: chunks.length,
fileHash: hash
},
success: (res) => {
if(res.statusCode !== 200) {
this.retryUpload(file, index);
}
}
});
6. 项目扩展方向
6.1 多校区适配方案
- 数据库添加校区表(campus),商品关联campus_id
- 首页根据GPS自动定位最近校区
- 后台管理支持分校区数据统计
6.2 信用体系设计
- 交易评价影响信用分(1-5星)
- 违约行为记录(如虚假发货)
- 信用分特权(如优先展示、免押金)
6.3 即时通讯集成
使用腾讯云IM SDK实现:
- 商品咨询实时聊天
- 订单状态变更通知
- 系统公告推送
7. 开发心得与建议
-
微信审核避坑:
- 避免使用"二手"字样,改用"校园闲置"
- 支付功能需申请企业资质
- 用户隐私协议必须明确数据用途
-
性能调优经验:
- MySQL连接池大小建议设为CPU核心数*2 + 有效磁盘数
- 商品列表分页使用
last_id方式优于limit offset - 定期执行
OPTIMIZE TABLE减少碎片
-
安全防护要点:
- 接口防刷:短信验证码需图形验证前置
- XSS防护:富文本内容使用DOMPurify过滤
- 权限控制:@PreAuthorize注解校验角色
这个项目让我深刻体会到校园场景下的产品设计需要特别关注:
- 学期周期性(开学/期末需求差异)
- 用户社交链(同校/同系信任度更高)
- 线下交付场景(建议增加"自提点"功能)
对于想尝试类似项目的开发者,建议先从MVP版本开始:核心交易流程(发布-沟通-支付)跑通后,再逐步扩展评价系统、信用体系等增值功能。数据库设计时要预留足够的扩展字段,校园业务的个性化需求往往超出初期预期。