主题
多多多宝后端服务器需求文档
基于前端代码、数据库结构和业务逻辑生成
生成时间:2025-10-09
目标:重建后端服务器系统,包括小程序API接口和后台管理系统
📋 目录
项目概述
业务简介
多多多宝是一个拼多多多多客CPS推广应用,核心功能包括:
- 商品推广与佣金分成
- 多级分销体系(3级分润)
- 地域代理管理(市/县/镇)
- 用户晋升机制
- 收益提现管理(微信零钱)
项目特点
- B2C + 分销:用户推广商品获得佣金,邀请下级获得提成
- 地域代理:支持三级地域代理体系
- 多多客对接:深度集成拼多多多多客API
- 收益结算:自动计算佣金分成,支持微信零钱提现
目标用户
- C端用户:通过小程序推广商品赚取佣金
- 代理商:城市/区域代理,获得区域内订单分成
- 管理员:平台运营人员,管理用户、订单、提现等
技术栈建议
后端框架
方案:RuoYi-Vue(前后端分离版)✅
优点:
- 基于 Spring Boot + Spring Security + JWT 的成熟企业级框架
- 完整的权限管理系统(RBAC)
- 自带后台管理系统(Vue前端 + Element UI)
- 代码生成器,快速开发CRUD功能
- 完善的日志管理、数据权限、定时任务等功能
- 开源免费,文档完善,社区活跃
- 适合快速二次开发
技术栈:
- Java 1.8+
- Spring Boot 2.5+
- Spring Security(安全框架)
- JWT(Token认证)
- MyBatis(ORM)
- Quartz(定时任务)
- Redis(缓存)
- MySQL 5.7+
- Vue 3.5+ + Element Plus + Pinia(后台管理前端)
官方文档:https://doc.ruoyi.vip/ruoyi-vue/数据库
- MySQL 5.7+:主数据库
- Redis:缓存、会话存储
其他服务
- Quartz:定时任务(订单同步、佣金结算)
- Nginx:反向代理、负载均衡
- Docker:容器化部署
系统架构
整体架构
┌─────────────────┐
│ 微信小程序端 │
└────────┬────────┘
│
│ HTTPS/WSS
▼
┌─────────────────────────────────┐
│ Nginx 反向代理 │
└────────┬──────────────┬─────────┘
│ │
│ │
▼ ▼
┌────────────────┐ ┌──────────────┐
│ API Server │ │ Admin Server │
│ (小程序接口) │ │ (后台管理) │
└───────┬────────┘ └──────┬───────┘
│ │
│ │
▼ ▼
┌───────────────────────────────────┐
│ MySQL 数据库 │
│ (duo 数据库) │
└───────────────────────────────────┘
│
│
▼
┌───────────────────────────────────┐
│ Redis 缓存/会话 │
└───────────────────────────────────┘
┌───────────────────────────────────┐
│ Celery 异步任务队列 │
│ - 订单同步 │
│ - 佣金结算 │
│ - 晋升检测 │
└───────────────────────────────────┘
┌───────────────────────────────────┐
│ 第三方服务 │
│ - 淘宝客API │
│ - 阿里云短信 │
│ - 支付宝转账 │
└───────────────────────────────────┘服务划分
1. API Server(小程序接口服务)
- 用户认证与注册
- 商品搜索与详情
- 订单查询
- 收益管理
- 提现申请
- 团队管理
2. Admin Server(后台管理服务 - RuoYi后台)
- 管理员登录认证(基于Spring Security + JWT)
- 用户管理(查看、编辑、禁用)
- 订单管理(列表、详情、同步)
- 提现审核(微信零钱转账)
- 代理申请审核
- 内容管理(轮播图、活动、问题)
- 数据统计与报表
- 系统管理(菜单、角色、权限、日志)
3. Task Worker(异步任务服务 - Quartz定时任务)
- 定时同步多多客订单
- 订单佣金结算与分润
- 用户晋升检测
- 发送短信通知
二次开发说明
基于RuoYi框架二次开发
本项目基于现有的 RuoYi-Vue 框架进行二次开发:
后端项目:duoduo_server
- 基于 RuoYi-Vue 后端框架
- 已包含完整的用户认证、权限管理、日志管理等基础功能
- 需要在此基础上添加多多客业务模块
后台管理项目:duoduo_ui
- 基于 RuoYi-Vue 前端框架(Vue 3.5+ + Element Plus + Pinia)
- 已包含完整的后台管理界面
- 需要在此基础上添加多多客业务管理页面
开发方式
1. 使用代码生成器
RuoYi框架提供了强大的代码生成器,可以快速生成CRUD代码:
- 配置数据库连接到
duo数据库 - 导入需要管理的表(如 pdd_user、pdd_order、pdd_money 等)
- 使用代码生成器生成:
- Domain(实体类)
- Mapper(数据访问层)
- Service(业务逻辑层)
- Controller(控制器)
- 前端页面(Vue组件)
2. 自定义业务开发
在生成的基础代码上,添加自定义业务逻辑:
- 多多客API对接服务
- 三级分润算法
- 提现审核与微信转账
- 团队数据统计
- 用户晋升检测
3. 配置定时任务
在RuoYi后台管理系统中配置Quartz定时任务:
- 订单同步任务
- 佣金结算任务
- 用户晋升检测任务
项目结构
duoduo_server/
├── ruoyi-admin/ # 后台管理模块(启动入口)
├── ruoyi-common/ # 公共模块
├── ruoyi-framework/ # 框架核心
├── ruoyi-system/ # 系统模块(用户、角色、权限等)
└── ruoyi-pdd/ # 【新增】多多客业务模块
├── domain/ # 实体类
├── mapper/ # 数据访问层
├── service/ # 业务逻辑层
├── controller/ # 控制器
└── task/ # 定时任务
duoduo_ui/
├── src/
│ ├── api/ # API接口
│ ├── views/ # 页面组件
│ │ └── pdd/ # 【新增】多多客业务页面
│ ├── router/ # 路由配置
│ └── store/ # 状态管理核心功能模块
1. 用户模块(User Module)
功能清单
- 手机号+验证码登录/注册
- Token认证
- 用户信息管理
- 邀请码系统
- 推广位管理
核心逻辑
注册流程
java
public AjaxResult register(String phone, String code, String invitationCode) {
// 1. 验证手机验证码
verifySmsCode(phone, code);
// 2. 检查是否已注册
PddUser existUser = userMapper.selectUserByPhone(phone);
if (existUser != null) {
return AjaxResult.error("手机号已注册");
}
// 3. 分配邀请码(从 pdd_goodinvitatercode 随机抽取)
String newInvitationCode = getRandomInvitationCode();
// 4. 生成多多客推广位 relation_id
// 格式:PID_ADZONE_ID(需要调用多多客API)
String relationId = createPddRelationId();
// 5. 处理邀请关系
PddUser inviter = null;
if (StringUtils.isNotEmpty(invitationCode)) {
inviter = userMapper.selectUserByInvitationCode(invitationCode);
}
// 6. 创建用户
PddUser user = new PddUser();
user.setUsername(phone);
user.setInvitationCode(newInvitationCode);
user.setRelationId(relationId);
user.setInviterUserId(inviter != null ? inviter.getId() : null);
user.setRegTime(System.currentTimeMillis() / 1000);
user.setLevelId(0); // 默认普通用户
user.setStatus(0);
userMapper.insertUser(user);
// 7. 生成Token(使用JWT)
String token = TokenUtils.createToken(user);
return AjaxResult.success(MapUtil.builder()
.put("token", token)
.put("user", user)
.build());
}登录流程
java
public AjaxResult login(String phone, String code) {
// 1. 验证手机验证码
verifySmsCode(phone, code);
// 2. 查找用户
PddUser user = userMapper.selectUserByPhone(phone);
if (user == null) {
// 自动注册
return register(phone, code, null);
}
// 3. 检查账号状态
if (user.getStatus() == 1) {
return AjaxResult.error("账号已被禁用");
}
// 4. 生成Token(使用JWT)
String token = TokenUtils.createToken(user);
// 5. 保存Token到数据库
PddToken tokenEntity = new PddToken();
tokenEntity.setUserId(user.getId());
tokenEntity.setToken(token);
tokenEntity.setCreateTime(System.currentTimeMillis() / 1000);
tokenMapper.insertToken(tokenEntity);
return AjaxResult.success(MapUtil.builder()
.put("token", token)
.put("user", user)
.build());
}数据表
pdd_user- 用户主表pdd_token- 登录令牌表pdd_telcode- 验证码表pdd_goodinvitatercode- 邀请码池
2. 多多客模块(PDD DDK Module)
功能清单
- 商品搜索
- 商品详情
- 生成推广链接
- 订单同步(定时任务)
- 商品分类
核心接口对接
根据 docs/项目资料.md,需要对接以下拼多多多多客API:
- pdd.ddk.goods.search - 商品搜索
- pdd.ddk.goods.detail - 商品详情
- pdd.ddk.goods.promotion.url.generate - 生成推广链接
- pdd.ddk.order.list.range.get - 根据时间范围查询订单
- pdd.ddk.order.detail.get - 查询订单详情
订单同步逻辑(定时任务)
java
/**
* 定时同步多多客订单
* 使用Quartz定时任务,每小时执行一次
*/
@Component
public class SyncPddOrdersTask {
@Autowired
private IPddUserService userService;
@Autowired
private IPddOrderService orderService;
@Autowired
private PddApiService pddApiService;
/**
* 每小时执行一次,同步多多客订单
*/
public void execute() {
// 1. 获取所有正常状态用户的 relation_id
List<PddUser> users = userService.selectUserList(new PddUser().setStatus(0));
// 2. 遍历用户,查询订单
for (PddUser user : users) {
// 查询过去24小时的订单
long startTime = System.currentTimeMillis() / 1000 - 24 * 3600;
long endTime = System.currentTimeMillis() / 1000;
// 调用多多客API查询订单
List<PddOrderDTO> orders = pddApiService.orderListRangeGet(
startTime,
endTime,
user.getRelationId()
);
// 3. 保存或更新订单
for (PddOrderDTO orderData : orders) {
PddOrder existOrder = orderService.selectOrderByTradeId(orderData.getTradeId());
if (existOrder != null) {
// 更新订单
existOrder.setItemTitle(orderData.getItemTitle());
existOrder.setPayPrice(orderData.getPayPrice());
existOrder.setCommission(orderData.getCommission());
existOrder.setTkStatus(orderData.getTkStatus());
// ... 其他字段
orderService.updateOrder(existOrder);
} else {
// 新增订单
PddOrder newOrder = new PddOrder();
newOrder.setUserId(user.getId());
newOrder.setTradeId(orderData.getTradeId());
newOrder.setItemTitle(orderData.getItemTitle());
newOrder.setPayPrice(orderData.getPayPrice());
newOrder.setCommission(orderData.getCommission());
newOrder.setTkStatus(orderData.getTkStatus());
// ... 其他字段
orderService.insertOrder(newOrder);
}
}
}
}
}数据表
pdd_order- 订单表pdd_sort- 商品分类表
3. 收益模块(Income Module)
功能清单
- 收益统计(今日、本月、累计)
- 收益明细查询
- 订单明细查询
- 佣金结算(定时任务)
核心逻辑:三级分润算法
java
/**
* 订单结算:分润算法
*
* 佣金分配规则:
* - 推广者:60%
* - 上级:20%
* - 上上级:10%
* - 地区代理:10%
*/
@Service
public class CommissionSettleService {
@Autowired
private IPddOrderService orderService;
@Autowired
private IPddUserService userService;
@Autowired
private IPddMoneyService moneyService;
@Autowired
private IPddCityService cityService;
@Transactional
public void settleOrderCommission(Long orderId) {
// 1. 获取订单信息
PddOrder order = orderService.selectOrderById(orderId);
// 只结算状态为"结算成功"的订单(tk_status=14)
if (order.getTkStatus() != 14) {
return;
}
// 已结算过的订单跳过
if (moneyService.checkOrderSettled(order.getTradeId())) {
return;
}
BigDecimal commission = order.getCommission(); // 总佣金
PddUser user = userService.selectUserById(order.getUserId());
long settleTime = System.currentTimeMillis() / 1000;
int settleMonth = Integer.parseInt(DateUtils.dateTimeNow("yyyyMM"));
// 2. 推广者获得60%佣金
PddMoney promoterMoney = new PddMoney();
promoterMoney.setMoneyType(2); // 佣金
promoterMoney.setOrderNum(order.getTradeId());
promoterMoney.setCount(commission.multiply(new BigDecimal("0.6")));
promoterMoney.setUserId(user.getId());
promoterMoney.setStatus(1);
promoterMoney.setSettleTime(settleTime);
promoterMoney.setSettleMonth(settleMonth);
promoterMoney.setCityCode(user.getCityCode());
moneyService.insertMoney(promoterMoney);
// 3. 上级获得20%提成
if (user.getInviterUserId() != null) {
PddUser parentUser = userService.selectUserById(user.getInviterUserId());
PddMoney parentMoney = new PddMoney();
parentMoney.setMoneyType(3); // 提成
parentMoney.setOrderNum(order.getTradeId());
parentMoney.setCount(commission.multiply(new BigDecimal("0.2")));
parentMoney.setUserId(parentUser.getId());
parentMoney.setStatus(1);
parentMoney.setSettleTime(settleTime);
parentMoney.setSettleMonth(settleMonth);
moneyService.insertMoney(parentMoney);
// 4. 上上级获得10%提成
if (parentUser.getInviterUserId() != null) {
PddUser grandParentUser = userService.selectUserById(parentUser.getInviterUserId());
PddMoney grandParentMoney = new PddMoney();
grandParentMoney.setMoneyType(3); // 提成
grandParentMoney.setOrderNum(order.getTradeId());
grandParentMoney.setCount(commission.multiply(new BigDecimal("0.1")));
grandParentMoney.setUserId(grandParentUser.getId());
grandParentMoney.setStatus(1);
grandParentMoney.setSettleTime(settleTime);
grandParentMoney.setSettleMonth(settleMonth);
moneyService.insertMoney(grandParentMoney);
}
}
// 5. 地区代理分成10%(如果有)
if (StringUtils.isNotEmpty(user.getCityCode())) {
// 查找市代理
PddCity city = cityService.selectCityByCode(user.getCityCode(), 3);
if (city != null && city.getUserId() != null) {
PddMoney cityMoney = new PddMoney();
cityMoney.setMoneyType(2); // 佣金
cityMoney.setOrderNum(order.getTradeId());
cityMoney.setCount(commission.multiply(new BigDecimal("0.1")));
cityMoney.setUserId(city.getUserId());
cityMoney.setStatus(1);
cityMoney.setSettleTime(settleTime);
cityMoney.setSettleMonth(settleMonth);
cityMoney.setCity(city.getUserId());
moneyService.insertMoney(cityMoney);
}
}
}
}数据表
pdd_money- 资金流水表pdd_order- 订单表
4. 提现模块(Withdraw Module)
功能清单
- 绑定支付宝账户
- 提现申请
- 提现记录查询
- 提现审核(后台管理)
- 支付宝转账(调用支付宝API)
核心逻辑
提现申请
java
@Service
public class WithdrawService {
@Autowired
private IPddUserService userService;
@Autowired
private IPddMoneyService moneyService;
@Autowired
private IPddWithdrawService withdrawService;
@Transactional
public AjaxResult createWithdraw(Long userId, BigDecimal money) {
// 1. 获取用户信息
PddUser user = userService.selectUserById(userId);
// 检查微信openid是否存在
if (StringUtils.isEmpty(user.getOpenid())) {
return AjaxResult.error("微信授权信息不存在,请重新登录");
}
// 2. 计算可提现金额
BigDecimal availableMoney = moneyService.getAvailableBalance(userId);
if (availableMoney.compareTo(money) < 0) {
return AjaxResult.error("可提现金额不足,当前可提现:" + availableMoney + "元");
}
// 3. 检查提现金额限制(最低1元)
if (money.compareTo(BigDecimal.ONE) < 0) {
return AjaxResult.error("最低提现金额为1元");
}
// 4. 创建提现订单
String orderId = IdUtils.fastSimpleUUID();
PddWithdraw withdraw = new PddWithdraw();
withdraw.setOrderId(orderId);
withdraw.setSubmitTime(System.currentTimeMillis() / 1000);
withdraw.setStatus(0); // 待审核
withdraw.setMoney(money);
withdraw.setRealmoney(money); // 无手续费
withdraw.setUserId(userId);
withdraw.setUserAccount(user.getOpenid()); // 微信openid
withdrawService.insertWithdraw(withdraw);
// 5. 扣减余额(插入负数记录)
PddMoney moneyRecord = new PddMoney();
moneyRecord.setMoneyType(6); // 取现
moneyRecord.setCount(money.negate()); // 负数
moneyRecord.setUserId(userId);
moneyRecord.setStatus(1);
moneyRecord.setTxId(withdraw.getId());
moneyRecord.setCreateTime(System.currentTimeMillis() / 1000);
moneyService.insertMoney(moneyRecord);
return AjaxResult.success(MapUtil.builder()
.put("order_id", orderId)
.build());
}
}提现审核(后台管理)
java
@Service
public class WithdrawApproveService {
@Autowired
private IPddWithdrawService withdrawService;
@Autowired
private IPddUserService userService;
@Autowired
private IPddMoneyService moneyService;
@Autowired
private WechatPayService wechatPayService;
@Transactional
public AjaxResult approveWithdraw(Long withdrawId, Long adminId) {
// 1. 获取提现信息
PddWithdraw withdraw = withdrawService.selectWithdrawById(withdrawId);
PddUser user = userService.selectUserById(withdraw.getUserId());
// 检查状态
if (withdraw.getStatus() != 0) {
return AjaxResult.error("该提现申请已处理");
}
try {
// 2. 调用微信企业付款到零钱API
String tradeId = wechatPayService.transferToChange(
user.getOpenid(),
withdraw.getRealmoney().multiply(new BigDecimal("100")).intValue(), // 转换为分
"多多多宝提现-" + withdraw.getOrderId(),
withdraw.getOrderId()
);
// 3. 更新提现状态
withdraw.setStatus(1); // 成功
withdraw.setTradeId(tradeId);
withdraw.setDisposeTime(System.currentTimeMillis() / 1000);
withdraw.setOperatorId(adminId);
withdrawService.updateWithdraw(withdraw);
return AjaxResult.success("提现审核成功,已转账到用户微信零钱");
} catch (Exception e) {
// 4. 转账失败,退回余额
withdraw.setStatus(2); // 失败
withdraw.setMsg(e.getMessage());
withdraw.setDisposeTime(System.currentTimeMillis() / 1000);
withdraw.setOperatorId(adminId);
withdrawService.updateWithdraw(withdraw);
// 退回余额(将负数改为正数)
moneyService.refundWithdrawMoney(withdraw.getId(), withdraw.getMoney());
return AjaxResult.error("转账失败:" + e.getMessage());
}
}
}数据表
pdd_withdraw- 提现记录表pdd_money- 资金流水表pdd_user- 用户表
5. 团队模块(Team Module)
功能清单
- 我的团队数据统计
- 团队成员列表
- 团队明细
- 团队排行榜
- 推荐人信息
核心逻辑
团队数据统计
python
def get_team_info(user_id):
"""
获取团队数据统计
"""
# 1. 获取所有下级用户ID(递归查询)
sub_user_ids = get_all_sub_users(user_id)
# 2. 总会员数
total_num = len(sub_user_ids)
# 3. 有效会员数(有过订单的用户)
valid_num = Order.objects.filter(
user_id__in=sub_user_ids,
tk_status=14
).values('user_id').distinct().count()
# 4. 预估佣金(团队所有预估佣金总和)
pre_fee = Money.objects.filter(
user_id__in=sub_user_ids,
money_type=2,
status=0
).aggregate(total=Sum('count'))['total'] or 0
# 5. 今日新增
today_start = int(datetime.today().replace(hour=0, minute=0, second=0).timestamp())
today_num = User.objects.filter(
id__in=sub_user_ids,
reg_time__gte=today_start
).count()
# 6. 昨日新增
yesterday_start = today_start - 86400
yesterday_num = User.objects.filter(
id__in=sub_user_ids,
reg_time__gte=yesterday_start,
reg_time__lt=today_start
).count()
# 7. 今日出单
today_sales = Order.objects.filter(
user_id__in=sub_user_ids,
create_time__gte=today_start,
tk_status=14
).count()
# 8. 累计出单
total_sales = Order.objects.filter(
user_id__in=sub_user_ids,
tk_status=14
).count()
return {
"num": total_num,
"invaild_num": valid_num,
"pre": pre_fee,
"today": today_num,
"yesterday": yesterday_num,
"today_sales": today_sales,
"sales": total_sales
}
def get_all_sub_users(user_id, result=None):
"""
递归获取所有下级用户ID
"""
if result is None:
result = []
# 查询直接下级
sub_users = User.objects.filter(inviter_user_id=user_id).values_list('id', flat=True)
for sub_id in sub_users:
if sub_id not in result:
result.append(sub_id)
# 递归查询下下级
get_all_sub_users(sub_id, result)
return result团队排行榜TOP100
python
def get_team_ranking(user_id):
"""
团队成员出单排行榜TOP100
"""
# 获取所有下级用户
sub_user_ids = get_all_sub_users(user_id)
# 统计每个用户的出单数和佣金
ranking = []
for uid in sub_user_ids:
user = User.objects.get(id=uid)
# 统计出单数
order_count = Order.objects.filter(user_id=uid, tk_status=14).count()
# 统计总佣金
total_commission = Money.objects.filter(
user_id=uid,
money_type=2,
status=1
).aggregate(total=Sum('count'))['total'] or 0
ranking.append({
"user_id": uid,
"nickname": user.nickname,
"avatar": user.avatar,
"order_count": order_count,
"total_commission": total_commission
})
# 按出单数排序,取TOP100
ranking.sort(key=lambda x: x['order_count'], reverse=True)
return ranking[:100]数据表
pdd_user- 用户表pdd_order- 订单表pdd_money- 资金流水表
6. 晋升模块(Upgrade Module)
功能清单
- 查看晋升条件
- 自动晋升检测(定时任务)
- 晋升记录查询
- 代理申请
- 代理申请审核(后台管理)
用户等级体系
- level_id = 0:普通用户
- level_id = 1:(预留)
- level_id = 2:合伙人(累计佣金≥100元)
- level_id = 3:高级总监(累计佣金≥500元)
- level_id = 4:市代理(申请审核)
核心逻辑
自动晋升检测(定时任务)
java
/**
* 用户晋升检测定时任务
* 每日凌晨执行,检测用户是否满足晋升条件
*/
@Component
public class UserUpgradeTask {
@Autowired
private IPddUpgradeService upgradeService;
@Autowired
private IPddUserService userService;
@Autowired
private IPddMoneyService moneyService;
@Autowired
private IPddUpgradeListService upgradeListService;
public void execute() {
// 获取所有晋升规则
List<PddUpgrade> rules = upgradeService.selectUpgradeList(new PddUpgrade());
for (PddUpgrade rule : rules) {
Integer levelId = rule.getLevelId();
BigDecimal requiredMoney = rule.getMoney();
// 查询所有低于该等级的用户
List<PddUser> users = userService.selectUsersByLevelLessThan(levelId);
for (PddUser user : users) {
// 计算累计佣金
BigDecimal totalCommission = moneyService.getTotalCommission(
user.getId(),
2, // 佣金类型
1 // 已结算状态
);
// 满足条件则晋升
if (totalCommission.compareTo(requiredMoney) >= 0) {
// 更新用户等级
user.setLevelId(levelId);
user.setUpgradeTime(System.currentTimeMillis() / 1000);
userService.updateUser(user);
// 记录晋升
PddUpgradeList upgradeList = new PddUpgradeList();
upgradeList.setUid(user.getId());
upgradeList.setLevelId(levelId);
upgradeList.setUpgradeTime(System.currentTimeMillis() / 1000);
upgradeList.setMoney(requiredMoney);
upgradeListService.insertUpgradeList(upgradeList);
}
}
}
}
}代理申请
python
def apply_city_agent(user_id, data):
"""
申请城市代理
"""
# 1. 检查是否已申请过
if Apply.objects.filter(uid=user_id, status=0).exists():
return error("您已提交过申请,请等待审核")
# 2. 检查城市是否已被占用
if Apply.objects.filter(city_code=data['city_code'], status=1).exists():
return error("该城市已有代理")
# 3. 创建申请
Apply.objects.create(
uid=user_id,
team=data['team'],
has_company=data['has_company'],
company=data.get('company', ''),
company_address=data.get('company_address', ''),
address=data['address'],
name=data['name'],
phone=data['phone'],
wx=data['wx'],
create_time=int(time.time()),
status=0, # 待审核
city_name=data['city_name'],
city_code=data['city_code'],
apply_city=data['city_name']
)
return success()数据表
pdd_upgrade- 晋升规则表pdd_upgrade_list- 晋升记录表pdd_apply- 代理申请表pdd_city- 城市代理表
7. 内容管理模块(Content Module)
功能清单
- 轮播图管理
- 活动入口管理
- 热搜词管理
- 常见问题管理
- 问题分类管理
数据表
pdd_banner- 轮播图表pdd_act- 活动入口表pdd_hotword- 热搜词表pdd_question- 常见问题表pdd_fl- 问题分类表
8. 其他模块
物料管理模块
- 物料活动管理
- 物料商品管理
- 物料申请
- 物料订单管理
数据表
pdd_material- 物料活动表pdd_material_goods- 物料商品表pdd_material_order- 物料订单表
拉新活动模块
- 拉新批次管理
- 拉新订单记录
- 拉新奖励发放
数据表
pdd_batch- 拉新批次表pdd_pullorder- 拉新订单表
积分系统模块
- 积分购买
- 积分消耗
- 积分流水
数据表
pdd_pay_points- 积分购买表pdd_points- 积分流水表
详细API接口清单
请查看独立文档:docs/API接口文档.md
后台管理功能清单
请查看独立文档:docs/后台管理功能清单.md
第三方服务对接
1. 多多客API对接
API配置信息
client-id: 45dff93629e04f148c4e2c7a744b517b
client-secret: 969db70623039d1820b1b63ae198cc84d3b6fefa
redirect-uri: http://quser.wholecity.com.cn/web/message/pdd需要对接的接口
pdd.ddk.goods.search- 商品搜索pdd.ddk.goods.detail- 商品详情pdd.ddk.goods.promotion.url.generate- 生成推广链接pdd.ddk.order.list.range.get- 查询订单(定时任务)pdd.ddk.order.detail.get- 订单详情
2. 阿里云短信服务
功能
- 发送登录/注册验证码
- 发送提现通知
- 发送订单通知
3. 微信企业付款到零钱API
功能
- 提现自动转账到用户微信零钱
- 支持实时到账
- 无手续费
接口说明
- 接口名称:企业付款到零钱
- 接口地址:
https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers - 请求方式:POST(需要双向证书)
- 主要参数:
mch_appid:微信公众账号appidmchid:商户号openid:用户openidamount:金额(单位:分)desc:企业付款备注partner_trade_no:商户订单号
注意事项
- 需要商户号开通企业付款功能
- 需要配置商户证书(apiclient_cert.pem、apiclient_key.pem)
- 单笔最低1元,单日单用户限额2万元
- 需要用户已完成微信授权登录(获取openid)
4. 微信小程序登录
功能
- 获取用户openid和unionid
- 用户信息授权
数据库优化建议
1. 添加索引
sql
-- 用户表
CREATE INDEX idx_invitation_code ON pdd_user(invitation_code);
CREATE INDEX idx_inviter_user_id ON pdd_user(inviter_user_id);
CREATE INDEX idx_relation_id ON pdd_user(relation_id);
CREATE INDEX idx_username ON pdd_user(username);
-- 订单表
CREATE INDEX idx_trade_id ON pdd_order(trade_id);
CREATE INDEX idx_user_id_status ON pdd_order(user_id, tk_status);
CREATE INDEX idx_create_time ON pdd_order(create_time);
CREATE INDEX idx_earning_time ON pdd_order(earning_time);
-- 资金流水表
CREATE INDEX idx_user_id_type ON pdd_money(user_id, money_type);
CREATE INDEX idx_order_num ON pdd_money(order_num);
CREATE INDEX idx_settle_time ON pdd_money(settle_time);
CREATE INDEX idx_tx_id ON pdd_money(tx_id);
-- Token表
CREATE INDEX idx_token ON pdd_token(token);
CREATE INDEX idx_user_id ON pdd_token(user_id);
-- 提现表
CREATE INDEX idx_user_id_status ON pdd_withdraw(user_id, status);
CREATE INDEX idx_order_id ON pdd_withdraw(order_id);2. 添加字段
sql
-- City表添加代理用户ID
ALTER TABLE pdd_city ADD COLUMN user_id INT(11) DEFAULT NULL COMMENT '代理用户ID';
-- 验证码表添加过期时间和使用状态
ALTER TABLE pdd_telcode ADD COLUMN expire_time BIGINT(20) DEFAULT NULL COMMENT '过期时间';
ALTER TABLE pdd_telcode ADD COLUMN is_used TINYINT(4) DEFAULT 0 COMMENT '是否已使用(0未使用/1已使用)';
ALTER TABLE pdd_telcode ADD COLUMN try_count TINYINT(4) DEFAULT 0 COMMENT '尝试次数';
-- User表添加软删除字段
ALTER TABLE pdd_user ADD COLUMN deleted_at BIGINT(20) DEFAULT NULL COMMENT '删除时间';
-- Withdraw表添加操作人字段
ALTER TABLE pdd_withdraw ADD COLUMN operator_id INT(11) DEFAULT NULL COMMENT '操作管理员ID';
ALTER TABLE pdd_withdraw ADD COLUMN operator_name VARCHAR(50) DEFAULT NULL COMMENT '操作管理员名称';3. 数据类型优化
sql
-- 时间字段改为datetime
ALTER TABLE pdd_user MODIFY COLUMN reg_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间';
ALTER TABLE pdd_user MODIFY COLUMN upgrade_time DATETIME DEFAULT NULL COMMENT '升级时间';
-- ... 其他时间字段类似处理安全性建议
1. 认证与授权
Token机制
python
- Token生成使用JWT,设置过期时间(如7天)
- Token存储在Redis,支持快速过期和撤销
- 每个请求验证Token有效性权限控制
python
- 管理员分角色管理(超级管理员、运营、财务等)
- API接口按用户等级限流
- 敏感操作(提现审核)需要二次验证2. 数据安全
密码加密
python
# 使用bcrypt加密
from bcrypt import hashpw, gensalt, checkpw
# 加密
hashed = hashpw(password.encode(), gensalt())
# 验证
checkpw(password.encode(), hashed)敏感信息加密
python
- 支付宝账号加密存储
- 手机号脱敏展示
- 身份证号加密存储3. API安全
防刷机制
python
- IP限流(如每分钟最多10次请求)
- 用户限流(如每分钟最多5次验证码)
- 接口签名验证输入验证
python
- 所有输入参数进行类型和格式验证
- SQL注入防护(使用ORM)
- XSS防护4. 日志审计
python
- 记录所有敏感操作日志
- 记录登录日志
- 记录提现审核日志
- 定期分析异常行为部署建议
1. 服务器配置
最低配置
CPU: 2核
内存: 4GB
硬盘: 40GB SSD
带宽: 3Mbps推荐配置
CPU: 4核
内存: 8GB
硬盘: 100GB SSD
带宽: 5Mbps2. 部署架构
单机部署(适合初期)
服务器1:
- Nginx
- API Server
- Admin Server
- MySQL
- Redis
- Celery Worker分离部署(适合扩展)
服务器1 (Web):
- Nginx
- API Server
- Admin Server
服务器2 (Database):
- MySQL (主)
- Redis
服务器3 (Worker):
- Celery Worker
- Celery Beat
服务器4 (Database):
- MySQL (从,读写分离)3. 部署步骤
使用Docker Compose部署(推荐)
yaml
# docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:5.7
volumes:
- ./mysql-data:/var/lib/mysql
- ./docs/duo.sql:/docker-entrypoint-initdb.d/init.sql
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: duo
redis:
image: redis:6-alpine
volumes:
- ./redis-data:/data
api:
build: ./api
ports:
- "8000:8000"
depends_on:
- mysql
- redis
environment:
DATABASE_URL: mysql://root:root123@mysql:3306/duo
REDIS_URL: redis://redis:6379/0
admin:
build: ./admin
ports:
- "8001:8001"
depends_on:
- mysql
- redis
worker:
build: ./api
command: celery -A tasks worker -l info
depends_on:
- mysql
- redis
- api
beat:
build: ./api
command: celery -A tasks beat -l info
depends_on:
- redis
- api
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
depends_on:
- api
- admin4. Nginx配置
nginx
# nginx.conf
upstream api_backend {
server api:8000;
}
upstream admin_backend {
server admin:8001;
}
server {
listen 80;
server_name union1.unionall.com.cn;
# API接口
location /api/ {
proxy_pass http://api_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 后台管理
location /admin/ {
proxy_pass http://admin_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 静态文件
location /static/ {
alias /var/www/static/;
expires 30d;
}
}5. 定时任务配置
在RuoYi后台管理系统中配置Quartz定时任务:
任务列表配置
| 任务名称 | 任务组名 | 调用目标字符串 | Cron表达式 | 说明 |
|---|---|---|---|---|
| 同步多多客订单 | DEFAULT | syncPddOrdersTask.execute | 0 0 * * * ? | 每小时执行一次 |
| 结算订单佣金 | DEFAULT | commissionSettleTask.execute | 0 0 3 * * ? | 每天凌晨3点执行 |
| 检测用户晋升 | DEFAULT | userUpgradeTask.execute | 0 0 4 * * ? | 每天凌晨4点执行 |
任务Bean配置示例
java
/**
* 定时任务配置
*/
@Configuration
public class ScheduleConfig {
@Bean
public SyncPddOrdersTask syncPddOrdersTask() {
return new SyncPddOrdersTask();
}
@Bean
public CommissionSettleTask commissionSettleTask() {
return new CommissionSettleTask();
}
@Bean
public UserUpgradeTask userUpgradeTask() {
return new UserUpgradeTask();
}
}Cron表达式说明
0 0 * * * ?- 每小时整点执行0 0 3 * * ?- 每天凌晨3点执行0 0 4 * * ?- 每天凌晨4点执行
---
## 开发规范
### 1. 代码规范
- 遵循阿里巴巴Java开发手册
- 使用RuoYi框架代码规范
- 代码注释完整(类、方法、关键逻辑)
- API文档完整(使用Swagger)
- 统一返回结果封装(AjaxResult)
- 统一异常处理
### 2. Git规范
```bash
# 分支规范
main - 生产环境
develop - 开发环境
feature/* - 功能开发
hotfix/* - 紧急修复
# 提交规范
feat: 新功能
fix: 修复bug
docs: 文档更新
refactor: 代码重构
test: 测试相关3. 测试规范
- 单元测试覆盖率 > 80%
- 集成测试覆盖核心业务流程
- 压力测试验证性能
后续扩展建议
1. 功能扩展
- [ ] App端开发(Android/iOS)
- [ ] H5端开发
- [ ] 直播带货功能
- [ ] 社群管理功能
- [ ] 数据大屏
2. 技术优化
- [ ] 订单表分表(按月)
- [ ] Redis集群
- [ ] MySQL读写分离
- [ ] CDN加速
- [ ] 日志系统(ELK)
3. 业务优化
- [ ] 优化分润算法
- [ ] 增加更多晋升等级
- [ ] 完善积分系统
- [ ] 增加会员权益
附录
相关文档
参考资料
- 拼多多开放平台:https://open.pinduoduo.com/#/developer
- RuoYi官方文档:https://doc.ruoyi.vip/ruoyi-vue/
- Spring Boot文档:https://spring.io/projects/spring-boot
- MyBatis文档:https://mybatis.org/mybatis-3/zh/index.html
文档版本:v1.0
生成时间:2025-10-09
维护人:AI Assistant