校园二手交易平台的需求在近年来呈现爆发式增长。作为一名经历过四年大学生活的开发者,我深刻理解学生们面临的痛点:每到毕业季,大量教材、电器、生活用品被低价处理甚至丢弃;而新生入学时又需要重新购置这些物品。这种资源错配不仅造成浪费,也加重了学生经济负担。
传统线下交易方式存在三个核心问题:
我们设计的系统主要解决以下问题:
采用前后端分离架构,主要基于以下考虑:
code复制客户端层
├── Web前端(Vue.js)
├── 微信小程序(预留接口)
└── 管理后台(Vue+ElementUI)
服务层
├── API网关(Spring Cloud Gateway)
├── 用户服务
├── 商品服务
├── 订单服务
└── 消息服务
数据层
├── MySQL(主库)
├── MySQL(从库)
├── Redis(缓存)
└── Elasticsearch(搜索)
java复制// 密码加密示例
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 登录逻辑
public String login(String username, String password) {
User user = userDao.selectByUsername(username);
if(!passwordEncoder.matches(password, user.getPassword())) {
throw new BusinessException("密码错误");
}
return jwtUtil.generateToken(user.getId());
}
在原表基础上增加:
sql复制ALTER TABLE user ADD COLUMN `avatar` VARCHAR(255) COMMENT '头像URL';
ALTER TABLE user ADD COLUMN `credit_score` INT DEFAULT 100 COMMENT '信用分';
ALTER TABLE user ADD COLUMN `school_id` INT COMMENT '所属学校';
java复制// 商品发布核心逻辑
@Transactional
public Item publishItem(ItemDTO dto) {
// 1. 敏感词过滤
if(sensitiveWordFilter.contains(dto.getDescription())){
throw new BusinessException("包含敏感内容");
}
// 2. 图片处理
List<String> thumbnails = imageService.generateThumbnails(dto.getImages());
// 3. 保存商品
Item item = convertToEntity(dto);
item.setThumbnails(thumbnails);
itemMapper.insert(item);
// 4. 建立搜索索引
esClient.index(item);
return item;
}
采用Elasticsearch的复合查询:
json复制{
"query": {
"bool": {
"must": [
{"match": {"name": "教材"}},
{"range": {"price": {"gte": 10, "lte": 100}}}
],
"filter": [
{"term": {"category": "图书"}},
{"geo_distance": {
"distance": "2km",
"location": "39.9,116.4"
}}
]
}
},
"sort": [
{"_score": {"order": "desc"}},
{"create_time": {"order": "desc"}}
]
}
mermaid复制stateDiagram-v2
[*] --> PENDING
PENDING --> PAID: 支付成功
PENDING --> CANCELLED: 取消订单
PAID --> SHIPPED: 卖家发货
SHIPPED --> COMPLETED: 确认收货
SHIPPED --> REFUNDING: 发起退款
REFUNDING --> REFUNDED: 退款成功
REFUNDING --> SHIPPED: 拒绝退款
java复制// 支付回调处理
@PostMapping("/pay/notify")
public String handleNotify(@RequestBody String xmlData) {
// 1. 验证签名
if(!wxPayService.verifySignature(xmlData)) {
return "FAIL";
}
// 2. 解析支付结果
PaymentResult result = parseXml(xmlData);
// 3. 更新订单状态
orderService.updateStatus(result.getOrderNo(), OrderStatus.PAID);
// 4. 发送通知
messageService.sendPaymentSuccess(result.getUserId());
return "SUCCESS";
}
推荐服务器配置:
yaml复制# application-prod.yml
management:
endpoints:
web:
exposure:
include: health,info,metrics
metrics:
export:
prometheus:
enabled: true
java复制// 异步处理示例
@Async
public void asyncRecordOperationLog(Log log) {
logMapper.insert(log); // 非关键日志异步存储
}
java复制// XSS过滤配置
public class XssStringJsonSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator gen,
SerializerProvider provider) throws IOException {
gen.writeString(HtmlUtils.htmlEscape(value));
}
}
python复制# 推荐算法示例
def recommend_items(user_id):
user_vector = get_user_vector(user_id)
all_items = get_all_items()
scores = [(item_id, cosine_similarity(user_vector, item_vector))
for item_id, item_vector in all_items]
return sorted(scores, key=lambda x: x[1], reverse=True)[:10]
在实际开发中,有几个关键点值得注意:
遇到最棘手的问题是分布式事务处理,最终采用的解决方案:
java复制// 基于本地消息表的最终一致性
public void createOrder(OrderDTO dto) {
// 1. 创建订单(本地事务)
Order order = createOrderLocal(dto);
// 2. 发送延时消息
rocketMQTemplate.sendDelayMessage(
"order-pay-check",
order.getOrderNo(),
30 * 60 * 1000); // 30分钟超时
// 3. 扣减库存(TCC模式)
inventoryService.tryReduce(dto.getItemId(), dto.getQuantity());
}
这个项目让我深刻体会到,一个好的校园交易系统不仅需要技术实现,更要理解学生群体的使用习惯。比如我们增加了"教材专区"和"毕业季特卖"等场景化入口,使转化率提升了40%。