From 0de5c4ad530098ca72a99fbc8d7c67f705658fd5 Mon Sep 17 00:00:00 2001 From: printempw Date: Fri, 22 Jul 2016 19:36:24 +0800 Subject: [PATCH] working on admin panel --- app/Controllers/AdminController.php | 125 ++++++++++++ app/Middlewares/CheckAdminMiddleware.php | 18 ++ app/Middlewares/CheckLoggedInMiddleware.php | 9 +- .../CheckPlayerExistMiddleware.php | 2 - app/Middlewares/CheckPostMiddleware.php | 1 - app/Models/Closet.php | 42 ++-- app/Models/User.php | 5 + app/Services/Option.php | 8 +- assets/src/js/admin.js | 163 +++++++++++++++ assets/src/sass/admin.scss | 51 +++++ config/menu.php | 22 +- config/routes.php | 22 +- resources/views/admin/customize.tpl | 186 +++++++++++++++++ resources/views/admin/index.tpl | 73 +++++++ resources/views/admin/master.tpl | 141 +++++++++++++ resources/views/admin/options.tpl | 188 ++++++++++++++++++ resources/views/admin/users.tpl | 116 +++++++++++ 17 files changed, 1128 insertions(+), 44 deletions(-) create mode 100644 app/Controllers/AdminController.php create mode 100644 app/Middlewares/CheckAdminMiddleware.php create mode 100644 assets/src/js/admin.js create mode 100644 assets/src/sass/admin.scss create mode 100644 resources/views/admin/customize.tpl create mode 100644 resources/views/admin/index.tpl create mode 100644 resources/views/admin/master.tpl create mode 100644 resources/views/admin/options.tpl create mode 100644 resources/views/admin/users.tpl diff --git a/app/Controllers/AdminController.php b/app/Controllers/AdminController.php new file mode 100644 index 00000000..4a328966 --- /dev/null +++ b/app/Controllers/AdminController.php @@ -0,0 +1,125 @@ +render(); + } + + public function ajaxHandler() + { + $action = isset($_GET['action']) ? $_GET['action'] : ""; + + if ($action == "color") { + Utils::checkPost(['color_scheme']); + + $color_scheme = str_replace('_', '-', $_POST['color_scheme']); + Option::set('color_scheme', $color_scheme); + + View::json('修改配色成功', 0); + } + + $user = new User('', Utils::getValue('uid', $_POST)); + + if (!$user->is_registered) + throw new E('用户不存在', 1); + + if ($action == "email") { + Utils::checkPost(['email']); + + if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { + View::json('邮箱格式错误', 3); + } + + if ($user->setEmail($_POST['email'])) + View::json('邮箱修改成功', 0); + } if ($action == "nickname") { + Utils::checkPost(['nickname']); + + if (Utils::convertString($_POST['nickname']) != $_POST['nickname']) + View::json('无效的昵称。昵称中包含了奇怪的字符。', 1); + + if ($user->setNickName($_POST['nickname'])) + View::json('昵称已成功设置为 '.$_POST['nickname'], 0); + } else if ($action == "password") { + Utils::checkPost(['password']); + + if (\Validate::checkValidPwd($_POST['password'])) { + if ($user->changePasswd($_POST['password'])) + View::json('密码修改成功', 0); + } + } else if ($action == "score") { + Utils::checkPost(['score']); + + if ($user->setScore($_POST['score'])) + View::json('积分修改成功', 0); + } else if ($action == "delete") { + if ($user->delete()) + View::json('账号已被成功删除', 0); + } else { + throw new E('Illegal parameters', 1); + } + } + + public function customize() + { + echo View::make('admin.customize')->render(); + } + + public function options() + { + echo View::make('admin.options')->render(); + } + + public function users() + {/* + for ($i=0; $i < 60; $i++) { + $user = new UserModel(); + $user->email = Utils::generateRndString(6)."@".Utils::generateRndString(3).".com"; + $user->nickname = Utils::generateRndString(5); + $user->score = 666; + $user->ip = '111.111.111.111'; + $user->permission = "0"; + $user->register_at = Utils::getTimeFormatted(); + $user->save(); + + echo "Seed: ".$user->email." added.
"; + } + exit;*/ + + $page = isset($_GET['page']) ? $_GET['page'] : 1; + $filter = isset($_GET['filter']) ? $_GET['filter'] : ""; + + if ($filter == "") { + $users = UserModel::orderBy('uid'); + $total_pages = ceil($users->count() / 30); + $users = $users->skip(($page - 1) * 30)->take(30)->get(); + } else { + $users = UserModel::like('nickname', $filter)->orderBy('uid'); + $total_pages = ceil($users->count() / 30); + $users = $users->skip(($page - 1) * 30)->take(30)->get(); + } + + echo View::make('admin.users')->with('users', $users) + ->with('page', $page) + ->with('total_pages', $total_pages) + ->render(); + } + + public function players() + { + echo View::make('admin.players')->render(); + } + +} diff --git a/app/Middlewares/CheckAdminMiddleware.php b/app/Middlewares/CheckAdminMiddleware.php new file mode 100644 index 00000000..edd3309a --- /dev/null +++ b/app/Middlewares/CheckAdminMiddleware.php @@ -0,0 +1,18 @@ +handle($request); + + if (!$user->is_admin) { + \Http::redirect('../user', '看起来你并不是管理员哦'); + } + } +} diff --git a/app/Middlewares/CheckLoggedInMiddleware.php b/app/Middlewares/CheckLoggedInMiddleware.php index 59f5c122..834940bb 100644 --- a/app/Middlewares/CheckLoggedInMiddleware.php +++ b/app/Middlewares/CheckLoggedInMiddleware.php @@ -5,8 +5,6 @@ namespace App\Middlewares; use Pecee\Http\Middleware\IMiddleware; use Pecee\Http\Request; use App\Models\User; -use App\Exceptions\E; -use Utils; class CheckLoggedInMiddleware implements IMiddleware { @@ -18,10 +16,11 @@ class CheckLoggedInMiddleware implements IMiddleware } if (isset($_SESSION['email'])) { - if ($_SESSION['token'] != (new User($_SESSION['email']))->getToken()) - { + $user = new User($_SESSION['email']); + if ($_SESSION['token'] != $user->getToken()) \Http::redirect('../auth/login', '无效的 token,请重新登录~'); - } + + return $user; } else { \Http::redirect('../auth/login', '非法访问,请先登录'); } diff --git a/app/Middlewares/CheckPlayerExistMiddleware.php b/app/Middlewares/CheckPlayerExistMiddleware.php index fd3d8283..9f94912b 100644 --- a/app/Middlewares/CheckPlayerExistMiddleware.php +++ b/app/Middlewares/CheckPlayerExistMiddleware.php @@ -4,9 +4,7 @@ namespace App\Middlewares; use Pecee\Http\Middleware\IMiddleware; use Pecee\Http\Request; -use App\Models\User; use App\Models\PlayerModel; -use App\Exceptions\E; class CheckPlayerExistMiddleware implements IMiddleware { diff --git a/app/Middlewares/CheckPostMiddleware.php b/app/Middlewares/CheckPostMiddleware.php index fb06f05b..d32a2d71 100644 --- a/app/Middlewares/CheckPostMiddleware.php +++ b/app/Middlewares/CheckPostMiddleware.php @@ -4,7 +4,6 @@ namespace App\Middlewares; use \Pecee\Http\Middleware\IMiddleware; use \Pecee\Http\Request; -use View; use App\Exceptions\E; class CheckPostMiddleware implements IMiddleware diff --git a/app/Models/Closet.php b/app/Models/Closet.php index 3bb55767..54f129f1 100644 --- a/app/Models/Closet.php +++ b/app/Models/Closet.php @@ -41,33 +41,37 @@ class Closet { $this->uid = $uid; $this->eloquent_model = ClosetModel::find($uid); - $this->textures = json_decode($this->eloquent_model->textures, true); - $this->textures = is_null($this->textures) ? [] : $this->textures; - $textures_invalid = []; + if ($this->eloquent_model) { + $this->textures = json_decode($this->eloquent_model->textures, true); + $this->textures = is_null($this->textures) ? [] : $this->textures; - foreach ($this->textures as $texture) { - $result = Texture::find($texture['tid']); - if ($result) { - // user custom texture name - $result->name = $texture['name']; + $textures_invalid = []; - if ($result->type == "cape") { - $this->textures_cape[] = $result; + foreach ($this->textures as $texture) { + $result = Texture::find($texture['tid']); + if ($result) { + // user custom texture name + $result->name = $texture['name']; + + if ($result->type == "cape") { + $this->textures_cape[] = $result; + } else { + $this->textures_skin[] = $result; + } } else { - $this->textures_skin[] = $result; + $textures_invalid[] = $texture['tid']; + continue; } - } else { - $textures_invalid[] = $texture['tid']; - continue; } + + foreach ($textures_invalid as $tid) { + $this->remove($tid); + } + + unset($textures_invalid); } - foreach ($textures_invalid as $tid) { - $this->remove($tid); - } - - unset($textures_invalid); } /** diff --git a/app/Models/User.php b/app/Models/User.php index 0dd707de..e31e3f55 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -232,4 +232,9 @@ class UserModel extends \Illuminate\Database\Eloquent\Model public $primaryKey = 'uid'; protected $table = 'users'; public $timestamps = false; + + public function scopeLike($query, $field, $value) + { + return $query->where($field, 'LIKE', "%$value%"); + } } diff --git a/app/Services/Option.php b/app/Services/Option.php index c214a6b8..82533262 100644 --- a/app/Services/Option.php +++ b/app/Services/Option.php @@ -16,8 +16,10 @@ class Option } public static function set($key, $value) { - $option = OptionModel::firstOrCreate('option_name', $key); - $option->update(['option_value' => $value]); + $option = OptionModel::where('option_name', $key)->first(); + if (!$option) throw new E('Unexistent option.', 1); + $option->option_value = $value; + return $option->save(); } public static function add($key, $value) { @@ -47,4 +49,6 @@ class OptionModel extends Model { protected $table = 'options'; public $timestamps = false; + + protected $fillable = ['option_value']; } diff --git a/assets/src/js/admin.js b/assets/src/js/admin.js new file mode 100644 index 00000000..5077d2d9 --- /dev/null +++ b/assets/src/js/admin.js @@ -0,0 +1,163 @@ +/* +* @Author: printempw +* @Date: 2016-07-22 14:02:44 +* @Last Modified by: printempw +* @Last Modified time: 2016-07-22 19:27:20 +*/ + +'use strict'; + +$(document).ready(function() { + $('input').iCheck({ + checkboxClass: 'icheckbox_square-blue' + }); +}); + +$('#layout-skins-list [data-skin]').click(function(e) { + e.preventDefault(); + var skin_name = $(this).data('skin'); + $('body').removeClass(current_skin).addClass(skin_name); + current_skin = skin_name; +}); + +$('#color-submit').click(function() { + + $.ajax({ + type: "POST", + url: "../admin?action=color", + dataType: "json", + data: { "color_scheme": current_skin }, + success: function(json) { + if (json.errno == 0) + toastr.success(json.msg); + else + toastr.warning(json.msg); + }, + error: function(json) { + showModal(json.responseText.replace(/\n/g, '
'), 'Fatal Error(请联系作者)', 'danger'); + } + }); +}); + +$('#page-select').on('change', function() { + window.location = "?page=" + $(this).val(); +}); + +function changeUserEmail(uid) { + var email = prompt("请输入新邮箱:"); + + if (!email) return; + + $.ajax({ + type: "POST", + url: "../admin?action=email", + dataType: "json", + data: { 'uid': uid, 'email': email }, + success: function(json) { + if (json.errno == 0) { + $($('tr#'+uid+' > td')[1]).html(email); + toastr.success(json.msg); + } else { + toastr.warning(json.msg); + } + }, + error: function(json) { + showModal(json.responseText.replace(/\n/g, '
'), 'Fatal Error(请联系作者)', 'danger'); + } + }); +} + +function changeUserNickName(uid) { + var nickname = prompt("请输入新昵称:"); + + if (!nickname) return; + + $.ajax({ + type: "POST", + url: "../admin?action=nickname", + dataType: "json", + data: { 'uid': uid, 'nickname': nickname }, + success: function(json) { + if (json.errno == 0) { + $($('tr#'+uid+' > td')[2]).html(nickname); + toastr.success(json.msg); + } else { + toastr.warning(json.msg); + } + }, + error: function(json) { + showModal(json.responseText.replace(/\n/g, '
'), 'Fatal Error(请联系作者)', 'danger'); + } + }); +} + +function changeUserPwd(uid) { + var password = prompt("请输入新密码:"); + + if (!password) return; + + $.ajax({ + type: "POST", + url: "../admin?action=password", + dataType: "json", + data: { 'uid': uid, 'password': password }, + success: function(json) { + if (json.errno == 0) + toastr.success(json.msg); + else + toastr.warning(json.msg); + }, + error: function(json) { + showModal(json.responseText.replace(/\n/g, '
'), 'Fatal Error(请联系作者)', 'danger'); + } + }); +} + +function changeUserScore(uid, score) { + $.ajax({ + type: "POST", + url: "../admin?action=score", + dataType: "json", + data: { 'uid': uid, 'score': score }, + success: function(json) { + if (json.errno == 0) { + $('tr#'+uid+' > td > .score').val(score); + toastr.success(json.msg); + } else { + toastr.warning(json.msg); + } + }, + error: function(json) { + showModal(json.responseText.replace(/\n/g, '
'), 'Fatal Error(请联系作者)', 'danger'); + } + }); +} + +function deleteUserAccount(uid) { + if (!window.confirm('真的要删除此用户吗?此操作不可恢复')) return; + + $.ajax({ + type: "POST", + url: "../admin?action=delete", + dataType: "json", + data: { 'uid': uid }, + success: function(json) { + if (json.errno == 0) { + $('tr#'+uid).remove(); + toastr.success(json.msg); + } else { + toastr.warning(json.msg); + } + }, + error: function(json) { + showModal(json.responseText.replace(/\n/g, '
'), 'Fatal Error(请联系作者)', 'danger'); + } + }); +} + +$('.score').on('keypress', function(event){ + if (event.which == 13) + changeUserScore($(this).parent().parent().attr('id'), $(this).val()); +}).click(function() { + $(this).tooltip('show'); +}) diff --git a/assets/src/sass/admin.scss b/assets/src/sass/admin.scss new file mode 100644 index 00000000..9316f049 --- /dev/null +++ b/assets/src/sass/admin.scss @@ -0,0 +1,51 @@ +/* +* @Author: printempw +* @Date: 2016-07-22 14:08:41 +* @Last Modified by: printempw +* @Last Modified time: 2016-07-22 19:33:23 +*/ + +@import "style.scss"; + +.info-box > a { + color: #333; + font-size: 18px; +} + +.key { + vertical-align: middle !important; +} +.value { + width: 70%; +} + +td[class='key'], td[class='value'] { + border-top: 0 !important; +} + +.btn-group { + .btn { + margin-right: 10px; + } +} + +#page-select { + padding-left: 0; + margin: 0 20px 0 0; + border-radius: 4px; + padding: 5.5px 14px; +} + +input.score { + width: 80px; +} + +.user-search-form { + display: inline; +} +.user-search-input { + display: inline; + width: 30%; + float: right; + margin: 0; +} diff --git a/config/menu.php b/config/menu.php index 792fef5a..8eaa6a82 100644 --- a/config/menu.php +++ b/config/menu.php @@ -9,21 +9,19 @@ */ $menu['user'] = array( - 1 => ['title' => '仪表盘', 'link' => '/user', 'icon' => 'fa-dashboard'], - 2 => ['title' => '我的衣柜', 'link' => '/user/closet', 'icon' => 'fa-star'], - 3 => ['title' => '角色管理', 'link' => '/user/player', 'icon' => 'fa-users'], - 4 => ['title' => '配置生成', 'link' => '/user/config', 'icon' => 'fa-book'], - 5 => ['title' => '个人资料', 'link' => '/user/profile', 'icon' => 'fa-user'] + 1 => ['title' => '仪表盘', 'link' => '/user', 'icon' => 'fa-dashboard'], + 2 => ['title' => '我的衣柜', 'link' => '/user/closet', 'icon' => 'fa-star'], + 3 => ['title' => '角色管理', 'link' => '/user/player', 'icon' => 'fa-users'], + 4 => ['title' => '配置生成', 'link' => '/user/config', 'icon' => 'fa-book'], + 5 => ['title' => '个人资料', 'link' => '/user/profile', 'icon' => 'fa-user'] ); $menu['admin'] = array( - 1 => ['title' => '仪表盘', 'link' => '/admin', 'icon' => 'fa-dashboard'], - 2 => ['title' => '用户管理', 'link' => '/admin/manage/user', 'icon' => 'fa-users'], - 3 => ['title' => '角色管理', 'link' => '/admin/manage/player', 'icon' => 'fa-users'], - 4 => ['title' => '材质管理', 'link' => '/admin/manage/texture', 'icon' => 'fa-users'], - 5 => ['title' => '个性化', 'link' => '/admin/customize', 'icon' => 'fa-paint-brush'], - 6 => ['title' => '站点配置', 'link' => '/admin/options', 'icon' => 'fa-cog'], - 7 => ['title' => '检查更新', 'link' => '/admin/update', 'icon' => 'fa-arrow-up'] + 1 => ['title' => '仪表盘', 'link' => '/admin', 'icon' => 'fa-dashboard'], + 2 => ['title' => '用户管理', 'link' => '/admin/users', 'icon' => 'fa-users'], + 3 => ['title' => '角色管理', 'link' => '/admin/players', 'icon' => 'fa-gamepad'], + 4 => ['title' => '个性化', 'link' => '/admin/customize', 'icon' => 'fa-paint-brush'], + 5 => ['title' => '站点配置', 'link' => '/admin/options', 'icon' => 'fa-cog'] ); return $menu; diff --git a/config/routes.php b/config/routes.php index abcac3f8..7401166e 100644 --- a/config/routes.php +++ b/config/routes.php @@ -41,7 +41,7 @@ Route::group(['prefix' => 'auth'], function() /** * User Center */ -Route::group(['prefix' => 'user', 'middleware' => 'App\Middlewares\CheckLoggedInMiddleware'], function() +Route::group(['middleware' => 'App\Middlewares\CheckLoggedInMiddleware', 'prefix' => 'user'], function() { Route::all ('', 'UserController@index'); Route::all ('/sign', 'UserController@sign'); @@ -82,7 +82,7 @@ Route::group(['prefix' => 'skinlib'], function() Route::post('/privacy/{tid}', 'SkinlibController@privacy'); - Route::group(['middleware' => 'App\Middlewares\CheckLoggedInMiddleware'], function() + Route::group(['middleware' => 'App\Middlewares\CheckLoggedInMiddleware'], function() { Route::get ('/upload', 'SkinlibController@upload'); Route::post('/upload', 'SkinlibController@handleUpload'); @@ -91,10 +91,26 @@ Route::group(['prefix' => 'skinlib'], function() }); }); +/** + * Admin Panel + */ +Route::group(['middleware' => 'App\Middlewares\CheckAdminMiddleware', 'prefix' => 'admin'], function() +{ + Route::get('/', 'AdminController@index'); + Route::post('/', 'AdminController@ajaxHandler'); + + Route::all('/customize', 'AdminController@customize'); + + Route::all('/options', 'AdminController@options'); + + Route::get('/users', 'AdminController@users'); + Route::get('/players', 'AdminController@players'); +}); + /** * Resources */ -Route::group(['middleware' => 'App\Middlewares\CheckPlayerExistMiddleware'], function() +Route::group(['middleware' => 'App\Middlewares\CheckPlayerExistMiddleware'], function() { // Json profile Route::get('/{player_name}.json', 'TextureController@json')->where(['player_name' => '[^\\/]+?']); diff --git a/resources/views/admin/customize.tpl b/resources/views/admin/customize.tpl new file mode 100644 index 00000000..4572d665 --- /dev/null +++ b/resources/views/admin/customize.tpl @@ -0,0 +1,186 @@ +@extends('admin.master') + +@section('title', '个性化') + +@section('style') + +@endsection + +@section('content') + + +
+ +
+

+ 个性化 + Customize +

+
+ + +
+ +
+
+
+
+

更改配色

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
蓝色主题(默认)
蓝色主题-白色侧边栏
黄色主题
黄色主题-白色侧边栏
绿色主题
绿色主题-白色侧边栏
基佬紫
紫色主题-白色侧边栏
喜庆红(笑)
红色主题-白色侧边栏
高端黑
黑色主题-白色侧边栏
+
+ +
+ + +
+ +
+
+
+

首页配置

+
+
+ +
+ 设置已保存。
'; + } ?> + + + + + + + + + + + +
首页图片地址 + +
版权信息 + +
+
+ + +
+ +
+
+

自定义 CSS/JavaScript + +

+
+
+ +
+ 设置已保存。
'; + } else { + echo '
内容将会被追加至每个页面的 <style> 和 <script> 标签中
'; + } ?> + + + + + + + + + + + + +
CSS + +
JavaScript + +
+
+ + +
+
+ + + + + + + + +@endsection + + diff --git a/resources/views/admin/index.tpl b/resources/views/admin/index.tpl new file mode 100644 index 00000000..562a2a83 --- /dev/null +++ b/resources/views/admin/index.tpl @@ -0,0 +1,73 @@ +@extends('admin.master') + +@section('title', '仪表盘') + +@section('content') + + +
+ +
+

+ 仪表盘 + Dashboard +

+
+ + +
+ +
+
+ + + + + + + +
+ +
+ 上传材质总数 + {{ \Storage::getFileNum(BASE_DIR."/textures/") }} +
+
+ +
+ +
+ 占用空间大小 + {{ floor(\Storage::getDirSize(BASE_DIR."/textures/")/1024)."KB" }} +
+
+
+
+ +
+
+ +@endsection diff --git a/resources/views/admin/master.tpl b/resources/views/admin/master.tpl new file mode 100644 index 00000000..96e68ae5 --- /dev/null +++ b/resources/views/admin/master.tpl @@ -0,0 +1,141 @@ + + + + + + @yield('title') - {{ Option::get('site_name') }} + + + + + + + + + + + @yield('style') + + + + + + + +
+ + +
+ + + + + + +
+ + + + @yield('content') + + + + +
+ + + + + + + @yield('script') + + + + diff --git a/resources/views/admin/options.tpl b/resources/views/admin/options.tpl new file mode 100644 index 00000000..787be688 --- /dev/null +++ b/resources/views/admin/options.tpl @@ -0,0 +1,188 @@ +@extends('admin.master') + +@section('title', '站点配置') + +@section('style') + +@endsection + +@section('content') + + +
+ +
+

+ 站点配置 + Options +

+
+ + +
+ +
+
+
+
+

常规选项

+
+
+ +
+ $value) { + // remove slash if site_url is ended with slash + if ($key == "site_url" && substr($value, -1) == "/") + $value = substr($value, 0, -1); + + if ($key != "option" && $key != "submit") + Option::set($key, $value); + } + echo '
设置已保存。
'; + } ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
站点标题 + +
站点描述 + +
站点地址(URL) + +
开放注册 + +
每个 IP 限制注册数 + +
新用户默认积分 +
+ +
+
角色名 + +
首选 JSON API + +
Disqus 短域名 + +
签到间隔时间 +
+ + 小时 +
+ +
+
+ +
+
+
+ +
+
+
+

站点公告

+
+
+ +
+ 设置已保存。
'; + } ?> + + + +
+ + +
+ +
+
+

数据对接配置

+
+
+ +
+

当前版本数据对接不可用。

+
+
+
+
+ +
+ + + + +@endsection diff --git a/resources/views/admin/users.tpl b/resources/views/admin/users.tpl new file mode 100644 index 00000000..c02ede1e --- /dev/null +++ b/resources/views/admin/users.tpl @@ -0,0 +1,116 @@ +@extends('admin.master') + +@section('title', '用户管理') + +@section('content') + + +
+ +
+

+ @if (isset($_GET['filter'])) + 搜索结果:{{ $_GET['filter'] }} + @else + 用户管理 + @endif + User Management +
+ +
+

+
+ + +
+
+
+ + + + + + + + + + + + + + @forelse($users as $user) + + + + + + + + + + @empty + + + + + @endforelse + +
UID邮箱昵称积分注册时间操作
{{ $user->uid }}{{ $user->email }}{{ $user->nickname }}{{ $user->register_at }} +
+ + +
+ + permission == "1") + disabled="disabled" data-toggle="tooltip" data-placement="bottom" title="少年,不要作死哦" + @else + href="javascript:deleteUserAccount('{{ $user->uid }}');" + @endif> + 删除用户 + +
0无结果
+
+ +
+ +
+
+ +@endsection