1. 项目背景与需求分析
1.1 为什么选校园二手商城切入
每个大学生宿舍里都堆着毕业季带不走的风扇、考研结束就吃灰的参考书、冲动消费买来只穿过一次的衣服,这些物品的价值在校内人群之间其实是可以重新流动起来的。而目前市面上闲鱼、转转这类综合二手平台,虽然品类全、用户多,但放到校园这个场景里反而有几个没解决的痛点:第一,物流成本不划算,卖个20块钱的台灯,运费就要12块;第二,信任机制缺失,跨校陌生人交易容易碰到瑕疵描述不实的情况;第三,信息被淹没在同城海量商品中,曝光效率低。
校园二手商城就不一样了,用户在同一个校区、甚至同一栋宿舍楼,可以当面验货、当场交易,物流和信任问题同时消除。这个小程序要做的,就是把这个“校内跳蚤市场”搬到微信里,让买卖双方在平台上完成信息发布、浏览、联系、交易支付,形成一个闭环。做这个项目的直接动机很现实:毕业季宿舍楼下确实堆着大量闲置,而每年新生入学又有一批人正需要低价接手这些物品,供需两端天然匹配。
1.2 目标用户与核心使用场景分析
这个系统主要覆盖三类角色:买方、卖方、平台管理员。买方通常是低年级本科生,需求明确,预算有限,会搜索教材、自行车、小家电这类高频品类。卖方则多是高年级学生和即将离校的毕业生,他们需要在短时间内快速处理大量物品,对发布流程的便捷性要求很高。管理员一般是校内勤工助学的学生或者后勤部门的工作人员,日常工作是审核商品、处理举报、管理用户状态。
从使用场景来看,我梳理出四条关键链路,开发时要优先满足:一是逛,用户打开小程序能看到推荐商品,按分类筛选;二是搜,能通过关键词快速找到目标商品;三是聊,买卖双方需要在线沟通(可以直接用微信的客服消息或预留手机号,不用自研IM);四是成,下单支付、线下交付、确认收货。整个系统不用做太重,但核心链路必须完整。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与整体方案设计
2.1 小程序端框架选型:原生还是uni-app
这是项目启动后我做的第一个关键决策。当时市面上比较主流的方案有三个:微信小程序原生框架、uni-app跨端框架、Taro React跨端框架。我最终选择了原生框架,主要是基于三个考量。
第一,项目功能边界清晰,没有多端发布的需求。这个系统只服务校内用户,微信小程序就够用了,不需要额外覆盖App和H5,跨端框架带来的“一次编写、多端运行”优势在这里体现不出来。第二,原生框架对微信API的封装最直接,登录、支付、订阅消息这些核心能力在原生环境下调试链路最短,遇到问题定位也快。尤其支付功能,涉及商户号、证书、回调验签这些环节,跨端框架抽象层容易把问题复杂化。第三,原生框架的包体积控制和性能表现更好,对于设备配置参差不齐的学生手机来说,渲染性能差异在长列表场景下会比较明显。
当然,原生开发也不是没有问题。它的代码结构相对繁琐,页面逻辑和样式写起来不如Vue语法舒服,组件复用需要依赖自定义组件机制。但综合项目周期和维护成本来看,原生依然是最稳妥的选择。如果你未来确实有App端的计划,再用uni-app重写也不算晚,业务逻辑和接口设计可以提前做好分层。
2.2 服务端选型:云开发还是自建后端
第二个关键决策是后端方案,我在微信云开发和自建服务器后端之间反复对比过。这里给大家分享一个可以复用的决策逻辑:算人力账、算运维账、算成本账。
人力账:如果选择自建后端,需要维护服务器、配置HTTPS证书、处理备案、搭建数据库、写接口层、做鉴权,前期工作量大,后续还要定期打补丁、做备份。这对一个校园项目来说,意味着要有一个人长期盯着服务器稳定性和安全性。云开发则把这些全部封装好了,登录鉴权有现成的openid机制,数据库是文档型的,存储有自带CDN加速,云函数免运维,开发效率能提升不少。
运维账:校园项目的访问量有明显的潮汐特征,平时每天几百人用,到了毕业季或开学季可能突然涨到几千人同时在线。自建服务器遇到这种脉冲流量,要么提前备好高配机器造成资源浪费,要么扛不住波动影响体验。云开发按量计费,天然适配这种弹性场景。
成本账:云开发有免费额度,个人项目跑日常流量基本够用,超出部分按量计费。自建服务器虽然也有低价的学生机,但把域名、证书、带宽、存储加起来,一年的费用并不会比云开发低多少,还得搭进去运维精力。
我最后选了微信云开发作为服务端,数据库用云开发自带的文档型数据库,图片上传用云存储,后端逻辑写在云函数里。这个方案最大的好处是,整个项目没有引入一台需要管理的服务器,却完整支撑了用户认证、商品管理、交易记录、反馈处理这些核心业务逻辑。
2.3 系统整体架构梳理
整个系统的架构可以分为三层来看。表现层就是微信小程序客户端,负责展示商品信息、处理用户交互、调用微信API;业务逻辑层由云函数承担,每个云函数就是一个独立的Node.js模块,负责接收客户端的调用请求,执行具体的业务规则,例如发布商品时检查敏感词、下单时校验库存状态;数据层使用云开发的文档型数据库,按业务域划分集合,存储用户信息、商品数据、订单数据和反馈记录。
云函数之间的调用关系也尽量保持清晰:客户端通过wx.cloud.callFunction调用云函数,云函数与数据库直接交互,支付相关的回调则通过HTTPS触发云函数来处理。商品图片统一传到云存储,数据库只保存fileID,前端通过云存储的临时链接来展示。
3. 核心功能模块详细设计与实现
3.1 用户登录与身份管理模块
用户登录是整个系统的入口,也是第一个需要实现的功能。微信小程序提供了一套完整的登录链路:前端调用wx.login获取临时code,把code传给云函数,云函数用code向微信服务端换取openid,这个openid就是用户的唯一标识。在云开发环境下,这个过程更简单,云函数可以直接通过cloud.getWXContext()获取到openid,不需要额外维护session状态。
javascript复制// 登录云函数
const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
const db = cloud.database()
const users = db.collection('users')
// 根据openid查询用户,判断是否已注册
const userRes = await users.where({
_openid: wxContext.OPENID
}).get()
let userInfo
if (userRes.data.length > 0) {
// 已注册用户,直接返回信息
userInfo = userRes.data[0]
} else {
// 新用户,用默认昵称创建记录
const newUser = {
_openid: wxContext.OPENID,
nickname: '微信用户',
avatarUrl: '',
phone: '',
studentId: '',
campus: '',
creditScore: 100,
createdA
