增加 管理员管理

This commit is contained in:
iVampireSP.com 2022-11-21 15:47:07 +08:00
parent af2b26ee0e
commit 9ab76daa4b
No known key found for this signature in database
GPG Key ID: 2F7B001CA27A8132
6 changed files with 304 additions and 67 deletions

View File

@ -0,0 +1,131 @@
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Admin;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
use Illuminate\View\View;
class AdminController extends Controller
{
/**
* Display a listing of the resource.
*
* @return View
*/
public function index(): View
{
$admins = Admin::paginate(100);
return view('admin.admins.index', compact('admins'));
}
/**
* Show the form for creating a new resource.
*
* @return View
*/
public function create(): View
{
return view('admin.admins.create');
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return RedirectResponse
*/
public function store(Request $request): RedirectResponse
{
//
$request->validate([
'email' => 'required|email|unique:admins,email',
]);
// 随机密码
$password = Str::random(16);
$admin = Admin::create([
'email' => $request->email,
'password' => bcrypt($password),
]);
return redirect()->route('admin.admins.edit', $admin)->with('success', '管理员创建成功,密码为:' . $password . '。');
}
/**
* Show the form for editing the specified resource.
*
* @param Admin $admin
*
* @return View
*/
public function edit(Admin $admin): View
{
return view('admin.admins.edit', compact('admin'));
}
/**
* Update the specified resource in storage.
*
* @param Request $request
* @param Admin $admin
*
* @return RedirectResponse
*/
public function update(Request $request, Admin $admin): RedirectResponse
{
$request->validate([
'email' => 'required|email|unique:admins,email,' . $admin->id,
]);
$msg = '管理员信息更新成功';
if ($request->filled('reset_password')) {
// 随机密码
$password = Str::random(16);
$msg .= ',新的密码为:' . $password;
$admin->password = bcrypt($password);
}
$msg .= '。';
$admin->email = $request->email;
$admin->save();
return redirect()->back()->with('success', $msg);
}
/**
* Remove the specified resource from storage.
*
* @param Admin $admin
*
* @return RedirectResponse
*/
public function destroy(Admin $admin): RedirectResponse
{
// 不能删除自己
if ($admin->id == auth('admin')->id()) {
return redirect()->back()->with('error', '不能删除自己。');
}
// 不能删除最后一个管理员
if (Admin::count() == 1) {
return redirect()->back()->with('error', '不能删除最后一个管理员。');
}
$admin->delete();
return redirect()->route('admin.admins.index')->with('success', '管理员已删除。');
}
}

View File

@ -0,0 +1,20 @@
@extends('layouts.admin')
@section('title', '新建管理员')
@section('content')
<h3>权力越大,责任越大</h3>
<a class="mt-3" href="{{ route('admin.admins.index') }}">返回管理员列表</a>
<form method="POST" action="{{ route('admin.admins.store')}}">
@csrf
<div class="form-group mt-1">
<label for="email">Email</label>
<input type="text" class="form-control" id="email" name="email" placeholder="Email" required>
</div>
<button type="submit" class="btn btn-primary mt-3">提交</button>
</form>
@endsection

View File

@ -0,0 +1,36 @@
@extends('layouts.admin')
@section('title', '管理员:' . $admin->name)
@section('content')
<h3>{{ $admin->name }}</h3>
<form method="POST" action="{{ route('admin.admins.update', $admin)}}">
@csrf
@method('PATCH')
<div class="form-group mt-1">
<label for="email">Email</label>
<input type="text" class="form-control" id="email" name="email" value="{{ $admin->email }}">
</div>
<div class="form-check mt-1">
<input class="form-check-input" type="checkbox" value="1" id="reset_password" name="reset_password">
<label class="form-check-label" for="reset_password">
重置密码。
</label>
</div>
<button type="submit" class="btn btn-primary mt-3">提交</button>
</form>
<hr/>
<form method="POST" action="{{ route('admin.admins.destroy', $admin)}}"
onsubmit="return confirm('此管理员将不复存在。')">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-danger">删除</button>
</form>
@endsection

View File

@ -0,0 +1,45 @@
@extends('layouts.admin')
@section('title', '管理员')
@section('content')
<h3>管理员</h3>
<p>权力越大,责任越大</p>
<a href="{{ route('admin.admins.create') }}">新建管理员</a>
<div class="overflow-auto">
<table class="table table-hover">
<thead>
<th>ID</th>
<th>邮件</th>
<th>操作</th>
</thead>
<tbody>
@foreach ($admins as $admin)
<tr>
<td>
<a href="{{ route('admin.admins.edit', $admin) }}">
{{ $admin->id }}
</a>
</td>
<td>
{{ $admin->email }}
</td>
<td>
<a href="{{ route('admin.admins.edit', $admin) }}" class="btn btn-primary btn-sm">编辑</a>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
{{-- 分页 --}}
{{ $admins->links() }}
@endsection

View File

@ -19,91 +19,94 @@
</head> </head>
<body> <body>
<div id="app"> <div id="app">
<nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm"> <nav class="navbar navbar-expand-md navbar-light bg-white shadow-sm">
<div class="container"> <div class="container">
<a class="navbar-brand" href="{{ route('admin.index') }}"> <a class="navbar-brand" href="{{ route('admin.index') }}">
管理员 管理员
</a> </a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" <button class="navbar-toggler" type="button" data-bs-toggle="collapse"
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="{{ __('Toggle navigation') }}"> aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<div class="collapse navbar-collapse" id="navbarSupportedContent"> <div class="collapse navbar-collapse" id="navbarSupportedContent">
<!-- Left Side Of Navbar --> <!-- Left Side Of Navbar -->
<ul class="navbar-nav me-auto"> <ul class="navbar-nav me-auto">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ route('admin.users.index') }}">用户</a> <a class="nav-link" href="{{ route('admin.users.index') }}">用户</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ route('admin.hosts.index') }}">主机</a> <a class="nav-link" href="{{ route('admin.hosts.index') }}">主机</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ route('admin.modules.index') }}">模块</a> <a class="nav-link" href="{{ route('admin.modules.index') }}">模块</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ route('admin.work-orders.index') }}">工单</a> <a class="nav-link" href="{{ route('admin.work-orders.index') }}">工单</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ route('admin.transactions') }}">交易记录</a> <a class="nav-link" href="{{ route('admin.transactions') }}">交易记录</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ route('admin.commands') }}">命令速查表</a> <a class="nav-link" href="{{ route('admin.admins.index') }}">管理员</a>
</li> </li>
</ul> <li class="nav-item">
<a class="nav-link" href="{{ route('admin.commands') }}">命令速查表</a>
</li>
</ul>
<!-- Right Side Of Navbar --> <!-- Right Side Of Navbar -->
<ul class="navbar-nav ms-auto"> <ul class="navbar-nav ms-auto">
<!-- Authentication Links --> <!-- Authentication Links -->
@if (!Auth::guard('admin')->check()) @if (!Auth::guard('admin')->check())
@if (Route::has('admin.login')) @if (Route::has('admin.login'))
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ route('admin.login') }}">{{ __('Login') }}</a> <a class="nav-link" href="{{ route('admin.login') }}">{{ __('Login') }}</a>
</li> </li>
@endif @endif
@else @else
@if (Auth::guard('web')->check()) @if (Auth::guard('web')->check())
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" <a class="nav-link" href="{{ route('index') }}">切换到
href="{{ route('index') }}">切换到 {{ Auth::guard('web')->user()->name }}</a> {{ Auth::guard('web')->user()->name }}</a>
</li> </li>
@endif @endif
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button"
data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{{ Auth::guard('admin')->user()->email ?? '' }} {{ Auth::guard('admin')->user()->email ?? '' }}
</a>
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="{{ route('admin.logout') }}"
onclick="event.preventDefault();
document.getElementById('logout-form').submit();">
{{ __('Logout') }}
</a> </a>
<form id="logout-form" action="{{ route('admin.logout') }}" method="POST" <div class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
class="d-none"> <a class="dropdown-item" href="{{ route('admin.logout') }}"
@csrf onclick="event.preventDefault();
</form> document.getElementById('logout-form').submit();">
</div> {{ __('Logout') }}
</li> </a>
@endguest
<form id="logout-form" action="{{ route('admin.logout') }}" method="POST"
class="d-none">
@csrf
</form>
</div>
</li>
@endguest
</ul> </ul>
</div> </div>
</div> </div>
</nav> </nav>
<main class="py-4"> <main class="py-4">
<x-alert/> <x-alert />
<div class="container"> <div class="container">
@yield('content') @yield('content')
</div> </div>
</main> </main>
<x-module-script/> <x-module-script />
</div> </div>
</body> </body>

View File

@ -1,5 +1,6 @@
<?php <?php
use App\Http\Controllers\Admin\AdminController;
use App\Http\Controllers\Admin\AuthController; use App\Http\Controllers\Admin\AuthController;
use App\Http\Controllers\Admin\HomeController; use App\Http\Controllers\Admin\HomeController;
use App\Http\Controllers\Admin\HostController; use App\Http\Controllers\Admin\HostController;
@ -19,6 +20,7 @@
Route::group([ Route::group([
'middleware' => 'auth:admin', 'middleware' => 'auth:admin',
], function () { ], function () {
Route::resource('admins', AdminController::class)->except('show');
Route::resource('users', UserController::class)->only(['index', 'show', 'edit', 'update']); Route::resource('users', UserController::class)->only(['index', 'show', 'edit', 'update']);
Route::resource('modules', ModuleController::class); Route::resource('modules', ModuleController::class);
Route::resource('hosts', HostController::class)->only(['index', 'edit', 'update', 'destroy']); Route::resource('hosts', HostController::class)->only(['index', 'edit', 'update', 'destroy']);