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