4
0
Fork 0
dcat-admin-user/src/Http/Admin/UserController.php

222 lines
8.8 KiB
PHP

<?php
namespace Peidikeji\User\Http\Admin;
use Carbon\Carbon;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
use Dcat\Admin\Grid;
use Dcat\Admin\Grid\Filter;
use Dcat\Admin\Http\Controllers\AdminController;
use Dcat\Admin\Layout\Row;
use Dcat\Admin\Show;
use Dcat\Admin\Show\Tools;
use Dcat\Admin\Widgets\Card;
use Dcat\Admin\Widgets\Tab;
use Dcat\Admin\Widgets\Table;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Peidikeji\User\Models\User;
use Illuminate\Support\Str;
use Peidikeji\User\Action\GridImportUser;
use Peidikeji\User\Action\ShowBalance;
use Peidikeji\User\Action\ShowPassword;
class UserController extends AdminController
{
protected $translation = 'dcat-admin-user::user';
public function list(Request $request)
{
$query = User::query();
$filter = [];
if ($request->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 ? '<img src="'.$this->avatar.'" width="60" class="img-thumbnail" />' : '') . $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;
}
}