Skip to content

多多多宝后端服务器需求文档

基于前端代码、数据库结构和业务逻辑生成
生成时间:2025-10-09
目标:重建后端服务器系统,包括小程序API接口和后台管理系统


📋 目录

  1. 项目概述
  2. 技术栈建议
  3. 系统架构
  4. 核心功能模块
  5. API接口清单
  6. 后台管理功能
  7. 第三方服务对接
  8. 数据库优化建议
  9. 安全性建议
  10. 部署建议

项目概述

业务简介

多多多宝是一个拼多多多多客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:

  1. pdd.ddk.goods.search - 商品搜索
  2. pdd.ddk.goods.detail - 商品详情
  3. pdd.ddk.goods.promotion.url.generate - 生成推广链接
  4. pdd.ddk.order.list.range.get - 根据时间范围查询订单
  5. 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

需要对接的接口

  1. pdd.ddk.goods.search - 商品搜索
  2. pdd.ddk.goods.detail - 商品详情
  3. pdd.ddk.goods.promotion.url.generate - 生成推广链接
  4. pdd.ddk.order.list.range.get - 查询订单(定时任务)
  5. pdd.ddk.order.detail.get - 订单详情

2. 阿里云短信服务

功能

  • 发送登录/注册验证码
  • 发送提现通知
  • 发送订单通知

3. 微信企业付款到零钱API

功能

  • 提现自动转账到用户微信零钱
  • 支持实时到账
  • 无手续费

接口说明

  • 接口名称:企业付款到零钱
  • 接口地址https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers
  • 请求方式:POST(需要双向证书)
  • 主要参数
    • mch_appid:微信公众账号appid
    • mchid:商户号
    • openid:用户openid
    • amount:金额(单位:分)
    • 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
带宽: 5Mbps

2. 部署架构

单机部署(适合初期)

服务器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
      - admin

4. 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表达式说明
同步多多客订单DEFAULTsyncPddOrdersTask.execute0 0 * * * ?每小时执行一次
结算订单佣金DEFAULTcommissionSettleTask.execute0 0 3 * * ?每天凌晨3点执行
检测用户晋升DEFAULTuserUpgradeTask.execute0 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. 业务优化

  • [ ] 优化分润算法
  • [ ] 增加更多晋升等级
  • [ ] 完善积分系统
  • [ ] 增加会员权益

附录

相关文档

参考资料


文档版本:v1.0
生成时间:2025-10-09
维护人:AI Assistant