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

176 lines
6.9 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 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));
}
$query->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);
});
});
}
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.'-' : '-';
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');
// 删除用户的登录信息
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;
}
}