166 lines
6.2 KiB
PHP
166 lines
6.2 KiB
PHP
<?php
|
|
|
|
namespace Peidikeji\User\Http\Admin;
|
|
|
|
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 Peidikeji\User\Models\UserSocialite;
|
|
use Illuminate\Support\Str;
|
|
|
|
class UserController extends AdminController
|
|
{
|
|
protected $translation = 'dcat-admin-user::user';
|
|
|
|
public function list(Request $request)
|
|
{
|
|
$query = User::query();
|
|
|
|
if ($request->filled('q')) {
|
|
$search = '%' . $request->input('q'). '%';
|
|
$query->where(fn($q) => $q->where('phone', 'like', $search)->orWhere('name', 'like', $search));
|
|
}
|
|
|
|
if ($request->filled('none_merchant') || $request->filled('amp;none_merchant')) {
|
|
$query->whereDoesntHave('merchants');
|
|
}
|
|
|
|
$query->select(['id', 'phone as text']);
|
|
|
|
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('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');
|
|
$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', function ($q) {
|
|
$search = '%'.$this->input.'%';
|
|
$q->where(fn($q) => $q->where('username', 'like', $search)->orWhere('name', 'like', $search)->orWhere('phone', 'like', $search));
|
|
}, '搜索')->placeholder('姓名/手机号')->width(3);
|
|
});
|
|
});
|
|
}
|
|
|
|
protected function form()
|
|
{
|
|
return Form::make(new User(), function (Form $form) {
|
|
$uniquePhone = Rule::unique('users', 'phone');
|
|
if ($form->isEditing()) {
|
|
$uniquePhone->ignore($form->model()->id);
|
|
}
|
|
$form->text('phone')->rules([$uniquePhone])->required();
|
|
$form->text('name')->required();
|
|
$form->image('avatar')->autoUpload()->saveFullUrl()->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->saving(function (Form $form) {
|
|
$form->inviter_path = $form->inviter_id ? User::where('id', $form->inviter_id)->value('inviter_path') . $form->inviter_id.'-' : null;
|
|
if (!$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');
|
|
// 删除用户的登录信息
|
|
UserSocialite::whereIn('user_id', $ids)->delete();
|
|
foreach($ids as $id) {
|
|
$current = User::findOrFail($id);
|
|
// 删除用户的邀请信息
|
|
$users = User::where('inviter_path', 'like', '%-'.$id.'-%')->get();
|
|
foreach($users as $user) {
|
|
$user->inviter_path = str_replace('-'.$id.'-', '-', $user->inviter_path);
|
|
$ids = explode('-', $user->inviter_path);
|
|
$user->inviter_id = count($ids) > 2 ? $ids[count($ids) - 2] : null;
|
|
$user->save();
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
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('profit');
|
|
$show->field('created_at');
|
|
$show->tools(function (Tools $tools) {
|
|
$tools->disableBack();
|
|
$tools->disableList(false);
|
|
});
|
|
|
|
$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;
|
|
}
|
|
}
|