
1. 项目概述作为一名在校园二手交易领域深耕多年的开发者我最近完成了一个基于Spring Boot和微信小程序的校园二手交易平台。这个项目源于我在大学期间观察到的一个普遍现象每年毕业季大量仍有使用价值的物品被直接丢弃而新生入学时又需要重新购置同样的物品。这种资源浪费让我萌生了搭建一个校内二手交易平台的想法。这个平台的核心目标是解决三个关键问题提高二手物品的流通效率减少资源浪费降低学生的生活成本构建一个可信的校内交易环境经过三个月的开发和测试平台已经稳定运行日均交易量达到200用户活跃度保持在60%以上。下面我将详细介绍这个项目的技术实现和关键设计思路。2. 技术选型与架构设计2.1 后端技术栈选择Spring Boot作为后端框架主要基于以下考虑快速开发Spring Boot的自动配置和起步依赖大大减少了样板代码微服务友好为未来可能的业务扩展预留空间社区支持丰富的文档和活跃的社区SpringBootApplication public class SecondHandApplication { public static void main(String[] args) { SpringApplication.run(SecondHandApplication.class, args); } }数据库选用MySQL 8.0主要因为事务支持完善保证交易数据一致性对校园场景下的数据量预计10万级性能足够与Spring生态集成良好2.2 前端技术选型微信小程序作为前端主要因为免安装降低用户使用门槛社交属性强便于商品分享传播开发成本低一套代码兼容iOS和Android// 小程序首页示例代码 Page({ data: { goodsList: [], currentPage: 1 }, onLoad() { this.loadGoods() }, loadGoods() { wx.request({ url: https://api.example.com/goods, success: (res) { this.setData({goodsList: res.data}) } }) } })2.3 系统架构系统采用经典的三层架构表现层微信小程序 管理后台Web界面业务逻辑层Spring Boot应用数据访问层MySQL Redis缓存提示在实际开发中我们使用了Redis缓存热门商品数据和会话信息将商品列表查询响应时间从300ms降低到50ms左右。3. 核心功能实现3.1 商品模块商品模块是整个系统的核心主要功能包括商品发布商品浏览与搜索商品收藏商品状态管理3.1.1 商品发布流程用户填写商品信息标题、描述、价格等上传商品图片最多6张选择商品分类和状态提交审核// 商品发布接口示例 PostMapping(/goods) public Result publishGoods(RequestBody GoodsDTO goodsDTO) { // 1. 参数校验 if (StringUtils.isEmpty(goodsDTO.getTitle())) { return Result.error(商品标题不能为空); } // 2. 保存商品信息 Goods goods new Goods(); BeanUtils.copyProperties(goodsDTO, goods); goods.setStatus(GoodsStatus.PENDING); goodsService.save(goods); // 3. 保存商品图片 goodsImageService.saveBatch(goodsDTO.getImages()); return Result.success(); }3.1.2 商品搜索实现我们实现了基于Elasticsearch的商品搜索功能支持关键词搜索分类筛选价格区间过滤新旧程度筛选public PageGoodsVO searchGoods(GoodsQuery query) { // 构建搜索请求 NativeSearchQueryBuilder builder new NativeSearchQueryBuilder(); // 添加查询条件 if (StringUtils.isNotBlank(query.getKeyword())) { builder.withQuery(QueryBuilders.matchQuery(title, query.getKeyword())); } // 添加分页 builder.withPageable(PageRequest.of(query.getPage(), query.getSize())); // 执行搜索 SearchHitsGoods hits elasticsearchRestTemplate.search(builder.build(), Goods.class); // 转换结果 return convertToPage(hits, query.getPageable()); }3.2 交易模块交易模块确保买卖双方能够安全、便捷地完成交易主要功能包括订单创建支付集成订单状态管理交易评价3.2.1 订单状态机设计我们使用状态模式管理订单生命周期stateDiagram [*] -- PENDING PENDING -- PAID: 支付成功 PENDING -- CANCELLED: 取消订单 PAID -- SHIPPED: 卖家发货 SHIPPED -- COMPLETED: 确认收货 SHIPPED -- REFUNDING: 申请退款 REFUNDING -- REFUNDED: 退款成功 REFUNDING -- SHIPPED: 退款拒绝注意实际开发中我们使用Spring State Machine实现状态管理确保状态转换的原子性和一致性。3.2.2 支付集成平台接入了微信支付关键实现点生成预付单支付结果回调处理支付状态同步public PaymentResult createPayment(Order order) { // 1. 调用微信支付API生成预付单 WxPayUnifiedOrderRequest request new WxPayUnifiedOrderRequest(); request.setBody(order.getGoodsTitle()); request.setOutTradeNo(order.getOrderNo()); request.setTotalFee(order.getAmount()); // 2. 调用微信支付SDK WxPayUnifiedOrderResult result wxPayService.unifiedOrder(request); // 3. 返回支付参数给前端 PaymentResult paymentResult new PaymentResult(); paymentResult.setAppId(result.getAppid()); paymentResult.setTimeStamp(String.valueOf(System.currentTimeMillis()/1000)); paymentResult.setNonceStr(result.getNonceStr()); paymentResult.setPackageValue(prepay_id result.getPrepayId()); paymentResult.setSignType(MD5); return paymentResult; }3.3 用户模块用户模块负责用户身份认证和权限管理主要功能包括微信登录个人信息管理收藏夹消息通知3.3.1 微信登录流程小程序端调用wx.login获取code将code发送到后端后端使用code向微信服务器换取openid创建或更新用户信息返回自定义tokenpublic String wechatLogin(String code) { // 1. 使用code换取openid WxMaJscode2SessionResult session wxMaService.getUserService() .getSessionInfo(code); // 2. 查询或创建用户 User user userService.findByOpenid(session.getOpenid()); if (user null) { user new User(); user.setOpenid(session.getOpenid()); userService.save(user); } // 3. 生成JWT token return JwtUtil.generateToken(user.getId()); }3.3.2 权限控制我们使用Spring Security实现基于角色的访问控制Configuration EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers(/admin/**).hasRole(ADMIN) .antMatchers(/user/**).hasRole(USER) .anyRequest().permitAll() .and() .addFilter(new JwtAuthenticationFilter(authenticationManager())); } }4. 数据库设计4.1 核心表结构4.1.1 商品表(second_hand_goods)字段类型说明idbigint主键titlevarchar(100)商品标题descriptiontext商品描述pricedecimal(10,2)价格category_idint分类IDseller_idbigint卖家IDstatustinyint状态(0:待审核,1:已上架,2:已下架)view_countint浏览数created_atdatetime创建时间4.1.2 订单表(order)字段类型说明idbigint主键order_novarchar(32)订单编号goods_idbigint商品IDbuyer_idbigint买家IDamountdecimal(10,2)订单金额statustinyint订单状态payment_timedatetime支付时间created_atdatetime创建时间4.2 索引优化为提高查询性能我们在以下字段上创建了索引商品表seller_id, category_id, status订单表buyer_id, goods_id, statusCREATE INDEX idx_goods_seller ON second_hand_goods(seller_id); CREATE INDEX idx_goods_category ON second_hand_goods(category_id); CREATE INDEX idx_order_buyer ON order(buyer_id);5. 部署与运维5.1 服务器配置我们使用阿里云ECS部署服务配置如下CPU: 2核内存: 4GB系统盘: 100GB SSD带宽: 5Mbps5.2 部署架构5.3 监控与告警我们使用Prometheus Grafana搭建监控系统监控以下指标应用指标QPS、响应时间、错误率系统指标CPU、内存、磁盘使用率数据库指标查询耗时、连接数6. 项目总结6.1 关键成果用户增长上线3个月注册用户突破5000人交易量日均交易额超过1万元技术沉淀形成了一套可复用的校园交易平台解决方案6.2 经验教训图片处理初期没有对用户上传的图片进行压缩导致存储空间快速增长。后来我们引入了图片压缩和CDN加速。事务管理在订单创建流程中最初没有处理好分布式事务导致偶尔出现数据不一致。最终我们通过本地消息表解决了这个问题。缓存策略商品详情页最初没有使用缓存在高并发时数据库压力很大。后来我们引入了多级缓存策略Redis 本地缓存。6.3 未来规划引入推荐算法根据用户行为推荐相关商品增加信用评价体系提升平台可信度开发卖家端APP方便批量商品管理这个项目让我深刻理解了如何将一个想法转化为实际可用的产品。技术选型的合理性、架构设计的扩展性、细节处理的完善度都会直接影响最终的用户体验。希望我的经验对正在开发类似项目的同学有所帮助。