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')
+
+
+
| 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 | +无结果 | +