|
|
<?php
|
|
|
|
|
|
namespace App\Admin\Controllers;
|
|
|
|
|
|
use App\Admin\Actions\Post\ActiveUserAction; // 引入激活用户操作
|
|
|
use App\Admin\Transforms\UserSexTransform; // 引入性别转换器
|
|
|
use App\Admin\Transforms\YesNoTransform; // 引入是/否转换器
|
|
|
use App\Enums\UserSexEnum; // 引入性别枚举
|
|
|
use App\Enums\UserStatusEnum; // 引入用户状态枚举
|
|
|
use App\Http\Controllers\Controller; // 引入控制器基类
|
|
|
use App\Models\Level; // 引入等级模型
|
|
|
use App\Models\User; // 引入用户模型
|
|
|
use Encore\Admin\Controllers\HasResourceActions; // 引入资源操作特性
|
|
|
use Encore\Admin\Form; // 引入表单构建器
|
|
|
use Encore\Admin\Grid; // 引入网格构建器
|
|
|
use Encore\Admin\Grid\Filter; // 引入网格过滤器
|
|
|
use Encore\Admin\Layout\Content; // 引入内容布局
|
|
|
use Encore\Admin\Show; // 引入显示构建器
|
|
|
use Illuminate\Validation\Rule; // 引入验证规则
|
|
|
|
|
|
class UserController extends Controller
|
|
|
{
|
|
|
use HasResourceActions; // 使用资源操作特性,提供 CRUD 操作
|
|
|
|
|
|
/**
|
|
|
* 显示会员列表界面.
|
|
|
*
|
|
|
* @param Content $content
|
|
|
* @return Content
|
|
|
*/
|
|
|
public function index(Content $content)
|
|
|
{
|
|
|
return $content
|
|
|
->header('会员列表') // 设置页面标题
|
|
|
->description('') // 设置页面描述
|
|
|
->body($this->grid()); // 设置页面主体为网格
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 显示用户详情界面.
|
|
|
*
|
|
|
* @param mixed $id 用户 ID
|
|
|
* @param Content $content
|
|
|
* @return Content
|
|
|
*/
|
|
|
public function show($id, Content $content)
|
|
|
{
|
|
|
return $content
|
|
|
->header('详情') // 设置页面标题
|
|
|
->description('') // 设置页面描述
|
|
|
->body($this->detail($id)); // 设置页面主体为用户详情
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 显示编辑用户界面.
|
|
|
*
|
|
|
* @param mixed $id 用户 ID
|
|
|
* @param Content $content
|
|
|
* @return Content
|
|
|
*/
|
|
|
public function edit($id, Content $content)
|
|
|
{
|
|
|
return $content
|
|
|
->header('Edit') // 设置页面标题
|
|
|
->description('') // 设置页面描述
|
|
|
->body($this->form()->edit($id)); // 设置页面主体为编辑表单
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 显示创建用户界面.
|
|
|
*
|
|
|
* @param Content $content
|
|
|
* @return Content
|
|
|
*/
|
|
|
public function create(Content $content)
|
|
|
{
|
|
|
return $content
|
|
|
->header('新建') // 设置页面标题
|
|
|
->description('') // 设置页面描述
|
|
|
->body($this->form()); // 设置页面主体为创建表单
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建网格构建器.
|
|
|
*
|
|
|
* @return Grid
|
|
|
*/
|
|
|
protected function grid()
|
|
|
{
|
|
|
$grid = new Grid(new User); // 创建用户网格
|
|
|
|
|
|
// 获取所有等级,并按最小分数降序排序
|
|
|
$levels = Level::query()->orderBy('min_score', 'desc')->get();
|
|
|
|
|
|
// 按照最新的用户排序
|
|
|
$grid->model()->latest();
|
|
|
|
|
|
// 定义网格列
|
|
|
$grid->column('id', 'Id'); // 用户 ID
|
|
|
$grid->column('name', '用户名'); // 用户名
|
|
|
$grid->column('sex', '性别')->display(function ($sex) {
|
|
|
return UserSexTransform::trans($sex); // 显示性别
|
|
|
});
|
|
|
$grid->column('email', '邮箱')->display(function ($email) {
|
|
|
return str_limit($email, 20); // 限制显示邮箱长度
|
|
|
});
|
|
|
$grid->column('avatar', '头像')->image('', 50, 50); // 显示用户头像
|
|
|
$grid->column('github_name', 'Github'); // Github 昵称
|
|
|
$grid->column('qq_name', 'QQ'); // QQ 昵称
|
|
|
$grid->column('weibo_name', '微博'); // 微博 昵称
|
|
|
$grid->column('level', '等级')->display(function () use ($levels) {
|
|
|
// 根据用户总积分获取对应等级
|
|
|
$level = $levels->where('min_score', '<=', $this->score_all)->first();
|
|
|
return optional($level)->name; // 显示等级名称
|
|
|
});
|
|
|
$grid->column('score_all', '总积分')->sortable(); // 总积分,支持排序
|
|
|
$grid->column('score_now', '剩余积分')->sortable(); // 剩余积分,支持排序
|
|
|
$grid->column('login_ip', '登录地址'); // 登录地址
|
|
|
$grid->column('login_count', '登录次数')->sortable(); // 登录次数,支持排序
|
|
|
$grid->column('is_active', '是否激活')->display(function ($isActive) {
|
|
|
return YesNoTransform::trans($isActive); // 显示是否激活状态
|
|
|
});
|
|
|
$grid->column('created_at', '创建时间'); // 创建时间
|
|
|
$grid->column('updated_at', '修改时间'); // 修改时间
|
|
|
|
|
|
// 定义网格操作
|
|
|
$grid->actions(function (Grid\Displayers\DropdownActions $actions) {
|
|
|
// 如果用户未激活,则添加激活用户操作
|
|
|
if (!$actions->row->is_active) {
|
|
|
$actions->add(new ActiveUserAction());
|
|
|
}
|
|
|
});
|
|
|
|
|
|
// 筛选功能
|
|
|
$levelOptions = $levels->pluck('name', 'id'); // 获取等级选项
|
|
|
$grid->filter(function (Filter $filter) use ($levelOptions) {
|
|
|
$filter->disableIdFilter(); // 禁用 ID 筛选
|
|
|
$filter->like('name', '用户名'); // 用户名模糊筛选
|
|
|
$filter->like('email', '邮箱'); // 邮箱模糊筛选
|
|
|
|
|
|
// 按等级筛选
|
|
|
$filter->where(function ($query) {
|
|
|
// 找到选中的等级
|
|
|
$level = Level::query()->findOrFail($this->input);
|
|
|
// 找到下一个等级
|
|
|
$high = Level::query()->where('min_score', '>', $level->min_score)->orderBy('min_score', 'asc')->first();
|
|
|
|
|
|
// 筛选总积分在当前等级范围内的用户
|
|
|
$query->where('score_all', '>=', $level->min_score);
|
|
|
if (!is_null($high)) {
|
|
|
$query->where('score_all', '<', $high->min_score);
|
|
|
}
|
|
|
}, '等级')->select($levelOptions); // 添加等级选择
|
|
|
});
|
|
|
|
|
|
return $grid; // 返回网格
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建显示构建器.
|
|
|
*
|
|
|
* @param mixed $id 用户 ID
|
|
|
* @return Show
|
|
|
*/
|
|
|
protected function detail($id)
|
|
|
{
|
|
|
$show = new Show(User::findOrFail($id)); // 创建用户详情显示构建器
|
|
|
|
|
|
// 定义显示字段
|
|
|
$show->field('id', 'Id'); // 用户 ID
|
|
|
$show->field('name', '用户名'); // 用户名
|
|
|
$show->field('sex', '性别')->as(function ($sex) {
|
|
|
return UserSexTransform::trans($sex); // 显示性别
|
|
|
});
|
|
|
$show->field('email', '邮箱'); // 邮箱
|
|
|
$show->field('avatar', '头像')->image(); // 显示头像
|
|
|
$show->field('github_name', 'Github昵称'); // Github 昵称
|
|
|
$show->field('qq_name', 'QQ昵称'); // QQ 昵称
|
|
|
$show->field('weibo_name', '微博昵称'); // 微博 昵称
|
|
|
$show->field('login_ip', '登录地址'); // 登录地址
|
|
|
$show->field('login_count', '登录次数'); // 登录次数
|
|
|
$show->field('is_active', '是否激活')->as(function ($isActive) {
|
|
|
return YesNoTransform::trans($isActive); // 显示是否激活状态
|
|
|
})->unescape(); // 取消 HTML 转义
|
|
|
$show->field('created_at', '创建时间'); // 创建时间
|
|
|
$show->field('updated_at', '修改时间'); // 修改时间
|
|
|
|
|
|
// 显示用户的收货地址
|
|
|
$show->addresses('收货地址', function (Grid $grid) {
|
|
|
$grid->model()->latest(); // 按最新排序
|
|
|
$grid->column('name', '收货人'); // 收货人姓名
|
|
|
$grid->column('phone', '收货人联系方式'); // 收货人联系方式
|
|
|
$grid->column('detail_address', '详细地址'); // 详细地址
|
|
|
$grid->column('is_default', '是否默认')->display(function ($is) {
|
|
|
return YesNoTransform::trans($is); // 显示是否默认
|
|
|
});
|
|
|
$grid->column('created_at', '创建时间'); // 创建时间
|
|
|
|
|
|
// 禁用一些操作
|
|
|
$grid->disableActions();
|
|
|
$grid->disableCreateButton();
|
|
|
$grid->disableFilter();
|
|
|
$grid->disableTools();
|
|
|
$grid->disableRowSelector();
|
|
|
});
|
|
|
|
|
|
// 显示用户的积分日志
|
|
|
$show->scoreLogs('积分', function (Grid $grid) {
|
|
|
$grid->model()->latest(); // 按最新排序
|
|
|
$grid->column('description', '描述'); // 积分描述
|
|
|
$grid->column('score', '积分'); // 积分
|
|
|
$grid->column('created_at', '创建时间'); // 创建时间
|
|
|
|
|
|
// 禁用一些操作
|
|
|
$grid->disableActions();
|
|
|
$grid->disableCreateButton();
|
|
|
$grid->disableFilter();
|
|
|
$grid->disableTools();
|
|
|
$grid->disableRowSelector();
|
|
|
});
|
|
|
|
|
|
return $show; // 返回用户详情显示构建器
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建表单构建器.
|
|
|
*
|
|
|
* @return Form
|
|
|
*/
|
|
|
protected function form()
|
|
|
{
|
|
|
// 前台用户注册必须要有这个 token,兼容一下
|
|
|
$form = new Form(tap(new User, function ($user) {
|
|
|
$user->active_token = str_random(60); // 生成随机激活 token
|
|
|
}));
|
|
|
|
|
|
// 用户名字段
|
|
|
$form->text('name', '用户名')->rules(function (Form $form) {
|
|
|
$rules = 'required|unique:users,name'; // 用户名必填且唯一
|
|
|
|
|
|
// 更新操作时,排除当前用户 ID
|
|
|
if (!is_null($id = $form->model()->getKey())) {
|
|
|
$rules .= ",{$id}";
|
|
|
}
|
|
|
|
|
|
return $rules; // 返回验证规则
|
|
|
});
|
|
|
|
|
|
// 性别字段
|
|
|
$sexOptions = [UserSexEnum::MAN => '男', UserSexEnum::WOMAN => '女']; // 性别选项
|
|
|
$form->select('sex', '性别')->rules(['required', Rule::in(array_keys($sexOptions))])
|
|
|
->options($sexOptions)->default(1); // 默认选择男
|
|
|
|
|
|
// 邮箱字段
|
|
|
$form->email('email', '邮箱')->rules(function (Form $form) {
|
|
|
$rules = 'required|email|unique:users,email'; // 邮箱必填且唯一
|
|
|
|
|
|
// 更新操作时,排除当前用户 ID
|
|
|
if (!is_null($id = $form->model()->getKey())) {
|
|
|
$rules .= ",{$id}";
|
|
|
}
|
|
|
|
|
|
return $rules; // 返回验证规则
|
|
|
});
|
|
|
|
|
|
// 密码字段
|
|
|
$form->password('password', '密码'); // 密码字段
|
|
|
|
|
|
// 头像字段
|
|
|
$avatar = $form->image('avatar', '头像')->uniqueName()->move('avatars'); // 上传头像并指定存储路径
|
|
|
|
|
|
// 如果不是 Windows 系统,调整头像尺寸
|
|
|
if (!windows_os()) {
|
|
|
$avatar->resize(160, 160);
|
|
|
}
|
|
|
|
|
|
// 激活状态开关
|
|
|
$form->switch('is_active', '激活');
|
|
|
|
|
|
// 在保存表单前加密密码
|
|
|
$form->saving(function (Form $form) {
|
|
|
if ($form->password) {
|
|
|
$form->password = bcrypt($form->password); // 加密密码
|
|
|
} else {
|
|
|
$form->password = $form->model()->password; // 保持原密码
|
|
|
}
|
|
|
});
|
|
|
|
|
|
return $form; // 返回表单构建器
|
|
|
}
|
|
|
}
|