222 lines
8.8 KiB
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;
|
|
}
|
|
}
|