161057-后台URS用户推荐关系列表增加农场用户信息列.md 9.2 KB

后台URS用户推荐关系列表增加农场用户信息列

创建时间: 2025年06月16日 10:57 完成时间: 2025年06月16日 11:30 任务类型: 功能增强 + 代码重构 关联模块: UrsPromotion模块

📋 任务描述

在后台URS用户推荐关系列表中增加农场用户信息列,展示该人的用户信息(如果进入了农场)。

🎯 实现目标

  1. ✅ 在URS用户推荐关系列表中增加农场用户信息列
  2. ✅ 显示用户名和昵称信息
  3. ✅ 对未进入农场的用户显示友好提示
  4. ✅ 在详情页面也增加农场用户信息展示
  5. ✅ 在筛选功能中增加农场用户信息的筛选条件

🔧 技术实现

1. 修改UrsUserReferral模型

文件: app/Module/UrsPromotion/Models/UrsUserReferral.php

添加了与农场用户的关联关系:

/**
 * 获取农场用户信息(通过映射关系)
 */
public function farmUser(): BelongsTo
{
    return $this->belongsTo(\App\Module\User\Models\User::class, 'urs_user_id', 'id')
        ->join('urs_promotion_user_mappings', 'users.id', '=', 'urs_promotion_user_mappings.user_id')
        ->where('urs_promotion_user_mappings.urs_user_id', '=', $this->urs_user_id)
        ->where('urs_promotion_user_mappings.status', '=', UrsUserMapping::STATUS_VALID);
}

/**
 * 获取推荐人农场用户信息(通过映射关系)
 */
public function referrerFarmUser(): BelongsTo
{
    return $this->belongsTo(\App\Module\User\Models\User::class, 'urs_referrer_id', 'id')
        ->join('urs_promotion_user_mappings', 'users.id', '=', 'urs_promotion_user_mappings.user_id')
        ->where('urs_promotion_user_mappings.urs_user_id', '=', $this->urs_referrer_id)
        ->where('urs_promotion_user_mappings.status', '=', UrsUserMapping::STATUS_VALID);
}

2. 修改UrsUserReferralRepository

文件: app/Module/UrsPromotion/Repositorys/UrsUserReferralRepository.php

添加了JOIN查询来获取农场用户信息:

/**
 * 自定义查询构建器
 */
public function query()
{
    return $this->model()
        ->leftJoin('urs_promotion_user_mappings as user_mapping', function($join) {
            $join->on('urs_promotion_user_referrals.urs_user_id', '=', 'user_mapping.urs_user_id')
                 ->where('user_mapping.status', '=', UrsUserMapping::STATUS_VALID);
        })
        ->leftJoin('users as farm_user', 'user_mapping.user_id', '=', 'farm_user.id')
        ->leftJoin('user_infos as farm_user_info', 'farm_user.id', '=', 'farm_user_info.user_id')
        ->leftJoin('urs_promotion_user_mappings as referrer_mapping', function($join) {
            $join->on('urs_promotion_user_referrals.urs_referrer_id', '=', 'referrer_mapping.urs_user_id')
                 ->where('referrer_mapping.status', '=', UrsUserMapping::STATUS_VALID);
        })
        ->leftJoin('users as referrer_farm_user', 'referrer_mapping.user_id', '=', 'referrer_farm_user.id')
        ->leftJoin('user_infos as referrer_farm_user_info', 'referrer_farm_user.id', '=', 'referrer_farm_user_info.user_id')
        ->select([
            'urs_promotion_user_referrals.*',
            'farm_user.username as farm_username',
            'farm_user_info.nickname as farm_nickname',
            'referrer_farm_user.username as referrer_farm_username',
            'referrer_farm_user_info.nickname as referrer_farm_nickname',
        ]);
}

3. 修改UrsUserReferralController

文件: app/Module/UrsPromotion/AdminControllers/UrsUserReferralController.php

列表页面增加农场用户信息列:

// 农场用户信息列
$grid->column('farm_username', '农场用户名')->display(function ($value) {
    return $value ?: '<span class="label label-warning">未进入农场</span>';
});

$grid->column('farm_nickname', '农场用户昵称')->display(function ($value) {
    return $value ?: '<span class="text-muted">无昵称</span>';
});

// 推荐人农场用户信息列
$grid->column('referrer_farm_username', '推荐人农场用户名')->display(function ($value) {
    return $value ?: '<span class="label label-warning">未进入农场</span>';
});

$grid->column('referrer_farm_nickname', '推荐人农场昵称')->display(function ($value) {
    return $value ?: '<span class="text-muted">无昵称</span>';
});

筛选功能增加农场用户信息筛选:

$grid->filter(function (Grid\Filter $filter) {
    $filter->equal('urs_user_id', 'URS用户ID');
    $filter->equal('urs_referrer_id', 'URS推荐人ID');
    $filter->like('farm_username', '农场用户名');
    $filter->like('farm_nickname', '农场用户昵称');
    $filter->like('referrer_farm_username', '推荐人农场用户名');
    $filter->like('referrer_farm_nickname', '推荐人农场昵称');
    $filter->equal('status', '状态')->select([
        UrsUserReferral::STATUS_INVALID => '无效',
        UrsUserReferral::STATUS_VALID => '有效',
    ]);
    $filter->between('created_at', '创建时间')->datetime();
});

详情页面增加农场用户信息展示:

// 农场用户信息
$show->divider('农场用户信息');
$show->field('farm_username', '农场用户名')->as(function ($value) {
    return $value ?: '未进入农场';
});
$show->field('farm_nickname', '农场用户昵称')->as(function ($value) {
    return $value ?: '无昵称';
});

// 推荐人农场用户信息
$show->divider('推荐人农场用户信息');
$show->field('referrer_farm_username', '推荐人农场用户名')->as(function ($value) {
    return $value ?: '未进入农场';
});
$show->field('referrer_farm_nickname', '推荐人农场用户昵称')->as(function ($value) {
    return $value ?: '无昵称';
});

🧪 测试验证

1. 列表页面测试

  • ✅ 访问 http://kku_laravel.local.gd/admin/urs-promotion/user-referrals
  • ✅ 确认新增了"农场用户名"、"农场用户昵称"、"推荐人农场用户名"、"推荐人农场昵称"列
  • ✅ 对未进入农场的用户正确显示"未进入农场"和"无昵称"提示

2. 筛选功能测试

  • ✅ 点击筛选按钮,确认新增了农场用户信息的筛选条件
  • ✅ 筛选条件包括:农场用户名、农场用户昵称、推荐人农场用户名、推荐人农场昵称

3. 详情页面测试

  • ✅ 访问详情页面 http://kku_laravel.local.gd/admin/urs-promotion/user-referrals/39
  • ✅ 确认使用分隔符分组显示农场用户信息和推荐人农场用户信息
  • ✅ 对未进入农场的用户正确显示友好提示

📊 功能特点

  1. 数据关联: 通过LEFT JOIN查询获取农场用户信息,避免N+1查询问题
  2. 友好提示: 对未进入农场的用户显示"未进入农场"标签
  3. 完整筛选: 支持按农场用户名和昵称进行筛选
  4. 清晰展示: 详情页面使用分隔符分组,信息层次清晰
  5. 性能优化: 使用单次JOIN查询获取所有相关数据

🎉 任务完成

✅ 成功在后台URS用户推荐关系列表中增加了农场用户信息列
✅ 实现了完整的列表、筛选、详情功能
✅ 提供了友好的用户体验和清晰的信息展示
✅ 代码已提交并推送到远程仓库

提交信息:

  1. 后台URS用户推荐关系列表增加农场用户信息列 (c9530b95)
  2. 重构URS用户推荐关系列表:使用Eloquent关联查询替代JOIN (14b416df)

🔄 重构优化

在初始实现后,根据用户反馈"采用JOIN是不好的,应该进行关联查询",进行了代码重构:

重构前问题

  • 使用了原生JOIN查询,不符合Laravel最佳实践
  • 代码可维护性较差
  • 违反了Eloquent ORM的设计理念

重构后改进

  1. 在UrsUserMapping模型中添加关联关系

    /**
    * 获取关联的农场用户
    */
    public function user(): BelongsTo
    {
       return $this->belongsTo(\App\Module\User\Models\User::class, 'user_id', 'id');
    }
    
  2. Repository使用with预加载

    public function eloquent()
    {
       return parent::eloquent()
           ->with([
               'userMapping' => function($query) {
                   $query->where('status', UrsUserMapping::STATUS_VALID)
                         ->with('user.info');
               },
               'referrerMapping' => function($query) {
                   $query->where('status', UrsUserMapping::STATUS_VALID)
                         ->with('user.info');
               }
           ]);
    }
    
  3. Controller使用关联路径访问数据

    // 列表页面
    $grid->column('userMapping.user.username', '农场用户名')->display(function ($value) {
       return $value ?: '<span class="label label-warning">未进入农场</span>';
    });
    
    // 详情页面
    $show->field('farm_username', '农场用户名')->as(function ($value) {
       $referral = UrsUserReferral::find($this->getKey());
       $userMapping = UrsUserMapping::where('urs_user_id', $referral->urs_user_id)
           ->where('status', UrsUserMapping::STATUS_VALID)
           ->with('user')
           ->first();
       return $userMapping && $userMapping->user ? $userMapping->user->username : '未进入农场';
    });
    

重构收益

  • ✅ 符合Laravel最佳实践
  • ✅ 使用Eloquent关联查询替代原生JOIN
  • ✅ 避免N+1查询问题
  • ✅ 代码更加清晰和可维护
  • ✅ 保持了原有功能的完整性