在短剧分销赛道中,并非所有团队都需要重型架构。对于中小渠道商、MCN 机构或转型中的内容团队,一套轻量化、低成本、易部署的分销系统更能快速验证商业模式。本文聚焦轻量化解决方案,详解如何基于 UniApp+Spring Boot 技术栈,实现多端适配的分销系统,兼顾开发效率与运营需求。

一、轻量化架构设计:够用就好的技术选型

轻量化的核心是 "去冗余"—— 只保留分销业务的核心模块,用最小资源消耗实现核心功能。

1. 前后端技术栈选型

前端跨端方案

  • 主框架:UniApp(一套代码编译到微信 / 支付宝 / 抖音小程序 + H5+App)
  • UI 组件库:uView UI(轻量且兼容多端)
  • 状态管理:Pinia(替代 Vuex,体积更小)
  • 构建优化:分包加载(主包控制在 2MB 内,提升小程序启动速度)

后端精简架构

  • 主框架:Spring Boot 3.0(省去微服务的复杂性)
  • 数据库:MySQL 8.0(单库分表即可满足 10 万级分销商规模)
  • 缓存:Redis(仅缓存热点数据,如分销商信息、推广排行)
  • 服务器:2 核 4G 云服务器(初期足够支撑日均 10 万次请求)

架构优势

  • 开发效率:前端一套代码覆盖多端,开发周期缩短 60%
  • 运维成本:单服务器部署,省去服务治理开销
  • 迭代速度:前后端分离但不隔离,小团队可快速协同

2. 核心模块取舍原则

轻量化系统必须做减法,建议保留的核心模块:

plaintext

├── 用户中心(分销商注册/认证/等级)
├── 推广工具(专属链接/素材库/数据看板)
├── 分账引擎(佣金计算/结算/提现)
├── 内容中心(短剧列表/试看/购买记录)
└── 运营后台(分销商管理/订单统计/规则配置)

可暂时砍掉的非核心功能:

  • 复杂的数据分析报表(用 Excel 导出替代)
  • 多级分销团队管理(先做一级,验证模式后再扩展)
  • 素材 AI 生成工具(人工制作初期足够)

二、UniApp 跨端实现:多端适配的关键技术

UniApp 实现多端统一的核心是 "条件编译" 与 "组件适配",需重点解决小程序与 H5 的差异问题。

1. 分销商推广端实现

首页布局(兼顾信息展示与操作便捷)

vue

<template>
  <view class="distributor-home">
    <!-- 顶部收益卡片 -->
    <income-card :total="totalIncome" :today="todayIncome" />
    
    <!-- 功能入口 -->
    <grid-menu>
      <grid-item icon="link" text="我的推广" @click="toPromoCenter" />
      <grid-item icon="image" text="素材库" @click="toMaterialLib" />
      <grid-item icon="money" text="提现" @click="toWithdraw" />
      <grid-item icon="chart" text="数据报表" @click="toReport" />
    </grid-menu>
    
    <!-- 短剧推荐(根据推广效果排序) -->
    <drama-list :list="recommendDramas" />
    
    <!-- 底部导航(条件编译适配不同端) -->
    <tab-bar>
      <tab-bar-item pagePath="/pages/home/index" icon="home" text="首页" />
      <tab-bar-item pagePath="/pages/promo/index" icon="share-alt" text="推广" />
      <tab-bar-item pagePath="/pages/mine/index" icon="user" text="我的" />
    </tab-bar>
  </view>
</template>

<script setup>
// 引入工具函数(处理多端差异)
import { getSystemInfo } from '@/utils/device'
import { useDistributorStore } from '@/stores/distributor'

// 初始化
const distributorStore = useDistributorStore()
onLoad(() => {
  distributorStore.fetchHomeData()
  
  // 微信小程序隐藏返回首页按钮,H5显示
  #ifdef MP-WEIXIN
  wx.hideHomeButton()
  #endif
})
</script>

<style scoped>
/* 适配H5与小程序的样式差异 */
.distributor-home {
  min-height: 100vh;
  #ifdef H5
  padding-top: 44px; /* H5有导航栏 */
  #endif
  #ifdef MP-WEIXIN
  padding-top: 0; /* 小程序使用自定义导航 */
  #endif
}
</style>

推广工具核心功能

  • 一键生成带参数海报(Canvas 绘制 + 分销商标识水印)
  • 推广数据实时展示(今日点击 / 转化 / 收益)
  • 渠道效果对比(区分朋友圈 / 社群 / 短视频渠道)

2. 多端适配避坑指南

  1. 小程序分包加载配置

json

// pages.json
{
  "pages": [
    "pages/home/index",
    "pages/login/index",
    "pages/promo/index"
  ],
  "subPackages": [
    {
      "root": "pages/material/",
      "pages": ["list/index", "detail/index"]
    },
    {
      "root": "pages/withdraw/",
      "pages": ["index", "record/index"]
    }
  ],
  "preloadRule": {
    "pages/home/index": {
      "network": "all",
      "packages": ["pages/material"]
    }
  }
}
  1. 支付接口多端适配

javascript

运行

// 支付工具类
export const payService = {
  async createOrder(orderId) {
    // 统一调用后端创建订单
    const { data } = await request.post('/order/create', { orderId })
    
    // 条件编译调用各端支付API
    #ifdef MP-WEIXIN
    return await wx.requestPayment({
      timeStamp: data.timeStamp,
      nonceStr: data.nonceStr,
      package: data.package,
      signType: 'MD5',
      paySign: data.paySign
    })
    #endif
    
    #ifdef MP-ALIPAY
    return await my.tradePay({
      tradeNO: data.tradeNo
    })
    #endif
    
    #ifdef H5
    // H5调用微信H5支付或支付宝H5支付
    window.location.href = data.payUrl
    #endif
  }
}
  1. 本地存储跨端兼容

javascript

运行

// 封装存储工具,解决各端API差异
export const storage = {
  set(key, value) {
    #ifdef H5
    localStorage.setItem(key, JSON.stringify(value))
    #endif
    
    #ifdef MP-WEIXIN || MP-ALIPAY
    uni.setStorageSync(key, value)
    #endif
  },
  
  get(key) {
    #ifdef H5
    const val = localStorage.getItem(key)
    return val ? JSON.parse(val) : null
    #endif
    
    #ifdef MP-WEIXIN || MP-ALIPAY
    return uni.getStorageSync(key)
    #endif
  }
}

三、后端精简实现:Spring Boot 核心功能开发

轻量化后端的关键是 "聚焦核心流程",用最少的代码实现分销业务闭环。

1. 分销商管理模块

核心实体设计

java

运行

// 分销商实体(精简字段)
@Data
@TableName("distributor")
public class Distributor {
    private Long id;
    private String username;
    private String mobile; // 仅存储加密手机号
    private String inviteCode; // 邀请码
    private Long parentId; // 上级ID(一级分销)
    private Integer level; // 等级:1-普通 2-VIP
    private BigDecimal balance; // 可提现余额
    private String avatar; // 头像URL
    private LocalDateTime createTime;
}

邀请注册流程

java

运行

@Service
public class DistributorService {
    @Autowired
    private DistributorMapper distributorMapper;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
    
    // 注册并绑定邀请关系
    public void register(RegisterDTO dto) {
        // 校验邀请码是否存在
        if (StringUtils.hasText(dto.getInviteCode())) {
            Distributor inviter = distributorMapper.selectByInviteCode(dto.getInviteCode());
            if (inviter == null) {
                throw new BusinessException("邀请码无效");
            }
        }
        
        // 生成唯一邀请码
        String inviteCode = generateInviteCode();
        
        // 保存分销商信息
        Distributor distributor = new Distributor();
        distributor.setMobile(EncryptUtils.encrypt(dto.getMobile())); // 加密存储手机号
        distributor.setInviteCode(inviteCode);
        distributor.setParentId(dto.getInviteCode() != null ? inviter.getId() : 0L);
        distributor.setLevel(1); // 默认普通等级
        distributor.setBalance(new BigDecimal("0"));
        distributorMapper.insert(distributor);
        
        // 发送注册成功通知(异步)
        asyncService.sendRegisterNotify(distributor);
    }
    
    // 生成8位邀请码
    private String generateInviteCode() {
        String code = RandomStringUtils.randomAlphanumeric(8).toUpperCase();
        // 检查是否重复,重复则重试
        if (distributorMapper.countByInviteCode(code) > 0) {
            return generateInviteCode();
        }
        return code;
    }
}

2. 分账引擎实现

轻量化分账系统采用 "规则模板 + 简单计算" 模式,避免引入复杂规则引擎:

java

运行

@Service
public class CommissionService {
    // 分账比例配置(可改为数据库配置)
    private static final Map<Integer, BigDecimal> LEVEL_RATE = new HashMap<>();
    static {
        LEVEL_RATE.put(1, new BigDecimal("0.15")); // 普通分销商15%
        LEVEL_RATE.put(2, new BigDecimal("0.20")); // VIP分销商20%
    }
    
    // 订单支付后计算佣金
    @Transactional
    public void calculateCommission(Order order) {
        // 查询购买用户的推广来源
        Long distributorId = order.getDistributorId();
        if (distributorId == null) {
            return; // 非推广订单
        }
        
        // 查询分销商等级
        Distributor distributor = distributorMapper.selectById(distributorId);
        BigDecimal rate = LEVEL_RATE.get(distributor.getLevel());
        
        // 计算佣金
        BigDecimal commission = order.getAmount().multiply(rate).setScale(2, RoundingMode.HALF_UP);
        
        // 保存佣金记录
        CommissionRecord record = new CommissionRecord();
        record.setOrderId(order.getId());
        record.setDistributorId(distributorId);
        record.setAmount(commission);
        record.setStatus(1); // 待结算
        commissionRecordMapper.insert(record);
        
        // 更新分销商余额
        distributorMapper.increaseBalance(distributorId, commission);
    }
}

3. 提现流程设计

轻量化系统的提现流程需兼顾安全与效率:

java

运行

@Service
public class WithdrawService {
    @Autowired
    private WithdrawMapper withdrawMapper;
    @Autowired
    private DistributorMapper distributorMapper;
    @Autowired
    private PayService payService;
    
    // 申请提现
    @Transactional
    public void applyWithdraw(WithdrawDTO dto, Long distributorId) {
        // 校验余额
        Distributor distributor = distributorMapper.selectById(distributorId);
        if (distributor.getBalance().compareTo(dto.getAmount()) < 0) {
            throw new BusinessException("余额不足");
        }
        
        // 校验最低提现金额
        if (dto.getAmount().compareTo(new BigDecimal("50")) < 0) {
            throw new BusinessException("最低提现金额50元");
        }
        
        // 冻结余额
        distributorMapper.decreaseBalance(distributorId, dto.getAmount());
        
        // 创建提现记录
        WithdrawRecord record = new WithdrawRecord();
        record.setDistributorId(distributorId);
        record.setAmount(dto.getAmount());
        record.setAccount(dto.getAccount()); // 支付宝/微信账号
        record.setStatus(0); // 待审核
        record.setApplyTime(LocalDateTime.now());
        withdrawMapper.insert(record);
    }
    
    // 审核通过并付款(运营后台操作)
    @Transactional
    public void approveWithdraw(Long recordId) {
        WithdrawRecord record = withdrawMapper.selectById(recordId);
        if (record.getStatus() != 0) {
            throw new BusinessException("状态错误");
        }
        
        // 调用支付接口转账
        PayResult result = payService.transfer(
            record.getAccount(), 
            record.getAmount(), 
            "分销商提现-" + recordId
        );
        
        // 更新提现状态
        if (result.isSuccess()) {
            record.setStatus(1); // 已付款
            record.setPayTime(LocalDateTime.now());
            record.setTradeNo(result.getTradeNo());
            withdrawMapper.updateById(record);
        } else {
            // 转账失败,恢复余额
            distributorMapper.increaseBalance(record.getDistributorId(), record.getAmount());
            throw new BusinessException("转账失败:" + result.getMsg());
        }
    }
}

四、运营支撑功能:轻量化不等于弱运营

轻量化系统同样需要基础运营能力,关键是用最小成本实现核心需求。

1. 简易运营后台

采用 Vue+Element UI 快速搭建后台,核心功能包括:

  • 分销商管理(列表 / 审核 / 等级调整)
  • 订单查询(按分销商 / 时间 / 状态筛选)
  • 佣金统计(日 / 周 / 月报表)
  • 基础配置(分账比例 / 提现门槛)

数据统计实现

java

运行

@Service
public class StatisticService {
    @Autowired
    private OrderMapper orderMapper;
    @Autowired
    private CommissionRecordMapper commissionMapper;
    
    // 今日核心数据统计
    public TodayStatDTO getTodayStat() {
        LocalDate today = LocalDate.now();
        LocalDateTime start = today.atStartOfDay();
        LocalDateTime end = today.plusDays(1).atStartOfDay();
        
        // 今日订单数与金额
        OrderStat orderStat = orderMapper.statByTime(start, end);
        
        // 今日佣金总额
        BigDecimal totalCommission = commissionMapper.sumByTime(start, end);
        
        // 今日新增分销商
        int newDistributor = distributorMapper.countByCreateTime(start, end);
        
        return TodayStatDTO.builder()
            .orderCount(orderStat.getCount())
            .orderAmount(orderStat.getAmount())
            .commissionAmount(totalCommission)
            .newDistributor(newDistributor)
            .build();
    }
}

2. 素材管理与分发

轻量化素材库设计原则:简单分类 + 高效分发

  • 按短剧 ID 和素材类型(海报 / 视频片段 / 文案)组织
  • 支持批量上传与一键同步至分销商端
  • 记录素材被使用次数和转化效果

五、部署与运维:中小团队的极简方案

1. 部署架构

plaintext

云服务器(2核4G)
├── Nginx(静态资源+反向代理)
├── 后端服务(Spring Boot Jar包,通过systemd管理)
├── MySQL(主从复制可选,初期单库即可)
└── Redis(单实例,持久化开启)

Docker Compose 配置

yaml

version: '3'
services:
  app:
    image: openjdk:17-jdk-slim
    ports:
      - "8080:8080"
    volumes:
      - ./app:/app
    command: java -jar /app/drama-distribution.jar
    depends_on:
      - mysql
      - redis
  
  mysql:
    image: mysql:8.0
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/data:/var/lib/mysql
      - ./mysql/conf:/etc/mysql/conf.d
    environment:
      - MYSQL_ROOT_PASSWORD=xxx
      - MYSQL_DATABASE=drama
  
  redis:
    image: redis:7.0
    ports:
      - "6379:6379"
    volumes:
      - ./redis/data:/data
    command: redis-server --appendonly yes

2. 运维要点

  • 数据备份:每日自动备份 MySQL,保留 7 天历史
  • 日志管理:使用 logback 按天分割日志,超过 30 天自动删除
  • 监控告警:通过云服务商监控 CPU / 内存 / 磁盘使用率,超过 80% 告警
  • 安全加固:只开放必要端口,定期更新系统补丁

六、成本与扩展性评估

1. 初期成本估算

资源 配置 月成本(阿里云)
云服务器 2 核 4G 约 150 元
数据库 MySQL 1 核 2G 约 80 元
对象存储 OSS 50GB 约 10 元
域名与 SSL 阿里云域名 + 免费 SSL 约 60 元 / 年
总计 约 240 元 / 月

2. 扩展路径

当业务规模增长时,可逐步扩展:

  1. 服务器升级至 4 核 8G(支撑 5 万 + 分销商)
  2. 数据库读写分离(主库写入,从库查询)
  3. 引入消息队列(Kafka)处理异步任务
  4. 前端拆分为独立小程序和 App(保留 H5)

轻量化短剧分销系统的核心价值,在于用最低成本验证商业模式。对于中小团队,与其花费 3 个月开发重型系统,不如用 1 个月上线轻量化版本,通过真实运营数据指导后续迭代。技术选型上,UniApp+Spring Boot 的组合既能满足多端需求,又能保证开发效率,是中小团队切入短剧分销赛道的理想选择。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐