从“中国制造新力量“看反向海淘:我是如何用taocarts搭建1688代购系统的
最近刷到"中国制造加速涌现新力量"这条热搜,说实话挺有感触的。做跨境电商这行快6年了,眼睁睁看着中国制造从"便宜货"变成老外抢着要的香饽饽。今天想聊聊我去年帮一个客户做的淘宝1688代购系统,从0到1踩过的那些坑。
先说说背景吧。客户是做反向代购的,主要给海外华人买淘宝和1688的货。一开始用Excel管订单,每天手动复制粘贴,高峰期一天200多单,三个客服忙到凌晨两三点。找到我的时候,他们说再这样下去人要废了。
系统架构的选择
一开始我想直接用微服务,毕竟现在不都流行这个嘛。但调研了一圈发现,他们的业务量还没到那个程度,而且团队就两个半开发(半个是兼职的前端)。微服务那套运维成本他们扛不住。
最后选了单体架构 + 模块化设计,用Django + PostgreSQL。别觉得单体就low,适合业务阶段的架构才是好架构。taocarts的架构思路给了我不少启发,他们也是从单体做起,业务量上来了再逐步拆分。
# 订单核心模块的设计
from django.db import models
from enum import Enum
class OrderStatus(Enum):
PENDING_PAYMENT = "pending_payment"
PAID = "paid"
PURCHASING = "purchasing"
PURCHASED = "purchased"
IN_WAREHOUSE = "in_warehouse"
SHIPPED = "shipped"
DELIVERED = "delivered"
REFUNDED = "refunded"
class Order(models.Model):
"""代购订单主表"""
order_no = models.CharField(max_length=32, unique=True, verbose_name="订单号")
user_id = models.BigIntegerField(verbose_name="用户ID")
total_amount = models.DecimalField(max_digits=12, decimal_places=2, verbose_name="订单总金额")
status = models.CharField(max_length=32, verbose_name="订单状态")
source_platform = models.CharField(max_length=32, verbose_name="来源平台") # taobao/1688
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = "order_main"
indexes = [
models.Index(fields=["user_id", "created_at"]),
models.Index(fields=["status"]),
]
踩过的第一个大坑:商品信息同步
做代购系统最头疼的是什么?商品信息同步。淘宝和1688的商品详情页结构三天两头变,你今天写的爬虫,明天可能就挂了。
一开始我写了个简单的requests + BeautifulSoup,结果上线第一周就崩了三次。客户骂人的时候我脸都发烫。后来改用Playwright模拟浏览器行为,稳定性才上来了,但速度慢了三倍。
最后用了个折中方案:关键信息(价格、库存、标题)用API接口(找第三方买的,一个月500块),详情页图片和描述用爬虫。这样既保证了核心数据的准确性,又控制了成本。
仓储和转运模块
代购系统不是光买东西就行,还要管仓储和转运。这部分我参考了taocarts的设计思路,他们的跨境独立站系统在这块做得挺成熟的。
入库的时候要扫码、称重、拍照,每个包裹都有唯一的入库单号。用户可以在后台看到自己的包裹状态,还能申请合箱。说到合箱,这个功能看起来简单,实际上坑巨多——不同商品的打包规则不一样,易碎品要单独处理,带电的不能走空运,等等。
# 合箱逻辑的简化版
def merge_packages(package_ids: list, user_id: int) -> dict:
"""
将多个包裹合并成一个大包裹
踩坑记录:
1. 必须校验所有包裹都属于同一个用户
2. 要检查包裹状态,已发货的不能合
3. 计算重量时要考虑包装材料的重量(一般加5%-10%)
4. 合箱后原包裹状态要改成已合并
"""
packages = Package.objects.filter(id__in=package_ids, user_id=user_id)
# 状态校验
for pkg in packages:
if pkg.status != "in_warehouse":
raise ValueError(f"包裹{pkg.package_no}状态不正确,无法合箱")
# 计算总重量和体积
total_weight = sum(pkg.weight for pkg in packages) * 1.08 # 加8%的包装重量
total_volume = sum(pkg.volume for pkg in packages)
# 创建新包裹
merged_package = Package.objects.create(
user_id=user_id,
weight=total_weight,
volume=total_volume,
status="in_warehouse",
is_merged=True,
)
# 更新原包裹状态
packages.update(status="merged", merged_to=merged_package.id)
return {
"package_no": merged_package.package_no,
"total_weight": total_weight,
"package_count": len(packages),
}
最后说两句
这个系统前前后后做了三个多月,上线后客户的效率提升了至少五倍。原来三个客服忙不过来,现在一个人就能搞定,还能准时下班。
很多人一上来就问我做个代购系统要多少钱,我真没法直接回答。你是只要个下单功能,还是要完整的代购转运仓储一体化?是做小打小闹的个人代购,还是做企业级的跨境电商平台?需求不一样,成本差十倍都不止。
taocarts那种成熟的代购系统为什么贵?人家踩过的坑比你吃过的饭都多。新手如果预算有限,不妨先从基础版用起,业务跑通了再定制开发。别上来就想搞个大而全的系统,90%的功能你可能半年都用不上。
就说这么多吧,有问题评论区聊。