1. 项目概述:基于Python-Flask的同城二手交易小程序
这个二手交易系统是我去年为一个本地社区开发的实战项目,核心目标是解决学生和年轻上班族处理闲置物品的需求。相比闲鱼等大型平台,我们聚焦同城交易,通过地理位置匹配让买卖双方能快速面交,省去物流环节。系统采用Flask作为后端框架,搭配微信小程序前端,从需求分析到上线部署共耗时3个月,目前日均活跃用户稳定在800人左右。
为什么选择Flask?在初期技术选型时,我们对比了Django和FastAPI。Django虽然开箱即用但显得臃肿,FastAPI的异步特性在这个IO压力不大的场景下优势不明显。最终选择Flask是因为:
- 轻量级核心适合快速迭代
- 扩展机制灵活,可以按需引入组件
- 社区生态成熟,遇到问题容易找到解决方案
- 与SQLAlchemy的集成堪称完美
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心功能模块设计
2.1 用户系统实现方案
用户模块采用经典的手机号+验证码登录,这里有个值得分享的细节:我们没有直接存储用户手机号,而是使用AES-256加密后存储。关键实现如下:
python复制from Crypto.Cipher import AES
import base64
class UserSecurity:
def __init__(self):
self.key = b'32位长度的密钥字符串' # 实际项目应从配置读取
self.iv = b'16位初始化向量'
def encrypt_phone(self, phone):
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
encrypted = cipher.encrypt(phone.ljust(16).encode())
return base64.b64encode(encrypted).decode()
def decrypt_phone(self, encrypted):
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
decrypted = cipher.decrypt(base64.b64decode(encrypted))
return decrypted.decode().strip()
重要提示:密钥管理一定要通过环境变量注入,绝对不能硬编码在代码中。我们使用python-dotenv管理开发环境变量,生产环境则使用Vault。
2.2 商品发布与检索
商品模块的核心挑战是地理位置检索。我们在MySQL中使用了空间索引,具体实现分三步:
- 数据库表设计:
sql复制CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
location POINT NOT NULL,
SPATIAL INDEX(location),
-- 其他字段...
);
- Flask模型定义:
python复制class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
location = db.Column(
