filled('q')) { $filter['key'] = $request->input('q'); } $query->filter($filter)->select(['id', 'phone as text'])->sort(); if ($request->filled('_paginate')) { $list = $query->paginate(); } else { $list = $query->get(); } return $list; } protected function grid() { return Grid::make(User::with(['inviter']), function (Grid $grid) { $grid->model()->sort(); $grid->disableRowSelector(); $grid->column('id'); $grid->column('username'); $grid->column('name')->display(function () { return ($this->avatar ? '' : '') . $this->name; }); $grid->column('phone'); $grid->column('balance'); $grid->column('inviter.phone')->link(fn() => admin_url('users', ['id' => $this->inviter_id])); $grid->column('created_at'); $user = Admin::user(); $grid->showCreateButton($user->can('dcat.admin.users.create')); $grid->showViewButton($user->can('dcat.admin.users.show')); $grid->showEditButton($user->can('dcat.admin.users.edit')); $grid->showDeleteButton($user->can('dcat.admin.users.destroy')); $grid->filter(function (Filter $filter) { $filter->panel(); $filter->where('name', fn($q) => $q->filter(['key' => $this->input]), '关键字')->placeholder('用户名/姓名/手机号')->width(3); $filter->equal('inviter_id')->select()->ajax('api/users?_paginate=1')->model(User::class, 'id', 'phone')->width(3); $filter->whereBetween('created_at', function ($q) { $start = data_get($this->input, 'start'); $start = $start ? Carbon::createFromFormat('Y-m-d', $start) : null; $end = data_get($this->input, 'end'); $end = $end ? Carbon::createFromFormat('Y-m-d', $end) : null; if ($start) { if ($end) { $q->whereBetween('created_at', [$start, $end]); } $q->where('created_at', '>=', $start); } else if ($end) { $q->where('created_at', '<=', $end); } })->date()->width(3); }); $grid->tools(function (Grid\Tools $tools) use ($user) { if ($user->can('dcat.admin.users.import')) { $tools->append(new GridImportUser()); } }); }); } protected function form() { return Form::make(new User(), function (Form $form) { $uniquePhone = Rule::unique('users', 'phone'); $uniqueUsername = Rule::unique('users', 'phone'); if ($form->isEditing()) { $uniquePhone->ignore($form->model()->id); $uniqueUsername->ignore($form->model()->id); } $form->text('username')->rules([$uniqueUsername])->required(); $form->text('phone')->rules([$uniquePhone])->required(); $form->text('name')->required(); $form->image('avatar') ->uniqueName() ->autoUpload() ->saveFullUrl() ->retainable() ->removable(false) ->autoSave(false) ->move('user/avatar'); $form->select('inviter_id')->model(User::class, 'id', 'name')->ajax('api/user?_paginate=1'); $form->hidden('inviter_path'); $form->hidden('invite_code'); $form->disableCreatingCheck(); $form->disableEditingCheck(); $form->disableViewCheck(); $form->disableDeleteButton(); $form->disableViewButton(); $form->saving(function (Form $form) { $form->inviter_path = $form->inviter_id ? User::where('id', $form->inviter_id)->value('inviter_path') . $form->inviter_id.'-' : '-'; if ($form->isCreating() && !$form->invite_code) { do { $invite_code = strtoupper(Str::random(6)); } while(User::where('invite_code', $invite_code)->exists()); $form->invite_code = $invite_code; } }); $form->deleting(function (Form $form) { $data = $form->model()->toArray(); $ids = array_column($data, 'id'); foreach($ids as $id) { $current = User::findOrFail($id); // 用户订单 if (method_exists($current, 'orders') && $current->orders()->count() > 0) { return $form->response()->error('请先删除用户的订单'); } // 用户优惠券 if (method_exists($current, 'coupons') && $current->coupons()->effective()->count() > 0) { return $form->response()->error('请先删除用户的优惠券'); } // 用户收货地址 $current->addresses()->delete(); // 用户余额流水 if ($current->balance > 0) { return $form->response()->error('用户余额不为0, 无法删除'); } $current->balanceLogs()->delete(); // 提现申请 $current->withdraws()->delete(); // 用户邀请记录 $users = User::where('inviter_path', 'like', '%-'.$id.'-%')->get(); foreach($users as $user) { $user->inviter_path = str_replace('-'.$id.'-', '-', $user->inviter_path); $inviteIds = explode('-', $user->inviter_path); $user->inviter_id = count($inviteIds) > 2 ? $inviteIds[count($ids) - 2] : null; $user->save(); } // 用户第三方登录信息 $current->socialites()->delete(); // 用户登录授权记录 $current->tokens()->delete(); } }); }); } protected function detail($id) { $info = User::with(['inviter', 'inviteUsers', 'socialites'])->findOrFail($id); $show = Show::make($info); $show->field('name'); $show->field('gender'); $show->field('phone'); $show->field('avatar')->image('', 64); $show->field('inviter.phone'); $show->field('invite_code'); $show->field('balance'); $show->field('created_at'); $show->tools(function (Tools $tools) { $tools->disableList(); $tools->disableDelete(); $tools->disableEdit(); $tools->append(new ShowBalance()); $tools->append(new ShowPassword()); }); $tab = new Tab(); $keys = ['id', 'username', 'name', 'phone', 'created_at']; $inviteUsers = $info->inviteUsers->map(function ($item) { return [$item->id, $item->username, $item->name, $item->phone, $item->created_at->format('Y-m-d H:i:s')]; }); $headers = array_map(fn($v) => __($this->translation . '.fields.' . $v), $keys); $table = new Table($headers, $inviteUsers, ['table-hover']); $tab->add('邀请用户', $table); $keys = ['type', 'openid', 'created_at']; $socialites = $info->socialites->map(function ($item) { return [$item->type->text(), $item->openid, $item->created_at->format('Y-m-d H:i:s')]; }); $table = new Table($keys, $socialites, ['table-hover']); $tab->add('绑定账户', $table); $row = new Row(); $row->column(6, $show); $row->column(6, (new Card('', $tab))); return $row; } }