Tigshop开源商城 分销中心:源码只留了 salesman 表,C 端接口我给补全(附代码

简介: tigshop开源版虽预留分销数据模型(Salesman等),但C端接口缺失。本文基于现有model快速补全一级返佣与“我的分销中心”功能:新增Service聚合数据、Controller提供API、路由注册及支付回调自动记佣,前端Uniapp对接展示,零建表、轻量落地。(239字)

在 tigshop 单商户版里翻分销功能,会看到一个挺微妙的状态。php/app/model/salesman/ 下 Salesman、SalesmanOrder、SalesmanCustomer、SalesmanProduct 这些模型都在,表结构也齐;但 php/app/api/controller/ 里没有 salesman 目录,php/app/service/admin/ 下也没有 salesman 这一层。

也就是说,分销中心是 Pro 功能,开源版只给你留了数据层,C 端一个接口没有。官网功能清单里"多级分销、分销中心、推广海报"后面确实都标着 (Pro)。

这次客户只要个最简单的一级返佣加"我的分销中心",没必要为这个上 Pro。我照着 model 已有的字段,把 C 端接口补了出来。

先认字段

建表的功夫省了,salesman_order 表该有的都定义好了。翻一下实际列名,别想当然:

-- salesman_order 实际字段(数据库里已有)
salesman_order_id  int          -- 主键
order_id           int          -- 订单ID
salesman_id        int          -- 分销员ID
amount             decimal(10,2)-- 收益总额(注意是 amount,不是 commission_amount)
order_amount       decimal(10,2)-- 订单商品金额
status             tinyint      -- 0待结算 1已结算
salesman_settlement_data text   -- 结算配置快照(json)

我一开始按习惯写了 commission_amount,跑起来报字段不存在,翻表才发现佣金列叫 amount。SalesmanCustomer 记录"谁是谁拉来的",salesman_id 对 user_id,绑定关系一有,返佣就有依据。

补 C 端 Service

tigshop 前台 Service 放 php/app/service/front/,新建 salesman/SalesmanCenterService.php,把"我的分销数据"聚合出来:

<?php
namespace app\service\front\salesman;

use app\model\salesman\Salesman;
use app\model\salesman\SalesmanOrder;
use app\model\salesman\SalesmanCustomer;

class SalesmanCenterService
{
   
    // 分销中心首页数据
    public function overview(int $userId): array
    {
   
        $salesman = Salesman::where('user_id', $userId)->find();
        if (!$salesman) {
   
            return ['is_salesman' => 0];
        }
        $sid = $salesman->salesman_id;

        return [
            'is_salesman'     => 1,
            'salesman_id'     => $sid,
            'customer_count'  => SalesmanCustomer::where('salesman_id', $sid)->count(),
            'total_commission'=> SalesmanOrder::where('salesman_id', $sid)
                                    ->where('status', 1)->sum('amount'),
            'wait_commission' => SalesmanOrder::where('salesman_id', $sid)
                                    ->where('status', 0)->sum('amount'),
        ];
    }

    // 我的返佣订单
    public function orderList(int $userId, int $page, int $size): array
    {
   
        $salesman = Salesman::where('user_id', $userId)->find();
        if (!$salesman) return ['records' => [], 'total' => 0];

        $query = SalesmanOrder::where('salesman_id', $salesman->salesman_id)
            ->with(['orderUserInfo'])
            ->order('salesman_order_id', 'desc');

        return [
            'records' => $query->page($page, $size)->select(),
            'total'   => $query->count(),
        ];
    }
}

orderUserInfo 是 SalesmanOrder 模型里现成的关联,能带出订单号、金额这些,不用自己 join。

补 C 端 Controller

照 tigshop 现有 controller 的写法:继承 IndexBaseController、构造注入 Service、返回 $this->success()。用户 id 直接从 request()->userId 取,跟 Address 那些控制器一致:

<?php
namespace app\api\controller\user;

use app\api\IndexBaseController;
use app\service\front\salesman\SalesmanCenterService;
use think\App;
use think\Response;

class Salesman extends IndexBaseController
{
   
    protected SalesmanCenterService $service;

    public function __construct(App $app, SalesmanCenterService $service)
    {
   
        parent::__construct($app);
        $this->service = $service;
    }

    public function center(): Response
    {
   
        $this->checkLogin();
        return $this->success($this->service->overview(request()->userId));
    }

    public function orderList(): Response
    {
   
        $this->checkLogin();
        $page = $this->request->all('page/d', 1);
        $size = $this->request->all('size/d', 15);
        return $this->success($this->service->orderList(request()->userId, $page, $size));
    }
}

挂路由

跟着 php/app/api/route/user.php 里 address / aftersales 那几组的写法加一段:

Route::group('salesman', function () {
   
    Route::get('center', 'user.salesman/center');
    Route::get('orderList', 'user.salesman/orderList');
})->middleware([\app\api\middleware\CheckLogin::class]);

返佣在哪触发

绑定关系有了,得在订单支付成功后记一笔返佣。tigshop 的支付回调在 php/app/api/controller/order/Pay.php 的 notify,成功后我加了个钩子写 salesman_order:

// 支付成功后:给上级分销员记一笔待结算
$customer = SalesmanCustomer::where('user_id', $order['user_id'])->find();
if ($customer) {
   
    SalesmanOrder::create([
        'salesman_id' => $customer->salesman_id,
        'order_id'    => $order['order_id'],
        'amount'      => bcmul($order['total_amount'], '0.10', 2), // 一级 10%
        'status'      => 0, // 待结算,确认收货后再转 1
    ]);
}

字段用 amount,别再写成 commission_amount。确认收货或者售后期过了,再跑个定时任务把 status 从 0 改成 1,宝塔计划任务加个 php think 命令定时扫一遍就行。

前端 Uniapp 分销中心页

Uniapp 的 api 定义统一放 view/Tigshop-Uniapp/src/api,我加了个 salesman.ts:

// src/api/salesman.ts
import request from '@/utils/request'

export const getSalesmanCenter = () => request.get('/api/user/salesman/center')
export const getSalesmanOrders = (page = 1) =>
  request.get('/api/user/salesman/orderList', {
    page })

页面 src/pages/salesman/center.vue 拉数据展示:

<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { getSalesmanCenter } from '@/api/salesman'

const info = ref<any>({})
onMounted(async () => { info.value = (await getSalesmanCenter()).data })
</script>

<template>
  <view v-if="info.is_salesman" class="center">
    <view>累计佣金:{
  { info.total_commission }}</view>
    <view>待结算:{
  { info.wait_commission }}</view>
    <view>我的客户:{
  { info.customer_count }} 人</view>
  </view>
  <view v-else>你还不是分销员</view>
</template>

这只补了一级返佣加分销中心,多级、团队、推广素材那些还是 Pro 的完整功能。但客户只想给老客户开个返佣的话,这几处改完就能跑。model 层留得全,补 C 端不用建表;真要做多级,可以顺着 SalesmanOrder 的 salesman_settlement_data 这个 json 字段往里塞层级快照。

相关文章
|
3月前
|
运维 安全 Java
为什么不建议从零开发商城?集体放弃自研,转向开源二开的核心原因
电商技术选型核心在于规避隐性成本:自研商城看似自由,实则长期维护、迭代、安全投入巨大;成熟开源系统可省60%无效开发。本文对比VortMall(高并发多业态)、TigShop(全开源Java/低二开成本)、Jinor(PHP轻量快启)等5大主流方案,聚焦架构弹性、源码透明、生态持续与场景匹配,助企业精准降本增效。
351 0
为什么不建议从零开发商城?集体放弃自研,转向开源二开的核心原因
|
2月前
|
人工智能 自然语言处理 运维
百炼大模型对比:通义千问-max、DeepSeek-V4-Pro、GLM-5.2 选型指南
通义千问-max、DeepSeek-V4-Pro与GLM-5.2在百炼平台如何选型?从能力、价格、上下文长度、响应速度等维度横评三大模型,助你快速做出选型决策
544 0
|
2月前
|
NoSQL 前端开发 Redis
礼盒两件起售怎么拦?Tigshop开源商城我补了个min_buy
本方案为礼盒商品新增「起购数量」(min_buy)字段,与限购(limit_number)解耦:前者控制下限(如2件起购),后者控制上限。前后端双重校验,支持待付款占用、关单释放,管理后台可配,默认0不限。避免误用秒杀方案,轻量可靠。
|
3月前
|
机器学习/深度学习 运维 算法
路面缺陷检测数据集(9类YOLO已标注已划分)道路病害目标检测专用数据集分享
本数据集专为路面病害检测打造,含9类YOLO格式标注(含原生/修补裂缝、坑槽、网裂等),已划分训练/验证/测试集,适配YOLOv5-v10等主流模型。真实场景覆盖光照、雨湿、阴影等复杂条件,助力智能巡检、自动驾驶风险感知与道路养护数字化。
|
3月前
|
人工智能 前端开发 程序员
Claude Opus 5 全新发布,7 大项目实测,夯还是拉?半价吊打 Fable 5?
Claude Opus 5 模型全新发布,只用一半的价格,追平 Claude Fable 5 旗舰模型?我用 7 个实战项目测评 AI 编程能力,前端、后端和全栈开发能力如何?看到最后的例子我惊呆了
426 0
|
4月前
|
Web App开发 存储 缓存
2026 私域直播项目研发解析:低延迟流媒体架构与多端统一适配实现
2026年直播平台需构建低延迟、高并发的私域系统,解决传输延迟、多端数据割裂等问题,采用RTMP+WebRTC混合架构实现高效交互。
|
3月前
|
缓存 Java 应用服务中间件
保姆级实战!用宝塔部署企业级Java开源电商商城
基于SpringBoot3+Vue3+Nuxt3+UniApp全栈架构提供宝塔面板可视化部署方案,零命令、高稳定、全流程覆盖环境安装、双Java服务部署、Nginx反向代理与HTTPS配置,大幅降低中小企业及开发者运维门槛。(239字)
|
9月前
|
存储 编解码 Cloud Native
全链路解析:基于云原生架构的 Bilibili 视频下载引擎实现
本文深入解析基于云原生架构的B站视频下载引擎,涵盖DASH协议分析、音视频分片下载、FFmpeg无损合成及阿里云Serverless部署。结合异步任务编排、OSS存储与反爬策略,实现高效、合规的全链路流媒体解析,适用于离线学习与弱网播放场景。(238字)
1007 1
|
监控 网络安全 数据库
2025 ERPNext 一键部署方案
随着企业数字化转型加速,开源ERP系统ERPNext因其功能全面、灵活易定制等特点备受青睐。然而,其部署涉及Python环境、数据库配置等技术门槛。本文介绍如何通过Websoft9自动化工具一键部署ERPNext,简化流程,降低技术难度,帮助用户快速搭建稳定可用的企业管理系统。
2015 0
2025 ERPNext 一键部署方案

热门文章

最新文章