You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
aquaculture/app/Admin/Controllers/UserController.php

292 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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; // 返回表单构建器
}
}