commit d5ce3b46ebe4e8d3f6419512e0c8d38b4e08fbd8
Author: fangzesheng <810210908@qq.com>
Date: Sun Dec 16 11:38:44 2018 +0800
first-commit
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..668c06f
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,33 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=
+APP_DEBUG=true
+APP_LOG_LEVEL=debug
+APP_URL=http://localhost
+
+DB_CONNECTION=mysql
+DB_HOST=127.0.0.1
+DB_PORT=3306
+DB_DATABASE=homestead
+DB_USERNAME=homestead
+DB_PASSWORD=secret
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+SESSION_DRIVER=file
+QUEUE_DRIVER=sync
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_DRIVER=smtp
+MAIL_HOST=smtp.mailtrap.io
+MAIL_PORT=2525
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d9f02e5
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+/node_modules
+/public/storage
+/vendor
+/storage
+/.idea
+Homestead.json
+Homestead.yaml
+.env
+composer.lock
\ No newline at end of file
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
new file mode 100644
index 0000000..622e774
--- /dev/null
+++ b/app/Console/Kernel.php
@@ -0,0 +1,40 @@
+command('inspire')
+ // ->hourly();
+ }
+
+ /**
+ * Register the Closure based commands for the application.
+ *
+ * @return void
+ */
+ protected function commands()
+ {
+ require base_path('routes/console.php');
+ }
+}
diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php
new file mode 100644
index 0000000..a747e31
--- /dev/null
+++ b/app/Exceptions/Handler.php
@@ -0,0 +1,65 @@
+expectsJson()) {
+ return response()->json(['error' => 'Unauthenticated.'], 401);
+ }
+
+ return redirect()->guest(route('login'));
+ }
+}
diff --git a/app/Helpers/functions.php b/app/Helpers/functions.php
new file mode 100644
index 0000000..f57ed91
--- /dev/null
+++ b/app/Helpers/functions.php
@@ -0,0 +1,20 @@
+middleware('guest');
+ }
+}
diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php
new file mode 100644
index 0000000..609206b
--- /dev/null
+++ b/app/Http/Controllers/Auth/LoginController.php
@@ -0,0 +1,61 @@
+middleware('guest')->except('logout');
+ }
+ public function login(Request $request)
+ {
+ if($request->input('verity')==session('code'))return $this->doLogin($request);
+ else return redirect('/login')->withErrors([trans('fzs.login.false_verify')]);
+ }
+ public function username()
+ {
+ return 'username';
+ }
+
+ protected function authenticated(Request $request, $user)
+ {
+ Log::addLogs(trans('fzs.login.login_info'),'/login',$user->id);
+ return $this->oriAuthenticated($request, $user);
+ }
+
+}
diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php
new file mode 100644
index 0000000..f77265a
--- /dev/null
+++ b/app/Http/Controllers/Auth/RegisterController.php
@@ -0,0 +1,71 @@
+middleware('guest');
+ }
+
+ /**
+ * Get a validator for an incoming registration request.
+ *
+ * @param array $data
+ * @return \Illuminate\Contracts\Validation\Validator
+ */
+ protected function validator(array $data)
+ {
+ return Validator::make($data, [
+ 'name' => 'required|string|max:255',
+ 'email' => 'required|string|email|max:255|unique:users',
+ 'password' => 'required|string|min:6|confirmed',
+ ]);
+ }
+
+ /**
+ * Create a new user instance after a valid registration.
+ *
+ * @param array $data
+ * @return \App\User
+ */
+ protected function create(array $data)
+ {
+ return User::create([
+ 'name' => $data['name'],
+ 'email' => $data['email'],
+ 'password' => bcrypt($data['password']),
+ ]);
+ }
+}
diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php
new file mode 100644
index 0000000..cf726ee
--- /dev/null
+++ b/app/Http/Controllers/Auth/ResetPasswordController.php
@@ -0,0 +1,39 @@
+middleware('guest');
+ }
+}
diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php
new file mode 100644
index 0000000..e4cd582
--- /dev/null
+++ b/app/Http/Controllers/BaseController.php
@@ -0,0 +1,27 @@
+$res,'msg'=>trans($lang)]:['status'=>$res,'msg'=>$lang];
+ }
+}
diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php
new file mode 100644
index 0000000..03e02a2
--- /dev/null
+++ b/app/Http/Controllers/Controller.php
@@ -0,0 +1,13 @@
+$menu->menus(),'mid'=>$menu->getMenuId(),'parent_id'=>$menu->getParentMenuId()]);
+ }
+ /**
+ * 验证码
+ */
+ public function verify(){
+ $phrase = new PhraseBuilder;
+ $code = $phrase->build(4);
+ $builder = new CaptchaBuilder($code, $phrase);
+ $builder->setBackgroundColor(255, 255, 255);
+ $builder->build(130,40);
+ $phrase = $builder->getPhrase();
+ Session::flash('code', $phrase); //存储验证码
+ return response($builder->output())->header('Content-type','image/jpeg');
+ }
+ /**
+ * 欢迎首页
+ */
+ public function welcome(){
+ return view('admin.welcome',['sysinfo'=>$this->getSysInfo()]);
+ }
+ /**
+ * 排序
+ */
+ public function changeSort(Request $request){
+ $data = $request->all();
+ if(is_numeric($data['id'])){
+ $res = DB::table('admin_'.$data['name'])->where('id',$data['id'])->update(['order'=>$data['val']]);
+ if($res)return $this->resultJson('fzs.common.success', 1);
+ else return $this->resultJson('fzs.common.fail', 0);
+ }else{
+ return $this->resultJson('fzs.common.wrong', 0);
+ }
+ }
+ /**
+ * 获取系统信息
+ */
+ protected function getSysInfo(){
+ $sys_info['ip'] = GetHostByName($_SERVER['SERVER_NAME']);
+ $sys_info['phpv'] = phpversion();
+ $sys_info['web_server'] = $_SERVER['SERVER_SOFTWARE'];
+ $sys_info['time'] = date("Y-m-d H:i:s");
+ $sys_info['domain'] = $_SERVER['HTTP_HOST'];
+ $mysqlinfo = DB::select("SELECT VERSION() as version");
+ $sys_info['mysql_version'] = $mysqlinfo[0]->version;
+ return $sys_info;
+ }
+}
diff --git a/app/Http/Controllers/LogController.php b/app/Http/Controllers/LogController.php
new file mode 100644
index 0000000..8ba2f21
--- /dev/null
+++ b/app/Http/Controllers/LogController.php
@@ -0,0 +1,38 @@
+show($request);
+ }
+ /**
+ * 根据条件日志列表查询
+ */
+ public function show(Request $request)
+ {
+ $sql = Log::with('user.roles');
+ $sql->leftJoin(config('admin.user_table') . " as users", "users.id" , "=", "admin_logs.admin_id");
+ if(true == $request->has('title')&&true == $request->has('status')) {
+ $sql->where('admin_logs.'.$request->input('status'), 'LIKE', '%'.trim($request->input('title')).'%');
+ }
+ if(true == $request->has('begin')) {
+ $sql->where('admin_logs.log_time', '>=', trim($request->input('begin')));
+ }
+ $sql->select('admin_logs.*');
+ $pager = $sql->orderBy('admin_logs.id', 'desc')->paginate()->appends($request->all());
+ return view('logs.list', ['pager'=>$pager,'input'=>$request->all()]);
+ }
+}
diff --git a/app/Http/Controllers/MenuController.php b/app/Http/Controllers/MenuController.php
new file mode 100644
index 0000000..40aae39
--- /dev/null
+++ b/app/Http/Controllers/MenuController.php
@@ -0,0 +1,54 @@
+Menu::toTree(),'roles'=>Role::all()]);
+ }
+ /**
+ * 菜单增加保存
+ */
+ public function store(StoreRequest $request){
+ $model = new Menu();
+ $menu = DataService::handleDate($model,$request->all(),'menus-add_or_update');
+ if($menu['status']==1)Log::addLogs(trans('fzs.menus.handle_menu').trans('fzs.common.success'),'/menus/story');
+ else Log::addLogs(trans('fzs.menus.handle_menu').trans('fzs.common.fail'),'/menus/destroy');
+ return $menu;
+ }
+ /**
+ * 菜单编辑页面
+ */
+ public function edit($id=0)
+ {
+ $menu = ($id > 0) ? Menu::findByRoleId($id) : [];
+ return view('menus.edit', ['id'=>$id,'menu'=>$menu,'menus'=>Menu::toTree(),'roles'=>Role::all()]);
+ }
+ /**
+ * 菜单删除
+ */
+ public function destroy($id)
+ {
+ if (is_config_id($id, "admin.menu_table_cannot_manage_ids", false))return $this->resultJson('fzs.menus.notdel', 0);
+ $model = new Menu();
+ $menu = DataService::handleDate($model,['id'=>$id],'menus-delete');
+ if($menu['status']==1)Log::addLogs(trans('fzs.menus.del_menu').trans('fzs.common.success'),'/menus/destroy/'.$id);
+ else Log::addLogs(trans('fzs.menus.del_menu').trans('fzs.menus.fail'),'/menus/destroy/'.$id);
+ return $menu;
+ }
+}
diff --git a/app/Http/Controllers/PermissionController.php b/app/Http/Controllers/PermissionController.php
new file mode 100644
index 0000000..8a009aa
--- /dev/null
+++ b/app/Http/Controllers/PermissionController.php
@@ -0,0 +1,55 @@
+Permission::get()->toArray()]);
+ }
+ /**
+ * 权限编辑列表
+ */
+ public function edit($id=0)
+ {
+ $info = $id?Permission::find($id):[];
+ $role = $info?$info->roleToIds():[];
+ return view('permissions.edit', ['id'=>$id,'info'=>$info,'roles'=>Role::all(),'rolelist'=>$role]);
+ }
+ /**
+ * 权限增加保存
+ */
+ public function store(StoreRequest $request){
+ $model = new Permission();
+ $permission = DataService::handleDate($model,$request->all(),'permissions-add_or_update');
+ if($permission['status']==1)Log::addLogs(trans('fzs.permissions.handle_permission').trans('fzs.common.success'),'/permissions/story');
+ else Log::addLogs(trans('fzs.permissions.handle_permission').trans('fzs.common.fail'),'/permissions/destroy');
+ return $permission;
+ }
+ /**
+ * 权限删除
+ */
+ public function destroy($id)
+ {
+ if (is_config_id($id, "admin.permission_table_cannot_manage_ids", false))return $this->resultJson('fzs.permissions.notdel', 0);
+ $model = new Permission();
+ $permission = DataService::handleDate($model,['id'=>$id],'permissions-delete');
+ if($permission['status']==1)Log::addLogs(trans('fzs.permissions.del_permission').trans('fzs.common.success'),'/permissions/destroy/'.$id);
+ else Log::addLogs(trans('fzs.permissions.del_permission').trans('fzs.common.fail'),'/permissions/destroy/'.$id);
+ return $permission;
+ }
+}
diff --git a/app/Http/Controllers/RoleController.php b/app/Http/Controllers/RoleController.php
new file mode 100644
index 0000000..72e83c3
--- /dev/null
+++ b/app/Http/Controllers/RoleController.php
@@ -0,0 +1,58 @@
+Role::get()->toArray()]);
+ }
+ /**
+ * 角色编辑
+ */
+ public function edit($id=0)
+ {
+ $permission = Permission::get()->toArray();
+ $delId = explode(',',config('admin')['permission_table_cannot_manage_ids']);
+ foreach ($permission as $k => $v){
+ if(in_array($v['id'],$delId))unset($permission[$k]);
+ }
+ $info = $id?Role::find($id):[];
+ return view('roles.edit', ['id'=>$id,'info'=>$info,'permission'=>$permission]);
+ }
+ /**
+ * 角色增加保存
+ */
+ public function store(StoreRequest $request){
+ $model = new Role();
+ $role = DataService::handleDate($model,$request->all(),'roles-add_or_update');
+ if($role['status']==1)Log::addLogs(trans('fzs.roles.handle_role').trans('fzs.common.success'),'/roles/story');
+ else Log::addLogs(trans('fzs.roles.handle_role').trans('fzs.common.fail'),'/roles/destroy');
+ return $role;
+ }
+ /**
+ * 角色删除
+ */
+ public function destroy($id)
+ {
+ if (is_config_id($id, "admin.role_table_cannot_manage_ids", false))return $this->resultJson('fzs.roles.notdel', 0);
+ $model = new Role();
+ $role = DataService::handleDate($model,['id'=>$id],'roles-delete');
+ if($role['status']==1)Log::addLogs(trans('fzs.roles.del_role').trans('fzs.common.success'),'/roles/destroy/'.$id);
+ else Log::addLogs(trans('fzs.roles.del_role').trans('fzs.menus.fail'),'/roles/destroy/'.$id);
+ return $role;
+ }
+}
diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php
new file mode 100644
index 0000000..f0cbff1
--- /dev/null
+++ b/app/Http/Controllers/UserController.php
@@ -0,0 +1,74 @@
+User::with('roles')->get()->toArray()]);
+ }
+ /**
+ *用户编辑页面
+ */
+ public function edit($id=0)
+ {
+ $info = $id?User::find($id):[];
+ return view('users.edit', ['id'=>$id,'roles'=>Role::all(),'info'=>$info]);
+ }
+ /**
+ * 用户增加保存
+ */
+ public function store(StoreRequest $request){
+ $model = new User();
+ $user = DataService::handleDate($model,$request->all(),'users-add_or_update');
+ if($user['status']==1)Log::addLogs(trans('fzs.users.handle_user').trans('fzs.common.success'),'/users/story');
+ else Log::addLogs(trans('fzs.users.handle_user').trans('fzs.common.fail'),'/users/destroy');
+ return $user;
+ }
+ /**
+ *用户删除
+ */
+ public function destroy($id)
+ {
+ if (is_config_id($id, "admin.user_table_cannot_manage_ids", false))return $this->resultJson('fzs.users.notdel', 0);
+ $model = new User();
+ $user = DataService::handleDate($model,['id'=>$id],'users-delete');
+ if($user['status']==1)Log::addLogs(trans('fzs.users.del_user').trans('fzs.common.success'),'/users/destroy/'.$id);
+ else Log::addLogs(trans('fzs.users.del_user').trans('fzs.menus.fail'),'/users/destroy/'.$id);
+ return $user;
+ }
+ /**
+ *用户基本信息编辑页面
+ */
+ public function userInfo(){
+ $user = new Admin();
+ return view('users.userinfo',['userinfo'=>$user->user()]);
+ }
+ /**
+ *用户基本信息修改
+ */
+ public function saveInfo(StoreRequest $request,$type){
+ if($type==1)$kind = 'update_info';
+ else $kind = 'update_pwd';
+ $user = DataService::handleDate(new User(),$request->all(),'users-'.$kind);
+ if($user['status']==1)Log::addLogs(trans('fzs.users.'.$kind).trans('fzs.common.success'),'/saveinfo/'.$type);
+ else Log::addLogs(trans('fzs.users.'.$kind).trans('fzs.common.fail'),'/saveinfo/'.$type);
+ return $user;
+ }
+}
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
new file mode 100644
index 0000000..39b343f
--- /dev/null
+++ b/app/Http/Kernel.php
@@ -0,0 +1,61 @@
+ [
+ \App\Http\Middleware\EncryptCookies::class,
+ \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+ \Illuminate\Session\Middleware\StartSession::class,
+ // \Illuminate\Session\Middleware\AuthenticateSession::class,
+ \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+ \App\Http\Middleware\VerifyCsrfToken::class,
+ \Illuminate\Routing\Middleware\SubstituteBindings::class,
+ ],
+
+ 'api' => [
+ 'throttle:60,1',
+ 'bindings',
+ ],
+ ];
+
+ /**
+ * The application's route middleware.
+ *
+ * These middleware may be assigned to groups or used individually.
+ *
+ * @var array
+ */
+ protected $routeMiddleware = [
+ 'auth' => \App\Http\Middleware\AuthCheck::class,
+ 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
+ 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
+ 'can' => \Illuminate\Auth\Middleware\Authorize::class,
+ 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+ 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
+ 'permission' => \App\Http\Middleware\Permission::class,
+ ];
+}
diff --git a/app/Http/Middleware/AuthCheck.php b/app/Http/Middleware/AuthCheck.php
new file mode 100644
index 0000000..47b4980
--- /dev/null
+++ b/app/Http/Middleware/AuthCheck.php
@@ -0,0 +1,57 @@
+auth = $auth;
+ }
+
+ /**
+ * Handle an incoming request.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \Closure $next
+ * @return mixed
+ */
+ public function handle($request, Closure $next)
+ {
+ if($request->path() == 'logout') {
+ $this->auth->logout();
+ return redirect('/');
+ }
+ if ($this->auth->guest()) {
+ if ($request->ajax()) {
+ return new JsonResponse(['msg'=>trans('fzs.common.no_permission'),'status'=>0], 200);
+ } else {
+ return redirect()->guest('/login');
+ }
+ }
+
+ return $next($request);
+ }
+}
diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php
new file mode 100644
index 0000000..3aa15f8
--- /dev/null
+++ b/app/Http/Middleware/EncryptCookies.php
@@ -0,0 +1,17 @@
+permissions();
+ $permissionRules = [
+ strtolower($controller .'@'. $method),
+ strtolower($className .'@'. $method),
+ strtolower($controller .'@'. $requestMethod),
+ strtolower($className .'@'. $requestMethod),
+ strtolower($controller),
+ strtolower($className),
+ ];
+ foreach ($permissionRules as $p) {
+ if (isset($allPermissions[$p])) {
+ $permission = $allPermissions[$p];
+ $auth = $permission[config('admin.permission_name')];
+ $permissionName = $permission[config('admin.permission_display_name')];
+ break;
+ }
+ }
+ $allMenus = $admin->allMenus();
+ $urlMatchMaxLen = 0;
+ foreach ($allMenus as $m) {
+ $params = explode(":", $m['routes']);
+ if (empty($params[0]) || empty($params[1])) continue;
+ if (($params[0] == 'url' && starts_with($url, $params[1]))) {
+ $len = strlen($params[1]);
+ if ($len > $urlMatchMaxLen) {
+ $menu = $m;
+ }
+ } else if($params[0] == 'controller' && in_array(strtolower($params[1]), $permissionRules) ) {
+ $menu = $m;
+ break;
+ }
+ }
+ if (!empty($menu)) {
+ $pmid = isset($menu[config('admin.menu_table_parent_id_key')]) ? $menu[config('admin.menu_table_parent_id_key')] : 0;
+ $mid = isset($menu[config('admin.menu_table_id_key')]) ? $menu[config('admin.menu_table_id_key')] : 0;
+ $admin->setMenuId($pmid, $mid);
+ }
+ if ($admin->hasRole(config('admin.role_admin'))) {
+ return $next($request);
+ }
+ if (!empty($auth)) {
+ if (!$admin->can($auth)) {
+ if ($request->ajax()) {
+ return new JsonResponse(['msg'=>trans('fzs.common.no_permission'),'status'=>0], 200);
+ } else {
+ exit(trans('fzs.common.no_permission'));
+ }
+ }
+ }
+ return $next($request);
+ }
+
+}
\ No newline at end of file
diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php
new file mode 100644
index 0000000..e4cec9c
--- /dev/null
+++ b/app/Http/Middleware/RedirectIfAuthenticated.php
@@ -0,0 +1,26 @@
+check()) {
+ return redirect('/home');
+ }
+
+ return $next($request);
+ }
+}
diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php
new file mode 100644
index 0000000..943e9a4
--- /dev/null
+++ b/app/Http/Middleware/TrimStrings.php
@@ -0,0 +1,18 @@
+getPathInfo()) {
+ case '/menus':
+ $rules['category'] = 'required';
+ if($mid = request()->input('id'))$rules['name'] = 'required|alpha|between:2,12|unique:admin_menus,title,'.$mid;
+ else $rules['name'] = 'required|alpha|between:2,12|unique:admin_menus,title';
+ $rules['order'] = 'required|numeric';
+ $rules['icon'] = 'required';
+ $rules['uri'] = 'required|max:12';
+ $rules['roles'] = 'required';
+ break;
+ case '/users':
+
+ if($uid = request()->input('id')){
+ $rules['user_name'] = 'required|alpha|between:2,12|unique:admin_users,username,'.$uid;
+ $rules['pwd'] = 'nullable|alpha_num|between:6,12|confirmed';
+ $rules['email'] = 'required|email|unique:admin_users,email,'.$uid;
+
+ }else{
+ $rules['user_name'] = 'required|alpha|between:2,12|unique:admin_users,username';
+ $rules['pwd'] = 'required|alpha_num|between:6,12|confirmed';
+ $rules['email'] = 'required|email|unique:admin_users,email';
+ $rules['pwd_confirmation'] = 'required';
+ }
+ $rules['tel'] = 'required|numeric';
+ $rules['sex'] = 'required|numeric';
+
+ $rules['user_role'] = 'required|numeric';
+ break;
+
+ case '/roles':
+
+ if($rid = request()->input('id')){
+ $rules['role_remark'] = 'required|between:2,12|alpha|unique:admin_roles,name,'.$rid;
+ $rules['role_name'] = 'required|between:2,12|unique:admin_roles,display_name,'.$rid;
+ }else{
+ $rules['role_remark'] = 'required|between:2,12|alpha|unique:admin_roles,name';
+ $rules['role_name'] = 'required|between:2,12|unique:admin_roles,display_name';
+ }
+ $rules['role_desc'] = 'required|between:2,30';
+ $rules['permission_list'] = 'array';
+ break;
+ case '/permissions':
+ if($rid = request()->input('id')){
+ $rules['permission_name'] = 'required|between:2,12|unique:admin_permissions,name,'.$rid;
+ $rules['permission_control'] = 'required|between:2,50|unique:admin_permissions,controllers,'.$rid;
+
+ }else{
+ $rules['permission_name'] = 'required|between:2,12|unique:admin_permissions,display_name';
+ $rules['permission_control'] = 'required|between:2,50|unique:admin_permissions,controllers';
+
+ }
+ $rules['permission_desc'] = 'required|between:2,30';
+ $rules['permission_remark'] = 'required|alpha|between:2,30';
+ $rules['permission_roles'] = 'required|array';
+ break;
+ case '/saveinfo/1':
+ $rules['useremail'] = 'required|email|unique:admin_users,email,'.request()->input('id');
+ $rules['usertel'] = 'required|numeric';
+ $rules['usersex'] = 'required|numeric';
+ break;
+ case '/saveinfo/2':
+ $rules['oldpwd'] = 'required|alpha_num|between:6,12|different:pwd';
+ $rules['pwd'] = 'required|alpha_num|between:6,12|confirmed';
+ $rules['pwd_confirmation'] = 'required';
+ break;
+ }
+ return $rules;
+ }
+
+
+ public function response(array $errors)
+ {
+ if($errors){
+ foreach ($errors as $k => $v){
+ $msg = $v[0];
+ break;
+ }
+ }
+ if ($this->expectsJson()) {
+ return response()->json(['status'=>0,'msg'=>$msg]);
+ }
+ return $this->redirector->to($this->getRedirectUrl())
+ ->withInput($this->except($this->dontFlash))
+ ->withErrors($errors, $this->errorBag);
+ }
+
+}
\ No newline at end of file
diff --git a/app/Models/Admin.php b/app/Models/Admin.php
new file mode 100644
index 0000000..549840e
--- /dev/null
+++ b/app/Models/Admin.php
@@ -0,0 +1,72 @@
+can($permission);
+ }
+
+ public function user()
+ {
+ return Auth::user();
+ }
+
+ public function userId()
+ {
+ return Auth::user()['id'];
+ }
+ public function userCid()
+ {
+ return Auth::user()['cid'];
+ }
+
+ public function menus()
+ {
+ $user = $this->user();
+ return Menu::getUserMenu($user);
+ }
+
+ public function allMenus()
+ {
+ return Menu::all();
+ }
+
+ public function permissions()
+ {
+ return Permission::controllerPermissions();
+ }
+
+ public function hasRole($roles)
+ {
+ return $this->user()->hasRole($roles);
+ }
+
+ public function guest() {
+ return Auth::guest();
+ }
+
+ public function setMenuId ($pmid, $mid)
+ {
+ $this->parentMenuId = $pmid;
+ $this->MenuId = $mid;
+ }
+
+ public function getParentMenuId()
+ {
+ return $this->parentMenuId;
+ }
+
+ public function getMenuId()
+ {
+ return $this->MenuId;
+ }
+}
+
diff --git a/app/Models/Interfaces/AdminMenuInterface.php b/app/Models/Interfaces/AdminMenuInterface.php
new file mode 100644
index 0000000..43249bd
--- /dev/null
+++ b/app/Models/Interfaces/AdminMenuInterface.php
@@ -0,0 +1,25 @@
+hasOne(config('auth.providers.users.model'), 'id', 'admin_id');
+ }
+ public static function addLogs($content,$url,$id = ''){
+ if(!$id){
+ $admin = new Admin();
+ $id = $admin->userId();
+ }
+ $data = [
+ 'admin_id'=>$id,
+ 'log_info'=>$content,
+ 'log_url'=>$url,
+ 'log_ip'=>$_SERVER['REMOTE_ADDR'],
+ 'log_time'=>date('Y-m-d H:i:s',time())
+ ];
+ Log::insert($data);
+ }
+}
diff --git a/app/Models/Menu.php b/app/Models/Menu.php
new file mode 100644
index 0000000..f8527bc
--- /dev/null
+++ b/app/Models/Menu.php
@@ -0,0 +1,18 @@
+roles;
+ $ids = [];
+ if (count($roles) > 0) {
+ foreach ($roles as $role) {
+ if (is_object($role)) {
+ $ids[] = $role->id;
+ } else if (is_array($role) && isset ($role['id'])) {
+ $ids[] = $role['id'];
+ }
+ }
+ }
+ return $ids;
+ }
+
+ public function menuToIds()
+ {
+ $menus = $this->menus;
+ $ids = [];
+ if (count($menus) > 0) {
+ foreach ($menus as $menu) {
+ if (is_object($menu)) {
+ $ids[] = $menu->id;
+ } else if (is_array($menu) && isset ($menu['id'])) {
+ $ids[] = $menu['id'];
+ }
+ }
+ }
+ return $ids;
+ }
+}
diff --git a/app/Models/Role.php b/app/Models/Role.php
new file mode 100644
index 0000000..9f9469a
--- /dev/null
+++ b/app/Models/Role.php
@@ -0,0 +1,17 @@
+where('role_id',$roleid)->get()->toArray()?true:false;
+ }
+}
diff --git a/app/Models/Traits/AdminMenuTrait.php b/app/Models/Traits/AdminMenuTrait.php
new file mode 100644
index 0000000..6c90198
--- /dev/null
+++ b/app/Models/Traits/AdminMenuTrait.php
@@ -0,0 +1,227 @@
+belongsToMany(Config::get('admin.role'), Config::get('admin.menu_role_table'),
+ Config::get('admin.menu_foreign_key'), Config::get('admin.role_foreign_key'));
+ }
+
+ /**
+ * 与权限的多对多关系
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+ */
+ public function perms()
+ {
+ return $this->belongsToMany(Config::get('admin.permission'), Config::get('admin.permission_menu_table'),
+ Config::get('admin.menu_foreign_key'), Config::get('admin.permission_foreign_key'));
+ }
+
+ /**
+ * 把权限转成角色ID,并放到到数组的roleIds
+ * @param $menu
+ * @return mixed
+ */
+ private static function transRoleIds($menu) {
+ if (!empty($menu['roles'])) {
+ $menu['roleIds'] = array_map(function ($item){
+ return $item['id'];
+ }, $menu['roles']);
+ }
+ else
+ {
+ $menu['roleIds'] = [];
+ }
+ return $menu;
+ }
+
+ /**
+ * 把权限转成权限ID,并放到到数组的permIds
+ * @param $menu 菜单数组
+ * @return mixed
+ */
+ private static function transPermIds($menu) {
+ if (!empty($menu['perms'])) {
+ $menu['permIds'] = array_map(function ($item){
+ return $item['id'];
+ }, $menu['perms']);
+ }
+ else
+ {
+ $menu['permIds'] = [];
+ }
+ return $menu;
+ }
+
+ /**
+ * 查找菜单
+ * @param $id 菜单ID
+ * @return mixed
+ */
+ public static function find($id)
+ {
+ return static::with('roles')->find($id);
+ }
+
+ /**
+ * 查找带权限的菜单
+ * @param $id 菜单ID
+ * @return array|mixed
+ */
+ public static function findByRoleId($id)
+ {
+ $menu = [];
+ $menuObj= static::with('roles')->find($id);
+ if (!empty($menuObj))
+ {
+ $menu = $menuObj->toArray();
+ $menu = static::transRoleIds($menu);
+ }
+ return $menu;
+ }
+
+ /**
+ * 转成树结构
+ * @param array $elements 树数组
+ * @param int $parentId 上级ID
+ * @param array $roleIds 权限ID
+ * @return array
+ */
+ public static function toTree(array $elements = [], $parentId = 0, $roleIds = [])
+ {
+ $branch = [];
+
+ if (empty($elements)) {
+ $elements = static::with('roles', 'perms')->orderByRaw('`order` = 0,`order`')->get()->toArray();
+ }
+
+ foreach ($elements as $element) {
+ if ($element['parent_id'] == $parentId) {
+ $element = static::transRoleIds($element);
+ $element = static::transPermIds($element);
+
+ if (!empty($element['roleIds']) && !empty($roleIds))
+ {
+ $_roles = array_intersect($element['roleIds'], $roleIds);
+ if (empty($_roles)) continue;
+ }
+
+ $children = static::toTree($elements, $element['id'], $roleIds);
+
+ if ($children) {
+ $element['children'] = $children;
+ }
+
+ $branch[] = $element;
+ }
+ }
+
+ return $branch;
+ }
+
+ /**
+ * 设计分支排序
+ *
+ * @param array $order
+ *
+ * @return void
+ */
+ protected static function setBranchOrder(array $order)
+ {
+ static::$branchOrder = array_flip(array_flatten($order));
+
+ static::$branchOrder = array_map(function ($item) {
+ return ++$item;
+ }, static::$branchOrder);
+ }
+
+ /**
+ * 保存树类菜单
+ * @param array $tree 树结构
+ * @param int $parentId 上级ID
+ */
+ public static function saveTree($tree = [], $parentId = 0)
+ {
+ if (empty(static::$branchOrder)) {
+ static::setBranchOrder($tree);
+ }
+
+ foreach ($tree as $branch) {
+ $node = static::find($branch['id']);
+
+ $node->parent_id = $parentId;
+ $node->order = static::$branchOrder[$branch['id']];
+ $node->save();
+
+ if (isset($branch['children'])) {
+ static::saveTree($branch['children'], $branch['id']);
+ }
+ }
+ }
+
+
+ /**
+ * 保存角色
+ * @param $roles
+ */
+ public function saveRoles($roles)
+ {
+ if (!empty($roles)) {
+ $this->roles()->sync($roles);
+ } else {
+ $this->roles()->detach();
+ }
+ }
+
+ /**
+ * 删除菜单
+ * @param array $options
+ * @return mixed
+ */
+ public function delete(array $options = [])
+ {
+ $children = $this->where('parent_id', $this->id)->get();
+ $this->where('parent_id', $this->id)->delete();
+ if ($children) {
+ foreach ($children as $child) {
+ $child->roles()->detach();
+ $child->perms()->detach();
+ }
+ }
+ $this->roles()->detach();
+ $this->perms()->detach();
+ return parent::delete($options);
+ }
+
+ /**
+ * 得到用户菜单
+ * @param $user
+ * @return array
+ */
+ public static function getUserMenu($user) {
+ $isAdminHasAllRoles = true;
+ $isAdmin = $user->hasRole('admin');
+ $roles = $user->cachedRoles();
+ $roleIds = [0];
+ foreach ($roles as $role)
+ {
+ $roleIds[] = $role->id;
+ }
+
+ if ($isAdminHasAllRoles && $isAdmin) $roleIds = [];
+ $menus = static::toTree([], 0, $roleIds);
+
+ return $menus;
+ }
+}
\ No newline at end of file
diff --git a/app/Models/Traits/AdminPermissionTrait.php b/app/Models/Traits/AdminPermissionTrait.php
new file mode 100644
index 0000000..6eb12c7
--- /dev/null
+++ b/app/Models/Traits/AdminPermissionTrait.php
@@ -0,0 +1,107 @@
+belongsToMany(Config::get('admin.role'), Config::get('admin.permission_role_table'),
+ Config::get('admin.permission_foreign_key'), Config::get('admin.role_foreign_key'));
+ }
+
+ /**
+ * 与菜单的多对多关系.
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+ */
+ public function menus()
+ {
+ return $this->belongsToMany(Config::get('admin.menu'), Config::get('admin.permission_menu_table'),
+ Config::get('admin.permission_foreign_key'), Config::get('admin.menu_foreign_key'));
+ }
+
+ /**
+ * 保存角色
+ * @param $roles
+ * @return mixed
+ */
+ public function saveRoles($roles)
+ {
+ if (!empty($roles)) {
+ $this->roles()->sync($roles);
+ } else {
+ $this->roles()->detach();
+ }
+ }
+
+ /**
+ * 保存菜单
+ * @param $menus
+ * @return mixed
+ */
+ public function saveMenus($menus)
+ {
+ if (!empty($menus)) {
+ $this->menus()->sync($menus);
+ } else {
+ $this->menus()->detach();
+ }
+ }
+
+ public static function boot()
+ {
+ parent::boot();
+
+ static::deleting(function($permission) {
+ if (!method_exists(Config::get('admin.permission'), 'bootSoftDeletes')) {
+ $permission->roles()->sync([]);
+ $permission->menus()->sync([]);
+ }
+ return true;
+ });
+ }
+
+
+ /**
+ * Controller对应的权限
+ * @return array
+ */
+ public static function controllerPermissions()
+ {
+ $permissions = static::with('menus')->get()->toArray();
+ $methods = [];
+ foreach ($permissions as $permission) {
+ $controllers = $permission[Config::get('admin.permission_controller')];
+ if (!empty($controllers)) {
+ $_controllerArr = explode(';', $controllers);
+ foreach ($_controllerArr as $str) {
+ $c = explode('@', $str);
+ $controller = strtolower($c[0]);
+ $size = count($c);
+ if ($size > 1) {
+ for($i = 1; $i < $size; $i++) {
+ $method = strtolower($c[$i]);
+ if (empty($method)) {
+ $methods[$controller] = $permission;
+ } else {
+ $methods[$controller.'@'.$method] = $permission;
+ }
+ }
+ } else {
+ $methods[$controller] = $permission;
+ }
+ }
+ }
+ }
+ return $methods;
+ }
+}
\ No newline at end of file
diff --git a/app/Models/Traits/AdminRoleTrait.php b/app/Models/Traits/AdminRoleTrait.php
new file mode 100644
index 0000000..2a14589
--- /dev/null
+++ b/app/Models/Traits/AdminRoleTrait.php
@@ -0,0 +1,142 @@
+primaryKey;
+
+ $cacheKey = 'admin_permissions_for_role_'.$this->$rolePrimaryKey;
+ return Cache::tags(Config::get('admin.permission_role_table'))->remember($cacheKey, Config::get('cache.ttl'), function () {
+ return $this->perms()->get();
+ });
+ }
+ public function save(array $options = [])
+ { //both inserts and updates
+ $result = parent::save($options);
+ Cache::tags(Config::get('admin.permission_role_table'))->flush();
+ return $result;
+ }
+ public function delete(array $options = [])
+ { //soft or hard
+ $result = parent::delete($options);
+ Cache::tags(Config::get('admin.permission_role_table'))->flush();
+ return $result;
+ }
+ public function restore()
+ { //soft delete undo's
+ $result = parent::restore();
+ Cache::tags(Config::get('admin.permission_role_table'))->flush();
+ return $result;
+ }
+
+ /**
+ * 与用户的多对多关系
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+ */
+ public function users()
+ {
+ return $this->belongsToMany(Config::get('auth.providers.users.model'), Config::get('admin.role_user_table'),
+ Config::get('admin.role_foreign_key'),Config::get('admin.user_foreign_key'));
+ }
+
+ /**
+ * 与权限的多对多关系
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+ */
+ public function perms()
+ {
+ return $this->belongsToMany(Config::get('admin.permission'), Config::get('admin.permission_role_table'));
+ }
+
+ /**
+ * 与菜单的多对多关系
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+ */
+ public function menus()
+ {
+ return $this->belongsToMany(Config::get('admin.menu'), Config::get('admin.menu_role_table'),
+ Config::get('admin.role_foreign_key'), Config::get('admin.menu_foreign_key'));
+ }
+
+ /**
+ * 当删除的时候,把角色关系也删除
+ *
+ * @return void|bool
+ */
+ public static function boot()
+ {
+ parent::boot();
+
+ static::deleting(function($role) {
+ if (!method_exists(Config::get('admin.role'), 'bootSoftDeletes')) {
+ $role->users()->sync([]);
+ $role->perms()->sync([]);
+ $role->menus()->sync([]);
+ }
+
+ return true;
+ });
+ }
+
+ /**
+ * 检查是否有权限
+ *
+ * @param string|array $name 权限名
+ * @param bool $requireAll All 是否检查全部权限
+ *
+ * @return bool
+ */
+ public function hasPermission($name, $requireAll = false)
+ {
+ if (is_array($name)) {
+ foreach ($name as $permissionName) {
+ $hasPermission = $this->hasPermission($permissionName);
+
+ if ($hasPermission && !$requireAll) {
+ return true;
+ } elseif (!$hasPermission && $requireAll) {
+ return false;
+ }
+ }
+
+ // If we've made it this far and $requireAll is FALSE, then NONE of the permissions were found
+ // If we've made it this far and $requireAll is TRUE, then ALL of the permissions were found.
+ // Return the value of $requireAll;
+ return $requireAll;
+ } else {
+ foreach ($this->cachedPermissions() as $permission) {
+ if ($permission->name == $name) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * 保存权限
+ *
+ * @param mixed $inputPermissions
+ *
+ * @return void
+ */
+ public function savePermissions($inputPermissions)
+ {
+ if (!empty($inputPermissions)) {
+ $this->perms()->sync($inputPermissions);
+ } else {
+ $this->perms()->detach();
+ }
+ }
+
+}
diff --git a/app/Models/Traits/AdminUsersTrait.php b/app/Models/Traits/AdminUsersTrait.php
new file mode 100644
index 0000000..4464ea7
--- /dev/null
+++ b/app/Models/Traits/AdminUsersTrait.php
@@ -0,0 +1,159 @@
+primaryKey;
+ $cacheKey = 'admin_roles_for_user_'.$this->$userPrimaryKey;
+ return Cache::tags(Config::get('admin.role_user_table'))->remember($cacheKey, Config::get('admin.cache.ttl'), function () {
+ return $this->roles()->get();
+ });
+ }
+ public function save(array $options = [])
+ { //both inserts and updates
+ $result = parent::save($options);
+ Cache::tags(Config::get('admin.role_user_table'))->flush();
+ return $result;
+ }
+ public function delete(array $options = [])
+ { //soft or hard
+ $result = parent::delete($options);
+ Cache::tags(Config::get('admin.role_user_table'))->flush();
+ return $result;
+ }
+ public function restore()
+ { //soft delete undo's
+ $result = parent::restore();
+ Cache::tags(Config::get('admin.role_user_table'))->flush();
+ return $result;
+ }
+
+ /**
+ * 与角色的多对多关系
+ *
+ * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+ */
+ public function roles()
+ {
+ return $this->belongsToMany(Config::get('admin.role'), Config::get('admin.role_user_table'),
+ Config::get('admin.user_foreign_key'), Config::get('admin.role_foreign_key'));
+ }
+
+ /**
+ * 当删除的时候,把用户关系也删除
+ *
+ * @return void|bool
+ */
+ public static function boot()
+ {
+ parent::boot();
+
+ static::deleting(function($user) {
+ if (!method_exists(Config::get('auth.providers.users.model'), 'bootSoftDeletes')) {
+ $user->roles()->sync([]);
+ }
+
+ return true;
+ });
+ }
+
+ /**
+ * 检查用户是是否有角色.
+ *
+ * @param string|array $name 角色名.
+ * @param bool $requireAll 是否有全部请求权限
+ *
+ * @return bool
+ */
+ public function hasRole($name, $requireAll = false)
+ {
+ if (is_array($name)) {
+ foreach ($name as $roleName) {
+ $hasRole = $this->hasRole($roleName);
+
+ if ($hasRole && !$requireAll) {
+ return true;
+ } elseif (!$hasRole && $requireAll) {
+ return false;
+ }
+ }
+
+ // If we've made it this far and $requireAll is FALSE, then NONE of the roles were found
+ // If we've made it this far and $requireAll is TRUE, then ALL of the roles were found.
+ // Return the value of $requireAll;
+ return $requireAll;
+ } else {
+ foreach ($this->cachedRoles() as $role) {
+ if ($role->name == $name) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * 检查用户是否有权限
+ *
+ * @param string|array $permission 权限名
+ * @param bool $requireAll 是否有全部请求权限
+ *
+ * @return bool
+ */
+ public function can($permission, $requireAll = false)
+ {
+ if (is_array($permission)) {
+
+ foreach ($permission as $permName) {
+ $hasPerm = $this->can($permName);
+
+ if ($hasPerm && !$requireAll) {
+ return true;
+ } elseif (!$hasPerm && $requireAll) {
+ return false;
+ }
+ }
+
+ // If we've made it this far and $requireAll is FALSE, then NONE of the perms were found
+ // If we've made it this far and $requireAll is TRUE, then ALL of the perms were found.
+ // Return the value of $requireAll;
+ return $requireAll;
+ } else {
+
+ foreach ($this->cachedRoles() as $role) {
+ // Validate against the Permission table
+ foreach ($role->cachedPermissions() as $perm) {
+
+
+ if (str_is( $permission, $perm->name) ) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * 保存角色
+ *
+ * @param mixed $roles
+ */
+ public function saveRoles($roles)
+ {
+ if (!empty($roles)) {
+ $this->roles()->sync($roles);
+ } else {
+ $this->roles()->detach();
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/Models/User.php b/app/Models/User.php
new file mode 100644
index 0000000..5763f4d
--- /dev/null
+++ b/app/Models/User.php
@@ -0,0 +1,18 @@
+ 'App\Policies\ModelPolicy',
+ ];
+
+ /**
+ * Register any authentication / authorization services.
+ *
+ * @return void
+ */
+ public function boot()
+ {
+ $this->registerPolicies();
+
+ //
+ }
+}
diff --git a/app/Providers/BroadcastServiceProvider.php b/app/Providers/BroadcastServiceProvider.php
new file mode 100644
index 0000000..352cce4
--- /dev/null
+++ b/app/Providers/BroadcastServiceProvider.php
@@ -0,0 +1,21 @@
+ [
+ 'App\Listeners\EventListener',
+ ],
+ ];
+
+ /**
+ * Register any events for your application.
+ *
+ * @return void
+ */
+ public function boot()
+ {
+ parent::boot();
+
+ //
+ }
+}
diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php
new file mode 100644
index 0000000..5ea48d3
--- /dev/null
+++ b/app/Providers/RouteServiceProvider.php
@@ -0,0 +1,73 @@
+mapApiRoutes();
+
+ $this->mapWebRoutes();
+
+ //
+ }
+
+ /**
+ * Define the "web" routes for the application.
+ *
+ * These routes all receive session state, CSRF protection, etc.
+ *
+ * @return void
+ */
+ protected function mapWebRoutes()
+ {
+ Route::middleware('web')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/web.php'));
+ }
+
+ /**
+ * Define the "api" routes for the application.
+ *
+ * These routes are typically stateless.
+ *
+ * @return void
+ */
+ protected function mapApiRoutes()
+ {
+ Route::prefix('api')
+ ->middleware('api')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/api.php'));
+ }
+}
diff --git a/app/Service/DataService.php b/app/Service/DataService.php
new file mode 100644
index 0000000..fb5b1a2
--- /dev/null
+++ b/app/Service/DataService.php
@@ -0,0 +1,201 @@
+parent_id = $inputs['category'];
+ $model->title = $inputs['name'];
+ $model->icon = $inputs['icon'];
+ $model->uri = $inputs['uri'];
+ $model->order = $inputs['order'];
+ $model->routes = 'url:'.$inputs['uri'];
+ $roles = $inputs['roles'];
+ if($inputs['id']){
+ if (is_config_id($inputs['id'], "admin.menu_table_cannot_manage_ids", false))return ['status'=>0,'msg'=>trans('fzs.menus.notedit')];
+ $model->exists = true;
+ $model->id = $inputs['id'];
+ }
+
+ try{
+ if (!$model->save()) {
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ foreach ($roles as $k => $role) {
+ if (empty($role)) unset($roles[$k]);
+ }
+ $model->saveRoles($roles);
+ }catch (\Exception $e){
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ return ['status'=>1,'msg'=>trans('fzs.common.success')];
+ break;
+
+ case 'delete':
+ $model->id = $inputs['id'];
+ $model->exists = true;
+ if($model->delete())return ['status'=>1,'msg'=>trans('fzs.common.success')];
+ else return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ break;
+ default:
+ return ['status'=>0,'msg'=>trans('fzs.common.wrong')];
+ }
+ break;
+ case 'users':
+ switch ($kind[1]){
+ case 'add_or_update':
+ $model->username = $inputs['user_name'];
+ $model->email = $inputs['email'];
+ $model->mobile = $inputs['tel'];
+ $model->sex = $inputs['sex'];
+ if($inputs['pwd'])$model->password = bcrypt($inputs['pwd']);
+ if($inputs['id']){
+ if(is_config_id($inputs['id'], "admin.user_table_cannot_manage_ids", false))return ['status'=>0,'msg'=>trans('fzs.users.notedit')];
+ $model->exists = true;
+ $model->id = $inputs['id'];
+ }
+ try{
+ if (!$model->save()) {
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ $model->saveRoles($inputs['user_role']);
+ }catch (\Exception $e){
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ return ['status'=>1,'msg'=>trans('fzs.common.success')];
+ break;
+ case 'update_pwd':
+ $userinfo = new Admin();
+ $userinfo = $userinfo->user();
+ if(!App::make('hash')->check($inputs['oldpwd'],$userinfo['password']))return ['status'=>0,'msg'=>trans('fzs.users.pwd_false')];
+ $model->password = bcrypt($inputs['pwd']);
+ $model->exists = true;
+ $model->id = $inputs['id'];
+ try{
+ if (!$model->save()) {
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ }catch (\Exception $e){
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ return ['status'=>1,'msg'=>trans('fzs.common.success')];
+ break;
+ case 'update_info':
+ $model->email = $inputs['useremail'];
+ $model->mobile = $inputs['usertel'];
+ $model->sex = $inputs['usersex'];
+ $model->exists = true;
+ $model->id = $inputs['id'];
+ try{
+ if (!$model->save()) {
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ }catch (\Exception $e){
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ return ['status'=>1,'msg'=>trans('fzs.common.success')];
+ break;
+ case 'delete':
+ $model->id = $inputs['id'];
+ $model->exists = true;
+ if($model->delete())return ['status'=>1,'msg'=>trans('fzs.common.success')];
+ else return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ break;
+ default:
+ return ['status'=>0,'msg'=>trans('fzs.common.wrong')];
+ }
+ break;
+ case 'roles':
+ switch ($kind[1]){
+ case 'add_or_update':
+ $model->name = $inputs['role_remark'];
+ $model->display_name = $inputs['role_name'];
+ $model->description = $inputs['role_desc'];
+ if($inputs['id']){
+ if(is_config_id($inputs['id'], "admin.role_table_cannot_manage_ids", false))return ['status'=>0,'msg'=>trans('fzs.roles.notedit')];
+ $model->exists = true;
+ $model->id = $inputs['id'];
+ }
+ try{
+ if (!$model->save()) {
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ $role = new Role();
+ $role = $role->find($model->id);
+ $role->savePermissions(isset($inputs['permission_list'])?$inputs['permission_list']:'');
+ if (!$role->save()) {
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ }catch (\Exception $e){
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ return ['status'=>1,'msg'=>trans('fzs.common.success')];
+ break;
+
+ case 'delete':
+ if($model->isAbleDel($inputs['id']))return ['status'=>0,'msg'=>trans('fzs.roles.have_user')];
+ $model->id = $inputs['id'];
+ $model->exists = true;
+ if($model->delete())return ['status'=>1,'msg'=>trans('fzs.common.success')];
+ else return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ break;
+ default:
+ return ['status'=>0,'msg'=>trans('fzs.common.wrong')];
+ }
+ break;
+ case 'permissions':
+ switch ($kind[1]){
+ case 'add_or_update':
+ $model->name = $inputs['permission_remark'];
+ $model->display_name = $inputs['permission_name'];
+ $model->description = $inputs['permission_desc'];
+ $model->controllers = $inputs['permission_control'];
+ if($inputs['id']){
+ if (is_config_id($inputs['id'], "admin.permission_table_cannot_manage_ids", false))return ['status'=>0,'msg'=>trans('fzs.menus.notedit')];
+ $model->exists = true;
+ $model->id = $inputs['id'];
+ }
+ try{
+ if (!$model->save()) {
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ $roles = $inputs['permission_roles'];
+ if (!empty($roles)) {
+ foreach ($roles as $k => $role) {
+ if (empty($role)) unset($roles[$k]);
+ }
+ }
+ $model->saveRoles($roles);
+ }catch (\Exception $e){
+ return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ }
+ return ['status'=>1,'msg'=>trans('fzs.common.success')];
+ break;
+
+ case 'delete':
+ $model->id = $inputs['id'];
+ $model->exists = true;
+ if($model->delete())return ['status'=>1,'msg'=>trans('fzs.common.success')];
+ else return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+ break;
+ default:
+ return ['status'=>0,'msg'=>trans('fzs.common.wrong')];
+ }
+ break;
+ default:
+ return ['status'=>0,'msg'=>trans('fzs.common.wrong')];
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/User.php b/app/User.php
new file mode 100644
index 0000000..bfd96a6
--- /dev/null
+++ b/app/User.php
@@ -0,0 +1,29 @@
+getActionName());
+ // 如: [App\Http\Controllers\IndexController, getIndex]
+ $tmp = explode("@", $action);
+ // 如: App\Http\Controllers\IndexController
+ $controller = $tmp[0];
+ // 如: getIndex
+ $classMethod = count($tmp) > 1 ? $tmp[1] : '';
+ $paths = explode("\\", $controller);
+ // 如: IndexController
+ $className = $paths[count($paths) - 1];
+ // 如: GET | POST | PUT | DELETE , PUT跟DELETE方法可以通过_method参数传
+ $method = Request::getMethod();
+ // 如: GET | POST
+ $realMethod = Request::getRealMethod();
+ $url = Request::getRequestUri();
+
+ $params[static::ACTION] = $action;
+ $params[static::CONTROLLER] = $controller;
+ $params[static::CLASS_NAME] = $className;
+ $params[static::CLASS_METHOD] = $classMethod;
+ $params[static::METHOD] = $method;
+ $params[static::REAL_METHOD] = $realMethod;
+ $params[static::URL] = $url;
+ return $params;
+ }
+
+}
\ No newline at end of file
diff --git a/artisan b/artisan
new file mode 100644
index 0000000..44dc07b
--- /dev/null
+++ b/artisan
@@ -0,0 +1,51 @@
+#!/usr/bin/env php
+make(Illuminate\Contracts\Console\Kernel::class);
+
+$status = $kernel->handle(
+ $input = new Symfony\Component\Console\Input\ArgvInput,
+ new Symfony\Component\Console\Output\ConsoleOutput
+);
+
+/*
+|--------------------------------------------------------------------------
+| Shutdown The Application
+|--------------------------------------------------------------------------
+|
+| Once Artisan has finished running, we will fire off the shutdown events
+| so that any final work may be done by the application before we shut
+| down the process. This is the last thing to happen to the request.
+|
+*/
+
+$kernel->terminate($input, $status);
+
+exit($status);
diff --git a/bootstrap/app.php b/bootstrap/app.php
new file mode 100644
index 0000000..f2801ad
--- /dev/null
+++ b/bootstrap/app.php
@@ -0,0 +1,55 @@
+singleton(
+ Illuminate\Contracts\Http\Kernel::class,
+ App\Http\Kernel::class
+);
+
+$app->singleton(
+ Illuminate\Contracts\Console\Kernel::class,
+ App\Console\Kernel::class
+);
+
+$app->singleton(
+ Illuminate\Contracts\Debug\ExceptionHandler::class,
+ App\Exceptions\Handler::class
+);
+
+/*
+|--------------------------------------------------------------------------
+| Return The Application
+|--------------------------------------------------------------------------
+|
+| This script returns the application instance. The instance is given to
+| the calling script so we can separate the building of the instances
+| from the actual running of the application and sending responses.
+|
+*/
+
+return $app;
diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php
new file mode 100644
index 0000000..c64e19f
--- /dev/null
+++ b/bootstrap/autoload.php
@@ -0,0 +1,17 @@
+=5.6.4",
+ "laravel/framework": "5.4.*",
+ "laravel/tinker": "~1.0",
+ "gregwar/captcha": "1.*"
+ },
+ "require-dev": {
+ "fzaninotto/faker": "~1.4",
+ "mockery/mockery": "0.9.*",
+ "phpunit/phpunit": "~5.7"
+ },
+ "autoload": {
+ "classmap": [
+ "database"
+ ],
+ "psr-4": {
+ "App\\": "app/"
+ },
+ "files":[
+ "app/Helpers/functions.php"
+ ]
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Tests\\": "tests/"
+ }
+ },
+ "scripts": {
+ "post-root-package-install": [
+ "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+ ],
+ "post-create-project-cmd": [
+ "php artisan key:generate"
+ ],
+ "post-install-cmd": [
+ "Illuminate\\Foundation\\ComposerScripts::postInstall",
+ "php artisan optimize"
+ ],
+ "post-update-cmd": [
+ "Illuminate\\Foundation\\ComposerScripts::postUpdate",
+ "php artisan optimize"
+ ]
+ },
+ "config": {
+ "preferred-install": "dist",
+ "sort-packages": true,
+ "optimize-autoloader": true
+ }
+}
diff --git a/config/admin.php b/config/admin.php
new file mode 100644
index 0000000..251a1ba
--- /dev/null
+++ b/config/admin.php
@@ -0,0 +1,49 @@
+ 'admin_users',
+ 'user_table_cannot_manage_ids' => '1',
+
+ //role
+ 'role' => 'App\Models\Role',
+ 'role_table' => 'admin_roles',
+ 'role_user_table' => 'admin_role_user',
+ 'role_foreign_key' => 'role_id',
+ 'user_foreign_key' => 'user_id',
+ 'role_admin' => 'admin',
+ 'role_auth_page' => 'errors.role',
+ 'role_table_cannot_manage_ids' => '1',
+
+ //permission
+ 'permission' => 'App\Models\Permission',
+ 'permission_table' => 'admin_permissions',
+ 'permission_role_table' => 'admin_permission_role',
+ 'permission_name' => 'name',
+ 'permission_display_name' => 'display_name',
+ 'permission_controller' => 'controllers',
+ 'permission_menu_table' => 'admin_permission_menu',
+ 'permission_foreign_key' => 'permission_id',
+ 'permission_table_cannot_manage_ids' => '1,2,3,4,5,6,7,8,9',
+
+ //menu
+ 'menu' => 'App\Models\Menu',
+ 'menu_table' => 'admin_menus',
+ 'menu_role_table' => 'admin_role_menu',
+ 'menu_foreign_key' => 'menu_id',
+ 'menu_table_id_key' => 'id',
+ 'menu_table_parent_id_key' => 'parent_id',
+ 'menu_table_cannot_manage_ids' => '1,2,3,4,5,6,7',
+
+ 'db_log' => env('DB_LOG', false),
+ //cache
+ 'admin_permissions_for_role_id' =>'ap_id',
+ //cannot del
+ 'cannot_del_admin_ids' => '1',
+ 'cannot_del_admin_ids' => '1',
+
+];
\ No newline at end of file
diff --git a/config/app.php b/config/app.php
new file mode 100644
index 0000000..08e26aa
--- /dev/null
+++ b/config/app.php
@@ -0,0 +1,231 @@
+ env('APP_NAME', 'Laravel'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Environment
+ |--------------------------------------------------------------------------
+ |
+ | This value determines the "environment" your application is currently
+ | running in. This may determine how you prefer to configure various
+ | services your application utilizes. Set this in your ".env" file.
+ |
+ */
+
+ 'env' => env('APP_ENV', 'production'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Debug Mode
+ |--------------------------------------------------------------------------
+ |
+ | When your application is in debug mode, detailed error messages with
+ | stack traces will be shown on every error that occurs within your
+ | application. If disabled, a simple generic error page is shown.
+ |
+ */
+
+ 'debug' => env('APP_DEBUG', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application URL
+ |--------------------------------------------------------------------------
+ |
+ | This URL is used by the console to properly generate URLs when using
+ | the Artisan command line tool. You should set this to the root of
+ | your application so that it is used when running Artisan tasks.
+ |
+ */
+
+ 'url' => env('APP_URL', 'http://localhost'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Timezone
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the default timezone for your application, which
+ | will be used by the PHP date and date-time functions. We have gone
+ | ahead and set this to a sensible default for you out of the box.
+ |
+ */
+
+ 'timezone' => 'Asia/Shanghai',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Locale Configuration
+ |--------------------------------------------------------------------------
+ |
+ | The application locale determines the default locale that will be used
+ | by the translation service provider. You are free to set this value
+ | to any of the locales which will be supported by the application.
+ |
+ */
+
+ 'locale' => 'zh',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Application Fallback Locale
+ |--------------------------------------------------------------------------
+ |
+ | The fallback locale determines the locale to use when the current one
+ | is not available. You may change the value to correspond to any of
+ | the language folders that are provided through your application.
+ |
+ */
+
+ 'fallback_locale' => 'en',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Encryption Key
+ |--------------------------------------------------------------------------
+ |
+ | This key is used by the Illuminate encrypter service and should be set
+ | to a random, 32 character string, otherwise these encrypted strings
+ | will not be safe. Please do this before deploying an application!
+ |
+ */
+
+ 'key' => env('APP_KEY'),
+
+ 'cipher' => 'AES-256-CBC',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Logging Configuration
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the log settings for your application. Out of
+ | the box, Laravel uses the Monolog PHP logging library. This gives
+ | you a variety of powerful log handlers / formatters to utilize.
+ |
+ | Available Settings: "single", "daily", "syslog", "errorlog"
+ |
+ */
+
+ 'log' => env('APP_LOG', 'single'),
+
+ 'log_level' => env('APP_LOG_LEVEL', 'debug'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Autoloaded Service Providers
+ |--------------------------------------------------------------------------
+ |
+ | The service providers listed here will be automatically loaded on the
+ | request to your application. Feel free to add your own services to
+ | this array to grant expanded functionality to your applications.
+ |
+ */
+
+ 'providers' => [
+
+ /*
+ * Laravel Framework Service Providers...
+ */
+ Illuminate\Auth\AuthServiceProvider::class,
+ Illuminate\Broadcasting\BroadcastServiceProvider::class,
+ Illuminate\Bus\BusServiceProvider::class,
+ Illuminate\Cache\CacheServiceProvider::class,
+ Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
+ Illuminate\Cookie\CookieServiceProvider::class,
+ Illuminate\Database\DatabaseServiceProvider::class,
+ Illuminate\Encryption\EncryptionServiceProvider::class,
+ Illuminate\Filesystem\FilesystemServiceProvider::class,
+ Illuminate\Foundation\Providers\FoundationServiceProvider::class,
+ Illuminate\Hashing\HashServiceProvider::class,
+ Illuminate\Mail\MailServiceProvider::class,
+ Illuminate\Notifications\NotificationServiceProvider::class,
+ Illuminate\Pagination\PaginationServiceProvider::class,
+ Illuminate\Pipeline\PipelineServiceProvider::class,
+ Illuminate\Queue\QueueServiceProvider::class,
+ Illuminate\Redis\RedisServiceProvider::class,
+ Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
+ Illuminate\Session\SessionServiceProvider::class,
+ Illuminate\Translation\TranslationServiceProvider::class,
+ Illuminate\Validation\ValidationServiceProvider::class,
+ Illuminate\View\ViewServiceProvider::class,
+
+ /*
+ * Package Service Providers...
+ */
+ Laravel\Tinker\TinkerServiceProvider::class,
+
+ /*
+ * Application Service Providers...
+ */
+ App\Providers\AppServiceProvider::class,
+ App\Providers\AuthServiceProvider::class,
+ // App\Providers\BroadcastServiceProvider::class,
+ App\Providers\EventServiceProvider::class,
+ App\Providers\RouteServiceProvider::class,
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Class Aliases
+ |--------------------------------------------------------------------------
+ |
+ | This array of class aliases will be registered when this application
+ | is started. However, feel free to register as many as you wish as
+ | the aliases are "lazy" loaded so they don't hinder performance.
+ |
+ */
+
+ 'aliases' => [
+
+ 'App' => Illuminate\Support\Facades\App::class,
+ 'Artisan' => Illuminate\Support\Facades\Artisan::class,
+ 'Auth' => Illuminate\Support\Facades\Auth::class,
+ 'Blade' => Illuminate\Support\Facades\Blade::class,
+ 'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
+ 'Bus' => Illuminate\Support\Facades\Bus::class,
+ 'Cache' => Illuminate\Support\Facades\Cache::class,
+ 'Config' => Illuminate\Support\Facades\Config::class,
+ 'Cookie' => Illuminate\Support\Facades\Cookie::class,
+ 'Crypt' => Illuminate\Support\Facades\Crypt::class,
+ 'DB' => Illuminate\Support\Facades\DB::class,
+ 'Eloquent' => Illuminate\Database\Eloquent\Model::class,
+ 'Event' => Illuminate\Support\Facades\Event::class,
+ 'File' => Illuminate\Support\Facades\File::class,
+ 'Gate' => Illuminate\Support\Facades\Gate::class,
+ 'Hash' => Illuminate\Support\Facades\Hash::class,
+ 'Lang' => Illuminate\Support\Facades\Lang::class,
+ 'Log' => Illuminate\Support\Facades\Log::class,
+ 'Mail' => Illuminate\Support\Facades\Mail::class,
+ 'Notification' => Illuminate\Support\Facades\Notification::class,
+ 'Password' => Illuminate\Support\Facades\Password::class,
+ 'Queue' => Illuminate\Support\Facades\Queue::class,
+ 'Redirect' => Illuminate\Support\Facades\Redirect::class,
+ 'Redis' => Illuminate\Support\Facades\Redis::class,
+ 'Request' => Illuminate\Support\Facades\Request::class,
+ 'Response' => Illuminate\Support\Facades\Response::class,
+ 'Route' => Illuminate\Support\Facades\Route::class,
+ 'Schema' => Illuminate\Support\Facades\Schema::class,
+ 'Session' => Illuminate\Support\Facades\Session::class,
+ 'Storage' => Illuminate\Support\Facades\Storage::class,
+ 'URL' => Illuminate\Support\Facades\URL::class,
+ 'Validator' => Illuminate\Support\Facades\Validator::class,
+ 'View' => Illuminate\Support\Facades\View::class,
+
+ ],
+
+];
diff --git a/config/auth.php b/config/auth.php
new file mode 100644
index 0000000..087bbb3
--- /dev/null
+++ b/config/auth.php
@@ -0,0 +1,102 @@
+ [
+ 'guard' => 'web',
+ 'passwords' => 'users',
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Authentication Guards
+ |--------------------------------------------------------------------------
+ |
+ | Next, you may define every authentication guard for your application.
+ | Of course, a great default configuration has been defined for you
+ | here which uses session storage and the Eloquent user provider.
+ |
+ | All authentication drivers have a user provider. This defines how the
+ | users are actually retrieved out of your database or other storage
+ | mechanisms used by this application to persist your user's data.
+ |
+ | Supported: "session", "token"
+ |
+ */
+
+ 'guards' => [
+ 'web' => [
+ 'driver' => 'session',
+ 'provider' => 'users',
+ ],
+
+ 'api' => [
+ 'driver' => 'token',
+ 'provider' => 'users',
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | User Providers
+ |--------------------------------------------------------------------------
+ |
+ | All authentication drivers have a user provider. This defines how the
+ | users are actually retrieved out of your database or other storage
+ | mechanisms used by this application to persist your user's data.
+ |
+ | If you have multiple user tables or models you may configure multiple
+ | sources which represent each model / table. These sources may then
+ | be assigned to any extra authentication guards you have defined.
+ |
+ | Supported: "database", "eloquent"
+ |
+ */
+
+ 'providers' => [
+ 'users' => [
+ 'driver' => 'eloquent',
+ 'model' => App\Models\User::class,
+ ],
+
+ // 'users' => [
+ // 'driver' => 'database',
+ // 'table' => 'users',
+ // ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Resetting Passwords
+ |--------------------------------------------------------------------------
+ |
+ | You may specify multiple password reset configurations if you have more
+ | than one user table or model in the application and you want to have
+ | separate password reset settings based on the specific user types.
+ |
+ | The expire time is the number of minutes that the reset token should be
+ | considered valid. This security feature keeps tokens short-lived so
+ | they have less time to be guessed. You may change this as needed.
+ |
+ */
+
+ 'passwords' => [
+ 'users' => [
+ 'provider' => 'users',
+ 'table' => 'password_resets',
+ 'expire' => 60,
+ ],
+ ],
+
+];
diff --git a/config/broadcasting.php b/config/broadcasting.php
new file mode 100644
index 0000000..5eecd2b
--- /dev/null
+++ b/config/broadcasting.php
@@ -0,0 +1,58 @@
+ env('BROADCAST_DRIVER', 'null'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Broadcast Connections
+ |--------------------------------------------------------------------------
+ |
+ | Here you may define all of the broadcast connections that will be used
+ | to broadcast events to other systems or over websockets. Samples of
+ | each available type of connection are provided inside this array.
+ |
+ */
+
+ 'connections' => [
+
+ 'pusher' => [
+ 'driver' => 'pusher',
+ 'key' => env('PUSHER_APP_KEY'),
+ 'secret' => env('PUSHER_APP_SECRET'),
+ 'app_id' => env('PUSHER_APP_ID'),
+ 'options' => [
+ //
+ ],
+ ],
+
+ 'redis' => [
+ 'driver' => 'redis',
+ 'connection' => 'default',
+ ],
+
+ 'log' => [
+ 'driver' => 'log',
+ ],
+
+ 'null' => [
+ 'driver' => 'null',
+ ],
+
+ ],
+
+];
diff --git a/config/cache.php b/config/cache.php
new file mode 100644
index 0000000..e87f032
--- /dev/null
+++ b/config/cache.php
@@ -0,0 +1,91 @@
+ env('CACHE_DRIVER', 'file'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cache Stores
+ |--------------------------------------------------------------------------
+ |
+ | Here you may define all of the cache "stores" for your application as
+ | well as their drivers. You may even define multiple stores for the
+ | same cache driver to group types of items stored in your caches.
+ |
+ */
+
+ 'stores' => [
+
+ 'apc' => [
+ 'driver' => 'apc',
+ ],
+
+ 'array' => [
+ 'driver' => 'array',
+ ],
+
+ 'database' => [
+ 'driver' => 'database',
+ 'table' => 'cache',
+ 'connection' => null,
+ ],
+
+ 'file' => [
+ 'driver' => 'file',
+ 'path' => storage_path('framework/cache/data'),
+ ],
+
+ 'memcached' => [
+ 'driver' => 'memcached',
+ 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
+ 'sasl' => [
+ env('MEMCACHED_USERNAME'),
+ env('MEMCACHED_PASSWORD'),
+ ],
+ 'options' => [
+ // Memcached::OPT_CONNECT_TIMEOUT => 2000,
+ ],
+ 'servers' => [
+ [
+ 'host' => env('MEMCACHED_HOST', '127.0.0.1'),
+ 'port' => env('MEMCACHED_PORT', 11211),
+ 'weight' => 100,
+ ],
+ ],
+ ],
+
+ 'redis' => [
+ 'driver' => 'redis',
+ 'connection' => 'default',
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cache Key Prefix
+ |--------------------------------------------------------------------------
+ |
+ | When utilizing a RAM based store such as APC or Memcached, there might
+ | be other applications utilizing the same cache. So, we'll specify a
+ | value to get prefixed to all our keys so we can avoid collisions.
+ |
+ */
+
+ 'prefix' => 'laravel',
+
+];
diff --git a/config/database.php b/config/database.php
new file mode 100644
index 0000000..cab5d06
--- /dev/null
+++ b/config/database.php
@@ -0,0 +1,120 @@
+ env('DB_CONNECTION', 'mysql'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Database Connections
+ |--------------------------------------------------------------------------
+ |
+ | Here are each of the database connections setup for your application.
+ | Of course, examples of configuring each database platform that is
+ | supported by Laravel is shown below to make development simple.
+ |
+ |
+ | All database work in Laravel is done through the PHP PDO facilities
+ | so make sure you have the driver for your particular database of
+ | choice installed on your machine before you begin development.
+ |
+ */
+
+ 'connections' => [
+
+ 'sqlite' => [
+ 'driver' => 'sqlite',
+ 'database' => env('DB_DATABASE', database_path('database.sqlite')),
+ 'prefix' => '',
+ ],
+
+ 'mysql' => [
+ 'driver' => 'mysql',
+ 'host' => env('DB_HOST', '127.0.0.1'),
+ 'port' => env('DB_PORT', '3306'),
+ 'database' => env('DB_DATABASE', 'forge'),
+ 'username' => env('DB_USERNAME', 'forge'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'unix_socket' => env('DB_SOCKET', ''),
+ 'charset' => 'utf8mb4',
+ 'collation' => 'utf8mb4_unicode_ci',
+ 'prefix' => '',
+ 'strict' => true,
+ 'engine' => null,
+ ],
+
+ 'pgsql' => [
+ 'driver' => 'pgsql',
+ 'host' => env('DB_HOST', '127.0.0.1'),
+ 'port' => env('DB_PORT', '5432'),
+ 'database' => env('DB_DATABASE', 'forge'),
+ 'username' => env('DB_USERNAME', 'forge'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'charset' => 'utf8',
+ 'prefix' => '',
+ 'schema' => 'public',
+ 'sslmode' => 'prefer',
+ ],
+
+ 'sqlsrv' => [
+ 'driver' => 'sqlsrv',
+ 'host' => env('DB_HOST', 'localhost'),
+ 'port' => env('DB_PORT', '1433'),
+ 'database' => env('DB_DATABASE', 'forge'),
+ 'username' => env('DB_USERNAME', 'forge'),
+ 'password' => env('DB_PASSWORD', ''),
+ 'charset' => 'utf8',
+ 'prefix' => '',
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Migration Repository Table
+ |--------------------------------------------------------------------------
+ |
+ | This table keeps track of all the migrations that have already run for
+ | your application. Using this information, we can determine which of
+ | the migrations on disk haven't actually been run in the database.
+ |
+ */
+
+ 'migrations' => 'migrations',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Redis Databases
+ |--------------------------------------------------------------------------
+ |
+ | Redis is an open source, fast, and advanced key-value store that also
+ | provides a richer set of commands than a typical key-value systems
+ | such as APC or Memcached. Laravel makes it easy to dig right in.
+ |
+ */
+
+ 'redis' => [
+
+ 'client' => 'predis',
+
+ 'default' => [
+ 'host' => env('REDIS_HOST', '127.0.0.1'),
+ 'password' => env('REDIS_PASSWORD', null),
+ 'port' => env('REDIS_PORT', 6379),
+ 'database' => 0,
+ ],
+
+ ],
+
+];
diff --git a/config/filesystems.php b/config/filesystems.php
new file mode 100644
index 0000000..4544f60
--- /dev/null
+++ b/config/filesystems.php
@@ -0,0 +1,68 @@
+ env('FILESYSTEM_DRIVER', 'local'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Default Cloud Filesystem Disk
+ |--------------------------------------------------------------------------
+ |
+ | Many applications store files both locally and in the cloud. For this
+ | reason, you may specify a default "cloud" driver here. This driver
+ | will be bound as the Cloud disk implementation in the container.
+ |
+ */
+
+ 'cloud' => env('FILESYSTEM_CLOUD', 's3'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Filesystem Disks
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure as many filesystem "disks" as you wish, and you
+ | may even configure multiple disks of the same driver. Defaults have
+ | been setup for each driver as an example of the required options.
+ |
+ | Supported Drivers: "local", "ftp", "s3", "rackspace"
+ |
+ */
+
+ 'disks' => [
+
+ 'local' => [
+ 'driver' => 'local',
+ 'root' => storage_path('app'),
+ ],
+
+ 'public' => [
+ 'driver' => 'local',
+ 'root' => storage_path('app/public'),
+ 'url' => env('APP_URL').'/storage',
+ 'visibility' => 'public',
+ ],
+
+ 's3' => [
+ 'driver' => 's3',
+ 'key' => env('AWS_KEY'),
+ 'secret' => env('AWS_SECRET'),
+ 'region' => env('AWS_REGION'),
+ 'bucket' => env('AWS_BUCKET'),
+ ],
+
+ ],
+
+];
diff --git a/config/mail.php b/config/mail.php
new file mode 100644
index 0000000..bb92224
--- /dev/null
+++ b/config/mail.php
@@ -0,0 +1,123 @@
+ env('MAIL_DRIVER', 'smtp'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | SMTP Host Address
+ |--------------------------------------------------------------------------
+ |
+ | Here you may provide the host address of the SMTP server used by your
+ | applications. A default option is provided that is compatible with
+ | the Mailgun mail service which will provide reliable deliveries.
+ |
+ */
+
+ 'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | SMTP Host Port
+ |--------------------------------------------------------------------------
+ |
+ | This is the SMTP port used by your application to deliver e-mails to
+ | users of the application. Like the host we have set this value to
+ | stay compatible with the Mailgun e-mail application by default.
+ |
+ */
+
+ 'port' => env('MAIL_PORT', 587),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Global "From" Address
+ |--------------------------------------------------------------------------
+ |
+ | You may wish for all e-mails sent by your application to be sent from
+ | the same address. Here, you may specify a name and address that is
+ | used globally for all e-mails that are sent by your application.
+ |
+ */
+
+ 'from' => [
+ 'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
+ 'name' => env('MAIL_FROM_NAME', 'Example'),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | E-Mail Encryption Protocol
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the encryption protocol that should be used when
+ | the application send e-mail messages. A sensible default using the
+ | transport layer security protocol should provide great security.
+ |
+ */
+
+ 'encryption' => env('MAIL_ENCRYPTION', 'tls'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | SMTP Server Username
+ |--------------------------------------------------------------------------
+ |
+ | If your SMTP server requires a username for authentication, you should
+ | set it here. This will get used to authenticate with your server on
+ | connection. You may also set the "password" value below this one.
+ |
+ */
+
+ 'username' => env('MAIL_USERNAME'),
+
+ 'password' => env('MAIL_PASSWORD'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Sendmail System Path
+ |--------------------------------------------------------------------------
+ |
+ | When using the "sendmail" driver to send e-mails, we will need to know
+ | the path to where Sendmail lives on this server. A default path has
+ | been provided here, which will work well on most of your systems.
+ |
+ */
+
+ 'sendmail' => '/usr/sbin/sendmail -bs',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Markdown Mail Settings
+ |--------------------------------------------------------------------------
+ |
+ | If you are using Markdown based email rendering, you may configure your
+ | theme and component paths here, allowing you to customize the design
+ | of the emails. Or, you may simply stick with the Laravel defaults!
+ |
+ */
+
+ 'markdown' => [
+ 'theme' => 'default',
+
+ 'paths' => [
+ resource_path('views/vendor/mail'),
+ ],
+ ],
+
+];
diff --git a/config/queue.php b/config/queue.php
new file mode 100644
index 0000000..4d83ebd
--- /dev/null
+++ b/config/queue.php
@@ -0,0 +1,85 @@
+ env('QUEUE_DRIVER', 'sync'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Queue Connections
+ |--------------------------------------------------------------------------
+ |
+ | Here you may configure the connection information for each server that
+ | is used by your application. A default configuration has been added
+ | for each back-end shipped with Laravel. You are free to add more.
+ |
+ */
+
+ 'connections' => [
+
+ 'sync' => [
+ 'driver' => 'sync',
+ ],
+
+ 'database' => [
+ 'driver' => 'database',
+ 'table' => 'jobs',
+ 'queue' => 'default',
+ 'retry_after' => 90,
+ ],
+
+ 'beanstalkd' => [
+ 'driver' => 'beanstalkd',
+ 'host' => 'localhost',
+ 'queue' => 'default',
+ 'retry_after' => 90,
+ ],
+
+ 'sqs' => [
+ 'driver' => 'sqs',
+ 'key' => 'your-public-key',
+ 'secret' => 'your-secret-key',
+ 'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id',
+ 'queue' => 'your-queue-name',
+ 'region' => 'us-east-1',
+ ],
+
+ 'redis' => [
+ 'driver' => 'redis',
+ 'connection' => 'default',
+ 'queue' => 'default',
+ 'retry_after' => 90,
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Failed Queue Jobs
+ |--------------------------------------------------------------------------
+ |
+ | These options configure the behavior of failed queue job logging so you
+ | can control which database and table are used to store the jobs that
+ | have failed. You may change them to any database / table you wish.
+ |
+ */
+
+ 'failed' => [
+ 'database' => env('DB_CONNECTION', 'mysql'),
+ 'table' => 'failed_jobs',
+ ],
+
+];
diff --git a/config/services.php b/config/services.php
new file mode 100644
index 0000000..4460f0e
--- /dev/null
+++ b/config/services.php
@@ -0,0 +1,38 @@
+ [
+ 'domain' => env('MAILGUN_DOMAIN'),
+ 'secret' => env('MAILGUN_SECRET'),
+ ],
+
+ 'ses' => [
+ 'key' => env('SES_KEY'),
+ 'secret' => env('SES_SECRET'),
+ 'region' => 'us-east-1',
+ ],
+
+ 'sparkpost' => [
+ 'secret' => env('SPARKPOST_SECRET'),
+ ],
+
+ 'stripe' => [
+ 'model' => App\User::class,
+ 'key' => env('STRIPE_KEY'),
+ 'secret' => env('STRIPE_SECRET'),
+ ],
+
+];
diff --git a/config/session.php b/config/session.php
new file mode 100644
index 0000000..e2779ad
--- /dev/null
+++ b/config/session.php
@@ -0,0 +1,179 @@
+ env('SESSION_DRIVER', 'file'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Lifetime
+ |--------------------------------------------------------------------------
+ |
+ | Here you may specify the number of minutes that you wish the session
+ | to be allowed to remain idle before it expires. If you want them
+ | to immediately expire on the browser closing, set that option.
+ |
+ */
+
+ 'lifetime' => 120,
+
+ 'expire_on_close' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Encryption
+ |--------------------------------------------------------------------------
+ |
+ | This option allows you to easily specify that all of your session data
+ | should be encrypted before it is stored. All encryption will be run
+ | automatically by Laravel and you can use the Session like normal.
+ |
+ */
+
+ 'encrypt' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session File Location
+ |--------------------------------------------------------------------------
+ |
+ | When using the native session driver, we need a location where session
+ | files may be stored. A default has been set for you but a different
+ | location may be specified. This is only needed for file sessions.
+ |
+ */
+
+ 'files' => storage_path('framework/sessions'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Database Connection
+ |--------------------------------------------------------------------------
+ |
+ | When using the "database" or "redis" session drivers, you may specify a
+ | connection that should be used to manage these sessions. This should
+ | correspond to a connection in your database configuration options.
+ |
+ */
+
+ 'connection' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Database Table
+ |--------------------------------------------------------------------------
+ |
+ | When using the "database" session driver, you may specify the table we
+ | should use to manage the sessions. Of course, a sensible default is
+ | provided for you; however, you are free to change this as needed.
+ |
+ */
+
+ 'table' => 'sessions',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cache Store
+ |--------------------------------------------------------------------------
+ |
+ | When using the "apc" or "memcached" session drivers, you may specify a
+ | cache store that should be used for these sessions. This value must
+ | correspond with one of the application's configured cache stores.
+ |
+ */
+
+ 'store' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Sweeping Lottery
+ |--------------------------------------------------------------------------
+ |
+ | Some session drivers must manually sweep their storage location to get
+ | rid of old sessions from storage. Here are the chances that it will
+ | happen on a given request. By default, the odds are 2 out of 100.
+ |
+ */
+
+ 'lottery' => [2, 100],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cookie Name
+ |--------------------------------------------------------------------------
+ |
+ | Here you may change the name of the cookie used to identify a session
+ | instance by ID. The name specified here will get used every time a
+ | new session cookie is created by the framework for every driver.
+ |
+ */
+
+ 'cookie' => 'laravel_session',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cookie Path
+ |--------------------------------------------------------------------------
+ |
+ | The session cookie path determines the path for which the cookie will
+ | be regarded as available. Typically, this will be the root path of
+ | your application but you are free to change this when necessary.
+ |
+ */
+
+ 'path' => '/',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Session Cookie Domain
+ |--------------------------------------------------------------------------
+ |
+ | Here you may change the domain of the cookie used to identify a session
+ | in your application. This will determine which domains the cookie is
+ | available to in your application. A sensible default has been set.
+ |
+ */
+
+ 'domain' => env('SESSION_DOMAIN', null),
+
+ /*
+ |--------------------------------------------------------------------------
+ | HTTPS Only Cookies
+ |--------------------------------------------------------------------------
+ |
+ | By setting this option to true, session cookies will only be sent back
+ | to the server if the browser has a HTTPS connection. This will keep
+ | the cookie from being sent to you if it can not be done securely.
+ |
+ */
+
+ 'secure' => env('SESSION_SECURE_COOKIE', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | HTTP Access Only
+ |--------------------------------------------------------------------------
+ |
+ | Setting this value to true will prevent JavaScript from accessing the
+ | value of the cookie and the cookie will only be accessible through
+ | the HTTP protocol. You are free to modify this option if needed.
+ |
+ */
+
+ 'http_only' => true,
+
+];
diff --git a/config/view.php b/config/view.php
new file mode 100644
index 0000000..2acfd9c
--- /dev/null
+++ b/config/view.php
@@ -0,0 +1,33 @@
+ [
+ resource_path('views'),
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Compiled View Path
+ |--------------------------------------------------------------------------
+ |
+ | This option determines where all the compiled Blade templates will be
+ | stored for your application. Typically, this is within the storage
+ | directory. However, as usual, you are free to change this value.
+ |
+ */
+
+ 'compiled' => realpath(storage_path('framework/views')),
+
+];
diff --git a/database/.gitignore b/database/.gitignore
new file mode 100644
index 0000000..9b1dffd
--- /dev/null
+++ b/database/.gitignore
@@ -0,0 +1 @@
+*.sqlite
diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php
new file mode 100644
index 0000000..e0dc869
--- /dev/null
+++ b/database/factories/ModelFactory.php
@@ -0,0 +1,23 @@
+define(App\User::class, function (Faker\Generator $faker) {
+ static $password;
+
+ return [
+ 'name' => $faker->name,
+ 'email' => $faker->unique()->safeEmail,
+ 'password' => $password ?: $password = bcrypt('secret'),
+ 'remember_token' => str_random(10),
+ ];
+});
diff --git a/database/migrations/.gitkeep b/database/migrations/.gitkeep
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/database/migrations/.gitkeep
@@ -0,0 +1 @@
+
diff --git a/database/migrations/2017_07_04_104528_create_admin_users_table.php b/database/migrations/2017_07_04_104528_create_admin_users_table.php
new file mode 100644
index 0000000..5918c8e
--- /dev/null
+++ b/database/migrations/2017_07_04_104528_create_admin_users_table.php
@@ -0,0 +1,39 @@
+increments('id')->comment('ID');
+ $table->string('username')->unique('users_username_unique')->comment('用户名');
+ $table->string('email')->unique('users_email_unique')->comment('邮件');
+ $table->string('mobile', 11)->nullable()->comment('手机号码');
+ $table->smallInteger('sex')->default(1)->comment('性别');
+ $table->string('password', 60)->comment('密码');
+ $table->string('remember_token', 100)->nullable()->comment('TOKEN');
+ $table->timestamps();
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('admin_users');
+ }
+
+}
diff --git a/database/migrations/2017_07_04_104719_create_admin_roles_table.php b/database/migrations/2017_07_04_104719_create_admin_roles_table.php
new file mode 100644
index 0000000..6fb5cbf
--- /dev/null
+++ b/database/migrations/2017_07_04_104719_create_admin_roles_table.php
@@ -0,0 +1,36 @@
+increments('id')->comment('ID');
+ $table->string('name')->unique('roles_name_unique')->comment('角色名');
+ $table->string('display_name')->nullable()->comment('显示名');
+ $table->string('description')->nullable()->comment('描述');
+ $table->timestamps();
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('admin_roles');
+ }
+
+}
diff --git a/database/migrations/2017_07_04_104933_create_admin_logs_table.php b/database/migrations/2017_07_04_104933_create_admin_logs_table.php
new file mode 100644
index 0000000..c4d3410
--- /dev/null
+++ b/database/migrations/2017_07_04_104933_create_admin_logs_table.php
@@ -0,0 +1,37 @@
+integer('id', true)->comment('ID');
+ $table->integer('admin_id')->comment('用户ID');
+ $table->string('log_url', 128)->nullable()->comment('URL');
+ $table->string('log_ip', 20)->nullable()->comment('ip');
+ $table->string('log_info', 100)->nullable()->comment('描述');
+ $table->datetime('log_time')->nullable()->comment('日志日期');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('admin_logs');
+ }
+
+}
diff --git a/database/migrations/2017_07_04_104933_create_admin_menus_table.php b/database/migrations/2017_07_04_104933_create_admin_menus_table.php
new file mode 100644
index 0000000..1fee439
--- /dev/null
+++ b/database/migrations/2017_07_04_104933_create_admin_menus_table.php
@@ -0,0 +1,39 @@
+increments('id');
+ $table->integer('parent_id')->default(0)->comment('上级ID');
+ $table->integer('order')->default(0)->comment('菜单排序');
+ $table->string('title', 50)->nullable()->comment('标题');
+ $table->string('icon', 50)->comment('图标');
+ $table->string('uri', 50)->comment('URI');
+ $table->string('routes', 256)->nullable()->comment('路由,如url:/menu,controller:MenuController');
+ $table->timestamps();
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('admin_menus');
+ }
+
+}
diff --git a/database/migrations/2017_07_04_104933_create_admin_permission_menu_table.php b/database/migrations/2017_07_04_104933_create_admin_permission_menu_table.php
new file mode 100644
index 0000000..bccfa8f
--- /dev/null
+++ b/database/migrations/2017_07_04_104933_create_admin_permission_menu_table.php
@@ -0,0 +1,34 @@
+integer('permission_id');
+ $table->integer('menu_id');
+ $table->index(['permission_id','menu_id'], 'permission_menu_permission_id_menu_id_index');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('admin_permission_menu');
+ }
+
+}
diff --git a/database/migrations/2017_07_04_104933_create_admin_permission_role_table.php b/database/migrations/2017_07_04_104933_create_admin_permission_role_table.php
new file mode 100644
index 0000000..1398a29
--- /dev/null
+++ b/database/migrations/2017_07_04_104933_create_admin_permission_role_table.php
@@ -0,0 +1,34 @@
+integer('permission_id')->unsigned();
+ $table->integer('role_id')->unsigned()->index('permission_role_role_id_foreign');
+ $table->primary(['permission_id','role_id']);
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('admin_permission_role');
+ }
+
+}
diff --git a/database/migrations/2017_07_04_104933_create_admin_permissions_table.php b/database/migrations/2017_07_04_104933_create_admin_permissions_table.php
new file mode 100644
index 0000000..ab8035e
--- /dev/null
+++ b/database/migrations/2017_07_04_104933_create_admin_permissions_table.php
@@ -0,0 +1,37 @@
+increments('id')->comment('ID');
+ $table->string('name')->unique('permissions_name_unique')->comment('权限名 英文');
+ $table->string('display_name')->nullable()->comment('显示名 中文');
+ $table->string('description')->nullable()->comment('描述');
+ $table->string('controllers', 512)->nullable()->comment('对应的controllers');
+ $table->timestamps();
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('admin_permissions');
+ }
+
+}
diff --git a/database/migrations/2017_07_04_104933_create_admin_role_menu_table.php b/database/migrations/2017_07_04_104933_create_admin_role_menu_table.php
new file mode 100644
index 0000000..0493af1
--- /dev/null
+++ b/database/migrations/2017_07_04_104933_create_admin_role_menu_table.php
@@ -0,0 +1,34 @@
+integer('role_id');
+ $table->integer('menu_id');
+ $table->index(['role_id','menu_id'], 'role_menu_role_id_menu_id_index');
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('admin_role_menu');
+ }
+
+}
diff --git a/database/migrations/2017_07_04_104933_create_admin_role_user_table.php b/database/migrations/2017_07_04_104933_create_admin_role_user_table.php
new file mode 100644
index 0000000..8f6cef2
--- /dev/null
+++ b/database/migrations/2017_07_04_104933_create_admin_role_user_table.php
@@ -0,0 +1,34 @@
+integer('user_id')->unsigned();
+ $table->integer('role_id')->unsigned()->index('role_user_role_id_foreign');
+ $table->primary(['user_id','role_id']);
+ });
+ }
+
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::drop('admin_role_user');
+ }
+
+}
diff --git a/database/seeds/.gitkeep b/database/seeds/.gitkeep
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/database/seeds/.gitkeep
@@ -0,0 +1 @@
+
diff --git a/database/seeds/AdminMenusTableSeeder.php b/database/seeds/AdminMenusTableSeeder.php
new file mode 100644
index 0000000..28cd18f
--- /dev/null
+++ b/database/seeds/AdminMenusTableSeeder.php
@@ -0,0 +1,104 @@
+delete();
+ \DB::table('admin_menus')->insert(array (
+ 0 =>
+ array (
+ 'id' => 1,
+ 'parent_id' => 0,
+ 'order' => 4,
+ 'title' => '权限设置',
+ 'icon' => '',
+ 'uri' => 'url:/qx',
+ 'routes' => 'url:',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 1 =>
+ array (
+ 'id' => 2,
+ 'parent_id' => 1,
+ 'order' => 5,
+ 'title' => '用户管理',
+ 'icon' => '',
+ 'uri' => '/users',
+ 'routes' => 'url:/users',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 2 =>
+ array (
+ 'id' => 3,
+ 'parent_id' => 1,
+ 'order' => 6,
+ 'title' => '角色管理',
+ 'icon' => '',
+ 'uri' => '/roles',
+ 'routes' => 'url:/roles',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 3 =>
+ array (
+ 'id' => 4,
+ 'parent_id' => 1,
+ 'order' => 7,
+ 'title' => '权限管理',
+ 'icon' => '',
+ 'uri' => '/permissions',
+ 'routes' => 'url:/permissions',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 4 =>
+ array (
+ 'id' => 5,
+ 'parent_id' => 1,
+ 'order' => 8,
+ 'title' => '菜单管理',
+ 'icon' => '',
+ 'uri' => '/menus',
+ 'routes' => 'url:/menus',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 5 =>
+ array (
+ 'id' => 6,
+ 'parent_id' => 0,
+ 'order' => 1,
+ 'title' => '日志设置',
+ 'icon' => '',
+ 'uri' => '/log',
+ 'routes' => 'url:',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 6 =>
+ array (
+ 'id' => 7,
+ 'parent_id' => 6,
+ 'order' => 2,
+ 'title' => '日志管理',
+ 'icon' => '',
+ 'uri' => '/logs',
+ 'routes' => 'url:/logs',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ )
+ );
+ }
+}
\ No newline at end of file
diff --git a/database/seeds/AdminPermissionMenuTableSeeder.php b/database/seeds/AdminPermissionMenuTableSeeder.php
new file mode 100644
index 0000000..bf7cb9b
--- /dev/null
+++ b/database/seeds/AdminPermissionMenuTableSeeder.php
@@ -0,0 +1,64 @@
+delete();
+ \DB::table('admin_permission_menu')->insert(array(
+ 0 =>
+ array(
+ 'permission_id' => 1,
+ 'menu_id' => 2,
+ ),
+ 1 =>
+ array(
+ 'permission_id' => 2,
+ 'menu_id' => 2,
+ ),
+ 2 =>
+ array(
+ 'permission_id' => 3,
+ 'menu_id' => 3,
+ ),
+ 3 =>
+ array(
+ 'permission_id' => 4,
+ 'menu_id' => 3,
+ ),
+ 4 =>
+ array(
+ 'permission_id' => 5,
+ 'menu_id' => 4,
+ ),
+ 5 =>
+ array(
+ 'permission_id' => 6,
+ 'menu_id' => 4,
+ ),
+ 6 =>
+ array(
+ 'permission_id' => 7,
+ 'menu_id' => 5,
+ ),
+ 7 =>
+ array(
+ 'permission_id' => 8,
+ 'menu_id' => 5,
+ ),
+ 8 =>
+ array(
+ 'permission_id' => 9,
+ 'menu_id' => 7,
+ )
+ ));
+ }
+}
\ No newline at end of file
diff --git a/database/seeds/AdminPermissionRoleTableSeeder.php b/database/seeds/AdminPermissionRoleTableSeeder.php
new file mode 100644
index 0000000..2fb20d5
--- /dev/null
+++ b/database/seeds/AdminPermissionRoleTableSeeder.php
@@ -0,0 +1,66 @@
+delete();
+ \DB::table('admin_permission_role')->insert(array(
+ 0 =>
+ array(
+ 'permission_id' => 1,
+ 'role_id' => 1,
+ ),
+ 1 =>
+ array(
+ 'permission_id' => 2,
+ 'role_id' => 1,
+ ),
+ 2 =>
+ array(
+ 'permission_id' => 3,
+ 'role_id' => 1,
+ ),
+ 3 =>
+ array(
+ 'permission_id' => 4,
+ 'role_id' => 1,
+ ),
+ 4 =>
+ array(
+ 'permission_id' => 5,
+ 'role_id' => 1,
+ ),
+ 5 =>
+ array(
+ 'permission_id' => 6,
+ 'role_id' => 1,
+ ),
+ 6 =>
+ array(
+ 'permission_id' => 7,
+ 'role_id' => 1,
+ ),
+ 7 =>
+ array(
+ 'permission_id' => 8,
+ 'role_id' => 1,
+ ),
+ 8 =>
+ array(
+ 'permission_id' => 9,
+ 'role_id' => 1,
+ )
+ ));
+
+
+ }
+}
\ No newline at end of file
diff --git a/database/seeds/AdminPermissionsTableSeeder.php b/database/seeds/AdminPermissionsTableSeeder.php
new file mode 100644
index 0000000..d67b0bd
--- /dev/null
+++ b/database/seeds/AdminPermissionsTableSeeder.php
@@ -0,0 +1,109 @@
+delete();
+ \DB::table('admin_permissions')->insert(array(
+ 0 =>
+ array(
+ 'id' => 1,
+ 'name' => 'userlist',
+ 'display_name' => '用户管理查看',
+ 'description' => '用户管理查看',
+ 'controllers' => 'UserController@get',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 1 =>
+ array(
+ 'id' => 2,
+ 'name' => 'userhandle',
+ 'display_name' => '用户管理编辑',
+ 'description' => '用户管理编辑',
+ 'controllers' => 'UserController@post',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 2 =>
+ array(
+ 'id' => 3,
+ 'name' => 'rolelist',
+ 'display_name' => '角色管理查看',
+ 'description' => '角色管理查看',
+ 'controllers' => 'RoleController@get',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 3 =>
+ array(
+ 'id' => 4,
+ 'name' => 'rolehandle',
+ 'display_name' => '角色管理编辑',
+ 'description' => '角色管理编辑',
+ 'controllers' => 'RoleController@post',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 4 =>
+ array(
+ 'id' => 5,
+ 'name' => 'perlist',
+ 'display_name' => '权限管理查看',
+ 'description' => '权限管理查看',
+ 'controllers' => 'PermissionController@get',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 5 =>
+ array(
+ 'id' => 6,
+ 'name' => 'perhandle',
+ 'display_name' => '权限管理编辑',
+ 'description' => '权限管理编辑',
+ 'controllers' => 'PermissionController@post',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 6 =>
+ array(
+ 'id' => 7,
+ 'name' => 'menulist',
+ 'display_name' => '菜单管理查看',
+ 'description' => '菜单管理查看',
+ 'controllers' => 'MenuController@get',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 7 =>
+ array(
+ 'id' => 8,
+ 'name' => 'menuhandle',
+ 'display_name' => '菜单管理编辑',
+ 'description' => '菜单管理编辑',
+ 'controllers' => 'MenuController@post',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ 8 =>
+ array(
+ 'id' => 9,
+ 'name' => 'loglist',
+ 'display_name' => '日志管理查看',
+ 'description' => '日志管理查看',
+ 'controllers' => 'LogController@get',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ )
+ ));
+ }
+}
\ No newline at end of file
diff --git a/database/seeds/AdminRoleMenuTableSeeder.php b/database/seeds/AdminRoleMenuTableSeeder.php
new file mode 100644
index 0000000..a55a7a1
--- /dev/null
+++ b/database/seeds/AdminRoleMenuTableSeeder.php
@@ -0,0 +1,54 @@
+delete();
+ \DB::table('admin_role_menu')->insert(array(
+ 0 =>
+ array(
+ 'role_id' => 1,
+ 'menu_id' => 1,
+ ),
+ 1 =>
+ array(
+ 'role_id' => 1,
+ 'menu_id' => 2,
+ ),
+ 2 =>
+ array(
+ 'role_id' => 1,
+ 'menu_id' => 3,
+ ),
+ 3 =>
+ array(
+ 'role_id' => 1,
+ 'menu_id' => 4,
+ ),
+ 4 =>
+ array(
+ 'role_id' => 1,
+ 'menu_id' => 5,
+ ),
+ 5 =>
+ array(
+ 'role_id' => 1,
+ 'menu_id' => 6,
+ ),
+ 6 =>
+ array(
+ 'role_id' => 1,
+ 'menu_id' => 7,
+ )
+ ));
+ }
+}
\ No newline at end of file
diff --git a/database/seeds/AdminRoleUserTableSeeder.php b/database/seeds/AdminRoleUserTableSeeder.php
new file mode 100644
index 0000000..6063e15
--- /dev/null
+++ b/database/seeds/AdminRoleUserTableSeeder.php
@@ -0,0 +1,24 @@
+delete();
+ \DB::table('admin_role_user')->insert(array(
+ 0 =>
+ array(
+ 'user_id' => 1,
+ 'role_id' => 1,
+ ),
+ ));
+ }
+}
\ No newline at end of file
diff --git a/database/seeds/AdminRolesTableSeeder.php b/database/seeds/AdminRolesTableSeeder.php
new file mode 100644
index 0000000..da6d477
--- /dev/null
+++ b/database/seeds/AdminRolesTableSeeder.php
@@ -0,0 +1,28 @@
+delete();
+ \DB::table('admin_roles')->insert(array(
+ 0 =>
+ array(
+ 'id' => 1,
+ 'name' => 'admin',
+ 'display_name' => '超级管理员',
+ 'description' => '最高级的权限',
+ 'created_at' => date('Y-m-d H:i:s', time()),
+ 'updated_at' => date('Y-m-d H:i:s', time()),
+ ),
+ ));
+ }
+}
\ No newline at end of file
diff --git a/database/seeds/AdminUsersTableSeeder.php b/database/seeds/AdminUsersTableSeeder.php
new file mode 100644
index 0000000..5968014
--- /dev/null
+++ b/database/seeds/AdminUsersTableSeeder.php
@@ -0,0 +1,32 @@
+delete();
+ \DB::table('admin_users')->insert(array (
+ 0 =>
+ array (
+ 'id' => 1,
+ 'username' => 'admin',
+ 'email' => 'admin@admin.com',
+ 'mobile' => '18888888888',
+ 'sex' => 1,
+ 'password' => '$2y$10$0nZ2IJJQzkuwTUvmsxVCYOAFw09sGceAk5b9p.AQ.h7I0YEj975rO', //f123456
+ 'remember_token' => '',
+ 'created_at' => date('Y-m-d H:i:s',time()),
+ 'updated_at' => date('Y-m-d H:i:s',time()),
+ ),
+ )
+ );
+ }
+}
diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php
new file mode 100644
index 0000000..7d8f192
--- /dev/null
+++ b/database/seeds/DatabaseSeeder.php
@@ -0,0 +1,23 @@
+call(AdminUsersTableSeeder::class);
+ $this->call(AdminMenusTableSeeder::class);
+ $this->call(AdminRolesTableSeeder::class);
+ $this->call(AdminPermissionsTableSeeder::class);
+ $this->call(AdminRoleUserTableSeeder::class);
+ $this->call(AdminRoleMenuTableSeeder::class);
+ $this->call(AdminPermissionMenuTableSeeder::class);
+ $this->call(AdminPermissionRoleTableSeeder::class);
+ }
+}
diff --git a/database/sql/admin_logs.sql b/database/sql/admin_logs.sql
new file mode 100644
index 0000000..cea1929
--- /dev/null
+++ b/database/sql/admin_logs.sql
@@ -0,0 +1,9 @@
+CREATE TABLE `admin_logs` (
+ `id` bigint(16) unsigned NOT NULL AUTO_INCREMENT COMMENT '表id',
+ `admin_id` int(10) DEFAULT NULL COMMENT '管理员id',
+ `log_info` varchar(255) DEFAULT NULL COMMENT '日志描述',
+ `log_ip` varchar(30) DEFAULT NULL COMMENT 'ip地址',
+ `log_url` varchar(50) DEFAULT NULL COMMENT 'url',
+ `log_time` datetime DEFAULT NULL COMMENT '日志时间',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '后台日志表';
\ No newline at end of file
diff --git a/database/sql/admin_menus.sql b/database/sql/admin_menus.sql
new file mode 100644
index 0000000..787537a
--- /dev/null
+++ b/database/sql/admin_menus.sql
@@ -0,0 +1,12 @@
+CREATE TABLE `admin_menus` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '上级ID',
+ `order` int(11) NOT NULL DEFAULT '0' COMMENT '菜单排序,从1开始,数字越小排在超前,0为排在最后',
+ `title` varchar(50) DEFAULT NULL COMMENT '标题',
+ `icon` varchar(50) NOT NULL COMMENT '图标',
+ `uri` varchar(50) NOT NULL COMMENT 'URI',
+ `routes` varchar(256) DEFAULT NULL COMMENT '路由,如url:/menu,controller:MenuController',
+ `created_at` timestamp NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
+ `updated_at` timestamp NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '菜单表';
\ No newline at end of file
diff --git a/database/sql/admin_permission_menu.sql b/database/sql/admin_permission_menu.sql
new file mode 100644
index 0000000..7b4655b
--- /dev/null
+++ b/database/sql/admin_permission_menu.sql
@@ -0,0 +1,5 @@
+CREATE TABLE `admin_permission_menu` (
+ `permission_id` int(11) NOT NULL,
+ `menu_id` int(11) NOT NULL,
+ KEY `permission_menu_permission_id_menu_id_index` (`permission_id`,`menu_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
\ No newline at end of file
diff --git a/database/sql/admin_permission_role.sql b/database/sql/admin_permission_role.sql
new file mode 100644
index 0000000..212aab8
--- /dev/null
+++ b/database/sql/admin_permission_role.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `admin_permission_role` (
+ `permission_id` int(10) unsigned NOT NULL,
+ `role_id` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`permission_id`,`role_id`),
+ KEY `permission_role_role_id_foreign` (`role_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
\ No newline at end of file
diff --git a/database/sql/admin_permissions.sql b/database/sql/admin_permissions.sql
new file mode 100644
index 0000000..5cff8b5
--- /dev/null
+++ b/database/sql/admin_permissions.sql
@@ -0,0 +1,11 @@
+CREATE TABLE `admin_permissions` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `name` varchar(255) NOT NULL COMMENT '权限标识 英文',
+ `display_name` varchar(255) DEFAULT NULL COMMENT '权限名称 中文',
+ `description` varchar(255) DEFAULT NULL COMMENT '权限描述',
+ `controllers` varchar(512) DEFAULT NULL COMMENT '对应的controllers',
+ `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
+ `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `permissions_name_unique` (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
\ No newline at end of file
diff --git a/database/sql/admin_role_menu.sql b/database/sql/admin_role_menu.sql
new file mode 100644
index 0000000..6bf2965
--- /dev/null
+++ b/database/sql/admin_role_menu.sql
@@ -0,0 +1,5 @@
+CREATE TABLE `admin_role_menu` (
+ `role_id` int(11) NOT NULL,
+ `menu_id` int(11) NOT NULL,
+ KEY `role_menu_role_id_menu_id_index` (`role_id`,`menu_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
\ No newline at end of file
diff --git a/database/sql/admin_role_user.sql b/database/sql/admin_role_user.sql
new file mode 100644
index 0000000..ea18411
--- /dev/null
+++ b/database/sql/admin_role_user.sql
@@ -0,0 +1,6 @@
+CREATE TABLE `admin_role_user` (
+ `user_id` int(10) unsigned NOT NULL,
+ `role_id` int(10) unsigned NOT NULL,
+ PRIMARY KEY (`user_id`,`role_id`),
+ KEY `role_user_role_id_foreign` (`role_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;
\ No newline at end of file
diff --git a/database/sql/admin_roles.sql b/database/sql/admin_roles.sql
new file mode 100644
index 0000000..13190f1
--- /dev/null
+++ b/database/sql/admin_roles.sql
@@ -0,0 +1,10 @@
+CREATE TABLE `admin_roles` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `name` varchar(255) NOT NULL COMMENT '角色标识',
+ `display_name` varchar(255) DEFAULT NULL COMMENT '角色名称',
+ `description` varchar(255) DEFAULT NULL COMMENT '角色描述',
+ `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
+ `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `roles_name_unique` (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '角色表';
\ No newline at end of file
diff --git a/database/sql/admin_users.sql b/database/sql/admin_users.sql
new file mode 100644
index 0000000..a392d88
--- /dev/null
+++ b/database/sql/admin_users.sql
@@ -0,0 +1,14 @@
+CREATE TABLE `admin_users` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
+ `username` varchar(255) NOT NULL COMMENT '用户名',
+ `email` varchar(255) NOT NULL COMMENT '邮件',
+ `mobile` varchar(11) DEFAULT NULL COMMENT '手机号码',
+ `sex` smallint(3) NOT NULL DEFAULT 1 COMMENT '性别, 1为男,2为女',
+ `password` varchar(60) NOT NULL COMMENT '密码',
+ `remember_token` varchar(100) DEFAULT NULL COMMENT 'TOKEN',
+ `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
+ `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改时间',
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `users_username_unique` (`username`),
+ UNIQUE KEY `users_email_unique` (`email`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '管理用户表';
\ No newline at end of file
diff --git a/img/index.png b/img/index.png
new file mode 100644
index 0000000..61a0b50
Binary files /dev/null and b/img/index.png differ
diff --git a/img/log.png b/img/log.png
new file mode 100644
index 0000000..5bdfee7
Binary files /dev/null and b/img/log.png differ
diff --git a/img/m-index.png b/img/m-index.png
new file mode 100644
index 0000000..a75cd18
Binary files /dev/null and b/img/m-index.png differ
diff --git a/img/m-log.png b/img/m-log.png
new file mode 100644
index 0000000..c06f9dd
Binary files /dev/null and b/img/m-log.png differ
diff --git a/img/m-menu.png b/img/m-menu.png
new file mode 100644
index 0000000..16f33e0
Binary files /dev/null and b/img/m-menu.png differ
diff --git a/img/m-pre.png b/img/m-pre.png
new file mode 100644
index 0000000..49f6a46
Binary files /dev/null and b/img/m-pre.png differ
diff --git a/img/m-role.png b/img/m-role.png
new file mode 100644
index 0000000..8b16836
Binary files /dev/null and b/img/m-role.png differ
diff --git a/img/m-user.png b/img/m-user.png
new file mode 100644
index 0000000..e99e289
Binary files /dev/null and b/img/m-user.png differ
diff --git a/img/m-zhu.png b/img/m-zhu.png
new file mode 100644
index 0000000..dcd3327
Binary files /dev/null and b/img/m-zhu.png differ
diff --git a/img/menu.png b/img/menu.png
new file mode 100644
index 0000000..aaa483d
Binary files /dev/null and b/img/menu.png differ
diff --git a/img/pre.png b/img/pre.png
new file mode 100644
index 0000000..23bb381
Binary files /dev/null and b/img/pre.png differ
diff --git a/img/role.png b/img/role.png
new file mode 100644
index 0000000..35b99f9
Binary files /dev/null and b/img/role.png differ
diff --git a/img/user.png b/img/user.png
new file mode 100644
index 0000000..6c6de82
Binary files /dev/null and b/img/user.png differ
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..630a244
--- /dev/null
+++ b/package.json
@@ -0,0 +1,21 @@
+{
+ "private": true,
+ "scripts": {
+ "dev": "npm run development",
+ "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch-poll": "npm run watch -- --watch-poll",
+ "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "prod": "npm run production",
+ "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+ },
+ "devDependencies": {
+ "axios": "^0.16.2",
+ "bootstrap-sass": "^3.3.7",
+ "cross-env": "^5.0.1",
+ "jquery": "^3.1.1",
+ "laravel-mix": "^1.0",
+ "lodash": "^4.17.4",
+ "vue": "^2.1.10"
+ }
+}
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100644
index 0000000..9ecda83
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,31 @@
+
+
+
+
+ ./tests/Feature
+
+
+
+ ./tests/Unit
+
+
+
+
+ ./app
+
+
+
+
+
+
+
+
+
diff --git a/public/.htaccess b/public/.htaccess
new file mode 100644
index 0000000..903f639
--- /dev/null
+++ b/public/.htaccess
@@ -0,0 +1,20 @@
+
+
+ Options -MultiViews
+
+
+ RewriteEngine On
+
+ # Redirect Trailing Slashes If Not A Folder...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteRule ^(.*)/$ /$1 [L,R=301]
+
+ # Handle Front Controller...
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^ index.php [L]
+
+ # Handle Authorization Header
+ RewriteCond %{HTTP:Authorization} .
+ RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..e69de29
diff --git a/public/index.php b/public/index.php
new file mode 100644
index 0000000..1e1d775
--- /dev/null
+++ b/public/index.php
@@ -0,0 +1,58 @@
+
+ */
+
+/*
+|--------------------------------------------------------------------------
+| Register The Auto Loader
+|--------------------------------------------------------------------------
+|
+| Composer provides a convenient, automatically generated class loader for
+| our application. We just need to utilize it! We'll simply require it
+| into the script here so that we don't have to worry about manual
+| loading any of our classes later on. It feels great to relax.
+|
+*/
+
+require __DIR__.'/../bootstrap/autoload.php';
+
+/*
+|--------------------------------------------------------------------------
+| Turn On The Lights
+|--------------------------------------------------------------------------
+|
+| We need to illuminate PHP development, so let us turn on the lights.
+| This bootstraps the framework and gets it ready for use, then it
+| will load up this application so that we can run it and send
+| the responses back to the browser and delight our users.
+|
+*/
+
+$app = require_once __DIR__.'/../bootstrap/app.php';
+
+/*
+|--------------------------------------------------------------------------
+| Run The Application
+|--------------------------------------------------------------------------
+|
+| Once we have the application, we can handle the incoming request
+| through the kernel, and send the associated response back to
+| the client's browser allowing them to enjoy the creative
+| and wonderful application we have prepared for them.
+|
+*/
+
+$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
+
+$response = $kernel->handle(
+ $request = Illuminate\Http\Request::capture()
+);
+
+$response->send();
+
+$kernel->terminate($request, $response);
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..eb05362
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/public/static/admin/css/admin.css b/public/static/admin/css/admin.css
new file mode 100644
index 0000000..05b34e1
--- /dev/null
+++ b/public/static/admin/css/admin.css
@@ -0,0 +1,2144 @@
+/*圆角*/
+/*阴影*/
+/*字体*/
+/*动画属性*/
+/*清楚浮动*/
+/*2.1 栅格系统
+ Name: style_span
+ Example:
+
+ Explain: 栅格系统
+*/
+/*2.1 响应式栅格系统*/
+.container {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+.container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+@media (min-width: 992px) {
+ .container {
+ width: 960px;
+ }
+}
+@media (min-width: 1200px) {
+ .container {
+ width: 1170px;
+ }
+}
+@media (min-width: 1300px) {
+ .container {
+ width: 1270px;
+ }
+}
+@media print {
+ .container {
+ width: auto;
+ }
+}
+.row {
+ box-sizing: border-box;
+ margin-left: -15px;
+ margin-right: -15px;
+}
+.col-1,
+.col-2,
+.col-3,
+.col-4,
+.col-5,
+.col-6,
+.col-7,
+.col-8,
+.col-9,
+.col-10,
+.col-11,
+.col-12,
+.col-xs-1,
+.col-sm-1,
+.col-md-1,
+.col-lg-1,
+.col-xs-2,
+.col-sm-2,
+.col-md-2,
+.col-lg-2,
+.col-xs-3,
+.col-sm-3,
+.col-md-3,
+.col-lg-3,
+.col-xs-4,
+.col-sm-4,
+.col-md-4,
+.col-lg-4,
+.col-xs-5,
+.col-sm-5,
+.col-md-5,
+.col-lg-5,
+.col-xs-6,
+.col-sm-6,
+.col-md-6,
+.col-lg-6,
+.col-xs-7,
+.col-sm-7,
+.col-md-7,
+.col-lg-7,
+.col-xs-8,
+.col-sm-8,
+.col-md-8,
+.col-lg-8,
+.col-xs-9,
+.col-sm-9,
+.col-md-9,
+.col-lg-9,
+.col-xs-10,
+.col-sm-10,
+.col-md-10,
+.col-lg-10,
+.col-xs-11,
+.col-sm-11,
+.col-md-11,
+.col-lg-11,
+.col-xs-12,
+.col-sm-12,
+.col-md-12,
+.col-lg-12 {
+ min-height: 1px;
+ position: relative;
+ padding-left: 15px;
+ padding-right: 15px;
+ box-sizing: border-box;
+ -webkit-transition: all 0.3s ease-in;
+ -moz-transition: all 0.3s ease-in;
+ -o-transition: all 0.3s ease-in;
+ transition: all 0.3s ease-in;
+}
+.col-1 {
+ width: 8.33333%;
+}
+.col-2 {
+ width: 16.66667%;
+}
+.col-3 {
+ width: 25%;
+}
+.col-4 {
+ width: 33.33333%;
+}
+.col-5 {
+ width: 41.66667%;
+}
+.col-6 {
+ width: 50%;
+}
+.col-7 {
+ width: 58.33333%;
+}
+.col-8 {
+ width: 66.66667%;
+}
+.col-9 {
+ width: 75%;
+}
+.col-10 {
+ width: 83.33333%;
+}
+.col-11 {
+ width: 91.66667%;
+}
+.col-12 {
+ width: 100%;
+}
+.col-offset-0 {
+ margin-left: 0;
+}
+.col-offset-1 {
+ margin-left: 8.33333%;
+}
+.col-offset-2 {
+ margin-left: 16.66667%;
+}
+.col-offset-3 {
+ margin-left: 25%;
+}
+.col-offset-4 {
+ margin-left: 33.33333%;
+}
+.col-offset-5 {
+ margin-left: 41.66667%;
+}
+.col-offset-6 {
+ margin-left: 50%;
+}
+.col-offset-7 {
+ margin-left: 58.33333%;
+}
+.col-offset-8 {
+ margin-left: 66.66667%;
+}
+.col-offset-9 {
+ margin-left: 75%;
+}
+.col-offset-10 {
+ margin-left: 83.33333%;
+}
+.col-offset-11 {
+ margin-left: 91.66667%;
+}
+.col-push-0 {
+ position: relative;
+ left: 0;
+ right: auto;
+}
+.col-pull-0 {
+ right: 0;
+ left: auto;
+}
+.col-push-1 {
+ left: 8.33333%;
+ right: auto;
+}
+.col-pull-1 {
+ right: 8.33333%;
+ left: auto;
+}
+.col-push-2 {
+ left: 16.66667%;
+ right: auto;
+}
+.col-pull-2 {
+ right: 16.66667%;
+ left: auto;
+}
+.col-push-3 {
+ left: 25%;
+ right: auto;
+}
+.col-pull-3 {
+ right: 25%;
+ left: auto;
+}
+.col-push-4 {
+ left: 33.33333%;
+ right: auto;
+}
+.col-pull-4 {
+ right: 33.33333%;
+ left: auto;
+}
+.col-push-5 {
+ left: 41.66667%;
+ right: auto;
+}
+.col-pull-5 {
+ right: 41.66667%;
+ left: auto;
+}
+.col-push-6 {
+ left: 50%;
+ right: auto;
+}
+.col-pull-6 {
+ right: 50%;
+ left: auto;
+}
+.col-push-7 {
+ left: 58.33333%;
+ right: auto;
+}
+.col-pull-7 {
+ right: 58.33333%;
+ left: auto;
+}
+.col-push-8 {
+ left: 66.66667%;
+ right: auto;
+}
+.col-pull-8 {
+ right: 66.66667%;
+ left: auto;
+}
+.col-push-9 {
+ left: 75%;
+ right: auto;
+}
+.col-pull-9 {
+ right: 75%;
+ left: auto;
+}
+.col-push-10 {
+ left: 83.33333%;
+ right: auto;
+}
+.col-pull-10 {
+ right: 83.33333%;
+ left: auto;
+}
+.col-push-11 {
+ left: 91.66667%;
+ right: auto;
+}
+.col-pull-11 {
+ right: 91.66667%;
+ left: auto;
+}
+/*局部模块平分*/
+.col-1-1 {
+ width: 100%;
+}
+.col-2-1 {
+ width: 50%;
+}
+.col-3-1 {
+ width: 33.333333%;
+}
+.col-3-2 {
+ width: 66.666667%;
+}
+.col-4-1 {
+ width: 25%;
+}
+.col-4-3 {
+ width: 75%;
+}
+.col-5-1 {
+ width: 20%;
+}
+.col-5-2 {
+ width: 40%;
+}
+.col-5-3 {
+ width: 60%;
+}
+.col-5-4 {
+ width: 80%;
+}
+.col-6-1 {
+ width: 16.666667%;
+}
+.col-6-5 {
+ width: 83.333333%;
+}
+.col-xs-1,
+.col-xs-2,
+.col-xs-3,
+.col-xs-4,
+.col-xs-5,
+.col-xs-6,
+.col-xs-7,
+.col-xs-8,
+.col-xs-9,
+.col-xs-10,
+.col-xs-11,
+.col-xs-12 {
+ float: left;
+}
+.col-xs-12 {
+ width: 100%;
+}
+.col-xs-11 {
+ width: 91.66666667%;
+}
+.col-xs-10 {
+ width: 83.33333333%;
+}
+.col-xs-9 {
+ width: 75%;
+}
+.col-xs-8 {
+ width: 66.66666667%;
+}
+.col-xs-7 {
+ width: 58.33333333%;
+}
+.col-xs-6 {
+ width: 50%;
+}
+.col-xs-5 {
+ width: 41.66666667%;
+}
+.col-xs-4 {
+ width: 33.33333333%;
+}
+.col-xs-3 {
+ width: 25%;
+}
+.col-xs-2 {
+ width: 16.66666667%;
+}
+.col-xs-1 {
+ width: 8.33333333%;
+}
+.col-xs-pull-12 {
+ right: 100%;
+}
+.col-xs-pull-11 {
+ right: 91.66666667%;
+}
+.col-xs-pull-10 {
+ right: 83.33333333%;
+}
+.col-xs-pull-9 {
+ right: 75%;
+}
+.col-xs-pull-8 {
+ right: 66.66666667%;
+}
+.col-xs-pull-7 {
+ right: 58.33333333%;
+}
+.col-xs-pull-6 {
+ right: 50%;
+}
+.col-xs-pull-5 {
+ right: 41.66666667%;
+}
+.col-xs-pull-4 {
+ right: 33.33333333%;
+}
+.col-xs-pull-3 {
+ right: 25%;
+}
+.col-xs-pull-2 {
+ right: 16.66666667%;
+}
+.col-xs-pull-1 {
+ right: 8.33333333%;
+}
+.col-xs-pull-0 {
+ right: auto;
+}
+.col-xs-push-12 {
+ left: 100%;
+}
+.col-xs-push-11 {
+ left: 91.66666667%;
+}
+.col-xs-push-10 {
+ left: 83.33333333%;
+}
+.col-xs-push-9 {
+ left: 75%;
+}
+.col-xs-push-8 {
+ left: 66.66666667%;
+}
+.col-xs-push-7 {
+ left: 58.33333333%;
+}
+.col-xs-push-6 {
+ left: 50%;
+}
+.col-xs-push-5 {
+ left: 41.66666667%;
+}
+.col-xs-push-4 {
+ left: 33.33333333%;
+}
+.col-xs-push-3 {
+ left: 25%;
+}
+.col-xs-push-2 {
+ left: 16.66666667%;
+}
+.col-xs-push-1 {
+ left: 8.33333333%;
+}
+.col-xs-push-0 {
+ left: auto;
+}
+.col-xs-offset-12 {
+ margin-left: 100%;
+}
+.col-xs-offset-11 {
+ margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+ margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+ margin-left: 75%;
+}
+.col-xs-offset-8 {
+ margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+ margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+ margin-left: 50%;
+}
+.col-xs-offset-5 {
+ margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+ margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+ margin-left: 25%;
+}
+.col-xs-offset-2 {
+ margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+ margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+ margin-left: 0;
+}
+@media (max-width: 767px) {
+ .responsive [class^="col-"],
+ .responsive [class*=" col-"] {
+ float: none!important;
+ width: auto !important;
+ }
+ .responsive [class^="col-offset-"],
+ .responsive [class*=" col-offset-"] {
+ margin-left: 0px !important;
+ }
+}
+@media (min-width: 768px) {
+ .col-sm-1,
+ .col-sm-10,
+ .col-sm-11,
+ .col-sm-12,
+ .col-sm-2,
+ .col-sm-3,
+ .col-sm-4,
+ .col-sm-5,
+ .col-sm-6,
+ .col-sm-7,
+ .col-sm-8,
+ .col-sm-9 {
+ float: left;
+ }
+ .col-sm-12 {
+ width: 100%;
+ }
+ .col-sm-11 {
+ width: 91.66666667%;
+ }
+ .col-sm-10 {
+ width: 83.33333333%;
+ }
+ .col-sm-9 {
+ width: 75%;
+ }
+ .col-sm-8 {
+ width: 66.66666667%;
+ }
+ .col-sm-7 {
+ width: 58.33333333%;
+ }
+ .col-sm-6 {
+ width: 50%;
+ }
+ .col-sm-5 {
+ width: 41.66666667%;
+ }
+ .col-sm-4 {
+ width: 33.33333333%;
+ }
+ .col-sm-3 {
+ width: 25%;
+ }
+ .col-sm-2 {
+ width: 16.66666667%;
+ }
+ .col-sm-1 {
+ width: 8.33333333%;
+ }
+ .col-sm-pull-12 {
+ right: 100%;
+ }
+ .col-sm-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-sm-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-sm-pull-9 {
+ right: 75%;
+ }
+ .col-sm-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-sm-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-sm-pull-6 {
+ right: 50%;
+ }
+ .col-sm-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-sm-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-sm-pull-3 {
+ right: 25%;
+ }
+ .col-sm-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-sm-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-sm-pull-0 {
+ right: 0;
+ }
+ .col-sm-push-12 {
+ left: 100%;
+ }
+ .col-sm-push-11 {
+ left: 91.66666667%;
+ }
+ .col-sm-push-10 {
+ left: 83.33333333%;
+ }
+ .col-sm-push-9 {
+ left: 75%;
+ }
+ .col-sm-push-8 {
+ left: 66.66666667%;
+ }
+ .col-sm-push-7 {
+ left: 58.33333333%;
+ }
+ .col-sm-push-6 {
+ left: 50%;
+ }
+ .col-sm-push-5 {
+ left: 41.66666667%;
+ }
+ .col-sm-push-4 {
+ left: 33.33333333%;
+ }
+ .col-sm-push-3 {
+ left: 25%;
+ }
+ .col-sm-push-2 {
+ left: 16.66666667%;
+ }
+ .col-sm-push-1 {
+ left: 8.33333333%;
+ }
+ .col-sm-push-0 {
+ left: 0;
+ }
+ .col-sm-offset-12 {
+ margin-left: 100%;
+ }
+ .col-sm-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-sm-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-sm-offset-9 {
+ margin-left: 75%;
+ }
+ .col-sm-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-sm-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-sm-offset-6 {
+ margin-left: 50%;
+ }
+ .col-sm-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-sm-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-sm-offset-3 {
+ margin-left: 25%;
+ }
+ .col-sm-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-sm-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-sm-offset-0 {
+ margin-left: 0;
+ }
+}
+@media (min-width: 992px) {
+ .col-md-1,
+ .col-md-10,
+ .col-md-11,
+ .col-md-12,
+ .col-md-2,
+ .col-md-3,
+ .col-md-4,
+ .col-md-5,
+ .col-md-6,
+ .col-md-7,
+ .col-md-8,
+ .col-md-9 {
+ float: left;
+ }
+ .col-md-12 {
+ width: 100%;
+ }
+ .col-md-11 {
+ width: 91.66666667%;
+ }
+ .col-md-10 {
+ width: 83.33333333%;
+ }
+ .col-md-9 {
+ width: 75%;
+ }
+ .col-md-8 {
+ width: 66.66666667%;
+ }
+ .col-md-7 {
+ width: 58.33333333%;
+ }
+ .col-md-6 {
+ width: 50%;
+ }
+ .col-md-5 {
+ width: 41.66666667%;
+ }
+ .col-md-4 {
+ width: 33.33333333%;
+ }
+ .col-md-3 {
+ width: 25%;
+ }
+ .col-md-2 {
+ width: 16.66666667%;
+ }
+ .col-md-1 {
+ width: 8.33333333%;
+ }
+ .col-md-pull-12 {
+ right: 100%;
+ }
+ .col-md-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-md-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-md-pull-9 {
+ right: 75%;
+ }
+ .col-md-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-md-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-md-pull-6 {
+ right: 50%;
+ }
+ .col-md-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-md-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-md-pull-3 {
+ right: 25%;
+ }
+ .col-md-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-md-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-md-pull-0 {
+ right: 0;
+ }
+ .col-md-push-12 {
+ left: 100%;
+ }
+ .col-md-push-11 {
+ left: 91.66666667%;
+ }
+ .col-md-push-10 {
+ left: 83.33333333%;
+ }
+ .col-md-push-9 {
+ left: 75%;
+ }
+ .col-md-push-8 {
+ left: 66.66666667%;
+ }
+ .col-md-push-7 {
+ left: 58.33333333%;
+ }
+ .col-md-push-6 {
+ left: 50%;
+ }
+ .col-md-push-5 {
+ left: 41.66666667%;
+ }
+ .col-md-push-4 {
+ left: 33.33333333%;
+ }
+ .col-md-push-3 {
+ left: 25%;
+ }
+ .col-md-push-2 {
+ left: 16.66666667%;
+ }
+ .col-md-push-1 {
+ left: 8.33333333%;
+ }
+ .col-md-push-0 {
+ left: 0;
+ }
+ .col-md-offset-12 {
+ margin-left: 100%;
+ }
+ .col-md-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-md-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-md-offset-9 {
+ margin-left: 75%;
+ }
+ .col-md-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-md-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-md-offset-6 {
+ margin-left: 50%;
+ }
+ .col-md-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-md-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-md-offset-3 {
+ margin-left: 25%;
+ }
+ .col-md-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-md-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-md-offset-0 {
+ margin-left: 0;
+ }
+}
+@media (min-width: 1200px) {
+ .col-lg-1,
+ .col-lg-10,
+ .col-lg-11,
+ .col-lg-12,
+ .col-lg-2,
+ .col-lg-3,
+ .col-lg-4,
+ .col-lg-5,
+ .col-lg-6,
+ .col-lg-7,
+ .col-lg-8,
+ .col-lg-9 {
+ float: left;
+ }
+ .col-lg-12 {
+ width: 100%;
+ }
+ .col-lg-11 {
+ width: 91.66666667%;
+ }
+ .col-lg-10 {
+ width: 83.33333333%;
+ }
+ .col-lg-9 {
+ width: 75%;
+ }
+ .col-lg-8 {
+ width: 66.66666667%;
+ }
+ .col-lg-7 {
+ width: 58.33333333%;
+ }
+ .col-lg-6 {
+ width: 50%;
+ }
+ .col-lg-5 {
+ width: 41.66666667%;
+ }
+ .col-lg-4 {
+ width: 33.33333333%;
+ }
+ .col-lg-3 {
+ width: 25%;
+ }
+ .col-lg-2 {
+ width: 16.66666667%;
+ }
+ .col-lg-1 {
+ width: 8.33333333%;
+ }
+ .col-lg-pull-12 {
+ right: 100%;
+ }
+ .col-lg-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-lg-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-lg-pull-9 {
+ right: 75%;
+ }
+ .col-lg-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-lg-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-lg-pull-6 {
+ right: 50%;
+ }
+ .col-lg-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-lg-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-lg-pull-3 {
+ right: 25%;
+ }
+ .col-lg-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-lg-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-lg-pull-0 {
+ right: 0;
+ }
+ .col-lg-push-12 {
+ left: 100%;
+ }
+ .col-lg-push-11 {
+ left: 91.66666667%;
+ }
+ .col-lg-push-10 {
+ left: 83.33333333%;
+ }
+ .col-lg-push-9 {
+ left: 75%;
+ }
+ .col-lg-push-8 {
+ left: 66.66666667%;
+ }
+ .col-lg-push-7 {
+ left: 58.33333333%;
+ }
+ .col-lg-push-6 {
+ left: 50%;
+ }
+ .col-lg-push-5 {
+ left: 41.66666667%;
+ }
+ .col-lg-push-4 {
+ left: 33.33333333%;
+ }
+ .col-lg-push-3 {
+ left: 25%;
+ }
+ .col-lg-push-2 {
+ left: 16.66666667%;
+ }
+ .col-lg-push-1 {
+ left: 8.33333333%;
+ }
+ .col-lg-push-0 {
+ left: 0;
+ }
+ .col-lg-offset-12 {
+ margin-left: 100%;
+ }
+ .col-lg-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-lg-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-lg-offset-9 {
+ margin-left: 75%;
+ }
+ .col-lg-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-lg-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-lg-offset-6 {
+ margin-left: 50%;
+ }
+ .col-lg-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-lg-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-lg-offset-3 {
+ margin-left: 25%;
+ }
+ .col-lg-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-lg-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-lg-offset-0 {
+ margin-left: 0;
+ }
+}
+/*2.2 响应式隐藏显示
+ Name: style_Layout
+ Explain: 左右两栏|左中右三栏|上中下
+ Last Modify: guojunhui
+*/
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg,
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+ display: none !important;
+}
+@media (max-width: 767px) {
+ .visible-xs {
+ display: block !important;
+ }
+ table.visible-xs {
+ display: table;
+ }
+ tr.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important;
+ }
+ .hidden-xs {
+ display: none !important;
+ }
+ .visible-xs-block {
+ display: block !important;
+ }
+ .visible-xs-inline {
+ display: inline !important;
+ }
+ .visible-xs-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm {
+ display: block !important;
+ }
+ table.visible-sm {
+ display: table;
+ }
+ tr.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-sm,
+ td.visible-sm {
+ display: table-cell !important;
+ }
+ .hidden-sm {
+ display: none !important;
+ }
+ .visible-sm-block {
+ display: block !important;
+ }
+ .visible-sm-inline {
+ display: inline !important;
+ }
+ .visible-sm-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md {
+ display: block !important;
+ }
+ table.visible-md {
+ display: table;
+ }
+ tr.visible-md {
+ display: table-row !important;
+ }
+ th.visible-md,
+ td.visible-md {
+ display: table-cell !important;
+ }
+ .hidden-md {
+ display: none !important;
+ }
+ .visible-md-block {
+ display: block !important;
+ }
+ .visible-md-inline {
+ display: inline !important;
+ }
+ .visible-md-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg {
+ display: block !important;
+ }
+ table.visible-lg {
+ display: table;
+ }
+ tr.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-lg,
+ td.visible-lg {
+ display: table-cell !important;
+ }
+ .hidden-lg {
+ display: none !important;
+ }
+ .visible-lg-block {
+ display: block !important;
+ }
+ .visible-lg-inline {
+ display: inline !important;
+ }
+ .visible-lg-inline-block {
+ display: inline-block !important;
+ }
+}
+.visible-print {
+ display: none !important;
+}
+.visible-print-block {
+ display: none !important;
+}
+.visible-print-inline {
+ display: none !important;
+}
+.visible-print-inline-block {
+ display: none !important;
+}
+@media print {
+ .visible-print {
+ display: block !important;
+ }
+ table.visible-print {
+ display: table;
+ }
+ tr.visible-print {
+ display: table-row !important;
+ }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important;
+ }
+ .visible-print-block {
+ display: block !important;
+ }
+ .visible-print-inline {
+ display: inline !important;
+ }
+ .visible-print-inline-block {
+ display: inline-block !important;
+ }
+ .hidden-print {
+ display: none !important;
+ }
+}
+.panel {
+ background-color: #fff;
+ border: solid 1px transparent;
+}
+.panel-header {
+ border-bottom: solid 1px transparent;
+ padding: 8px 15px;
+ font-size: 14px;
+ font-weight: 700;
+}
+/*面板标题*/
+.panel-body {
+ padding: 15px;
+}
+/*面板内容*/
+.panel-footer {
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ padding: 5px 20px;
+}
+/*面板页脚*/
+/*默认面板*/
+.panel-default {
+ border-color: #dddddd;
+}
+.panel-default > .panel-header {
+ border-color: #ddd;
+ background-color: #f5f5f5;
+ color: #444444;
+}
+/*主要面板*/
+.panel-primary {
+ border-color: #5a98de;
+}
+.panel-primary > .panel-header {
+ border-color: #5a98de;
+ background-color: #5a98de;
+ color: #ffffff;
+}
+/*次要面板*/
+.panel-secondary {
+ border-color: #3bb4f2;
+}
+.panel-secondary > .panel-header {
+ border-color: #3bb4f2;
+ background-color: #3bb4f2;
+ color: #ffffff;
+}
+/*成功面板*/
+.panel-success {
+ border-color: #5eb95e;
+}
+.panel-success > .panel-header {
+ border-color: #5eb95e;
+ background-color: #5eb95e;
+ color: #ffffff;
+}
+/*警告面板*/
+.panel-warning {
+ border-color: #f37b1d;
+}
+.panel-warning > .panel-header {
+ border-color: #f37b1d;
+ background-color: #f37b1d;
+ color: #ffffff;
+}
+/*危险面板*/
+.panel-danger {
+ border-color: #dd514c;
+}
+.panel-danger > .panel-header {
+ border-color: #dd514c;
+ background-color: #dd514c;
+ color: #ffffff;
+}
+.f-l {
+ float: left;
+}
+.f-r {
+ float: right;
+}
+@font-face {
+ font-family: 'iconfont';
+ src: url('../fonts//iconfont.eot');
+ src: url('../fonts//iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('../fonts//iconfont.woff') format('woff'), /* Modern Browsers */ url('../fonts//iconfont.ttf') format('truetype'), /* Safari, Android, iOS */ url('../fonts//iconfont.svg#svgFontName') format('svg');
+
+ /* IE9 Compat Modes */
+ /* Legacy iOS */
+}
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -webkit-text-stroke-width: 0.2px;
+ -moz-osx-font-smoothing: grayscale;
+}
+.panel-default {
+ border-color: #ebeaea;
+}
+.panel-default .panel-header {
+ border-color: transparent;
+ background-color: #fff;
+ color: #555555;
+}
+.panel-header {
+ border-bottom: solid 1px transparent;
+ padding: 8px 15px;
+ font-size: 16px;
+ font-weight: normal;
+}
+.layui-form-select dl dd.layui-this {
+ background: #f2f2f2;
+ color: #333;
+}
+.layui-btn-primary:hover {
+ border-color: #00b5f9;
+ color: #333;
+}
+.layui-tab-bar {
+ position: absolute;
+ right: 3px;
+ top: 3px;
+ z-index: 10;
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+ border: 1px solid #e2e2e2;
+ border-radius: 2px;
+ background-color: #fff;
+}
+.layui-elem-quote {
+ border-left: 5px solid #00b5f9;
+}
+/*清楚浮动*/
+.clearfix {
+ zoom: 1;
+}
+.clearfix:after {
+ display: block;
+ content: '';
+ clear: both;
+}
+.layui-nav-no-bg {
+ background: transparent;
+ width: auto;
+}
+.layui-nav-no-bg.layui-nav-tree .layui-nav-item a:hover {
+ background-color: transparent;
+ color: #00b5f9;
+}
+.layui-nav-no-bg.layui-nav .layui-nav-item a {
+ color: #333;
+}
+.layui-nav-no-bg .layui-nav-itemed > a,
+.layui-nav-no-bg .layui-nav-tree .layui-nav-title a,
+.layui-nav-no-bg .layui-nav-tree .layui-nav-title a:hover {
+ background: transparent!important;
+ color: #333!important;
+}
+.layui-nav-no-bg.layui-nav-tree .layui-nav-child a {
+ height: 40px;
+ line-height: 40px;
+ text-indent: 10px;
+ color: #666;
+}
+.layui-nav-no-bg.layui-nav-tree .layui-nav-child dd.layui-this,
+.layui-nav-no-bg.layui-nav-tree .layui-this,
+.layui-nav-no-bg.layui-nav-tree .layui-this > a:hover {
+ background-color: #fff;
+ color: #00b5f9;
+}
+.layui-nav-no-bg.layui-nav-tree .layui-this > a {
+ background-color: #fff;
+ color: #00b5f9;
+ border-left: 3px solid #00b5f9;
+ margin-right: -20px;
+}
+.layui-nav-no-bg .layui-nav-bar {
+ display: none;
+}
+.showSubBtn {
+ width: 16px;
+ height: 16px;
+ line-height: 16px;
+ margin-left: 5px;
+}
+.commentList .item {
+ list-style: none outside none;
+ margin: 1.6rem 0 0;
+}
+.commentList .avatar {
+ border: 1px solid transparent;
+ float: left;
+}
+.comment-main {
+ position: relative;
+ margin-left: 64px;
+ border: 1px solid #dedede;
+ border-radius: 2px;
+}
+.comment-main:after,
+.comment-main:before {
+ position: absolute;
+ top: 11px;
+ left: -16px;
+ right: 100%;
+ width: 0;
+ height: 0;
+ display: block;
+ content: " ";
+ border-color: transparent;
+ border-style: solid solid outset;
+ pointer-events: none;
+}
+.comment-main:before {
+ border-right-color: #dedede;
+ border-width: 8px;
+}
+.comment-main:after {
+ border-width: 7px;
+ border-right-color: #f8f8f8;
+ margin-top: 1px;
+ margin-left: 2px;
+}
+.comment-header {
+ padding: 10px 15px;
+ background: #f8f8f8;
+ border-bottom: 1px solid #eee;
+}
+.comment-title {
+ margin: 0 0 8px;
+ font-size: 1.6rem;
+ line-height: 1.2;
+}
+.comment-meta {
+ font-size: 13px;
+ color: #999;
+ line-height: 1.2;
+}
+.comment-meta a {
+ color: #999;
+}
+.comment-author {
+ font-weight: 700;
+ color: #999;
+}
+.comment-body {
+ padding: 15px;
+ overflow: hidden;
+}
+.comment-body > :last-child {
+ margin-bottom: 0;
+}
+.commentList .comment-flip .avatar {
+ float: right;
+}
+.comment-flip .comment-main {
+ margin-left: 0;
+ margin-right: 64px;
+}
+.comment-flip .comment-main:before {
+ border-left-color: #dedede;
+ border-right-color: transparent;
+}
+.comment-flip .comment-main:after,
+.comment-flip .comment-main:before {
+ left: 100%;
+ position: absolute;
+ right: -16px;
+}
+.comment-flip .comment-main:after {
+ border-left-color: #f8f8f8;
+ border-right-color: transparent;
+ margin-left: auto;
+ margin-right: 2px;
+}
+/*3.6.3 头像
+ Name: mod_avatar
+ Example:
+*/
+.avatar {
+ display: inline-block;
+ position: relative;
+ overflow: hidden;
+}
+.avatar img {
+ display: block;
+}
+.avatar.radius,
+.avatar.radius img {
+ border-radius: 50%;
+}
+.avatar,
+.avatar img {
+ width: 32px;
+ height: 32px;
+}
+.avatar.size-MINI {
+ width: 16px;
+ height: 16px;
+}
+.avatar.size-S,
+.avatar.size-S img {
+ width: 24px;
+ height: 24px;
+}
+.avatar.size-M,
+.avatar.size-M img {
+ width: 32px;
+ height: 32px;
+}
+/*默认为中,可以不写,可以理解为:均码*/
+.avatar.size-L,
+.avatar.size-L img {
+ width: 40px;
+ height: 40px;
+}
+.avatar.size-XL,
+.avatar.size-XL img {
+ width: 64px;
+ height: 64px;
+}
+.avatar.size-XXL,
+.avatar.size-XXL img {
+ width: 100px;
+ height: 100px;
+}
+.avatar.size-XXXL,
+.avatar.size-XXXL img {
+ width: 128px;
+ height: 128px;
+}
+.page-wrap {
+ text-align: center;
+}
+.pagination {
+ display: inline-block;
+ *display: inline;
+ *zoom: 1;
+ text-align: center;
+ margin: 10px 0;
+ font-size: 0;
+}
+.pagination li {
+ position: relative;
+ display: inline-block;
+ *display: inline;
+ *zoom: 1;
+ border: 1px solid #e2e2e2;
+ width: 28px;
+ height: 28px;
+ line-height: 28px;
+ margin: 0 -1px 5px 0;
+ background-color: #fff;
+ color: #333;
+ font-size: 12px;
+ text-align: center;
+}
+.pagination li a {
+ display: block;
+ width: 100%;
+ height: 100%;
+}
+.pagination li.active {
+ border: 1px solid #1E9FFF;
+}
+.pagination li.active span {
+ display: block;
+ width: 100%;
+ height: 100%;
+ background-color: #1E9FFF;
+ color: #fff;
+}
+.pagination li.disabled {
+ background: #f2f2f2;
+}
+.main-layout {
+ overflow: hidden;
+ width: 100%;
+ height: 100%;
+}
+.main-layout.hide-side .main-layout-side {
+ left: -200px;
+}
+.main-layout.hide-side .main-layout-container {
+ left: 0;
+}
+.main-layout-side {
+ width: 200px;
+ height: 100%;
+ background: #444c63;
+ position: absolute;
+ left: 0;
+ top: 0;
+ bottom: 0;
+ overflow: auto;
+ z-index: 1;
+ -webkit-transition: left 0.3s;
+ -moz-transition: left 0.3s;
+ -ms-transition: left 0.3s;
+ transition: left 0.3s;
+}
+.main-layout-side .m-logo {
+ width: 100%;
+ height: 60px;
+ background: #00b5f9 url(../images/logo.png) center center no-repeat;
+}
+.main-layout-side .layui-nav {
+ background: #444c63;
+}
+.main-layout-side .layui-nav .iconfont {
+ padding-right: 10px;
+ font-size: 18px;
+ color: #8f94a1;
+ position: relative;
+ top: 2px;
+}
+.main-layout-side .layui-nav-itemed > a {
+ background: #444c63 !important;
+}
+.main-layout-side .layui-nav-tree .layui-nav-child a {
+ height: 40px;
+ line-height: 40px;
+ color: #77829f;
+}
+.main-layout-side .layui-nav-tree .layui-nav-child a:hover {
+ color: #00b5f9;
+}
+.main-layout-side .layui-nav-tree .layui-nav-child a .l-line {
+ width: 12px;
+ display: inline-block;
+ line-height: 40px;
+ height: 40px;
+ float: left;
+ margin-right: 10px;
+ margin-left: 30px;
+ background: url("../images/l-line.png") left center no-repeat;
+}
+.main-layout-side .layui-nav-tree .layui-nav-child dd.layui-this,
+.main-layout-side .layui-nav-tree .layui-this {
+ background-color: #444c63;
+}
+.main-layout-side .layui-nav-tree .layui-nav-child .layui-this > a {
+ background-color: #444c63;
+ color: #00b5f9;
+}
+.main-layout-side .layui-nav-tree .layui-this > a {
+ background-color: rgba(0, 181, 249, 0.8);
+ color: #fff;
+}
+.main-layout-side .layui-nav-tree .layui-this > a .iconfont {
+ color: #fff;
+}
+.main-layout-side .layui-nav-tree .layui-nav-bar {
+ background-color: rgba(0, 181, 245, 0.8);
+}
+.main-layout-container {
+ position: absolute;
+ left: 200px;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ background: #f5f5f5;
+ -webkit-transition: left 0.3s;
+ -moz-transition: left 0.3s;
+ -ms-transition: left 0.3s;
+ transition: left 0.3s;
+}
+.main-layout-header {
+ height: 60px;
+ border-bottom: 1px solid #f0f0f0;
+ background: #fff;
+}
+.main-layout-header a {
+ text-decoration: none;
+}
+.main-layout-header .menu-btn {
+ float: left;
+ width: 60px;
+ height: 60px;
+ line-height: 60px;
+ text-align: center;
+}
+.main-layout-header .menu-btn .iconfont {
+ font-size: 20px;
+ color: #444c63;
+}
+.main-layout-header .layui-nav {
+ float: right;
+ padding: 0;
+ background: transparent;
+}
+.main-layout-header .layui-nav li {
+ border-left: 1px solid #f2f3f5;
+}
+.main-layout-header .layui-nav .layui-nav-item > a:hover {
+ color: #999;
+}
+.main-layout-header .layui-nav > .layui-this a {
+ color: #00b5f9;
+}
+.main-layout-header .layui-nav .layui-nav-bar {
+ display: none;
+}
+.main-layout-header .layui-nav .layui-this:after {
+ height: 0;
+}
+.main-layout-header .layui-nav .layui-nav-child dd.layui-this a {
+ color: #333;
+}
+.main-layout-header .layui-nav .layui-nav-child dd.layui-this {
+ color: #333;
+ background: #f2f2f2;
+}
+.main-layout-body {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 61px;
+ overflow: hidden;
+}
+.main-layout-tab {
+ margin-top: 0;
+}
+.main-layout-tab .layui-tab-title {
+ border-bottom: 1px solid #f0f0f0;
+ z-index: 98;
+ background: #fff;
+}
+.main-layout-tab.layui-tab-brief > .layui-tab-title .layui-this {
+ color: #00b5f9;
+}
+.main-layout-tab.layui-tab-brief > .layui-tab-more li.layui-this:after,
+.main-layout-tab.layui-tab-brief > .layui-tab-title .layui-this:after {
+ border: none;
+ border-radius: 0;
+ border-bottom: 3px solid #00b5f9;
+}
+.main-layout-tab .welcome .layui-tab-close {
+ display: none;
+}
+.main-layout-tab .layui-tab-content {
+ position: absolute;
+ right: 0;
+ left: 0;
+ bottom: 0;
+ top: 41px;
+ padding: 0;
+ z-index: 97;
+ background: #f5f5f5;
+ padding: 0px;
+ box-sizing: border-box;
+}
+.main-layout-tab .layui-tab-content .layui-tab-item {
+ width: 100%;
+ height: 100%;
+ background: #fff;
+}
+.wrap-container {
+ width: 100%;
+ height: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.iframe {
+ border: 0;
+}
+.main-mask {
+ display: none;
+ position: fixed;
+ z-index: 99;
+ left: 0;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.3);
+}
+@media (max-width: 768px) {
+ .main-layout-side {
+ position: fixed;
+ left: -200px;
+ overflow: auto;
+ overflow-x: hidden;
+ z-index: 100;
+ }
+ .main-layout-container {
+ position: absolute;
+ left: 0px;
+ right: 0;
+ top: 0;
+ bottom: 0;
+ }
+ .main-layout.hide-side .main-layout-side {
+ left: 0;
+ }
+ .main-layout.hide-side .main-mask {
+ display: block;
+ }
+ ::-webkit-scrollbar {
+ width: 2px;
+ height: 10px;
+ }
+}
+.email-wrap {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ height: 100%;
+ width: 100%;
+ padding: 15px;
+ background: #f5f5f5;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+.email-wrap .email-write-btn {
+ width: 100%;
+}
+.email-wrap .email-folder {
+ padding-top: 20px;
+}
+.email-wrap .email-folder dt {
+ font-size: 14px;
+ font-weight: bold;
+ color: #333;
+ line-height: 32px;
+}
+.email-wrap .email-folder dd {
+ font-size: 12px;
+ color: #545454;
+ line-height: 32px;
+ border-bottom: 1px solid #eee;
+}
+.email-wrap .email-folder dd button {
+ margin-top: 4px;
+}
+.email-wrap .email-folder dd .iconfont,
+.email-wrap .email-folder dd .layui-icon {
+ float: left;
+ padding-right: 10px;
+ font-size: 16px;
+}
+.email-wrap .email-classify {
+ padding-top: 20px;
+}
+.email-wrap .email-classify dt {
+ font-size: 14px;
+ font-weight: bold;
+ color: #333;
+ line-height: 32px;
+}
+.email-wrap .email-classify dd {
+ font-size: 12px;
+ color: #545454;
+ line-height: 32px;
+}
+.email-wrap .email-classify dd .iconfont,
+.email-wrap .email-classify dd .layui-icon {
+ float: left;
+ padding-right: 10px;
+ font-size: 14px;
+}
+.email-wrap .email-classify dd .icon-blue {
+ color: #01AAED;
+}
+.email-wrap .email-classify dd .icon-green {
+ color: #009688;
+}
+.email-wrap .email-classify dd .icon-wran {
+ color: #F7B824;
+}
+.email-wrap .email-classify dd .icon-red {
+ color: #FF5722;
+}
+.email-wrap .email-classify dd .icon-gray {
+ color: #2F4056;
+}
+.email-wrap .email-label {
+ padding-top: 20px;
+ padding-bottom: 20px;
+}
+.email-wrap .email-label dt {
+ font-size: 14px;
+ font-weight: bold;
+ color: #333;
+ line-height: 32px;
+}
+.email-wrap .email-label .layui-btn {
+ margin-bottom: 10px;
+}
+.email-wrap .email-label .layui-btn + .layui-btn {
+ margin-left: 0;
+ margin-right: 0;
+}
+.email-wrap .email-content {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ background: #fff;
+ height: 100%;
+ width: 100%;
+ overflow: auto;
+ padding: 15px;
+ overflow: hidden;
+}
+.iframe-h {
+ height: 100%;
+}
+.email-write {
+ padding: 15px;
+}
+.email-write .layui-btn {
+ margin-bottom: 10px;
+}
+.email-content-title {
+ padding: 15px;
+}
+.email-content-title .write-title {
+ font-size: 20px;
+}
+.email-tool-btn {
+ margin-top: 3px;
+}
+.email-tool-btn .layui-form-item {
+ margin: 0;
+}
+.email-tool-btn .layui-form-item .layui-inline {
+ margin-bottom: 0;
+}
+.email-tool-btn .email-tool-btn-right {
+ text-align: right;
+}
+.email-list {
+ padding: 0 15px;
+}
+@media (max-width: 768px) {
+ .email-wrap .email-content {
+ padding: 0;
+ }
+ .email-write {
+ padding: 15px;
+ }
+ .email-write .layui-btn {
+ width: 100%;
+ margin: 0 0 10px;
+ }
+ .email-tool-btn .email-tool-btn-right {
+ text-align: left;
+ }
+ .email-tool-btn-left,
+ .email-tool-btn-right {
+ padding-bottom: 10px;
+ }
+ .email-tool-btn-left .layui-inline,
+ .email-tool-btn-right .layui-inline {
+ padding-bottom: 10px;
+ }
+}
+.welcome-container {
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+ padding: 15px 0;
+}
+/***********welcome***********/
+.welcome-left-container .data-show li {
+ height: 95px;
+ margin-bottom: 15px;
+}
+.welcome-left-container .data-show a {
+ display: block;
+ background: #fff;
+ padding: 10px;
+ border: 1px solid #ebeaea;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.welcome-left-container .data-show .icon-bg {
+ width: 68px;
+ height: 68px;
+ text-align: center;
+ -webkit-border-radius: 70px;
+ -moz-border-radius: 70px;
+ -ms-border-radius: 70px;
+ border-radius: 70px;
+}
+.welcome-left-container .data-show .icon-bg .iconfont {
+ color: #fff;
+ font-size: 36px;
+ position: relative;
+ top: 15px;
+}
+.welcome-left-container .data-show .bg-org {
+ background: #f8bb74;
+}
+.welcome-left-container .data-show .bg-blue {
+ background: #86d2ee;
+}
+.welcome-left-container .data-show .bg-green {
+ background: #94e0e1;
+}
+.welcome-left-container .data-show .right-text-con {
+ padding-left: 78px;
+}
+.welcome-left-container .data-show p {
+ margin: 0;
+ color: #a0a8b4;
+}
+.welcome-left-container .data-show .color-org,
+.welcome-left-container .data-show .color-blue,
+.welcome-left-container .data-show .color-green {
+ font-size: 28px;
+ padding-right: 10px;
+ font-family: "arial";
+}
+.welcome-left-container .data-show .color-org {
+ color: #f8bb74;
+}
+.welcome-left-container .data-show .color-blue {
+ color: #86d2ee;
+}
+.welcome-left-container .data-show .color-green {
+ color: #94e0e1;
+}
+.welcome-left-container .data-show .name {
+ margin-bottom: 10px;
+ font-size: 16px;
+ color: #555555;
+}
+.welcome-left-container .chart-panel {
+ margin: 0px 15px 15px;
+}
+.welcome-left-container .server-panel {
+ margin: 15px;
+}
+.welcome-left-container .server-panel .panel-header {
+ padding-bottom: 0;
+}
+.welcome-left-container .server-panel .panel-body div {
+ padding: 0;
+}
+.welcome-left-container .server-panel .title {
+ background: #f2f2f2;
+ height: 40px;
+ line-height: 40px;
+ padding-left: 15px;
+ margin: 0;
+}
+.welcome-left-container .server-panel span {
+ height: 30px;
+ padding-top: 10px;
+ padding-left: 15px;
+ display: block;
+ background: #fafafa;
+}
+.welcome-edge {
+ padding: 0 30px 15px 0;
+}
+.welcome-edge .commentbox {
+ background: #fff;
+}
+.welcome-edge .comment-panel .panel-body {
+ padding-top: 10px;
+}
+.welcome-edge .comment-panel .commentList .item {
+ margin: 0 0 20px;
+}
+.welcome-edge .contact-panel {
+ margin-top: 15px;
+}
+.welcome-edge .contact-panel .panel-header {
+ padding-bottom: 0;
+}
+@media all and (max-width: 1200px) {
+ .welcome-edge {
+ padding: 0 30px 15px 30px;
+ }
+}
+.column-wrap {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ height: 100%;
+ width: 100%;
+ padding: 0px;
+ background: #f5f5f5;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+.iframe-h {
+ height: 100%;
+}
+.column-edge {
+ float: left;
+ padding-top: 16px;
+ width: 150px;
+ height: 100%;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.column-content {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 15px;
+ background: #f5f5f5;
+ height: 100%;
+ overflow-x: hidden;
+ margin-left: 0px;
+}
+.column-content-detail {
+ background: #fff;
+ padding: 20px;
+ margin: 0;
+}
+.page-content {
+ padding: 0px;
+}
+.page-content-wrap {
+ background: #fff;
+ padding: 20px;
+ margin: 0;
+}
+@media (max-width: 600px) {
+ .layui-nav-no-bg {
+ background: #fff;
+ }
+ .layui-nav-no-bg .layui-nav-item {
+ border-bottom: 1px solid #f8f8f8;
+ }
+ .column-edge {
+ float: none;
+ width: 100%;
+ height: auto;
+ padding-bottom: 10px;
+ }
+ .column-content {
+ background: #fff;
+ height: auto;
+ margin-left: 0px;
+ }
+ .layui-tab-content {
+ padding: 15px 0;
+ }
+ .layui-form-label {
+ padding: 9px 0px;
+ }
+ .layui-input-block {
+ margin-left: 80px;
+ }
+}
diff --git a/public/static/admin/css/avatar.css b/public/static/admin/css/avatar.css
new file mode 100644
index 0000000..01abe38
--- /dev/null
+++ b/public/static/admin/css/avatar.css
@@ -0,0 +1,56 @@
+/*3.6.3 头像
+ Name: mod_avatar
+ Example:
+*/
+.avatar {
+ display: inline-block;
+ position: relative;
+ overflow: hidden;
+}
+.avatar img {
+ display: block;
+}
+.avatar.radius,
+.avatar.radius img {
+ border-radius: 50%;
+}
+.avatar,
+.avatar img {
+ width: 32px;
+ height: 32px;
+}
+.avatar.size-MINI {
+ width: 16px;
+ height: 16px;
+}
+.avatar.size-S,
+.avatar.size-S img {
+ width: 24px;
+ height: 24px;
+}
+.avatar.size-M,
+.avatar.size-M img {
+ width: 32px;
+ height: 32px;
+}
+/*默认为中,可以不写,可以理解为:均码*/
+.avatar.size-L,
+.avatar.size-L img {
+ width: 40px;
+ height: 40px;
+}
+.avatar.size-XL,
+.avatar.size-XL img {
+ width: 64px;
+ height: 64px;
+}
+.avatar.size-XXL,
+.avatar.size-XXL img {
+ width: 100px;
+ height: 100px;
+}
+.avatar.size-XXXL,
+.avatar.size-XXXL img {
+ width: 128px;
+ height: 128px;
+}
diff --git a/public/static/admin/css/column.css b/public/static/admin/css/column.css
new file mode 100644
index 0000000..6c72dbb
--- /dev/null
+++ b/public/static/admin/css/column.css
@@ -0,0 +1,74 @@
+.column-wrap {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ height: 100%;
+ width: 100%;
+ padding: 0px;
+ background: #f5f5f5;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+.iframe-h {
+ height: 100%;
+}
+.column-edge {
+ float: left;
+ padding-top: 16px;
+ width: 150px;
+ height: 100%;
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+.column-content {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 15px;
+ background: #f5f5f5;
+ height: 100%;
+ overflow-x: hidden;
+ margin-left: 0px;
+}
+.column-content-detail {
+ background: #fff;
+ padding: 20px;
+ margin: 0;
+}
+.page-content {
+ padding: 0px;
+}
+.page-content-wrap {
+ background: #fff;
+ padding: 20px;
+ margin: 0;
+}
+@media (max-width: 600px) {
+ .layui-nav-no-bg {
+ background: #fff;
+ }
+ .layui-nav-no-bg .layui-nav-item {
+ border-bottom: 1px solid #f8f8f8;
+ }
+ .column-edge {
+ float: none;
+ width: 100%;
+ height: auto;
+ padding-bottom: 10px;
+ }
+ .column-content {
+ background: #fff;
+ height: auto;
+ margin-left: 0px;
+ }
+ .layui-tab-content {
+ padding: 15px 0;
+ }
+ .layui-form-label {
+ padding: 9px 0px;
+ }
+ .layui-input-block {
+ margin-left: 80px;
+ }
+}
diff --git a/public/static/admin/css/comment.css b/public/static/admin/css/comment.css
new file mode 100644
index 0000000..f21d232
--- /dev/null
+++ b/public/static/admin/css/comment.css
@@ -0,0 +1,90 @@
+.commentList .item {
+ list-style: none outside none;
+ margin: 1.6rem 0 0;
+}
+.commentList .avatar {
+ border: 1px solid transparent;
+ float: left;
+}
+.comment-main {
+ position: relative;
+ margin-left: 64px;
+ border: 1px solid #dedede;
+ border-radius: 2px;
+}
+.comment-main:after,
+.comment-main:before {
+ position: absolute;
+ top: 11px;
+ left: -16px;
+ right: 100%;
+ width: 0;
+ height: 0;
+ display: block;
+ content: " ";
+ border-color: transparent;
+ border-style: solid solid outset;
+ pointer-events: none;
+}
+.comment-main:before {
+ border-right-color: #dedede;
+ border-width: 8px;
+}
+.comment-main:after {
+ border-width: 7px;
+ border-right-color: #f8f8f8;
+ margin-top: 1px;
+ margin-left: 2px;
+}
+.comment-header {
+ padding: 10px 15px;
+ background: #f8f8f8;
+ border-bottom: 1px solid #eee;
+}
+.comment-title {
+ margin: 0 0 8px;
+ font-size: 1.6rem;
+ line-height: 1.2;
+}
+.comment-meta {
+ font-size: 13px;
+ color: #999;
+ line-height: 1.2;
+}
+.comment-meta a {
+ color: #999;
+}
+.comment-author {
+ font-weight: 700;
+ color: #999;
+}
+.comment-body {
+ padding: 15px;
+ overflow: hidden;
+}
+.comment-body > :last-child {
+ margin-bottom: 0;
+}
+.commentList .comment-flip .avatar {
+ float: right;
+}
+.comment-flip .comment-main {
+ margin-left: 0;
+ margin-right: 64px;
+}
+.comment-flip .comment-main:before {
+ border-left-color: #dedede;
+ border-right-color: transparent;
+}
+.comment-flip .comment-main:after,
+.comment-flip .comment-main:before {
+ left: 100%;
+ position: absolute;
+ right: -16px;
+}
+.comment-flip .comment-main:after {
+ border-left-color: #f8f8f8;
+ border-right-color: transparent;
+ margin-left: auto;
+ margin-right: 2px;
+}
diff --git a/public/static/admin/css/css3.css b/public/static/admin/css/css3.css
new file mode 100644
index 0000000..3c61357
--- /dev/null
+++ b/public/static/admin/css/css3.css
@@ -0,0 +1,5 @@
+/*圆角*/
+/*阴影*/
+/*字体*/
+/*动画属性*/
+/*清楚浮动*/
diff --git a/public/static/admin/css/email.css b/public/static/admin/css/email.css
new file mode 100644
index 0000000..870efe8
--- /dev/null
+++ b/public/static/admin/css/email.css
@@ -0,0 +1,154 @@
+.email-wrap {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ height: 100%;
+ width: 100%;
+ padding: 15px;
+ background: #f5f5f5;
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+.email-wrap .email-write-btn {
+ width: 100%;
+}
+.email-wrap .email-folder {
+ padding-top: 20px;
+}
+.email-wrap .email-folder dt {
+ font-size: 14px;
+ font-weight: bold;
+ color: #333;
+ line-height: 32px;
+}
+.email-wrap .email-folder dd {
+ font-size: 12px;
+ color: #545454;
+ line-height: 32px;
+ border-bottom: 1px solid #eee;
+}
+.email-wrap .email-folder dd button {
+ margin-top: 4px;
+}
+.email-wrap .email-folder dd .iconfont,
+.email-wrap .email-folder dd .layui-icon {
+ float: left;
+ padding-right: 10px;
+ font-size: 16px;
+}
+.email-wrap .email-classify {
+ padding-top: 20px;
+}
+.email-wrap .email-classify dt {
+ font-size: 14px;
+ font-weight: bold;
+ color: #333;
+ line-height: 32px;
+}
+.email-wrap .email-classify dd {
+ font-size: 12px;
+ color: #545454;
+ line-height: 32px;
+}
+.email-wrap .email-classify dd .iconfont,
+.email-wrap .email-classify dd .layui-icon {
+ float: left;
+ padding-right: 10px;
+ font-size: 14px;
+}
+.email-wrap .email-classify dd .icon-blue {
+ color: #01AAED;
+}
+.email-wrap .email-classify dd .icon-green {
+ color: #009688;
+}
+.email-wrap .email-classify dd .icon-wran {
+ color: #F7B824;
+}
+.email-wrap .email-classify dd .icon-red {
+ color: #FF5722;
+}
+.email-wrap .email-classify dd .icon-gray {
+ color: #2F4056;
+}
+.email-wrap .email-label {
+ padding-top: 20px;
+ padding-bottom: 20px;
+}
+.email-wrap .email-label dt {
+ font-size: 14px;
+ font-weight: bold;
+ color: #333;
+ line-height: 32px;
+}
+.email-wrap .email-label .layui-btn {
+ margin-bottom: 10px;
+}
+.email-wrap .email-label .layui-btn + .layui-btn {
+ margin-left: 0;
+ margin-right: 0;
+}
+.email-wrap .email-content {
+ -moz-box-sizing: border-box;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ background: #fff;
+ height: 100%;
+ width: 100%;
+ overflow: auto;
+ padding: 15px;
+ overflow: hidden;
+}
+.iframe-h {
+ height: 100%;
+}
+.email-write {
+ padding: 15px;
+}
+.email-write .layui-btn {
+ margin-bottom: 10px;
+}
+.email-content-title {
+ padding: 15px;
+}
+.email-content-title .write-title {
+ font-size: 20px;
+}
+.email-tool-btn {
+ margin-top: 3px;
+}
+.email-tool-btn .layui-form-item {
+ margin: 0;
+}
+.email-tool-btn .layui-form-item .layui-inline {
+ margin-bottom: 0;
+}
+.email-tool-btn .email-tool-btn-right {
+ text-align: right;
+}
+.email-list {
+ padding: 0 15px;
+}
+@media (max-width: 768px) {
+ .email-wrap .email-content {
+ padding: 0;
+ }
+ .email-write {
+ padding: 15px;
+ }
+ .email-write .layui-btn {
+ width: 100%;
+ margin: 0 0 10px;
+ }
+ .email-tool-btn .email-tool-btn-right {
+ text-align: left;
+ }
+ .email-tool-btn-left,
+ .email-tool-btn-right {
+ padding-bottom: 10px;
+ }
+ .email-tool-btn-left .layui-inline,
+ .email-tool-btn-right .layui-inline {
+ padding-bottom: 10px;
+ }
+}
diff --git a/public/static/admin/css/grid.css b/public/static/admin/css/grid.css
new file mode 100644
index 0000000..3dc0ea4
--- /dev/null
+++ b/public/static/admin/css/grid.css
@@ -0,0 +1,1180 @@
+/*2.1 栅格系统
+ Name: style_span
+ Example:
+
+ Explain: 栅格系统
+*/
+/*2.1 响应式栅格系统*/
+.container {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+.container-fluid {
+ padding-right: 15px;
+ padding-left: 15px;
+ margin-right: auto;
+ margin-left: auto;
+}
+@media (min-width: 992px) {
+ .container {
+ width: 960px;
+ }
+}
+@media (min-width: 1200px) {
+ .container {
+ width: 1170px;
+ }
+}
+@media (min-width: 1300px) {
+ .container {
+ width: 1270px;
+ }
+}
+@media print {
+ .container {
+ width: auto;
+ }
+}
+.row {
+ box-sizing: border-box;
+ margin-left: -15px;
+ margin-right: -15px;
+}
+.col-1,
+.col-2,
+.col-3,
+.col-4,
+.col-5,
+.col-6,
+.col-7,
+.col-8,
+.col-9,
+.col-10,
+.col-11,
+.col-12,
+.col-xs-1,
+.col-sm-1,
+.col-md-1,
+.col-lg-1,
+.col-xs-2,
+.col-sm-2,
+.col-md-2,
+.col-lg-2,
+.col-xs-3,
+.col-sm-3,
+.col-md-3,
+.col-lg-3,
+.col-xs-4,
+.col-sm-4,
+.col-md-4,
+.col-lg-4,
+.col-xs-5,
+.col-sm-5,
+.col-md-5,
+.col-lg-5,
+.col-xs-6,
+.col-sm-6,
+.col-md-6,
+.col-lg-6,
+.col-xs-7,
+.col-sm-7,
+.col-md-7,
+.col-lg-7,
+.col-xs-8,
+.col-sm-8,
+.col-md-8,
+.col-lg-8,
+.col-xs-9,
+.col-sm-9,
+.col-md-9,
+.col-lg-9,
+.col-xs-10,
+.col-sm-10,
+.col-md-10,
+.col-lg-10,
+.col-xs-11,
+.col-sm-11,
+.col-md-11,
+.col-lg-11,
+.col-xs-12,
+.col-sm-12,
+.col-md-12,
+.col-lg-12 {
+ min-height: 1px;
+ position: relative;
+ padding-left: 15px;
+ padding-right: 15px;
+ box-sizing: border-box;
+ -webkit-transition: all 0.3s ease-in;
+ -moz-transition: all 0.3s ease-in;
+ -o-transition: all 0.3s ease-in;
+ transition: all 0.3s ease-in;
+}
+.col-1 {
+ width: 8.33333%;
+}
+.col-2 {
+ width: 16.66667%;
+}
+.col-3 {
+ width: 25%;
+}
+.col-4 {
+ width: 33.33333%;
+}
+.col-5 {
+ width: 41.66667%;
+}
+.col-6 {
+ width: 50%;
+}
+.col-7 {
+ width: 58.33333%;
+}
+.col-8 {
+ width: 66.66667%;
+}
+.col-9 {
+ width: 75%;
+}
+.col-10 {
+ width: 83.33333%;
+}
+.col-11 {
+ width: 91.66667%;
+}
+.col-12 {
+ width: 100%;
+}
+.col-offset-0 {
+ margin-left: 0;
+}
+.col-offset-1 {
+ margin-left: 8.33333%;
+}
+.col-offset-2 {
+ margin-left: 16.66667%;
+}
+.col-offset-3 {
+ margin-left: 25%;
+}
+.col-offset-4 {
+ margin-left: 33.33333%;
+}
+.col-offset-5 {
+ margin-left: 41.66667%;
+}
+.col-offset-6 {
+ margin-left: 50%;
+}
+.col-offset-7 {
+ margin-left: 58.33333%;
+}
+.col-offset-8 {
+ margin-left: 66.66667%;
+}
+.col-offset-9 {
+ margin-left: 75%;
+}
+.col-offset-10 {
+ margin-left: 83.33333%;
+}
+.col-offset-11 {
+ margin-left: 91.66667%;
+}
+.col-push-0 {
+ position: relative;
+ left: 0;
+ right: auto;
+}
+.col-pull-0 {
+ right: 0;
+ left: auto;
+}
+.col-push-1 {
+ left: 8.33333%;
+ right: auto;
+}
+.col-pull-1 {
+ right: 8.33333%;
+ left: auto;
+}
+.col-push-2 {
+ left: 16.66667%;
+ right: auto;
+}
+.col-pull-2 {
+ right: 16.66667%;
+ left: auto;
+}
+.col-push-3 {
+ left: 25%;
+ right: auto;
+}
+.col-pull-3 {
+ right: 25%;
+ left: auto;
+}
+.col-push-4 {
+ left: 33.33333%;
+ right: auto;
+}
+.col-pull-4 {
+ right: 33.33333%;
+ left: auto;
+}
+.col-push-5 {
+ left: 41.66667%;
+ right: auto;
+}
+.col-pull-5 {
+ right: 41.66667%;
+ left: auto;
+}
+.col-push-6 {
+ left: 50%;
+ right: auto;
+}
+.col-pull-6 {
+ right: 50%;
+ left: auto;
+}
+.col-push-7 {
+ left: 58.33333%;
+ right: auto;
+}
+.col-pull-7 {
+ right: 58.33333%;
+ left: auto;
+}
+.col-push-8 {
+ left: 66.66667%;
+ right: auto;
+}
+.col-pull-8 {
+ right: 66.66667%;
+ left: auto;
+}
+.col-push-9 {
+ left: 75%;
+ right: auto;
+}
+.col-pull-9 {
+ right: 75%;
+ left: auto;
+}
+.col-push-10 {
+ left: 83.33333%;
+ right: auto;
+}
+.col-pull-10 {
+ right: 83.33333%;
+ left: auto;
+}
+.col-push-11 {
+ left: 91.66667%;
+ right: auto;
+}
+.col-pull-11 {
+ right: 91.66667%;
+ left: auto;
+}
+/*局部模块平分*/
+.col-1-1 {
+ width: 100%;
+}
+.col-2-1 {
+ width: 50%;
+}
+.col-3-1 {
+ width: 33.333333%;
+}
+.col-3-2 {
+ width: 66.666667%;
+}
+.col-4-1 {
+ width: 25%;
+}
+.col-4-3 {
+ width: 75%;
+}
+.col-5-1 {
+ width: 20%;
+}
+.col-5-2 {
+ width: 40%;
+}
+.col-5-3 {
+ width: 60%;
+}
+.col-5-4 {
+ width: 80%;
+}
+.col-6-1 {
+ width: 16.666667%;
+}
+.col-6-5 {
+ width: 83.333333%;
+}
+.col-xs-1,
+.col-xs-2,
+.col-xs-3,
+.col-xs-4,
+.col-xs-5,
+.col-xs-6,
+.col-xs-7,
+.col-xs-8,
+.col-xs-9,
+.col-xs-10,
+.col-xs-11,
+.col-xs-12 {
+ float: left;
+}
+.col-xs-12 {
+ width: 100%;
+}
+.col-xs-11 {
+ width: 91.66666667%;
+}
+.col-xs-10 {
+ width: 83.33333333%;
+}
+.col-xs-9 {
+ width: 75%;
+}
+.col-xs-8 {
+ width: 66.66666667%;
+}
+.col-xs-7 {
+ width: 58.33333333%;
+}
+.col-xs-6 {
+ width: 50%;
+}
+.col-xs-5 {
+ width: 41.66666667%;
+}
+.col-xs-4 {
+ width: 33.33333333%;
+}
+.col-xs-3 {
+ width: 25%;
+}
+.col-xs-2 {
+ width: 16.66666667%;
+}
+.col-xs-1 {
+ width: 8.33333333%;
+}
+.col-xs-pull-12 {
+ right: 100%;
+}
+.col-xs-pull-11 {
+ right: 91.66666667%;
+}
+.col-xs-pull-10 {
+ right: 83.33333333%;
+}
+.col-xs-pull-9 {
+ right: 75%;
+}
+.col-xs-pull-8 {
+ right: 66.66666667%;
+}
+.col-xs-pull-7 {
+ right: 58.33333333%;
+}
+.col-xs-pull-6 {
+ right: 50%;
+}
+.col-xs-pull-5 {
+ right: 41.66666667%;
+}
+.col-xs-pull-4 {
+ right: 33.33333333%;
+}
+.col-xs-pull-3 {
+ right: 25%;
+}
+.col-xs-pull-2 {
+ right: 16.66666667%;
+}
+.col-xs-pull-1 {
+ right: 8.33333333%;
+}
+.col-xs-pull-0 {
+ right: auto;
+}
+.col-xs-push-12 {
+ left: 100%;
+}
+.col-xs-push-11 {
+ left: 91.66666667%;
+}
+.col-xs-push-10 {
+ left: 83.33333333%;
+}
+.col-xs-push-9 {
+ left: 75%;
+}
+.col-xs-push-8 {
+ left: 66.66666667%;
+}
+.col-xs-push-7 {
+ left: 58.33333333%;
+}
+.col-xs-push-6 {
+ left: 50%;
+}
+.col-xs-push-5 {
+ left: 41.66666667%;
+}
+.col-xs-push-4 {
+ left: 33.33333333%;
+}
+.col-xs-push-3 {
+ left: 25%;
+}
+.col-xs-push-2 {
+ left: 16.66666667%;
+}
+.col-xs-push-1 {
+ left: 8.33333333%;
+}
+.col-xs-push-0 {
+ left: auto;
+}
+.col-xs-offset-12 {
+ margin-left: 100%;
+}
+.col-xs-offset-11 {
+ margin-left: 91.66666667%;
+}
+.col-xs-offset-10 {
+ margin-left: 83.33333333%;
+}
+.col-xs-offset-9 {
+ margin-left: 75%;
+}
+.col-xs-offset-8 {
+ margin-left: 66.66666667%;
+}
+.col-xs-offset-7 {
+ margin-left: 58.33333333%;
+}
+.col-xs-offset-6 {
+ margin-left: 50%;
+}
+.col-xs-offset-5 {
+ margin-left: 41.66666667%;
+}
+.col-xs-offset-4 {
+ margin-left: 33.33333333%;
+}
+.col-xs-offset-3 {
+ margin-left: 25%;
+}
+.col-xs-offset-2 {
+ margin-left: 16.66666667%;
+}
+.col-xs-offset-1 {
+ margin-left: 8.33333333%;
+}
+.col-xs-offset-0 {
+ margin-left: 0;
+}
+@media (max-width: 767px) {
+ .responsive [class^="col-"],
+ .responsive [class*=" col-"] {
+ float: none!important;
+ width: auto !important;
+ }
+ .responsive [class^="col-offset-"],
+ .responsive [class*=" col-offset-"] {
+ margin-left: 0px !important;
+ }
+}
+@media (min-width: 768px) {
+ .col-sm-1,
+ .col-sm-10,
+ .col-sm-11,
+ .col-sm-12,
+ .col-sm-2,
+ .col-sm-3,
+ .col-sm-4,
+ .col-sm-5,
+ .col-sm-6,
+ .col-sm-7,
+ .col-sm-8,
+ .col-sm-9 {
+ float: left;
+ }
+ .col-sm-12 {
+ width: 100%;
+ }
+ .col-sm-11 {
+ width: 91.66666667%;
+ }
+ .col-sm-10 {
+ width: 83.33333333%;
+ }
+ .col-sm-9 {
+ width: 75%;
+ }
+ .col-sm-8 {
+ width: 66.66666667%;
+ }
+ .col-sm-7 {
+ width: 58.33333333%;
+ }
+ .col-sm-6 {
+ width: 50%;
+ }
+ .col-sm-5 {
+ width: 41.66666667%;
+ }
+ .col-sm-4 {
+ width: 33.33333333%;
+ }
+ .col-sm-3 {
+ width: 25%;
+ }
+ .col-sm-2 {
+ width: 16.66666667%;
+ }
+ .col-sm-1 {
+ width: 8.33333333%;
+ }
+ .col-sm-pull-12 {
+ right: 100%;
+ }
+ .col-sm-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-sm-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-sm-pull-9 {
+ right: 75%;
+ }
+ .col-sm-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-sm-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-sm-pull-6 {
+ right: 50%;
+ }
+ .col-sm-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-sm-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-sm-pull-3 {
+ right: 25%;
+ }
+ .col-sm-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-sm-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-sm-pull-0 {
+ right: 0;
+ }
+ .col-sm-push-12 {
+ left: 100%;
+ }
+ .col-sm-push-11 {
+ left: 91.66666667%;
+ }
+ .col-sm-push-10 {
+ left: 83.33333333%;
+ }
+ .col-sm-push-9 {
+ left: 75%;
+ }
+ .col-sm-push-8 {
+ left: 66.66666667%;
+ }
+ .col-sm-push-7 {
+ left: 58.33333333%;
+ }
+ .col-sm-push-6 {
+ left: 50%;
+ }
+ .col-sm-push-5 {
+ left: 41.66666667%;
+ }
+ .col-sm-push-4 {
+ left: 33.33333333%;
+ }
+ .col-sm-push-3 {
+ left: 25%;
+ }
+ .col-sm-push-2 {
+ left: 16.66666667%;
+ }
+ .col-sm-push-1 {
+ left: 8.33333333%;
+ }
+ .col-sm-push-0 {
+ left: 0;
+ }
+ .col-sm-offset-12 {
+ margin-left: 100%;
+ }
+ .col-sm-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-sm-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-sm-offset-9 {
+ margin-left: 75%;
+ }
+ .col-sm-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-sm-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-sm-offset-6 {
+ margin-left: 50%;
+ }
+ .col-sm-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-sm-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-sm-offset-3 {
+ margin-left: 25%;
+ }
+ .col-sm-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-sm-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-sm-offset-0 {
+ margin-left: 0;
+ }
+}
+@media (min-width: 992px) {
+ .col-md-1,
+ .col-md-10,
+ .col-md-11,
+ .col-md-12,
+ .col-md-2,
+ .col-md-3,
+ .col-md-4,
+ .col-md-5,
+ .col-md-6,
+ .col-md-7,
+ .col-md-8,
+ .col-md-9 {
+ float: left;
+ }
+ .col-md-12 {
+ width: 100%;
+ }
+ .col-md-11 {
+ width: 91.66666667%;
+ }
+ .col-md-10 {
+ width: 83.33333333%;
+ }
+ .col-md-9 {
+ width: 75%;
+ }
+ .col-md-8 {
+ width: 66.66666667%;
+ }
+ .col-md-7 {
+ width: 58.33333333%;
+ }
+ .col-md-6 {
+ width: 50%;
+ }
+ .col-md-5 {
+ width: 41.66666667%;
+ }
+ .col-md-4 {
+ width: 33.33333333%;
+ }
+ .col-md-3 {
+ width: 25%;
+ }
+ .col-md-2 {
+ width: 16.66666667%;
+ }
+ .col-md-1 {
+ width: 8.33333333%;
+ }
+ .col-md-pull-12 {
+ right: 100%;
+ }
+ .col-md-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-md-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-md-pull-9 {
+ right: 75%;
+ }
+ .col-md-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-md-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-md-pull-6 {
+ right: 50%;
+ }
+ .col-md-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-md-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-md-pull-3 {
+ right: 25%;
+ }
+ .col-md-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-md-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-md-pull-0 {
+ right: 0;
+ }
+ .col-md-push-12 {
+ left: 100%;
+ }
+ .col-md-push-11 {
+ left: 91.66666667%;
+ }
+ .col-md-push-10 {
+ left: 83.33333333%;
+ }
+ .col-md-push-9 {
+ left: 75%;
+ }
+ .col-md-push-8 {
+ left: 66.66666667%;
+ }
+ .col-md-push-7 {
+ left: 58.33333333%;
+ }
+ .col-md-push-6 {
+ left: 50%;
+ }
+ .col-md-push-5 {
+ left: 41.66666667%;
+ }
+ .col-md-push-4 {
+ left: 33.33333333%;
+ }
+ .col-md-push-3 {
+ left: 25%;
+ }
+ .col-md-push-2 {
+ left: 16.66666667%;
+ }
+ .col-md-push-1 {
+ left: 8.33333333%;
+ }
+ .col-md-push-0 {
+ left: 0;
+ }
+ .col-md-offset-12 {
+ margin-left: 100%;
+ }
+ .col-md-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-md-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-md-offset-9 {
+ margin-left: 75%;
+ }
+ .col-md-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-md-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-md-offset-6 {
+ margin-left: 50%;
+ }
+ .col-md-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-md-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-md-offset-3 {
+ margin-left: 25%;
+ }
+ .col-md-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-md-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-md-offset-0 {
+ margin-left: 0;
+ }
+}
+@media (min-width: 1200px) {
+ .col-lg-1,
+ .col-lg-10,
+ .col-lg-11,
+ .col-lg-12,
+ .col-lg-2,
+ .col-lg-3,
+ .col-lg-4,
+ .col-lg-5,
+ .col-lg-6,
+ .col-lg-7,
+ .col-lg-8,
+ .col-lg-9 {
+ float: left;
+ }
+ .col-lg-12 {
+ width: 100%;
+ }
+ .col-lg-11 {
+ width: 91.66666667%;
+ }
+ .col-lg-10 {
+ width: 83.33333333%;
+ }
+ .col-lg-9 {
+ width: 75%;
+ }
+ .col-lg-8 {
+ width: 66.66666667%;
+ }
+ .col-lg-7 {
+ width: 58.33333333%;
+ }
+ .col-lg-6 {
+ width: 50%;
+ }
+ .col-lg-5 {
+ width: 41.66666667%;
+ }
+ .col-lg-4 {
+ width: 33.33333333%;
+ }
+ .col-lg-3 {
+ width: 25%;
+ }
+ .col-lg-2 {
+ width: 16.66666667%;
+ }
+ .col-lg-1 {
+ width: 8.33333333%;
+ }
+ .col-lg-pull-12 {
+ right: 100%;
+ }
+ .col-lg-pull-11 {
+ right: 91.66666667%;
+ }
+ .col-lg-pull-10 {
+ right: 83.33333333%;
+ }
+ .col-lg-pull-9 {
+ right: 75%;
+ }
+ .col-lg-pull-8 {
+ right: 66.66666667%;
+ }
+ .col-lg-pull-7 {
+ right: 58.33333333%;
+ }
+ .col-lg-pull-6 {
+ right: 50%;
+ }
+ .col-lg-pull-5 {
+ right: 41.66666667%;
+ }
+ .col-lg-pull-4 {
+ right: 33.33333333%;
+ }
+ .col-lg-pull-3 {
+ right: 25%;
+ }
+ .col-lg-pull-2 {
+ right: 16.66666667%;
+ }
+ .col-lg-pull-1 {
+ right: 8.33333333%;
+ }
+ .col-lg-pull-0 {
+ right: 0;
+ }
+ .col-lg-push-12 {
+ left: 100%;
+ }
+ .col-lg-push-11 {
+ left: 91.66666667%;
+ }
+ .col-lg-push-10 {
+ left: 83.33333333%;
+ }
+ .col-lg-push-9 {
+ left: 75%;
+ }
+ .col-lg-push-8 {
+ left: 66.66666667%;
+ }
+ .col-lg-push-7 {
+ left: 58.33333333%;
+ }
+ .col-lg-push-6 {
+ left: 50%;
+ }
+ .col-lg-push-5 {
+ left: 41.66666667%;
+ }
+ .col-lg-push-4 {
+ left: 33.33333333%;
+ }
+ .col-lg-push-3 {
+ left: 25%;
+ }
+ .col-lg-push-2 {
+ left: 16.66666667%;
+ }
+ .col-lg-push-1 {
+ left: 8.33333333%;
+ }
+ .col-lg-push-0 {
+ left: 0;
+ }
+ .col-lg-offset-12 {
+ margin-left: 100%;
+ }
+ .col-lg-offset-11 {
+ margin-left: 91.66666667%;
+ }
+ .col-lg-offset-10 {
+ margin-left: 83.33333333%;
+ }
+ .col-lg-offset-9 {
+ margin-left: 75%;
+ }
+ .col-lg-offset-8 {
+ margin-left: 66.66666667%;
+ }
+ .col-lg-offset-7 {
+ margin-left: 58.33333333%;
+ }
+ .col-lg-offset-6 {
+ margin-left: 50%;
+ }
+ .col-lg-offset-5 {
+ margin-left: 41.66666667%;
+ }
+ .col-lg-offset-4 {
+ margin-left: 33.33333333%;
+ }
+ .col-lg-offset-3 {
+ margin-left: 25%;
+ }
+ .col-lg-offset-2 {
+ margin-left: 16.66666667%;
+ }
+ .col-lg-offset-1 {
+ margin-left: 8.33333333%;
+ }
+ .col-lg-offset-0 {
+ margin-left: 0;
+ }
+}
+/*2.2 响应式隐藏显示
+ Name: style_Layout
+ Explain: 左右两栏|左中右三栏|上中下
+ Last Modify: guojunhui
+*/
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg,
+.visible-xs-block,
+.visible-xs-inline,
+.visible-xs-inline-block,
+.visible-sm-block,
+.visible-sm-inline,
+.visible-sm-inline-block,
+.visible-md-block,
+.visible-md-inline,
+.visible-md-inline-block,
+.visible-lg-block,
+.visible-lg-inline,
+.visible-lg-inline-block {
+ display: none !important;
+}
+@media (max-width: 767px) {
+ .visible-xs {
+ display: block !important;
+ }
+ table.visible-xs {
+ display: table;
+ }
+ tr.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important;
+ }
+ .hidden-xs {
+ display: none !important;
+ }
+ .visible-xs-block {
+ display: block !important;
+ }
+ .visible-xs-inline {
+ display: inline !important;
+ }
+ .visible-xs-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm {
+ display: block !important;
+ }
+ table.visible-sm {
+ display: table;
+ }
+ tr.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-sm,
+ td.visible-sm {
+ display: table-cell !important;
+ }
+ .hidden-sm {
+ display: none !important;
+ }
+ .visible-sm-block {
+ display: block !important;
+ }
+ .visible-sm-inline {
+ display: inline !important;
+ }
+ .visible-sm-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md {
+ display: block !important;
+ }
+ table.visible-md {
+ display: table;
+ }
+ tr.visible-md {
+ display: table-row !important;
+ }
+ th.visible-md,
+ td.visible-md {
+ display: table-cell !important;
+ }
+ .hidden-md {
+ display: none !important;
+ }
+ .visible-md-block {
+ display: block !important;
+ }
+ .visible-md-inline {
+ display: inline !important;
+ }
+ .visible-md-inline-block {
+ display: inline-block !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg {
+ display: block !important;
+ }
+ table.visible-lg {
+ display: table;
+ }
+ tr.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-lg,
+ td.visible-lg {
+ display: table-cell !important;
+ }
+ .hidden-lg {
+ display: none !important;
+ }
+ .visible-lg-block {
+ display: block !important;
+ }
+ .visible-lg-inline {
+ display: inline !important;
+ }
+ .visible-lg-inline-block {
+ display: inline-block !important;
+ }
+}
+.visible-print {
+ display: none !important;
+}
+.visible-print-block {
+ display: none !important;
+}
+.visible-print-inline {
+ display: none !important;
+}
+.visible-print-inline-block {
+ display: none !important;
+}
+@media print {
+ .visible-print {
+ display: block !important;
+ }
+ table.visible-print {
+ display: table;
+ }
+ tr.visible-print {
+ display: table-row !important;
+ }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important;
+ }
+ .visible-print-block {
+ display: block !important;
+ }
+ .visible-print-inline {
+ display: inline !important;
+ }
+ .visible-print-inline-block {
+ display: inline-block !important;
+ }
+ .hidden-print {
+ display: none !important;
+ }
+}
diff --git a/public/static/admin/css/login.css b/public/static/admin/css/login.css
new file mode 100644
index 0000000..1715e0e
--- /dev/null
+++ b/public/static/admin/css/login.css
@@ -0,0 +1,89 @@
+html {
+ height: 100%;
+ overflow: hidden;
+}
+body {
+ background: url("../images/login/login_line.jpg") left center repeat-x;
+ height: 100%;
+}
+/*移除表单填充色*/
+input:-webkit-autofill {
+ -webkit-box-shadow: 0 0 0 1000px #ececec inset;
+}
+/*按钮移上去颜色*/
+.layui-btn-primary:hover {
+ border-color: #1E9FFF;
+ color: #333;
+}
+/*页面背景色*/
+.m-login-bg {
+ background: url("../images/login/login_bg.png") left center repeat-x;
+ height: 100%;
+}
+.m-login {
+ width: 390px;
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin-left: -195px;
+ margin-top: -205px;
+}
+.m-login h3 {
+ color: #fff;
+ text-align: center;
+ height: 60px;
+ font-size: 28px;
+}
+.m-login .copyright {
+ text-align: center;
+ color: #999;
+ padding-top: 10px;
+}
+.m-login-warp {
+ background: #fff;
+ -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
+ -webkit-border-radius: 6px;
+ border-radius: 6px;
+ padding: 25px;
+}
+.m-login-warp .layui-input {
+ height: 40px;
+ line-height: 40px\9;
+ margin-bottom: 5px;
+ -webkit-transition-property: none;
+ transition-property: none;
+ background: #ececec;
+ border: 1px solid #ececec;
+}
+.m-login-warp .m-login-btn .layui-inline {
+ width: 49%;
+ margin: 0;
+}
+.m-login-warp .m-login-btn .layui-inline button {
+ width: 100%;
+}
+.m-login-warp .verifyImg {
+ width: 130px;
+ height: 42px;
+}
+@media screen and (max-width: 450px) {
+ .m-login {
+ width: 300px;
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin-left: -150px;
+ margin-top: -240px;
+ }
+ .layui-form-item .layui-inline {
+ display: block;
+ margin-right: 0;
+ margin-bottom: 20px;
+ clear: both;
+ }
+ .m-login-warp .m-login-btn .layui-inline {
+ width: 100%;
+ margin: 0 0 10px;
+ }
+}
diff --git a/public/static/admin/css/page.css b/public/static/admin/css/page.css
new file mode 100644
index 0000000..363f25d
--- /dev/null
+++ b/public/static/admin/css/page.css
@@ -0,0 +1,44 @@
+.page-wrap {
+ text-align: center;
+}
+.pagination {
+ display: inline-block;
+ *display: inline;
+ *zoom: 1;
+ text-align: center;
+ margin: 10px 0;
+ font-size: 0;
+}
+.pagination li {
+ position: relative;
+ display: inline-block;
+ *display: inline;
+ *zoom: 1;
+ border: 1px solid #e2e2e2;
+ width: 28px;
+ height: 28px;
+ line-height: 28px;
+ margin: 0 -1px 5px 0;
+ background-color: #fff;
+ color: #333;
+ font-size: 12px;
+ text-align: center;
+}
+.pagination li a {
+ display: block;
+ width: 100%;
+ height: 100%;
+}
+.pagination li.active {
+ border: 1px solid #1E9FFF;
+}
+.pagination li.active span {
+ display: block;
+ width: 100%;
+ height: 100%;
+ background-color: #1E9FFF;
+ color: #fff;
+}
+.pagination li.disabled {
+ background: #f2f2f2;
+}
diff --git a/public/static/admin/css/panel.css b/public/static/admin/css/panel.css
new file mode 100644
index 0000000..0e3669c
--- /dev/null
+++ b/public/static/admin/css/panel.css
@@ -0,0 +1,75 @@
+.panel {
+ background-color: #fff;
+ border: solid 1px transparent;
+}
+.panel-header {
+ border-bottom: solid 1px transparent;
+ padding: 8px 15px;
+ font-size: 14px;
+ font-weight: 700;
+}
+/*面板标题*/
+.panel-body {
+ padding: 15px;
+}
+/*面板内容*/
+.panel-footer {
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ padding: 5px 20px;
+}
+/*面板页脚*/
+/*默认面板*/
+.panel-default {
+ border-color: #dddddd;
+}
+.panel-default > .panel-header {
+ border-color: #ddd;
+ background-color: #f5f5f5;
+ color: #444444;
+}
+/*主要面板*/
+.panel-primary {
+ border-color: #5a98de;
+}
+.panel-primary > .panel-header {
+ border-color: #5a98de;
+ background-color: #5a98de;
+ color: #ffffff;
+}
+/*次要面板*/
+.panel-secondary {
+ border-color: #3bb4f2;
+}
+.panel-secondary > .panel-header {
+ border-color: #3bb4f2;
+ background-color: #3bb4f2;
+ color: #ffffff;
+}
+/*成功面板*/
+.panel-success {
+ border-color: #5eb95e;
+}
+.panel-success > .panel-header {
+ border-color: #5eb95e;
+ background-color: #5eb95e;
+ color: #ffffff;
+}
+/*警告面板*/
+.panel-warning {
+ border-color: #f37b1d;
+}
+.panel-warning > .panel-header {
+ border-color: #f37b1d;
+ background-color: #f37b1d;
+ color: #ffffff;
+}
+/*危险面板*/
+.panel-danger {
+ border-color: #dd514c;
+}
+.panel-danger > .panel-header {
+ border-color: #dd514c;
+ background-color: #dd514c;
+ color: #ffffff;
+}
diff --git a/public/static/admin/css/reset.css b/public/static/admin/css/reset.css
new file mode 100644
index 0000000..781e426
--- /dev/null
+++ b/public/static/admin/css/reset.css
@@ -0,0 +1,117 @@
+/*圆角*/
+/*阴影*/
+/*字体*/
+/*动画属性*/
+/*清楚浮动*/
+.f-l {
+ float: left;
+}
+.f-r {
+ float: right;
+}
+@font-face {
+ font-family: 'iconfont';
+ src: url('../fonts//iconfont.eot');
+ src: url('../fonts//iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('../fonts//iconfont.woff') format('woff'), /* Modern Browsers */ url('../fonts//iconfont.ttf') format('truetype'), /* Safari, Android, iOS */ url('../fonts//iconfont.svg#svgFontName') format('svg');
+
+ /* IE9 Compat Modes */
+ /* Legacy iOS */
+}
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -webkit-text-stroke-width: 0.2px;
+ -moz-osx-font-smoothing: grayscale;
+}
+.panel-default {
+ border-color: #ebeaea;
+}
+.panel-default .panel-header {
+ border-color: transparent;
+ background-color: #fff;
+ color: #555555;
+}
+.panel-header {
+ border-bottom: solid 1px transparent;
+ padding: 8px 15px;
+ font-size: 16px;
+ font-weight: normal;
+}
+.layui-form-select dl dd.layui-this {
+ background: #f2f2f2;
+ color: #333;
+}
+.layui-btn-primary:hover {
+ border-color: #00b5f9;
+ color: #333;
+}
+.layui-tab-bar {
+ position: absolute;
+ right: 3px;
+ top: 3px;
+ z-index: 10;
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+ border: 1px solid #e2e2e2;
+ border-radius: 2px;
+ background-color: #fff;
+}
+.layui-elem-quote {
+ border-left: 5px solid #00b5f9;
+}
+/*清楚浮动*/
+.clearfix {
+ zoom: 1;
+}
+.clearfix:after {
+ display: block;
+ content: '';
+ clear: both;
+}
+.layui-nav-no-bg {
+ background: transparent;
+ width: auto;
+}
+.layui-nav-no-bg.layui-nav-tree .layui-nav-item a:hover {
+ background-color: transparent;
+ color: #00b5f9;
+}
+.layui-nav-no-bg.layui-nav .layui-nav-item a {
+ color: #333;
+}
+.layui-nav-no-bg .layui-nav-itemed > a,
+.layui-nav-no-bg .layui-nav-tree .layui-nav-title a,
+.layui-nav-no-bg .layui-nav-tree .layui-nav-title a:hover {
+ background: transparent!important;
+ color: #333!important;
+}
+.layui-nav-no-bg.layui-nav-tree .layui-nav-child a {
+ height: 40px;
+ line-height: 40px;
+ text-indent: 10px;
+ color: #666;
+}
+.layui-nav-no-bg.layui-nav-tree .layui-nav-child dd.layui-this,
+.layui-nav-no-bg.layui-nav-tree .layui-this,
+.layui-nav-no-bg.layui-nav-tree .layui-this > a:hover {
+ background-color: #fff;
+ color: #00b5f9;
+}
+.layui-nav-no-bg.layui-nav-tree .layui-this > a {
+ background-color: #fff;
+ color: #00b5f9;
+ border-left: 3px solid #00b5f9;
+ margin-right: -20px;
+}
+.layui-nav-no-bg .layui-nav-bar {
+ display: none;
+}
+.showSubBtn {
+ width: 16px;
+ height: 16px;
+ line-height: 16px;
+ margin-left: 5px;
+}
diff --git a/public/static/admin/css/var.css b/public/static/admin/css/var.css
new file mode 100644
index 0000000..e69de29
diff --git a/public/static/admin/fonts/demo.css b/public/static/admin/fonts/demo.css
new file mode 100644
index 0000000..3d9cbe7
--- /dev/null
+++ b/public/static/admin/fonts/demo.css
@@ -0,0 +1,370 @@
+*{margin: 0;padding: 0;list-style: none;}
+/*
+KISSY CSS Reset
+理念:1. reset 的目的不是清除浏览器的默认样式,这仅是部分工作。清除和重置是紧密不可分的。
+2. reset 的目的不是让默认样式在所有浏览器下一致,而是减少默认样式有可能带来的问题。
+3. reset 期望提供一套普适通用的基础样式。但没有银弹,推荐根据具体需求,裁剪和修改后再使用。
+特色:1. 适应中文;2. 基于最新主流浏览器。
+维护:玉伯, 正淳
+ */
+
+/** 清除内外边距 **/
+body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, /* structural elements 结构元素 */
+dl, dt, dd, ul, ol, li, /* list elements 列表元素 */
+pre, /* text formatting elements 文本格式元素 */
+form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */
+th, td /* table elements 表格元素 */ {
+ margin: 0;
+ padding: 0;
+}
+
+/** 设置默认字体 **/
+body,
+button, input, select, textarea /* for ie */ {
+ font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif;
+}
+h1, h2, h3, h4, h5, h6 { font-size: 100%; }
+address, cite, dfn, em, var { font-style: normal; } /* 将斜体扶正 */
+code, kbd, pre, samp { font-family: courier new, courier, monospace; } /* 统一等宽字体 */
+small { font-size: 12px; } /* 小于 12px 的中文很难阅读,让 small 正常化 */
+
+/** 重置列表元素 **/
+ul, ol { list-style: none; }
+
+/** 重置文本格式元素 **/
+a { text-decoration: none; }
+a:hover { text-decoration: underline; }
+
+
+/** 重置表单元素 **/
+legend { color: #000; } /* for ie6 */
+fieldset, img { border: 0; } /* img 搭车:让链接里的 img 无边框 */
+button, input, select, textarea { font-size: 100%; } /* 使得表单元素在 ie 下能继承字体大小 */
+/* 注:optgroup 无法扶正 */
+
+/** 重置表格元素 **/
+table { border-collapse: collapse; border-spacing: 0; }
+
+/* 清除浮动 */
+.ks-clear:after, .clear:after {
+ content: '\20';
+ display: block;
+ height: 0;
+ clear: both;
+}
+.ks-clear, .clear {
+ *zoom: 1;
+}
+
+.main {
+ padding: 30px 100px;
+width: 960px;
+margin: 0 auto;
+}
+.main h1{font-size:36px; color:#333; text-align:left;margin-bottom:30px; border-bottom: 1px solid #eee;}
+
+.helps{margin-top:40px;}
+.helps pre{
+ padding:20px;
+ margin:10px 0;
+ border:solid 1px #e7e1cd;
+ background-color: #fffdef;
+ overflow: auto;
+}
+
+.icon_lists{
+ width: 100% !important;
+
+}
+
+.icon_lists li{
+ float:left;
+ width: 100px;
+ height:180px;
+ text-align: center;
+ list-style: none !important;
+}
+.icon_lists .icon{
+ font-size: 42px;
+ line-height: 100px;
+ margin: 10px 0;
+ color:#333;
+ -webkit-transition: font-size 0.25s ease-out 0s;
+ -moz-transition: font-size 0.25s ease-out 0s;
+ transition: font-size 0.25s ease-out 0s;
+
+}
+.icon_lists .icon:hover{
+ font-size: 100px;
+}
+
+
+
+.markdown {
+ color: #666;
+ font-size: 14px;
+ line-height: 1.8;
+}
+
+.highlight {
+ line-height: 1.5;
+}
+
+.markdown img {
+ vertical-align: middle;
+ max-width: 100%;
+}
+
+.markdown h1 {
+ color: #404040;
+ font-weight: 500;
+ line-height: 40px;
+ margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+ color: #404040;
+ margin: 1.6em 0 0.6em 0;
+ font-weight: 500;
+ clear: both;
+}
+
+.markdown h1 {
+ font-size: 28px;
+}
+
+.markdown h2 {
+ font-size: 22px;
+}
+
+.markdown h3 {
+ font-size: 16px;
+}
+
+.markdown h4 {
+ font-size: 14px;
+}
+
+.markdown h5 {
+ font-size: 12px;
+}
+
+.markdown h6 {
+ font-size: 12px;
+}
+
+.markdown hr {
+ height: 1px;
+ border: 0;
+ background: #e9e9e9;
+ margin: 16px 0;
+ clear: both;
+}
+
+.markdown p,
+.markdown pre {
+ margin: 1em 0;
+}
+
+.markdown > p,
+.markdown > blockquote,
+.markdown > .highlight,
+.markdown > ol,
+.markdown > ul {
+ width: 80%;
+}
+
+.markdown ul > li {
+ list-style: circle;
+}
+
+.markdown > ul li,
+.markdown blockquote ul > li {
+ margin-left: 20px;
+ padding-left: 4px;
+}
+
+.markdown > ul li p,
+.markdown > ol li p {
+ margin: 0.6em 0;
+}
+
+.markdown ol > li {
+ list-style: decimal;
+}
+
+.markdown > ol li,
+.markdown blockquote ol > li {
+ margin-left: 20px;
+ padding-left: 4px;
+}
+
+.markdown code {
+ margin: 0 3px;
+ padding: 0 5px;
+ background: #eee;
+ border-radius: 3px;
+}
+
+.markdown pre {
+ border-radius: 6px;
+ background: #f7f7f7;
+ padding: 20px;
+}
+
+.markdown pre code {
+ border: none;
+ background: #f7f7f7;
+ margin: 0;
+}
+
+.markdown strong,
+.markdown b {
+ font-weight: 600;
+}
+
+.markdown > table {
+ border-collapse: collapse;
+ border-spacing: 0px;
+ empty-cells: show;
+ border: 1px solid #e9e9e9;
+ width: 95%;
+ margin-bottom: 24px;
+}
+
+.markdown > table th {
+ white-space: nowrap;
+ color: #333;
+ font-weight: 600;
+
+}
+
+.markdown > table th,
+.markdown > table td {
+ border: 1px solid #e9e9e9;
+ padding: 8px 16px;
+ text-align: left;
+}
+
+.markdown > table th {
+ background: #F7F7F7;
+}
+
+.markdown blockquote {
+ font-size: 90%;
+ color: #999;
+ border-left: 4px solid #e9e9e9;
+ padding-left: 0.8em;
+ margin: 1em 0;
+ font-style: italic;
+}
+
+.markdown blockquote p {
+ margin: 0;
+}
+
+.markdown .anchor {
+ opacity: 0;
+ transition: opacity 0.3s ease;
+ margin-left: 8px;
+}
+
+.markdown .waiting {
+ color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+ opacity: 1;
+ display: inline-block;
+}
+
+.markdown > br,
+.markdown > p > br {
+ clear: both;
+}
+
+
+.hljs {
+ display: block;
+ background: white;
+ padding: 0.5em;
+ color: #333333;
+ overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+ color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+ color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+ color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+ color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+ color: #63a35c;
+}
+
+.hljs-tag {
+ color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+ color: #795da3;
+}
+
+.hljs-addition {
+ color: #55a532;
+ background-color: #eaffea;
+}
+
+.hljs-deletion {
+ color: #bd2c00;
+ background-color: #ffecec;
+}
+
+.hljs-link {
+ text-decoration: underline;
+}
+
+pre{
+ background: #fff;
+}
+
+
+
+
+
diff --git a/public/static/admin/fonts/demo.html b/public/static/admin/fonts/demo.html
new file mode 100644
index 0000000..b75226e
--- /dev/null
+++ b/public/static/admin/fonts/demo.html
@@ -0,0 +1,151 @@
+
+
+
+
+
+ IconFont
+
+
+
+
+
+
IconFont 图标
+
+
+ -
+
+
刷新
+ 
+ .shuaxin
+
+
+ -
+
+
数据库
+ 
+ .shujuku
+
+
+ -
+
+
删除
+ 
+ .shanchu
+
+
+ -
+
+
文章
+ 
+ .wenzhang
+
+
+ -
+
+
链接
+ 
+ .lianjie
+
+
+ -
+
+
菜单
+ 
+ .caidan
+
+
+ -
+
+
邮件
+ 
+ .youjian
+
+
+ -
+
+
推荐
+ 
+ .tuijian
+
+
+ -
+
+
评论
+ 
+ .msg
+
+
+ -
+
+
头像
+ 
+ .userpro
+
+
+ -
+
+
类目链接
+ 
+ .leimulianjie
+
+
+ -
+
+
名单
+ 
+ .list
+
+
+ -
+
+
提醒
+ 
+ .remind
+
+
+ -
+
+
密码
+ 
+ .Password
+
+
+ -
+
+
设置
+ 
+ .Setup
+
+
+
+
+
+
+ 第一步:使用font-face声明字体
+
+@font-face {font-family: 'iconfont';
+ src: url('iconfont.eot'); /* IE9*/
+ src: url('iconfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('iconfont.woff') format('woff'), /* chrome、firefox */
+ url('iconfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
+ url('iconfont.svg#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+第二步:定义使用iconfont的样式
+
+.iconfont{
+ font-family:"iconfont" !important;
+ font-size:16px;font-style:normal;
+ -webkit-font-smoothing: antialiased;
+ -webkit-text-stroke-width: 0.2px;
+ -moz-osx-font-smoothing: grayscale;}
+
+第三步:挑选相应图标并获取字体编码,应用于页面
+
+<i class="iconfont">3</i>
+
+
+
+
+
+
diff --git a/public/static/admin/fonts/demo_fontclass.html b/public/static/admin/fonts/demo_fontclass.html
new file mode 100644
index 0000000..c9dd597
--- /dev/null
+++ b/public/static/admin/fonts/demo_fontclass.html
@@ -0,0 +1,154 @@
+
+
+
+
+
+ IconFont
+
+
+
+
+
+
IconFont 图标
+
+
+ -
+
+
刷新
+ .icon-shuaxin
+
+
+ -
+
+
数据库
+ .icon-shujuku
+
+
+ -
+
+
删除
+ .icon-shanchu
+
+
+ -
+
+
文章
+ .icon-wenzhang
+
+
+ -
+
+
链接
+ .icon-lianjie
+
+
+ -
+
+
菜单
+ .icon-caidan
+
+
+ -
+
+
邮件
+ .icon-youjian
+
+
+ -
+
+
推荐
+ .icon-tuijian
+
+
+ -
+
+
评论
+ .icon-msg
+
+
+ -
+
+
头像
+ .icon-userpro
+
+
+ -
+
+
类目链接
+ .icon-leimulianjie
+
+
+ -
+
+
名单
+ .icon-list
+
+
+ -
+
+
提醒
+ .icon-remind
+
+
+ -
+
+
密码
+ .icon-Password
+
+
+ -
+
+
设置
+ .icon-Setup
+
+
+ -
+
+
上升
+ .icon-shangsheng
+
+
+ -
+
+
发件箱
+ .icon-fajianxiang
+
+
+ -
+
+
上升
+ .icon-xiajiang
+
+
+ -
+
+
排序
+ .icon-paixu
+
+
+
+
+
font-class引用
+
+
+
font-class是unicode使用方式的一种变种,主要是解决unicode书写不直观,语意不明确的问题。
+
与unicode使用方式相比,具有如下特点:
+
+ - 兼容性良好,支持ie8+,及所有现代浏览器。
+ - 相比于unicode语意明确,书写更直观。可以很容易分辨这个icon是什么。
+ - 因为使用class来定义图标,所以当要替换图标时,只需要修改class里面的unicode引用。
+ - 不过因为本质上还是使用的字体,所以多色图标还是不支持的。
+
+
使用步骤如下:
+
第一步:引入项目下面生成的fontclass代码:
+
+
+
+
第二步:挑选相应图标并获取类名,应用于页面:
+
<i class="iconfont icon-xxx"></i>
+
+ "iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。
+
+
+
+
diff --git a/public/static/admin/fonts/demo_symbol.html b/public/static/admin/fonts/demo_symbol.html
new file mode 100644
index 0000000..fb289e7
--- /dev/null
+++ b/public/static/admin/fonts/demo_symbol.html
@@ -0,0 +1,215 @@
+
+
+
+
+
+ IconFont
+
+
+
+
+
+
+
+
IconFont 图标
+
+
+ -
+
+
刷新
+ #icon-shuaxin
+
+
+ -
+
+
数据库
+ #icon-shujuku
+
+
+ -
+
+
删除
+ #icon-shanchu
+
+
+ -
+
+
文章
+ #icon-wenzhang
+
+
+ -
+
+
链接
+ #icon-lianjie
+
+
+ -
+
+
菜单
+ #icon-caidan
+
+
+ -
+
+
邮件
+ #icon-youjian
+
+
+ -
+
+
推荐
+ #icon-tuijian
+
+
+ -
+
+
评论
+ #icon-msg
+
+
+ -
+
+
头像
+ #icon-userpro
+
+
+ -
+
+
类目链接
+ #icon-leimulianjie
+
+
+ -
+
+
名单
+ #icon-list
+
+
+ -
+
+
提醒
+ #icon-remind
+
+
+ -
+
+
密码
+ #icon-Password
+
+
+ -
+
+
设置
+ #icon-Setup
+
+
+ -
+
+
上升
+ #icon-shangsheng
+
+
+ -
+
+
发件箱
+ #icon-fajianxiang
+
+
+ -
+
+
上升
+ #icon-xiajiang
+
+
+ -
+
+
排序
+ #icon-paixu
+
+
+
+
+
+
symbol引用
+
+
+
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章
+ 这种用法其实是做了一个svg的集合,与另外两种相比具有如下特点:
+
+ - 支持多色图标了,不再受单色限制。
+ - 通过一些技巧,支持像字体那样,通过
font-size,color来调整样式。
+ - 兼容性较差,支持 ie9+,及现代浏览器。
+ - 浏览器渲染svg的性能一般,还不如png。
+
+
使用步骤如下:
+
第一步:引入项目下面生成的symbol代码:
+
+
第二步:加入通用css代码(引入一次就行):
+
<style type="text/css">
+.icon {
+ width: 1em; height: 1em;
+ vertical-align: -0.15em;
+ fill: currentColor;
+ overflow: hidden;
+}
+</style>
+
第三步:挑选相应图标并获取类名,应用于页面:
+
<svg class="icon" aria-hidden="true">
+ <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+
diff --git a/public/static/admin/fonts/demo_unicode.html b/public/static/admin/fonts/demo_unicode.html
new file mode 100644
index 0000000..72cdc78
--- /dev/null
+++ b/public/static/admin/fonts/demo_unicode.html
@@ -0,0 +1,192 @@
+
+
+
+
+
+ IconFont
+
+
+
+
+
+
+
IconFont 图标
+
+
+ -
+
+
刷新
+ 
+
+
+ -
+
+
数据库
+ 
+
+
+ -
+
+
删除
+ 
+
+
+ -
+
+
文章
+ 
+
+
+ -
+
+
链接
+ 
+
+
+ -
+
+
菜单
+ 
+
+
+ -
+
+
邮件
+ 
+
+
+ -
+
+
推荐
+ 
+
+
+ -
+
+
评论
+ 
+
+
+ -
+
+
头像
+ 
+
+
+ -
+
+
类目链接
+ 
+
+
+ -
+
+
名单
+ 
+
+
+ -
+
+
提醒
+ 
+
+
+ -
+
+
密码
+ 
+
+
+ -
+
+
设置
+ 
+
+
+ -
+
+
上升
+ 
+
+
+ -
+
+
发件箱
+ 
+
+
+ -
+
+
上升
+ 
+
+
+ -
+
+
排序
+ 
+
+
+
+
unicode引用
+
+
+
unicode是字体在网页端最原始的应用方式,特点是:
+
+ - 兼容性最好,支持ie6+,及所有现代浏览器。
+ - 支持按字体的方式去动态调整图标大小,颜色等等。
+ - 但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。
+
+
+ 注意:新版iconfont支持多色图标,这些多色图标在unicode模式下将不能使用,如果有需求建议使用symbol的引用方式
+
+
unicode使用步骤如下:
+
第一步:拷贝项目下面生成的font-face
+
@font-face {
+ font-family: 'iconfont';
+ src: url('iconfont.eot');
+ src: url('iconfont.eot?#iefix') format('embedded-opentype'),
+ url('iconfont.woff') format('woff'),
+ url('iconfont.ttf') format('truetype'),
+ url('iconfont.svg#iconfont') format('svg');
+}
+
+
第二步:定义使用iconfont的样式
+
.iconfont{
+ font-family:"iconfont" !important;
+ font-size:16px;font-style:normal;
+ -webkit-font-smoothing: antialiased;
+ -webkit-text-stroke-width: 0.2px;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+
第三步:挑选相应图标并获取字体编码,应用于页面
+
<i class="iconfont">3</i>
+
+
+ "iconfont"是你项目下的font-family。可以通过编辑项目查看,默认是"iconfont"。
+
+
+
+
+
+
diff --git a/public/static/admin/fonts/iconfont.css b/public/static/admin/fonts/iconfont.css
new file mode 100644
index 0000000..baf14ac
--- /dev/null
+++ b/public/static/admin/fonts/iconfont.css
@@ -0,0 +1,55 @@
+
+@font-face {font-family: "iconfont";
+ src: url('iconfont.eot?t=1490337422326'); /* IE9*/
+ src: url('iconfont.eot?t=1490337422326#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('iconfont.woff?t=1490337422326') format('woff'), /* chrome, firefox */
+ url('iconfont.ttf?t=1490337422326') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
+ url('iconfont.svg?t=1490337422326#iconfont') format('svg'); /* iOS 4.1- */
+}
+
+.iconfont {
+ font-family:"iconfont" !important;
+ font-size:16px;
+ font-style:normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-shuaxin:before { content: "\e60d"; }
+
+.icon-shujuku:before { content: "\e600"; }
+
+.icon-shanchu:before { content: "\e601"; }
+
+.icon-wenzhang:before { content: "\e602"; }
+
+.icon-lianjie:before { content: "\e60c"; }
+
+.icon-caidan:before { content: "\e60e"; }
+
+.icon-youjian:before { content: "\e603"; }
+
+.icon-tuijian:before { content: "\e604"; }
+
+.icon-msg:before { content: "\e605"; }
+
+.icon-userpro:before { content: "\e606"; }
+
+.icon-leimulianjie:before { content: "\e607"; }
+
+.icon-list:before { content: "\e608"; }
+
+.icon-remind:before { content: "\e609"; }
+
+.icon-Password:before { content: "\e60a"; }
+
+.icon-Setup:before { content: "\e60b"; }
+
+.icon-shangsheng:before { content: "\e628"; }
+
+.icon-fajianxiang:before { content: "\e639"; }
+
+.icon-xiajiang:before { content: "\e60f"; }
+
+.icon-paixu:before { content: "\e656"; }
+
diff --git a/public/static/admin/fonts/iconfont.eot b/public/static/admin/fonts/iconfont.eot
new file mode 100644
index 0000000..274971e
Binary files /dev/null and b/public/static/admin/fonts/iconfont.eot differ
diff --git a/public/static/admin/fonts/iconfont.js b/public/static/admin/fonts/iconfont.js
new file mode 100644
index 0000000..029dc66
--- /dev/null
+++ b/public/static/admin/fonts/iconfont.js
@@ -0,0 +1,252 @@
+;(function(window) {
+
+ var svgSprite = ''
+ var script = function() {
+ var scripts = document.getElementsByTagName('script')
+ return scripts[scripts.length - 1]
+ }()
+ var shouldInjectCss = script.getAttribute("data-injectcss")
+
+ /**
+ * document ready
+ */
+ var ready = function(fn) {
+ if (document.addEventListener) {
+ if (~["complete", "loaded", "interactive"].indexOf(document.readyState)) {
+ setTimeout(fn, 0)
+ } else {
+ var loadFn = function() {
+ document.removeEventListener("DOMContentLoaded", loadFn, false)
+ fn()
+ }
+ document.addEventListener("DOMContentLoaded", loadFn, false)
+ }
+ } else if (document.attachEvent) {
+ IEContentLoaded(window, fn)
+ }
+
+ function IEContentLoaded(w, fn) {
+ var d = w.document,
+ done = false,
+ // only fire once
+ init = function() {
+ if (!done) {
+ done = true
+ fn()
+ }
+ }
+ // polling for no errors
+ var polling = function() {
+ try {
+ // throws errors until after ondocumentready
+ d.documentElement.doScroll('left')
+ } catch (e) {
+ setTimeout(polling, 50)
+ return
+ }
+ // no errors, fire
+
+ init()
+ };
+
+ polling()
+ // trying to always fire before onload
+ d.onreadystatechange = function() {
+ if (d.readyState == 'complete') {
+ d.onreadystatechange = null
+ init()
+ }
+ }
+ }
+ }
+
+ /**
+ * Insert el before target
+ *
+ * @param {Element} el
+ * @param {Element} target
+ */
+
+ var before = function(el, target) {
+ target.parentNode.insertBefore(el, target)
+ }
+
+ /**
+ * Prepend el to target
+ *
+ * @param {Element} el
+ * @param {Element} target
+ */
+
+ var prepend = function(el, target) {
+ if (target.firstChild) {
+ before(el, target.firstChild)
+ } else {
+ target.appendChild(el)
+ }
+ }
+
+ function appendSvg() {
+ var div, svg
+
+ div = document.createElement('div')
+ div.innerHTML = svgSprite
+ svgSprite = null
+ svg = div.getElementsByTagName('svg')[0]
+ if (svg) {
+ svg.setAttribute('aria-hidden', 'true')
+ svg.style.position = 'absolute'
+ svg.style.width = 0
+ svg.style.height = 0
+ svg.style.overflow = 'hidden'
+ prepend(svg, document.body)
+ }
+ }
+
+ if (shouldInjectCss && !window.__iconfont__svg__cssinject__) {
+ window.__iconfont__svg__cssinject__ = true
+ try {
+ document.write("");
+ } catch (e) {
+ console && console.log(e)
+ }
+ }
+
+ ready(appendSvg)
+
+
+})(window)
\ No newline at end of file
diff --git a/public/static/admin/fonts/iconfont.svg b/public/static/admin/fonts/iconfont.svg
new file mode 100644
index 0000000..a70cd14
--- /dev/null
+++ b/public/static/admin/fonts/iconfont.svg
@@ -0,0 +1,110 @@
+
+
+
diff --git a/public/static/admin/fonts/iconfont.ttf b/public/static/admin/fonts/iconfont.ttf
new file mode 100644
index 0000000..ad119ae
Binary files /dev/null and b/public/static/admin/fonts/iconfont.ttf differ
diff --git a/public/static/admin/fonts/iconfont.woff b/public/static/admin/fonts/iconfont.woff
new file mode 100644
index 0000000..09a5dc1
Binary files /dev/null and b/public/static/admin/fonts/iconfont.woff differ
diff --git a/public/static/admin/images/l-line-white.png b/public/static/admin/images/l-line-white.png
new file mode 100644
index 0000000..453b7fd
Binary files /dev/null and b/public/static/admin/images/l-line-white.png differ
diff --git a/public/static/admin/images/l-line.png b/public/static/admin/images/l-line.png
new file mode 100644
index 0000000..4e602b5
Binary files /dev/null and b/public/static/admin/images/l-line.png differ
diff --git a/public/static/admin/images/login/login_bg.png b/public/static/admin/images/login/login_bg.png
new file mode 100644
index 0000000..a22f1ab
Binary files /dev/null and b/public/static/admin/images/login/login_bg.png differ
diff --git a/public/static/admin/images/login/login_line.jpg b/public/static/admin/images/login/login_line.jpg
new file mode 100644
index 0000000..6e8a1b1
Binary files /dev/null and b/public/static/admin/images/login/login_line.jpg differ
diff --git a/public/static/admin/images/login/yzm.jpg b/public/static/admin/images/login/yzm.jpg
new file mode 100644
index 0000000..fb79d6c
Binary files /dev/null and b/public/static/admin/images/login/yzm.jpg differ
diff --git a/public/static/admin/images/logo.png b/public/static/admin/images/logo.png
new file mode 100644
index 0000000..49cb59b
Binary files /dev/null and b/public/static/admin/images/logo.png differ
diff --git a/public/static/admin/js/common.js b/public/static/admin/js/common.js
new file mode 100644
index 0000000..ead99d8
--- /dev/null
+++ b/public/static/admin/js/common.js
@@ -0,0 +1,184 @@
+layui.config({
+ base: '../../static/admin/js/module/'
+}).extend({
+ dialog: 'dialog',
+});
+
+layui.use(['form', 'jquery', 'laydate', 'layer', 'laypage', 'dialog', 'element'], function() {
+ var form = layui.form(),
+ layer = layui.layer,
+ $ = layui.jquery,
+ dialog = layui.dialog;
+ //获取当前iframe的name值
+ var iframeObj = $(window.frameElement).attr('name');
+ //全选
+ form.on('checkbox(allChoose)', function(data) {
+ var child = $(data.elem).parents('table').find('tbody input[type="checkbox"]');
+ child.each(function(index, item) {
+ item.checked = data.elem.checked;
+ });
+ form.render('checkbox');
+ });
+ //渲染表单
+ form.render();
+ //顶部添加
+ $('.addBtn').click(function() {
+ var url=$(this).attr('data-url');
+ var desc=$(this).attr('data-desc');
+ //将iframeObj传递给父级窗口,执行操作完成刷新
+ parent.page(desc, url, iframeObj, w = "700px", h = "620px");
+ return false;
+
+ }).mouseenter(function() {
+
+ dialog.tips($(this).attr('data-desc'), '.addBtn');
+
+ })
+
+ //顶部刷新
+ $('.freshBtn').click(function() {
+ location.reload();
+ }).mouseenter(function() {
+
+ dialog.tips('刷新页面', '.freshBtn');
+
+ })
+
+ //列表添加
+ $('#table-list').on('click', '.add-btn', function() {
+ var url=$(this).attr('data-url');
+ //将iframeObj传递给父级窗口
+ parent.page("菜单添加", url, iframeObj, w = "700px", h = "620px");
+ return false;
+ })
+ //列表删除
+ $('#table-list').on('click', '.del-btn', function() {
+ var that = $(this);
+ var url=$(this).attr('data-url');
+ var token = $("input[name='_token']").val();
+ dialog.confirm({
+ message:'您确定要进行删除吗?',
+ success:function(){
+ $.ajax({
+ url:url,
+ data:{_method: 'DELETE',_token:token},
+ type:'post',
+ dataType:'json',
+ success:function(res){
+ if(res.status == 1){
+ that.parent().parent().parent().remove();
+ $("[parentid='"+that.attr('data-id')+"']").remove();
+ layer.msg(res.msg,{icon:6});
+ }else{
+ layer.msg(res.msg,{shift: 6,icon:5});
+ }
+ },
+ error : function(XMLHttpRequest, textStatus, errorThrown) {
+ layer.msg('网络失败', {time: 1000});
+ }
+ });
+
+ },
+ cancel:function(){
+ layer.msg('取消了')
+ }
+ })
+ return false;
+ })
+ //列表跳转
+ $('#table-list,.tool-btn').on('click', '.go-btn', function() {
+ var url=$(this).attr('data-url');
+ var id = $(this).attr('data-id');
+ window.location.href=url+"?id="+id;
+ return false;
+ })
+ //编辑栏目
+ $('#table-list').on('click', '.edit-btn', function() {
+ var That = $(this);
+ var url=That.attr('data-url');
+ var desc=That.attr('data-desc');
+ //将iframeObj传递给父级窗口
+ parent.page(desc, url, iframeObj, w = "700px", h = "620px");
+ return false;
+ })
+});
+
+/**
+ * 控制iframe窗口的刷新操作
+ */
+var iframeObjName;
+
+//父级弹出页面
+function page(title, url, obj, w, h) {
+ if(title == null || title == '') {
+ title = false;
+ };
+ if(url == null || url == '') {
+ url = "404.html";
+ };
+ if(w == null || w == '') {
+ w = '700px';
+ };
+ if(h == null || h == '') {
+ h = '350px';
+ };
+ iframeObjName = obj;
+ //如果手机端,全屏显示
+ if(window.innerWidth <= 768) {
+ var index = layer.open({
+ type: 2,
+ title: title,
+ area: [320, h],
+ fixed: false, //不固定
+ content: url,
+ end:function(){
+ refresh();
+ }
+ });
+ layer.full(index);
+ } else {
+ var index = layer.open({
+ type: 2,
+ title: title,
+ area: [w, h],
+ fixed: false, //不固定
+ content: url,
+ end:function(){
+ if(title!='管理员信息')refresh();
+ }
+ });
+ }
+}
+
+/**
+ * 刷新子页,关闭弹窗
+ */
+function refresh() {
+ //根据传递的name值,获取子iframe窗口,执行刷新
+ if(window.frames[iframeObjName]) {
+ window.frames[iframeObjName].location.reload();
+
+ } else {
+ window.location.reload();
+ }
+
+ layer.closeAll();
+}
+
+/**
+ * 刷新iframe
+ */
+function changeSort(name,obj) {
+ $.ajax({
+ url:$(obj).attr('data-url'),
+ data:{name: name,val:$(obj).val(),id:$(obj).attr('data-id'),_token:$("input[name='_token']").val()},
+ type:'post',
+ dataType:'json',
+ success:function(res){
+ layer.msg(res.msg);
+ },
+ error : function(XMLHttpRequest, textStatus, errorThrown) {
+ layer.msg('网络失败', {time: 1000});
+ }
+ });
+}
\ No newline at end of file
diff --git a/public/static/admin/js/main.js b/public/static/admin/js/main.js
new file mode 100644
index 0000000..ed2bc87
--- /dev/null
+++ b/public/static/admin/js/main.js
@@ -0,0 +1,92 @@
+layui.use(['layer', 'form', 'element', 'jquery', 'dialog'], function() {
+ var layer = layui.layer;
+ var element = layui.element();
+ var form = layui.form();
+ var $ = layui.jquery;
+ var dialog = layui.dialog;
+ var hideBtn = $('#hideBtn');
+ var mainLayout = $('#main-layout');
+ var mainMask = $('.main-mask');
+ //监听导航点击
+ element.on('nav(leftNav)', function(elem) {
+ var navA = $(elem).find('a');
+ var id = navA.attr('data-id');
+ var url = navA.attr('data-url');
+ var text = navA.attr('data-text');
+ if(!url){
+ return;
+ }
+ var isActive = $('.main-layout-tab .layui-tab-title').find("li[lay-id=" + id + "]");
+ if(isActive.length > 0) {
+ //切换到选项卡
+ element.tabChange('tab', id);
+ } else {
+ element.tabAdd('tab', {
+ title: text,
+ content: '',
+ id: id
+ });
+ element.tabChange('tab', id);
+
+ }
+ mainLayout.removeClass('hide-side');
+ });
+ //监听导航点击
+ element.on('nav(rightNav)', function(elem) {
+ var navA = $(elem).find('a');
+ var id = navA.attr('data-id');
+ var url = navA.attr('data-url');
+ var text = navA.attr('data-text');
+ if(!url){
+ return;
+ }
+ var isActive = $('.main-layout-tab .layui-tab-title').find("li[lay-id=" + id + "]");
+ if(isActive.length > 0) {
+ //切换到选项卡
+ element.tabChange('tab', id);
+ } else {
+ element.tabAdd('tab', {
+ title: text,
+ content: '',
+ id: id
+ });
+ element.tabChange('tab', id);
+
+ }
+ mainLayout.removeClass('hide-side');
+ });
+ //菜单隐藏显示
+ hideBtn.on('click', function() {
+ if(!mainLayout.hasClass('hide-side')) {
+ mainLayout.addClass('hide-side');
+ } else {
+ mainLayout.removeClass('hide-side');
+ }
+ });
+ //遮罩点击隐藏
+ mainMask.on('click', function() {
+ mainLayout.removeClass('hide-side');
+ })
+
+ //示范一个公告层
+// layer.open({
+// type: 1
+// ,title: false //不显示标题栏
+// ,closeBtn: false
+// ,area: '300px;'
+// ,shade: 0.8
+// ,id: 'LAY_layuipro' //设定一个id,防止重复弹出
+// ,resize: false
+// ,btn: ['火速围观', '残忍拒绝']
+// ,btnAlign: 'c'
+// ,moveType: 1 //拖拽模式,0或者1
+// ,content: '后台模版1.1版本今日更新:
数据列表页...
编辑删除弹出功能
失去焦点排序功能
数据列表页
数据列表页
数据列表页
'
+// ,success: function(layero){
+// var btn = layero.find('.layui-layer-btn');
+// btn.find('.layui-layer-btn0').attr({
+// href: 'http://www.layui.com/'
+// ,target: '_blank'
+// });
+// }
+// });
+});
\ No newline at end of file
diff --git a/public/static/admin/js/module/dialog.js b/public/static/admin/js/module/dialog.js
new file mode 100644
index 0000000..ea3c155
--- /dev/null
+++ b/public/static/admin/js/module/dialog.js
@@ -0,0 +1,57 @@
+layui.define(['jquery', 'layer'], function (exports) {
+ var $ = layui.jquery;
+ var layer = layui.layer;
+ var dialog = {
+ /*确认框*/
+ confirm: function (jsonData) {
+ layer.confirm(jsonData.message, {
+ btn: ['确定', '取消'],
+ shade: [0.1, '#fff']
+ }, function () {
+ jsonData.success && jsonData.success();
+ }, function () {
+ jsonData.cancel && jsonData.cancel();
+ });
+ },
+ page: function (title, url, w, h) {
+ if (title == null || title == '') {
+ title = false;
+ }
+ ;
+ if (url == null || url == '') {
+ url = "404.html";
+ }
+ ;
+ if (w == null || w == '') {
+ w = '700px';
+ }
+ ;
+ if (h == null || h == '') {
+ h = '350px';
+ }
+ ;
+ var index = layer.open({
+ type: 2,
+ title: title,
+ area: [w, h],
+ fixed: false, //不固定
+ maxmin: true,
+ content: url
+ });
+ },
+ /**
+ * 提示
+ * @param title
+ * @param obj
+ */
+ tips: function(title, obj) {
+ layer.tips(title, obj, {
+ tips: [1, '#444c63'], //还可配置颜色
+ time: 1000
+ });
+ }
+ };
+ //输出test接口
+ exports('dialog', dialog);
+ }
+);
diff --git a/public/static/admin/js/module/formate.js b/public/static/admin/js/module/formate.js
new file mode 100644
index 0000000..9984007
--- /dev/null
+++ b/public/static/admin/js/module/formate.js
@@ -0,0 +1,64 @@
+layui.define(function(exports){
+ var formate = {
+ /**
+ * 获取当前的日期函数
+ * 传入一个时间戳,如果不传则为当前时间
+ * 注意:如果是uinx时间戳记得乘于1000, 比如php函数time()获得的时间戳就要乘于1000
+ * @type String timestamp 要转换的时间戳格式 1469504554276
+ * @returns {String} 日期格式: 2016-07-26 10:55:38
+ */
+ ge_time_format:function(timestamp){
+ if(timestamp){
+ var date = new Date(timestamp*1000);
+ }else{
+ var date = new Date();
+ }
+ Y = date.getFullYear(),
+ m = date.getMonth()+1,
+ d = date.getDate(),
+ H = date.getHours(),
+ i = date.getMinutes(),
+ s = date.getSeconds();
+ if(m<10){
+ m = '0'+m;
+ }
+ if(d<10){
+ d = '0'+d;
+ }
+ if(H<10){
+ H = '0'+H;
+ }
+ if(i<10){
+ i = '0'+i;
+ }
+ if(s<10){
+ s = '0'+s;
+ }
+ var t = Y+'-'+m+'-'+d+' '+H+':'+i+':'+s;
+ return t;
+ },
+ /**
+ * 日期函数转为时间戳格式
+ * 传入一个日期时间格式,如果不传入就是获取现在的时间了
+ * @type String strtime 要转换的日期时间格式 2016-07-26 10:55:38
+ * @return {String} 时间戳格式: 1469504554276
+ */
+ get_unix_time_stamp:function (strtime) {
+ if(strtime){
+ var date = new Date(strtime);
+ }else{
+ var date = new Date();
+ }
+ time1 = date.getTime(); //会精确到毫秒---长度为13位
+ //time2 = date.valueOf(); //会精确到毫秒---长度为13位
+ //time3 = Date.parse(date); //只能精确到秒,毫秒将用0来代替---长度为10位
+ return time1;
+ }
+ };
+
+ //输出test接口
+ exports('formate', formate);
+});
+
+
+
diff --git a/public/static/admin/js/module/tool.js b/public/static/admin/js/module/tool.js
new file mode 100644
index 0000000..d7692c2
--- /dev/null
+++ b/public/static/admin/js/module/tool.js
@@ -0,0 +1,34 @@
+layui.define(['jquery'], function (exports) {
+ var $ = layui.jquery;
+ var tool = {
+ /**
+ * 移除数组的值
+ * @param arr 数组
+ * @param val 删除的值
+ */
+ removeByValue: function (arr, val) {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i] == val) {
+ arr.splice(i, 1);
+ break;
+ }
+ }
+ },
+ /**
+ * 转义字符,防止xxs
+ * @param str
+ * @returns {string}
+ */
+ stringEncode:function (str){
+ var div=document.createElement('div');
+ if(div.innerText){
+ div.innerText=str;
+ }else{
+ div.textContent=str;//Support firefox
+ }
+ return div.innerHTML;
+ }
+ };
+
+ exports('tool', tool);
+});
\ No newline at end of file
diff --git a/public/static/admin/layui/css/layui.css b/public/static/admin/layui/css/layui.css
new file mode 100644
index 0000000..e867303
--- /dev/null
+++ b/public/static/admin/layui/css/layui.css
@@ -0,0 +1,2 @@
+/** layui-v1.0.9_rls MIT License By http://www.layui.com */
+ .layui-laypage a,a{text-decoration:none}.layui-btn,.layui-inline,img{vertical-align:middle}.layui-btn,.layui-unselect{-webkit-user-select:none;-ms-user-select:none;-moz-user-select:none}.layui-btn,.layui-tree li i,.layui-unselect{-moz-user-select:none}blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}a:active,a:hover{outline:0}img{display:inline-block;border:none}li{list-style:none}table{border-collapse:collapse;border-spacing:0}h1,h2,h3{font-size:14px;font-weight:400}h4,h5,h6{font-size:100%;font-weight:400}button,input,optgroup,option,select,textarea{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;outline:0}pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-button:vertical{display:none}::-webkit-scrollbar-corner,::-webkit-scrollbar-track{background-color:#e2e2e2}::-webkit-scrollbar-thumb{border-radius:0;background-color:rgba(0,0,0,.3)}::-webkit-scrollbar-thumb:vertical:hover{background-color:rgba(0,0,0,.35)}::-webkit-scrollbar-thumb:vertical:active{background-color:rgba(0,0,0,.38)}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.9);src:url(../font/iconfont.eot?v=1.0.9#iefix) format('embedded-opentype'),url(../font/iconfont.svg?v=1.0.9#iconfont) format('svg'),url(../font/iconfont.woff?v=1.0.9) format('woff'),url(../font/iconfont.ttf?v=1.0.9) format('truetype')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{line-height:24px;font:14px Helvetica Neue,Helvetica,PingFang SC,\5FAE\8F6F\96C5\9ED1,Tahoma,Arial,sans-serif}hr{height:1px;margin:10px 0;border:0;background-color:#e2e2e2;clear:both}a{color:#333}a:hover{color:#777}a cite{font-style:normal;*cursor:pointer}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-clear{clear:both;*zoom:1}.layui-clear:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge{position:absolute;width:0;height:0;border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-disabled,.layui-disabled:hover{color:#d2d2d2!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-main{position:relative;width:1140px;margin:0 auto}.layui-header{position:relative;z-index:1000;height:60px}.layui-header a:hover{transition:all .5s;-webkit-transition:all .5s}.layui-side{position:fixed;top:0;bottom:0;z-index:999;width:200px;overflow-x:hidden}.layui-side-scroll{width:220px;height:100%;overflow-x:hidden}.layui-body{position:absolute;left:200px;right:0;top:0;bottom:0;z-index:998;width:auto;overflow:hidden;overflow-y:auto;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.layui-layout-admin .layui-header{background-color:#23262E}.layui-layout-admin .layui-side{top:60px;width:200px;overflow-x:hidden}.layui-layout-admin .layui-body{top:60px;bottom:44px}.layui-layout-admin .layui-main{width:auto;margin:0 15px}.layui-layout-admin .layui-footer{position:fixed;left:200px;right:0;bottom:0;height:44px;background-color:#eee}.layui-btn,.layui-input,.layui-select,.layui-textarea,.layui-upload-button{outline:0;-webkit-transition:border-color .3s cubic-bezier(.65,.05,.35,.5);transition:border-color .3s cubic-bezier(.65,.05,.35,.5);-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-elem-quote{margin-bottom:10px;padding:15px;line-height:22px;border-left:5px solid #009688;border-radius:0 2px 2px 0;background-color:#f2f2f2}.layui-quote-nm{border-color:#e2e2e2;border-style:solid;border-width:1px 1px 1px 5px;background:0 0}.layui-elem-field{margin-bottom:10px;padding:0;border:1px solid #e2e2e2}.layui-elem-field legend{margin-left:20px;padding:0 10px;font-size:20px;font-weight:300}.layui-field-title{margin:10px 0 20px;border:none;border-top:1px solid #e2e2e2}.layui-field-box{padding:10px 15px}.layui-field-title .layui-field-box{padding:10px 0}.layui-progress{position:relative;height:6px;border-radius:20px;background-color:#e2e2e2}.layui-progress-bar{position:absolute;width:0;max-width:100%;height:6px;border-radius:20px;text-align:right;background-color:#5FB878;transition:all .3s;-webkit-transition:all .3s}.layui-progress-big,.layui-progress-big .layui-progress-bar{height:18px;line-height:18px}.layui-progress-text{position:relative;top:-18px;line-height:18px;font-size:12px;color:#666}.layui-progress-big .layui-progress-text{position:static;padding:0 10px;color:#fff}.layui-collapse{border:1px solid #e2e2e2;border-radius:2px}.layui-colla-item{border-top:1px solid #e2e2e2}.layui-colla-item:first-child{border-top:none}.layui-colla-title{position:relative;height:42px;line-height:42px;padding:0 15px 0 35px;color:#333;background-color:#f2f2f2;cursor:pointer}.layui-colla-content{display:none;padding:10px 15px;line-height:22px;border-top:1px solid #e2e2e2;color:#666}.layui-colla-icon{position:absolute;left:15px;top:0;font-size:14px}.layui-bg-red{background-color:#FF5722}.layui-bg-orange{background-color:#F7B824}.layui-bg-green{background-color:#009688}.layui-bg-cyan{background-color:#2F4056}.layui-bg-blue{background-color:#1E9FFF}.layui-bg-black{background-color:#393D49}.layui-bg-gray{background-color:#eee}.layui-word-aux{font-size:12px;color:#999;padding:0 5px}.layui-btn{display:inline-block;height:38px;line-height:38px;padding:0 18px;background-color:#009688;color:#fff;white-space:nowrap;text-align:center;font-size:14px;border:none;border-radius:2px;cursor:pointer;opacity:.9;filter:alpha(opacity=90)}.layui-btn:hover{opacity:.8;filter:alpha(opacity=80);color:#fff}.layui-btn:active{opacity:1;filter:alpha(opacity=100)}.layui-btn+.layui-btn{margin-left:10px}.layui-btn-radius{border-radius:100px}.layui-btn .layui-icon{font-size:18px;vertical-align:bottom}.layui-btn-primary{border:1px solid #C9C9C9;background-color:#fff;color:#555}.layui-btn-primary:hover{border-color:#009688;color:#333}.layui-btn-normal{background-color:#1E9FFF}.layui-btn-warm{background-color:#F7B824}.layui-btn-danger{background-color:#FF5722}.layui-btn-disabled,.layui-btn-disabled:active,.layui-btn-disabled:hover{border:1px solid #e6e6e6;background-color:#FBFBFB;color:#C9C9C9;cursor:not-allowed;opacity:1}.layui-btn-big{height:44px;line-height:44px;padding:0 25px;font-size:16px}.layui-btn-small{height:30px;line-height:30px;padding:0 10px;font-size:12px}.layui-btn-small i{font-size:16px!important}.layui-btn-mini{height:22px;line-height:22px;padding:0 5px;font-size:12px}.layui-btn-mini i{font-size:14px!important}.layui-btn-group{display:inline-block;vertical-align:middle;font-size:0}.layui-btn-group .layui-btn{margin-left:0!important;margin-right:0!important;border-left:1px solid rgba(255,255,255,.5);border-radius:0}.layui-btn-group .layui-btn-primary{border-left:none}.layui-btn-group .layui-btn-primary:hover{border-color:#C9C9C9;color:#009688}.layui-btn-group .layui-btn:first-child{border-left:none;border-radius:2px 0 0 2px}.layui-btn-group .layui-btn-primary:first-child{border-left:1px solid #c9c9c9}.layui-btn-group .layui-btn:last-child{border-radius:0 2px 2px 0}.layui-btn-group .layui-btn+.layui-btn{margin-left:0}.layui-btn-group+.layui-btn-group{margin-left:10px}.layui-input,.layui-select,.layui-textarea{height:38px;line-height:38px;line-height:36px\9;border:1px solid #e6e6e6;background-color:#fff;border-radius:2px}.layui-form-label,.layui-form-mid,.layui-textarea{line-height:20px;position:relative}.layui-input,.layui-textarea{display:block;width:100%;padding-left:10px}.layui-input:hover,.layui-textarea:hover{border-color:#D2D2D2!important}.layui-input:focus,.layui-textarea:focus{border-color:#C9C9C9!important}.layui-textarea{min-height:100px;height:auto;padding:6px 10px;resize:vertical}.layui-select{padding:0 10px}.layui-form input[type=checkbox],.layui-form input[type=radio],.layui-form select{display:none}.layui-form-item{margin-bottom:15px;clear:both;*zoom:1}.layui-form-item:after{content:'\20';clear:both;*zoom:1;display:block;height:0}.layui-form-label{float:left;display:block;padding:9px 15px;width:80px;font-weight:400;text-align:right}.layui-form-item .layui-inline{margin-bottom:5px;margin-right:10px}.layui-input-block,.layui-input-inline{position:relative}.layui-input-block{margin-left:110px;min-height:36px}.layui-input-inline{display:inline-block;vertical-align:middle}.layui-form-item .layui-input-inline{float:left;width:190px;margin-right:10px}.layui-form-text .layui-input-inline{width:auto}.layui-form-mid{float:left;display:block;padding:8px 0;margin-right:10px}.layui-form-danger+.layui-form-select .layui-input,.layui-form-danger:focus{border:1px solid #FF5722!important}.layui-form-select{position:relative}.layui-form-select .layui-input{padding-right:30px;cursor:pointer}.layui-form-select .layui-edge{position:absolute;right:10px;top:50%;margin-top:-3px;cursor:pointer;border-width:6px;border-top-color:#c2c2c2;border-top-style:solid;transition:all .3s;-webkit-transition:all .3s}.layui-form-select dl{display:none;position:absolute;left:0;top:42px;padding:5px 0;z-index:999;min-width:100%;border:1px solid #d2d2d2;max-height:300px;overflow-y:auto;background-color:#fff;border-radius:2px;box-shadow:0 2px 4px rgba(0,0,0,.12);box-sizing:border-box}.layui-form-select dl dd,.layui-form-select dl dt{padding:0 10px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.layui-form-select dl dt{font-size:12px;color:#999}.layui-form-select dl dd{cursor:pointer}.layui-form-select dl dd:hover{background-color:#f2f2f2}.layui-form-select .layui-select-group dd{padding-left:20px}.layui-form-select dl dd.layui-this{background-color:#5FB878;color:#fff}.layui-form-checkbox,.layui-form-select dl dd.layui-disabled{background-color:#fff}.layui-form-selected dl{display:block}.layui-form-checkbox,.layui-form-checkbox *,.layui-form-radio,.layui-form-radio *,.layui-form-switch{display:inline-block;vertical-align:middle}.layui-form-selected .layui-edge{margin-top:-9px;-webkit-transform:rotate(180deg);transform:rotate(180deg);margin-top:-3px\9}:root .layui-form-selected .layui-edge{margin-top:-9px\0/IE9}.layui-select-none{margin:5px 0;text-align:center;color:#999}.layui-select-disabled .layui-disabled{border-color:#eee!important}.layui-select-disabled .layui-edge{border-top-color:#d2d2d2}.layui-form-checkbox{position:relative;height:30px;line-height:28px;margin-right:10px;padding-right:30px;border:1px solid #d2d2d2;cursor:pointer;font-size:0;border-radius:2px;-webkit-transition:.1s linear;transition:.1s linear;box-sizing:border-box!important}.layui-form-checkbox:hover{border:1px solid #c2c2c2}.layui-form-checkbox span{padding:0 10px;height:100%;font-size:14px;background-color:#d2d2d2;color:#fff;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.layui-form-checkbox:hover span{background-color:#c2c2c2}.layui-form-checkbox i{position:absolute;right:0;width:30px;color:#fff;font-size:20px;text-align:center}.layui-form-checkbox:hover i{color:#c2c2c2}.layui-form-checked,.layui-form-checked:hover{border-color:#5FB878}.layui-form-checked span,.layui-form-checked:hover span{background-color:#5FB878}.layui-form-checked i,.layui-form-checked:hover i{color:#5FB878}.layui-form-item .layui-form-checkbox{margin-top:4px}.layui-form-checkbox[lay-skin=primary]{height:auto!important;line-height:normal!important;border:none!important;margin-right:0;padding-right:0;background:0 0}.layui-form-checkbox[lay-skin=primary] span{float:right;padding-right:15px;line-height:18px;background:0 0;color:#666}.layui-form-checkbox[lay-skin=primary] i{position:relative;top:0;width:16px;line-height:16px;border:1px solid #d2d2d2;font-size:12px;border-radius:2px;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-checkbox[lay-skin=primary]:hover i{border-color:#5FB878;color:#fff}.layui-form-checked[lay-skin=primary] i{border-color:#5FB878;background-color:#5FB878;color:#fff}.layui-checkbox-disbaled[lay-skin=primary] span{background:0 0!important}.layui-checkbox-disbaled[lay-skin=primary]:hover i{border-color:#d2d2d2}.layui-form-item .layui-form-checkbox[lay-skin=primary]{margin-top:10px}.layui-form-switch{position:relative;height:22px;line-height:22px;width:42px;padding:0 5px;margin-top:8px;border:1px solid #d2d2d2;border-radius:20px;cursor:pointer;background-color:#fff;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch i{position:absolute;left:5px;top:3px;width:16px;height:16px;border-radius:20px;background-color:#d2d2d2;-webkit-transition:.1s linear;transition:.1s linear}.layui-form-switch em{position:absolute;right:5px;top:0;width:25px;padding:0!important;text-align:center!important;color:#999!important;font-style:normal!important;font-size:12px}.layui-form-onswitch{border-color:#5FB878;background-color:#5FB878}.layui-form-onswitch i{left:32px;background-color:#fff}.layui-form-onswitch em{left:5px;right:auto;color:#fff!important}.layui-checkbox-disbaled{border-color:#e2e2e2!important}.layui-checkbox-disbaled span{background-color:#e2e2e2!important}.layui-checkbox-disbaled:hover i{color:#fff!important}.layui-form-radio{line-height:28px;margin:6px 10px 0 0;padding-right:10px;cursor:pointer;font-size:0}.layui-form-radio i{margin-right:8px;font-size:22px;color:#c2c2c2}.layui-form-radio span{font-size:14px}.layui-form-radio i:hover,.layui-form-radioed i{color:#5FB878}.layui-radio-disbaled i{color:#e2e2e2!important}.layui-form-pane .layui-form-label{width:110px;padding:8px 15px;height:38px;line-height:20px;border:1px solid #e6e6e6;border-radius:2px 0 0 2px;text-align:center;background-color:#FBFBFB;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-form-pane .layui-input-inline{margin-left:-1px}.layui-form-pane .layui-input-block{margin-left:110px;left:-1px}.layui-form-pane .layui-input{border-radius:0 2px 2px 0}.layui-form-pane .layui-form-text .layui-form-label{float:none;width:100%;border-right:1px solid #e6e6e6;border-radius:2px;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important;text-align:left}.layui-laypage button,.layui-laypage input,.layui-nav{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important}.layui-form-pane .layui-form-text .layui-input-inline{display:block;margin:0;top:-1px;clear:both}.layui-form-pane .layui-form-text .layui-input-block{margin:0;left:0;top:-1px}.layui-form-pane .layui-form-text .layui-textarea{min-height:100px;border-radius:0 0 2px 2px}.layui-form-pane .layui-form-checkbox{margin:4px 0 4px 10px}.layui-form-pane .layui-form-radio,.layui-form-pane .layui-form-switch{margin-top:6px;margin-left:10px}.layui-form-pane .layui-form-item[pane]{position:relative;border:1px solid #e6e6e6}.layui-form-pane .layui-form-item[pane] .layui-form-label{position:absolute;left:0;top:0;height:100%;border-width:0 1px 0 0}.layui-form-pane .layui-form-item[pane] .layui-input-inline{margin-left:110px}.layui-layedit{border:1px solid #d2d2d2;border-radius:2px}.layui-layedit-tool{padding:3px 5px;border-bottom:1px solid #e2e2e2;font-size:0}.layedit-tool-fixed{position:fixed;top:0;border-top:1px solid #e2e2e2}.layui-layedit-tool .layedit-tool-mid,.layui-layedit-tool .layui-icon{display:inline-block;vertical-align:middle;text-align:center;font-size:14px}.layui-layedit-tool .layui-icon{position:relative;width:32px;height:30px;line-height:30px;margin:3px 5px;color:#777;cursor:pointer;border-radius:2px}.layui-layedit-tool .layui-icon:hover{color:#393D49}.layui-layedit-tool .layui-icon:active{color:#000}.layui-layedit-tool .layedit-tool-active{background-color:#e2e2e2;color:#000}.layui-layedit-tool .layui-disabled,.layui-layedit-tool .layui-disabled:hover{color:#d2d2d2;cursor:not-allowed}.layui-layedit-tool .layedit-tool-mid{width:1px;height:18px;margin:0 10px;background-color:#d2d2d2}.layedit-tool-html{width:50px!important;font-size:30px!important}.layedit-tool-b,.layedit-tool-code,.layedit-tool-help{font-size:16px!important}.layedit-tool-d,.layedit-tool-face,.layedit-tool-image,.layedit-tool-unlink{font-size:18px!important}.layedit-tool-image input{position:absolute;font-size:0;left:0;top:0;width:100%;height:100%;opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-layedit-iframe iframe{display:block;width:100%}#LAY_layedit_code{overflow:hidden}.layui-table{width:100%;margin:10px 0;background-color:#fff}.layui-table tr{transition:all .3s;-webkit-transition:all .3s}.layui-table thead tr{background-color:#f2f2f2}.layui-table th{text-align:left}.layui-table td,.layui-table th{padding:9px 15px;min-height:20px;line-height:20px;border:1px solid #e2e2e2;font-size:14px}.layui-table tr:hover,.layui-table[lay-even] tr:nth-child(even){background-color:#f8f8f8}.layui-table[lay-skin=line],.layui-table[lay-skin=row]{border:1px solid #e2e2e2}.layui-table[lay-skin=line] td,.layui-table[lay-skin=line] th{border:none;border-bottom:1px solid #e2e2e2}.layui-table[lay-skin=row] td,.layui-table[lay-skin=row] th{border:none;border-right:1px solid #e2e2e2}.layui-table[lay-skin=nob] td,.layui-table[lay-skin=nob] th{border:none}.layui-upload-button{position:relative;display:inline-block;vertical-align:middle;min-width:60px;height:38px;line-height:38px;border:1px solid #DFDFDF;border-radius:2px;overflow:hidden;background-color:#fff;color:#666}.layui-upload-button:hover{border:1px solid #aaa;color:#333}.layui-upload-button:active{border:1px solid #4CAF50;color:#000}.layui-upload-button input,.layui-upload-file{opacity:.01;filter:Alpha(opacity=1);cursor:pointer}.layui-upload-button input{position:absolute;left:0;top:0;z-index:10;font-size:100px;width:100%;height:100%}.layui-upload-icon{display:block;margin:0 15px;text-align:center}.layui-upload-icon i{margin-right:5px;vertical-align:top;font-size:20px;color:#5FB878}.layui-upload-iframe{position:absolute;width:0;height:0;border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}.layui-upload-enter .layui-upload-icon,.layui-upload-enter .layui-upload-icon i{color:#fff}.layui-flow-more{margin:10px 0;text-align:center;color:#999;font-size:14px}.layui-flow-more a{height:32px;line-height:32px}.layui-flow-more a *{display:inline-block;vertical-align:top}.layui-flow-more a cite{padding:0 20px;border-radius:3px;background-color:#eee;color:#333;font-style:normal}.layui-flow-more a cite:hover{opacity:.8}.layui-flow-more a i{font-size:30px;color:#737383}.layui-laypage{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;margin:10px 0;font-size:0}.layui-laypage>:first-child,.layui-laypage>:first-child em{border-radius:2px 0 0 2px}.layui-laypage>:last-child,.layui-laypage>:last-child em{border-radius:0 2px 2px 0}.layui-laypage a,.layui-laypage span{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding:0 15px;border:1px solid #e2e2e2;height:28px;line-height:28px;margin:0 -1px 5px 0;background-color:#fff;color:#333;font-size:12px}.layui-laypage em{font-style:normal}.layui-laypage span{color:#999;font-weight:700}.layui-laypage .layui-laypage-curr{position:relative}.layui-laypage .layui-laypage-curr em{position:relative;color:#fff;font-weight:400}.layui-laypage .layui-laypage-curr .layui-laypage-em{position:absolute;left:-1px;top:-1px;padding:1px;width:100%;height:100%;background-color:#009688}.layui-laypage-em{border-radius:2px}.layui-laypage-next em,.layui-laypage-prev em{font-family:Sim sun;font-size:16px}.layui-laypage .layui-laypage-total{height:30px;line-height:30px;margin-left:1px;border:none;font-weight:400}.layui-laypage button,.layui-laypage input{height:30px;line-height:30px;border:1px solid #e2e2e2;border-radius:2px;vertical-align:top;background-color:#fff;box-sizing:border-box!important}.layui-laypage input{width:50px;margin:0 5px;text-align:center}.layui-laypage button{margin-left:5px;padding:0 15px;cursor:pointer}.layui-code{position:relative;margin:10px 0;padding:15px;line-height:20px;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New;font-size:12px}.layui-tree{line-height:26px}.layui-tree li{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-tree li .layui-tree-spread,.layui-tree li a{display:inline-block;vertical-align:top;height:26px;*display:inline;*zoom:1;cursor:pointer}.layui-tree li a{font-size:0}.layui-tree li a i{font-size:16px}.layui-tree li a cite{padding:0 6px;font-size:14px;font-style:normal}.layui-tree li i{padding-left:6px;color:#333}.layui-tree li .layui-tree-check{font-size:13px}.layui-tree li .layui-tree-check:hover{color:#009E94}.layui-tree li ul{display:none;margin-left:20px}.layui-tree li .layui-tree-enter{line-height:24px;border:1px dotted #000}.layui-tree-drag{display:none;position:absolute;left:-666px;top:-666px;background-color:#f2f2f2;padding:5px 10px;border:1px dotted #000;white-space:nowrap}.layui-tree-drag i{padding-right:5px}.layui-nav{position:relative;padding:0 20px;background-color:#393D49;color:#c2c2c2;border-radius:2px;font-size:0;box-sizing:border-box!important}.layui-nav *{font-size:14px}.layui-nav .layui-nav-item{position:relative;display:inline-block;*display:inline;*zoom:1;vertical-align:middle;line-height:60px}.layui-nav .layui-nav-item a{display:block;padding:0 20px;color:#c2c2c2;transition:all .3s;-webkit-transition:all .3s}.layui-nav .layui-this:after,.layui-nav-bar,.layui-nav-tree .layui-nav-itemed:after{position:absolute;left:0;top:0;width:0;height:5px;background-color:#5FB878;transition:all .2s;-webkit-transition:all .2s}.layui-nav-bar{z-index:1000}.layui-nav .layui-nav-item a:hover,.layui-nav .layui-this a{color:#fff}.layui-nav .layui-this:after{content:'';top:auto;bottom:0;width:100%}.layui-nav .layui-nav-more{content:'';width:0;height:0;border-style:solid dashed dashed;border-color:#c2c2c2 transparent transparent;overflow:hidden;cursor:pointer;transition:all .2s;-webkit-transition:all .2s;position:absolute;top:28px;right:3px;border-width:6px}.layui-nav .layui-nav-mored,.layui-nav-itemed .layui-nav-more{top:22px;border-style:dashed dashed solid;border-color:transparent transparent #c2c2c2}.layui-nav-child{display:none;position:absolute;left:0;top:65px;min-width:100%;line-height:36px;padding:5px 0;box-shadow:0 2px 4px rgba(0,0,0,.12);border:1px solid #d2d2d2;background-color:#fff;z-index:100;border-radius:2px;white-space:nowrap}.layui-nav .layui-nav-child a{color:#333}.layui-nav .layui-nav-child a:hover{background-color:#f2f2f2;color:#333}.layui-nav-child dd{position:relative}.layui-nav-child dd.layui-this{background-color:#5FB878;color:#fff}.layui-nav-child dd.layui-this a{color:#fff}.layui-nav-child dd.layui-this:after{display:none}.layui-nav-tree{width:200px;padding:0}.layui-nav-tree .layui-nav-item{display:block;width:100%;line-height:45px}.layui-nav-tree .layui-nav-item a{height:45px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-nav-tree .layui-nav-item a:hover{background-color:#4E5465}.layui-nav-tree .layui-nav-child dd.layui-this,.layui-nav-tree .layui-this,.layui-nav-tree .layui-this>a,.layui-nav-tree .layui-this>a:hover{background-color:#009688;color:#fff}.layui-nav-tree .layui-this:after{display:none}.layui-nav-itemed>a,.layui-nav-tree .layui-nav-title a,.layui-nav-tree .layui-nav-title a:hover{background-color:#2B2E37!important;color:#fff!important}.layui-nav-tree .layui-nav-bar{width:5px;height:0;background-color:#009688}.layui-nav-tree .layui-nav-child{position:relative;z-index:0;top:0;border:none;box-shadow:none}.layui-nav-tree .layui-nav-child a{height:40px;line-height:40px;color:#c2c2c2}.layui-nav-tree .layui-nav-child,.layui-nav-tree .layui-nav-child a:hover{background:0 0;color:#fff}.layui-nav-tree .layui-nav-more{top:20px;right:10px}.layui-nav-itemed .layui-nav-more{top:14px}.layui-nav-itemed .layui-nav-child{display:block;padding:0}.layui-nav-side{position:fixed;top:0;bottom:0;left:0;overflow-x:hidden;z-index:999}.layui-breadcrumb{visibility:hidden;font-size:0}.layui-breadcrumb a{padding-right:8px;line-height:22px;font-size:14px;color:#333!important}.layui-breadcrumb a:hover{color:#01AAED!important}.layui-breadcrumb a cite,.layui-breadcrumb a span{color:#666;cursor:text;font-style:normal}.layui-breadcrumb a span{padding-left:8px;font-family:Sim sun}.layui-tab{margin:10px 0;text-align:left!important}.layui-fixbar li,.layui-tab-bar,.layui-tab-title li,.layui-util-face ul li{cursor:pointer;text-align:center}.layui-tab[overflow]>.layui-tab-title{overflow:hidden}.layui-tab-title{position:relative;left:0;height:40px;white-space:nowrap;font-size:0;border-bottom:1px solid #e2e2e2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;font-size:14px;transition:all .2s;-webkit-transition:all .2s;position:relative;line-height:40px;min-width:65px;padding:0 10px}.layui-tab-title li a{display:block}.layui-tab-title .layui-this{color:#000}.layui-tab-title .layui-this:after{position:absolute;left:0;top:0;content:'';width:100%;height:41px;border:1px solid #e2e2e2;border-bottom-color:#fff;border-radius:2px 2px 0 0;-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important;pointer-events:none}.layui-tab-bar{position:absolute;right:0;top:0;z-index:10;width:30px;height:39px;line-height:39px;border:1px solid #e2e2e2;border-radius:2px;background-color:#fff}.layui-tab-bar .layui-icon{position:relative;display:inline-block;top:3px;transition:all .3s;-webkit-transition:all .3s}.layui-tab-item,.layui-util-face .layui-layer-TipsG{display:none}.layui-tab-more{padding-right:30px;height:auto;white-space:normal}.layui-tab-more li.layui-this:after{border-bottom-color:#e2e2e2;border-radius:2px}.layui-tab-more .layui-tab-bar .layui-icon{top:-2px;top:3px\9;-webkit-transform:rotate(180deg);transform:rotate(180deg)}:root .layui-tab-more .layui-tab-bar .layui-icon{top:-2px\0/IE9}.layui-tab-content{padding:10px}.layui-tab-title li .layui-tab-close{position:relative;margin-left:8px;top:1px;color:#c2c2c2;transition:all .2s;-webkit-transition:all .2s}.layui-tab-title li .layui-tab-close:hover{border-radius:2px;background-color:#FF5722;color:#fff}.layui-tab-brief>.layui-tab-title .layui-this{color:#009688}.layui-tab-brief>.layui-tab-more li.layui-this:after,.layui-tab-brief>.layui-tab-title .layui-this:after{border:none;border-radius:0;border-bottom:3px solid #5FB878}.layui-tab-brief[overflow]>.layui-tab-title .layui-this:after{top:-1px}.layui-tab-card{border:1px solid #e2e2e2;border-radius:2px;box-shadow:0 2px 5px 0 rgba(0,0,0,.1)}.layui-tab-card>.layui-tab-title{background-color:#f2f2f2}.layui-tab-card>.layui-tab-title li{margin-right:-1px;margin-left:-1px}.layui-tab-card>.layui-tab-title .layui-this{background-color:#fff}.layui-tab-card>.layui-tab-title .layui-this:after{border-top:none;border-width:1px;border-bottom-color:#fff}.layui-tab-card>.layui-tab-title .layui-tab-bar{height:40px;line-height:40px;border-radius:0;border-top:none;border-right:none}.layui-tab-card>.layui-tab-more .layui-this{background:0 0;color:#5FB878}.layui-tab-card>.layui-tab-more .layui-this:after{border:none}.layui-fixbar{position:fixed;right:15px;bottom:15px;z-index:9999}.layui-fixbar li{width:50px;height:50px;line-height:50px;margin-bottom:1px;font-size:30px;background-color:#9F9F9F;color:#fff;border-radius:2px;opacity:.95}.layui-fixbar li:hover{opacity:.85}.layui-fixbar li:active{opacity:1}.layui-fixbar .layui-fixbar-top{display:none;font-size:40px}body .layui-util-face{border:none;background:0 0}body .layui-util-face .layui-layer-content{padding:0;background-color:#fff;color:#666;box-shadow:none}.layui-util-face ul{position:relative;width:372px;padding:10px;border:1px solid #D9D9D9;background-color:#fff;box-shadow:0 0 20px rgba(0,0,0,.2)}.layui-util-face ul li{float:left;border:1px solid #e8e8e8;height:22px;width:26px;overflow:hidden;margin:-1px 0 0 -1px;padding:4px 2px}.layui-util-face ul li:hover{position:relative;z-index:2;border:1px solid #eb7350;background:#fff9ec}.layui-anim{-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-anim-loop{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes layui-rotate{from{-webkit-transform:rotate(0)}to{-webkit-transform:rotate(360deg)}}@keyframes layui-rotate{from{transform:rotate(0)}to{transform:rotate(360deg)}}.layui-anim-rotate{-webkit-animation-name:layui-rotate;animation-name:layui-rotate;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:linear;animation-timing-function:linear}@-webkit-keyframes layui-up{from{-webkit-transform:translate3d(0,100%,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-up{from{transform:translate3d(0,100%,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-up{-webkit-animation-name:layui-up;animation-name:layui-up}@-webkit-keyframes layui-upbit{from{-webkit-transform:translate3d(0,30px,0);opacity:.3}to{-webkit-transform:translate3d(0,0,0);opacity:1}}@keyframes layui-upbit{from{transform:translate3d(0,30px,0);opacity:.3}to{transform:translate3d(0,0,0);opacity:1}}.layui-anim-upbit{-webkit-animation-name:layui-upbit;animation-name:layui-upbit}@-webkit-keyframes layui-scale{0%{opacity:.3;-webkit-transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale{0%{opacity:.3;-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scale{-webkit-animation-name:layui-scale;animation-name:layui-scale}@-webkit-keyframes layui-scale-spring{0%{opacity:.5;-webkit-transform:scale(.5)}80%{opacity:.8;-webkit-transform:scale(1.1)}100%{opacity:1;-webkit-transform:scale(1)}}@keyframes layui-scale-spring{0%{opacity:.5;-ms-transform:scale(.5);transform:scale(.5)}80%{opacity:.8;-ms-transform:scale(1.1);transform:scale(1.1)}100%{opacity:1;-ms-transform:scale(1);transform:scale(1)}}.layui-anim-scaleSpring{-webkit-animation-name:layui-scale-spring;animation-name:layui-scale-spring}@media screen and (max-width:450px){.layui-form-item .layui-form-label{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-form-item .layui-inline{display:block;margin-right:0;margin-bottom:20px;clear:both}.layui-form-item .layui-inline:after{content:'\20';clear:both;display:block;height:0}.layui-form-item .layui-input-inline{display:block;float:none;left:-3px;width:auto;margin:0 0 10px 112px}.layui-form-item .layui-input-inline+.layui-form-mid{margin-left:110px;top:-5px;padding:0}.layui-form-item .layui-form-checkbox{margin-right:5px;margin-bottom:5px}}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/layui.mobile.css b/public/static/admin/layui/css/layui.mobile.css
new file mode 100644
index 0000000..06aa5f6
--- /dev/null
+++ b/public/static/admin/layui/css/layui.mobile.css
@@ -0,0 +1,2 @@
+/** layui-v1.0.9_rls MIT License By http://www.layui.com */
+ blockquote,body,button,dd,div,dl,dt,form,h1,h2,h3,h4,h5,h6,input,legend,li,ol,p,td,textarea,th,ul{margin:0;padding:0;-webkit-tap-highlight-color:rgba(0,0,0,0)}html{font:12px 'Helvetica Neue','PingFang SC',STHeitiSC-Light,Helvetica,Arial,sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}a,button,input{-webkit-tap-highlight-color:rgba(255,0,0,0)}a{text-decoration:none;background:0 0}a:active,a:hover{outline:0}table{border-collapse:collapse;border-spacing:0}li{list-style:none}b,strong{font-weight:700}h1,h2,h3,h4,h5,h6{font-weight:500}address,cite,dfn,em,var{font-style:normal}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}img{border:0;vertical-align:bottom}.layui-inline,input,label{vertical-align:middle}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0;outline:0}button,select{text-transform:none}select{-webkit-appearance:none;border:none}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}@font-face{font-family:layui-icon;src:url(../font/iconfont.eot?v=1.0.7);src:url(../font/iconfont.eot?v=1.0.7#iefix) format('embedded-opentype'),url(../font/iconfont.woff?v=1.0.7) format('woff'),url(../font/iconfont.ttf?v=1.0.7) format('truetype'),url(../font/iconfont.svg?v=1.0.7#iconfont) format('svg')}.layui-icon{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.layui-box,.layui-box *{-webkit-box-sizing:content-box!important;-moz-box-sizing:content-box!important;box-sizing:content-box!important}.layui-border-box,.layui-border-box *{-webkit-box-sizing:border-box!important;-moz-box-sizing:border-box!important;box-sizing:border-box!important}.layui-inline{position:relative;display:inline-block;*display:inline;*zoom:1}.layui-edge,.layui-upload-iframe{position:absolute;width:0;height:0}.layui-edge{border-style:dashed;border-color:transparent;overflow:hidden}.layui-elip{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-unselect{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none}.layui-disabled,.layui-disabled:active{background-color:#d2d2d2!important;color:#fff!important;cursor:not-allowed!important}.layui-circle{border-radius:100%}.layui-show{display:block!important}.layui-hide{display:none!important}.layui-upload-iframe{border:0;visibility:hidden}.layui-upload-enter{border:1px solid #009E94;background-color:#009E94;color:#fff;-webkit-transform:scale(1.1);transform:scale(1.1)}.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/code.css b/public/static/admin/layui/css/modules/code.css
new file mode 100644
index 0000000..704b8f3
--- /dev/null
+++ b/public/static/admin/layui/css/modules/code.css
@@ -0,0 +1,2 @@
+/** layui-v1.0.9_rls MIT License By http://www.layui.com */
+ html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #ddd;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:30px;line-height:30px;border-bottom:1px solid #ddd}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #ddd;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/laydate/icon.png b/public/static/admin/layui/css/modules/laydate/icon.png
new file mode 100644
index 0000000..5a50673
Binary files /dev/null and b/public/static/admin/layui/css/modules/laydate/icon.png differ
diff --git a/public/static/admin/layui/css/modules/laydate/laydate.css b/public/static/admin/layui/css/modules/laydate/laydate.css
new file mode 100644
index 0000000..c0eec2f
--- /dev/null
+++ b/public/static/admin/layui/css/modules/laydate/laydate.css
@@ -0,0 +1,2 @@
+/** layui-v1.0.9_rls MIT License By http://www.layui.com */
+ #layuicss-laydatecss{display:none;position:absolute;width:1989px}.laydate_body .laydate_box,.laydate_body .laydate_box *{margin:0;padding:0;box-sizing:content-box}.laydate-icon,.laydate-icon-dahong,.laydate-icon-danlan,.laydate-icon-default,.laydate-icon-molv{height:22px;line-height:22px;padding-right:20px;border:1px solid #C6C6C6;background-repeat:no-repeat;background-position:right center;background-color:#fff;outline:0}.laydate-icon-default{background-image:url(../skins/default/icon.png)}.laydate-icon-danlan{border:1px solid #B1D2EC;background-image:url(../skins/danlan/icon.png)}.laydate-icon-dahong{background-image:url(../skins/dahong/icon.png)}.laydate-icon-molv{background-image:url(../skins/molv/icon.png)}.laydate_body .laydate_box{width:240px;font:12px '\5B8B\4F53';z-index:99999999;*overflow:hidden;_margin:0;_position:absolute!important}.laydate_body .laydate_box li{list-style:none}.laydate_body .laydate_box .laydate_void{cursor:text!important}.laydate_body .laydate_box cite,.laydate_body .laydate_box label{position:absolute;width:0;height:0;border-width:5px;border-style:dashed;border-color:transparent;overflow:hidden;cursor:pointer}.laydate_body .laydate_box .laydate_time,.laydate_body .laydate_box .laydate_yms{display:none}.laydate_body .laydate_box .laydate_show{display:block}.laydate_body .laydate_box input{outline:0;font-size:14px;background-color:#fff;color:#333}.laydate_body .laydate_top{position:relative;height:26px;padding:5px;*width:100%;z-index:99}.laydate_body .laydate_ym{position:relative;float:left;height:24px;cursor:pointer}.laydate_body .laydate_ym input{float:left;height:24px;line-height:24px;text-align:center;border:none;cursor:pointer}.laydate_body .laydate_ym .laydate_yms{position:absolute;left:-1px;top:24px;height:181px}.laydate_body .laydate_y{width:121px;margin-right:6px}.laydate_body .laydate_y input{width:64px;margin-right:15px}.laydate_body .laydate_y .laydate_yms{width:121px;text-align:center}.laydate_body .laydate_y .laydate_yms a{position:relative;display:block;height:20px}.laydate_body .laydate_y .laydate_yms ul{height:139px;padding:0;*overflow:hidden}.laydate_body .laydate_y .laydate_yms ul li{float:left;width:60px;height:20px;line-height:20px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.laydate_body .laydate_m{width:99px}.laydate_body .laydate_m .laydate_yms{width:99px;padding:0}.laydate_body .laydate_m input{width:42px;margin-right:15px}.laydate_body .laydate_m .laydate_yms span{display:block;float:left;width:42px;margin:5px 0 0 5px;line-height:24px;text-align:center;_display:inline}.laydate_body .laydate_choose{display:block;float:left;position:relative;width:20px;height:24px}.laydate_body .laydate_choose cite,.laydate_body .laydate_tab cite{left:50%;top:50%}.laydate_body .laydate_chtop cite{margin:-7px 0 0 -5px;border-bottom-style:solid}.laydate_body .laydate_chdown cite,.laydate_body .laydate_ym label{top:50%;margin:-2px 0 0 -5px;border-top-style:solid}.laydate_body .laydate_chprev cite{margin:-5px 0 0 -7px}.laydate_body .laydate_chnext cite{margin:-5px 0 0 -2px}.laydate_body .laydate_ym label{right:28px}.laydate_body .laydate_table{width:230px;margin:0 5px;border-collapse:collapse;border-spacing:0}.laydate_body .laydate_table td{width:31px;text-align:center;cursor:pointer;font-size:12px}.laydate_body .laydate_table thead th{font-weight:400;font-size:12px;text-align:center}.laydate_body .laydate_bottom{position:relative;height:22px;line-height:20px;padding:5px;font-size:12px}.laydate_body .laydate_bottom #laydate_hms{position:relative;z-index:1;float:left}.laydate_body .laydate_time{position:absolute;left:5px;bottom:26px;width:129px;height:125px;*overflow:hidden}.laydate_body .laydate_time .laydate_hmsno{padding:5px 0 0 5px}.laydate_body .laydate_time .laydate_hmsno span{display:block;float:left;width:24px;height:19px;line-height:19px;text-align:center;cursor:pointer;*margin-bottom:-5px}.laydate_body .laydate_time1{width:228px;height:154px}.laydate_body .laydate_time1 .laydate_hmsno{padding:6px 0 0 8px}.laydate_body .laydate_time1 .laydate_hmsno span{width:21px;height:20px;line-height:20px}.laydate_body .laydate_msg{left:49px;bottom:67px;width:141px;height:auto;overflow:hidden}.laydate_body .laydate_msg p{padding:5px 10px}.laydate_body .laydate_bottom li{float:left;height:20px;line-height:20px;border-right:none;font-weight:900}.laydate_body .laydate_bottom .laydate_sj{width:33px;text-align:center;font-weight:400}.laydate_body .laydate_bottom input{float:left;width:21px;height:20px;line-height:20px;border:none;text-align:center;cursor:pointer;font-size:12px;font-weight:400}.laydate_body .laydate_bottom .laydte_hsmtex{height:20px;line-height:20px;text-align:center}.laydate_body .laydate_bottom .laydte_hsmtex span{position:absolute;width:20px;top:0;right:0;cursor:pointer}.laydate_body .laydate_bottom .laydte_hsmtex span:hover{font-size:14px}.laydate_body .laydate_bottom .laydate_btn{position:absolute;right:5px;top:5px}.laydate_body .laydate_bottom .laydate_btn a{float:left;height:20px;padding:0 6px;_padding:0 5px}.laydate_body .laydate_table td,.laydate_body .laydate_table thead{height:21px!important;line-height:21px!important}.laydate-icon{border:1px solid #C6C6C6;background-image:url(icon.png)}.laydate_body .laydate_bottom #laydate_hms,.laydate_body .laydate_bottom .laydate_btn a,.laydate_body .laydate_box,.laydate_body .laydate_table,.laydate_body .laydate_table td,.laydate_body .laydate_time,.laydate_body .laydate_ym,.laydate_body .laydate_ym .laydate_yms{border:1px solid #ccc}.laydate_body .laydate_bottom .laydte_hsmtex,.laydate_body .laydate_choose,.laydate_body .laydate_table thead,.laydate_body .laydate_y .laydate_yms a{background-color:#F6F6F6}.laydate_body .laydate_box,.laydate_body .laydate_time,.laydate_body .laydate_ym .laydate_yms{box-shadow:2px 2px 5px rgba(0,0,0,.1)}.laydate_body .laydate_box{border-top:none;border-bottom:none;background-color:#fff;color:#333}.laydate_body .laydate_box .laydate_void{color:#ccc!important}.laydate_body .laydate_box .laydate_void:hover{background-color:#fff!important}.laydate_body .laydate_box a,.laydate_body .laydate_box a:hover{text-decoration:none;blr:expression(this.onFocus=this.blur());cursor:pointer;color:#333}.laydate_body .laydate_box a:hover{text-decoration:none;color:#666}.laydate_body .laydate_click{background-color:#eee!important}.laydate_body .laydate_bottom #laydate_hms,.laydate_body .laydate_choose:hover,.laydate_body .laydate_table td,.laydate_body .laydate_time,.laydate_body .laydate_y .laydate_yms a:hover{background-color:#fff}.laydate_body .laydate_top{border-top:1px solid #C6C6C6}.laydate_body .laydate_ym .laydate_yms{border:1px solid #C6C6C6;background-color:#fff}.laydate_body .laydate_y .laydate_yms a{border-bottom:1px solid #C6C6C6}.laydate_body .laydate_y .laydate_yms .laydate_chdown{border-top:1px solid #C6C6C6;border-bottom:none}.laydate_body .laydate_choose{border-left:1px solid #C6C6C6}.laydate_body .laydate_chprev{border-left:none;border-right:1px solid #C6C6C6}.laydate_body .laydate_chtop cite{border-bottom-color:#666}.laydate_body .laydate_chdown cite,.laydate_body .laydate_ym label{border-top-color:#666}.laydate_body .laydate_chprev cite{border-right-style:solid;border-right-color:#666}.laydate_body .laydate_chnext cite{border-left-style:solid;border-left-color:#666}.laydate_body .laydate_table td{border:none}.laydate_body .laydate_table .laydate_nothis{color:#999}.laydate_body .laydate_table thead th{border-bottom:1px solid #ccc}.laydate_body .laydate_bottom,.laydate_body .laydate_bottom .laydte_hsmtex{border-bottom:1px solid #C6C6C6}.laydate_body .laydate_bottom .laydate_sj{border-right:1px solid #C6C6C6;background-color:#F6F6F6}.laydate_body .laydate_bottom input{background-color:#fff}.laydate_body .laydate_bottom .laydate_btn{border-right:1px solid #C6C6C6}.laydate_body .laydate_bottom .laydate_v{position:absolute;left:10px;top:6px;font-family:Courier;z-index:0;color:#999}.laydate_body .laydate_bottom .laydate_btn a{border-right:none;background-color:#F6F6F6}.laydate_body .laydate_bottom .laydate_btn a:hover{color:#000;background-color:#fff}.laydate_body .laydate_m .laydate_yms span:hover,.laydate_body .laydate_table td:hover,.laydate_body .laydate_time .laydate_hmsno span:hover,.laydate_body .laydate_y .laydate_yms ul li:hover{background-color:#F3F3F3}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/layer/default/icon-ext.png b/public/static/admin/layui/css/modules/layer/default/icon-ext.png
new file mode 100644
index 0000000..bbbb669
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/icon-ext.png differ
diff --git a/public/static/admin/layui/css/modules/layer/default/icon.png b/public/static/admin/layui/css/modules/layer/default/icon.png
new file mode 100644
index 0000000..3e17da8
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/icon.png differ
diff --git a/public/static/admin/layui/css/modules/layer/default/layer.css b/public/static/admin/layui/css/modules/layer/default/layer.css
new file mode 100644
index 0000000..9f2e523
--- /dev/null
+++ b/public/static/admin/layui/css/modules/layer/default/layer.css
@@ -0,0 +1,2 @@
+/** layui-v1.0.9_rls MIT License By http://www.layui.com */
+ .layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}*html{background-image:url(about:blank);background-attachment:fixed}html #layuicss-skinlayercss{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layui-layer{border-radius:2px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 10px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:6px 6px 0;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:5px 10px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:1px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#BBB5B5;border:none}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
\ No newline at end of file
diff --git a/public/static/admin/layui/css/modules/layer/default/loading-0.gif b/public/static/admin/layui/css/modules/layer/default/loading-0.gif
new file mode 100644
index 0000000..6f3c953
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/loading-0.gif differ
diff --git a/public/static/admin/layui/css/modules/layer/default/loading-1-1.gif b/public/static/admin/layui/css/modules/layer/default/loading-1-1.gif
new file mode 100644
index 0000000..db3a483
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/loading-1-1.gif differ
diff --git a/public/static/admin/layui/css/modules/layer/default/loading-1.gif b/public/static/admin/layui/css/modules/layer/default/loading-1.gif
new file mode 100644
index 0000000..5bb90fd
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/loading-1.gif differ
diff --git a/public/static/admin/layui/css/modules/layer/default/loading-2.gif b/public/static/admin/layui/css/modules/layer/default/loading-2.gif
new file mode 100644
index 0000000..5bb90fd
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/loading-2.gif differ
diff --git a/public/static/admin/layui/css/modules/layer/default/loading-4.gif b/public/static/admin/layui/css/modules/layer/default/loading-4.gif
new file mode 100644
index 0000000..d4d7d5a
Binary files /dev/null and b/public/static/admin/layui/css/modules/layer/default/loading-4.gif differ
diff --git a/public/static/admin/layui/font/iconfont.eot b/public/static/admin/layui/font/iconfont.eot
new file mode 100644
index 0000000..bd89983
Binary files /dev/null and b/public/static/admin/layui/font/iconfont.eot differ
diff --git a/public/static/admin/layui/font/iconfont.svg b/public/static/admin/layui/font/iconfont.svg
new file mode 100644
index 0000000..3680fce
--- /dev/null
+++ b/public/static/admin/layui/font/iconfont.svg
@@ -0,0 +1,387 @@
+
+
+
diff --git a/public/static/admin/layui/font/iconfont.ttf b/public/static/admin/layui/font/iconfont.ttf
new file mode 100644
index 0000000..7410faa
Binary files /dev/null and b/public/static/admin/layui/font/iconfont.ttf differ
diff --git a/public/static/admin/layui/font/iconfont.woff b/public/static/admin/layui/font/iconfont.woff
new file mode 100644
index 0000000..ccf64e6
Binary files /dev/null and b/public/static/admin/layui/font/iconfont.woff differ
diff --git a/public/static/admin/layui/images/face/0.gif b/public/static/admin/layui/images/face/0.gif
new file mode 100644
index 0000000..a63f0d5
Binary files /dev/null and b/public/static/admin/layui/images/face/0.gif differ
diff --git a/public/static/admin/layui/images/face/1.gif b/public/static/admin/layui/images/face/1.gif
new file mode 100644
index 0000000..b2b78b2
Binary files /dev/null and b/public/static/admin/layui/images/face/1.gif differ
diff --git a/public/static/admin/layui/images/face/10.gif b/public/static/admin/layui/images/face/10.gif
new file mode 100644
index 0000000..556c7e3
Binary files /dev/null and b/public/static/admin/layui/images/face/10.gif differ
diff --git a/public/static/admin/layui/images/face/11.gif b/public/static/admin/layui/images/face/11.gif
new file mode 100644
index 0000000..2bfc58b
Binary files /dev/null and b/public/static/admin/layui/images/face/11.gif differ
diff --git a/public/static/admin/layui/images/face/12.gif b/public/static/admin/layui/images/face/12.gif
new file mode 100644
index 0000000..1c321c7
Binary files /dev/null and b/public/static/admin/layui/images/face/12.gif differ
diff --git a/public/static/admin/layui/images/face/13.gif b/public/static/admin/layui/images/face/13.gif
new file mode 100644
index 0000000..300bbc2
Binary files /dev/null and b/public/static/admin/layui/images/face/13.gif differ
diff --git a/public/static/admin/layui/images/face/14.gif b/public/static/admin/layui/images/face/14.gif
new file mode 100644
index 0000000..43b6d0a
Binary files /dev/null and b/public/static/admin/layui/images/face/14.gif differ
diff --git a/public/static/admin/layui/images/face/15.gif b/public/static/admin/layui/images/face/15.gif
new file mode 100644
index 0000000..c9f25fa
Binary files /dev/null and b/public/static/admin/layui/images/face/15.gif differ
diff --git a/public/static/admin/layui/images/face/16.gif b/public/static/admin/layui/images/face/16.gif
new file mode 100644
index 0000000..34f28e4
Binary files /dev/null and b/public/static/admin/layui/images/face/16.gif differ
diff --git a/public/static/admin/layui/images/face/17.gif b/public/static/admin/layui/images/face/17.gif
new file mode 100644
index 0000000..39cd035
Binary files /dev/null and b/public/static/admin/layui/images/face/17.gif differ
diff --git a/public/static/admin/layui/images/face/18.gif b/public/static/admin/layui/images/face/18.gif
new file mode 100644
index 0000000..7bce299
Binary files /dev/null and b/public/static/admin/layui/images/face/18.gif differ
diff --git a/public/static/admin/layui/images/face/19.gif b/public/static/admin/layui/images/face/19.gif
new file mode 100644
index 0000000..adac542
Binary files /dev/null and b/public/static/admin/layui/images/face/19.gif differ
diff --git a/public/static/admin/layui/images/face/2.gif b/public/static/admin/layui/images/face/2.gif
new file mode 100644
index 0000000..7edbb58
Binary files /dev/null and b/public/static/admin/layui/images/face/2.gif differ
diff --git a/public/static/admin/layui/images/face/20.gif b/public/static/admin/layui/images/face/20.gif
new file mode 100644
index 0000000..50631a6
Binary files /dev/null and b/public/static/admin/layui/images/face/20.gif differ
diff --git a/public/static/admin/layui/images/face/21.gif b/public/static/admin/layui/images/face/21.gif
new file mode 100644
index 0000000..b984212
Binary files /dev/null and b/public/static/admin/layui/images/face/21.gif differ
diff --git a/public/static/admin/layui/images/face/22.gif b/public/static/admin/layui/images/face/22.gif
new file mode 100644
index 0000000..1f0bd8b
Binary files /dev/null and b/public/static/admin/layui/images/face/22.gif differ
diff --git a/public/static/admin/layui/images/face/23.gif b/public/static/admin/layui/images/face/23.gif
new file mode 100644
index 0000000..e05e0f9
Binary files /dev/null and b/public/static/admin/layui/images/face/23.gif differ
diff --git a/public/static/admin/layui/images/face/24.gif b/public/static/admin/layui/images/face/24.gif
new file mode 100644
index 0000000..f35928a
Binary files /dev/null and b/public/static/admin/layui/images/face/24.gif differ
diff --git a/public/static/admin/layui/images/face/25.gif b/public/static/admin/layui/images/face/25.gif
new file mode 100644
index 0000000..0b4a883
Binary files /dev/null and b/public/static/admin/layui/images/face/25.gif differ
diff --git a/public/static/admin/layui/images/face/26.gif b/public/static/admin/layui/images/face/26.gif
new file mode 100644
index 0000000..45c4fb5
Binary files /dev/null and b/public/static/admin/layui/images/face/26.gif differ
diff --git a/public/static/admin/layui/images/face/27.gif b/public/static/admin/layui/images/face/27.gif
new file mode 100644
index 0000000..7a4c013
Binary files /dev/null and b/public/static/admin/layui/images/face/27.gif differ
diff --git a/public/static/admin/layui/images/face/28.gif b/public/static/admin/layui/images/face/28.gif
new file mode 100644
index 0000000..fc5a0cf
Binary files /dev/null and b/public/static/admin/layui/images/face/28.gif differ
diff --git a/public/static/admin/layui/images/face/29.gif b/public/static/admin/layui/images/face/29.gif
new file mode 100644
index 0000000..5dd7442
Binary files /dev/null and b/public/static/admin/layui/images/face/29.gif differ
diff --git a/public/static/admin/layui/images/face/3.gif b/public/static/admin/layui/images/face/3.gif
new file mode 100644
index 0000000..86df67b
Binary files /dev/null and b/public/static/admin/layui/images/face/3.gif differ
diff --git a/public/static/admin/layui/images/face/30.gif b/public/static/admin/layui/images/face/30.gif
new file mode 100644
index 0000000..b751f98
Binary files /dev/null and b/public/static/admin/layui/images/face/30.gif differ
diff --git a/public/static/admin/layui/images/face/31.gif b/public/static/admin/layui/images/face/31.gif
new file mode 100644
index 0000000..c9476d7
Binary files /dev/null and b/public/static/admin/layui/images/face/31.gif differ
diff --git a/public/static/admin/layui/images/face/32.gif b/public/static/admin/layui/images/face/32.gif
new file mode 100644
index 0000000..9931b06
Binary files /dev/null and b/public/static/admin/layui/images/face/32.gif differ
diff --git a/public/static/admin/layui/images/face/33.gif b/public/static/admin/layui/images/face/33.gif
new file mode 100644
index 0000000..59111a3
Binary files /dev/null and b/public/static/admin/layui/images/face/33.gif differ
diff --git a/public/static/admin/layui/images/face/34.gif b/public/static/admin/layui/images/face/34.gif
new file mode 100644
index 0000000..a334548
Binary files /dev/null and b/public/static/admin/layui/images/face/34.gif differ
diff --git a/public/static/admin/layui/images/face/35.gif b/public/static/admin/layui/images/face/35.gif
new file mode 100644
index 0000000..a932264
Binary files /dev/null and b/public/static/admin/layui/images/face/35.gif differ
diff --git a/public/static/admin/layui/images/face/36.gif b/public/static/admin/layui/images/face/36.gif
new file mode 100644
index 0000000..6de432a
Binary files /dev/null and b/public/static/admin/layui/images/face/36.gif differ
diff --git a/public/static/admin/layui/images/face/37.gif b/public/static/admin/layui/images/face/37.gif
new file mode 100644
index 0000000..d05f2da
Binary files /dev/null and b/public/static/admin/layui/images/face/37.gif differ
diff --git a/public/static/admin/layui/images/face/38.gif b/public/static/admin/layui/images/face/38.gif
new file mode 100644
index 0000000..8b1c88a
Binary files /dev/null and b/public/static/admin/layui/images/face/38.gif differ
diff --git a/public/static/admin/layui/images/face/39.gif b/public/static/admin/layui/images/face/39.gif
new file mode 100644
index 0000000..38b84a5
Binary files /dev/null and b/public/static/admin/layui/images/face/39.gif differ
diff --git a/public/static/admin/layui/images/face/4.gif b/public/static/admin/layui/images/face/4.gif
new file mode 100644
index 0000000..d52200c
Binary files /dev/null and b/public/static/admin/layui/images/face/4.gif differ
diff --git a/public/static/admin/layui/images/face/40.gif b/public/static/admin/layui/images/face/40.gif
new file mode 100644
index 0000000..ae42991
Binary files /dev/null and b/public/static/admin/layui/images/face/40.gif differ
diff --git a/public/static/admin/layui/images/face/41.gif b/public/static/admin/layui/images/face/41.gif
new file mode 100644
index 0000000..b9c715c
Binary files /dev/null and b/public/static/admin/layui/images/face/41.gif differ
diff --git a/public/static/admin/layui/images/face/42.gif b/public/static/admin/layui/images/face/42.gif
new file mode 100644
index 0000000..0eb1434
Binary files /dev/null and b/public/static/admin/layui/images/face/42.gif differ
diff --git a/public/static/admin/layui/images/face/43.gif b/public/static/admin/layui/images/face/43.gif
new file mode 100644
index 0000000..ac0b700
Binary files /dev/null and b/public/static/admin/layui/images/face/43.gif differ
diff --git a/public/static/admin/layui/images/face/44.gif b/public/static/admin/layui/images/face/44.gif
new file mode 100644
index 0000000..ad44497
Binary files /dev/null and b/public/static/admin/layui/images/face/44.gif differ
diff --git a/public/static/admin/layui/images/face/45.gif b/public/static/admin/layui/images/face/45.gif
new file mode 100644
index 0000000..6837fca
Binary files /dev/null and b/public/static/admin/layui/images/face/45.gif differ
diff --git a/public/static/admin/layui/images/face/46.gif b/public/static/admin/layui/images/face/46.gif
new file mode 100644
index 0000000..d62916d
Binary files /dev/null and b/public/static/admin/layui/images/face/46.gif differ
diff --git a/public/static/admin/layui/images/face/47.gif b/public/static/admin/layui/images/face/47.gif
new file mode 100644
index 0000000..58a0836
Binary files /dev/null and b/public/static/admin/layui/images/face/47.gif differ
diff --git a/public/static/admin/layui/images/face/48.gif b/public/static/admin/layui/images/face/48.gif
new file mode 100644
index 0000000..7ffd161
Binary files /dev/null and b/public/static/admin/layui/images/face/48.gif differ
diff --git a/public/static/admin/layui/images/face/49.gif b/public/static/admin/layui/images/face/49.gif
new file mode 100644
index 0000000..959b992
Binary files /dev/null and b/public/static/admin/layui/images/face/49.gif differ
diff --git a/public/static/admin/layui/images/face/5.gif b/public/static/admin/layui/images/face/5.gif
new file mode 100644
index 0000000..4e8b09f
Binary files /dev/null and b/public/static/admin/layui/images/face/5.gif differ
diff --git a/public/static/admin/layui/images/face/50.gif b/public/static/admin/layui/images/face/50.gif
new file mode 100644
index 0000000..6e22e7f
Binary files /dev/null and b/public/static/admin/layui/images/face/50.gif differ
diff --git a/public/static/admin/layui/images/face/51.gif b/public/static/admin/layui/images/face/51.gif
new file mode 100644
index 0000000..ad3f4d3
Binary files /dev/null and b/public/static/admin/layui/images/face/51.gif differ
diff --git a/public/static/admin/layui/images/face/52.gif b/public/static/admin/layui/images/face/52.gif
new file mode 100644
index 0000000..39f8a22
Binary files /dev/null and b/public/static/admin/layui/images/face/52.gif differ
diff --git a/public/static/admin/layui/images/face/53.gif b/public/static/admin/layui/images/face/53.gif
new file mode 100644
index 0000000..a181ee7
Binary files /dev/null and b/public/static/admin/layui/images/face/53.gif differ
diff --git a/public/static/admin/layui/images/face/54.gif b/public/static/admin/layui/images/face/54.gif
new file mode 100644
index 0000000..e289d92
Binary files /dev/null and b/public/static/admin/layui/images/face/54.gif differ
diff --git a/public/static/admin/layui/images/face/55.gif b/public/static/admin/layui/images/face/55.gif
new file mode 100644
index 0000000..4351083
Binary files /dev/null and b/public/static/admin/layui/images/face/55.gif differ
diff --git a/public/static/admin/layui/images/face/56.gif b/public/static/admin/layui/images/face/56.gif
new file mode 100644
index 0000000..e0eff22
Binary files /dev/null and b/public/static/admin/layui/images/face/56.gif differ
diff --git a/public/static/admin/layui/images/face/57.gif b/public/static/admin/layui/images/face/57.gif
new file mode 100644
index 0000000..0bf130f
Binary files /dev/null and b/public/static/admin/layui/images/face/57.gif differ
diff --git a/public/static/admin/layui/images/face/58.gif b/public/static/admin/layui/images/face/58.gif
new file mode 100644
index 0000000..0f06508
Binary files /dev/null and b/public/static/admin/layui/images/face/58.gif differ
diff --git a/public/static/admin/layui/images/face/59.gif b/public/static/admin/layui/images/face/59.gif
new file mode 100644
index 0000000..7081e4f
Binary files /dev/null and b/public/static/admin/layui/images/face/59.gif differ
diff --git a/public/static/admin/layui/images/face/6.gif b/public/static/admin/layui/images/face/6.gif
new file mode 100644
index 0000000..f7715bf
Binary files /dev/null and b/public/static/admin/layui/images/face/6.gif differ
diff --git a/public/static/admin/layui/images/face/60.gif b/public/static/admin/layui/images/face/60.gif
new file mode 100644
index 0000000..6e15f89
Binary files /dev/null and b/public/static/admin/layui/images/face/60.gif differ
diff --git a/public/static/admin/layui/images/face/61.gif b/public/static/admin/layui/images/face/61.gif
new file mode 100644
index 0000000..f092d7e
Binary files /dev/null and b/public/static/admin/layui/images/face/61.gif differ
diff --git a/public/static/admin/layui/images/face/62.gif b/public/static/admin/layui/images/face/62.gif
new file mode 100644
index 0000000..7fe4984
Binary files /dev/null and b/public/static/admin/layui/images/face/62.gif differ
diff --git a/public/static/admin/layui/images/face/63.gif b/public/static/admin/layui/images/face/63.gif
new file mode 100644
index 0000000..cf8e23e
Binary files /dev/null and b/public/static/admin/layui/images/face/63.gif differ
diff --git a/public/static/admin/layui/images/face/64.gif b/public/static/admin/layui/images/face/64.gif
new file mode 100644
index 0000000..a779719
Binary files /dev/null and b/public/static/admin/layui/images/face/64.gif differ
diff --git a/public/static/admin/layui/images/face/65.gif b/public/static/admin/layui/images/face/65.gif
new file mode 100644
index 0000000..7bb98f2
Binary files /dev/null and b/public/static/admin/layui/images/face/65.gif differ
diff --git a/public/static/admin/layui/images/face/66.gif b/public/static/admin/layui/images/face/66.gif
new file mode 100644
index 0000000..bb6d077
Binary files /dev/null and b/public/static/admin/layui/images/face/66.gif differ
diff --git a/public/static/admin/layui/images/face/67.gif b/public/static/admin/layui/images/face/67.gif
new file mode 100644
index 0000000..6e33f7c
Binary files /dev/null and b/public/static/admin/layui/images/face/67.gif differ
diff --git a/public/static/admin/layui/images/face/68.gif b/public/static/admin/layui/images/face/68.gif
new file mode 100644
index 0000000..1a6c400
Binary files /dev/null and b/public/static/admin/layui/images/face/68.gif differ
diff --git a/public/static/admin/layui/images/face/69.gif b/public/static/admin/layui/images/face/69.gif
new file mode 100644
index 0000000..a02f0b2
Binary files /dev/null and b/public/static/admin/layui/images/face/69.gif differ
diff --git a/public/static/admin/layui/images/face/7.gif b/public/static/admin/layui/images/face/7.gif
new file mode 100644
index 0000000..e6d4db8
Binary files /dev/null and b/public/static/admin/layui/images/face/7.gif differ
diff --git a/public/static/admin/layui/images/face/70.gif b/public/static/admin/layui/images/face/70.gif
new file mode 100644
index 0000000..416c5c1
Binary files /dev/null and b/public/static/admin/layui/images/face/70.gif differ
diff --git a/public/static/admin/layui/images/face/71.gif b/public/static/admin/layui/images/face/71.gif
new file mode 100644
index 0000000..c17d60c
Binary files /dev/null and b/public/static/admin/layui/images/face/71.gif differ
diff --git a/public/static/admin/layui/images/face/8.gif b/public/static/admin/layui/images/face/8.gif
new file mode 100644
index 0000000..66f967b
Binary files /dev/null and b/public/static/admin/layui/images/face/8.gif differ
diff --git a/public/static/admin/layui/images/face/9.gif b/public/static/admin/layui/images/face/9.gif
new file mode 100644
index 0000000..6044740
Binary files /dev/null and b/public/static/admin/layui/images/face/9.gif differ
diff --git a/public/static/admin/layui/lay/dest/layui.all.js b/public/static/admin/layui/lay/dest/layui.all.js
new file mode 100644
index 0000000..bfecf84
--- /dev/null
+++ b/public/static/admin/layui/lay/dest/layui.all.js
@@ -0,0 +1,5 @@
+/** layui-v1.0.9_rls MIT License By http://www.layui.com */
+ ;!function(e){"use strict";var t=function(){this.v="1.0.9_rls"};t.fn=t.prototype;var n=document,o=t.fn.cache={},i=function(){var e=n.scripts,t=e[e.length-1].src;return t.substring(0,t.lastIndexOf("/")+1)}(),r=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},l="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),a={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",util:"modules/util",flow:"modules/flow",carousel:"modules/carousel",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"dest/layui.all"};o.modules={},o.status={},o.timeout=10,o.event={},t.fn.define=function(e,t){var n=this,i="function"==typeof e,r=function(){return"function"==typeof t&&t(function(e,t){layui[e]=t,o.status[e]=!0}),this};return i&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?r.call(n):(n.use(e,r),n)},t.fn.use=function(e,t,u){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[m]=t,y.removeChild(p),function i(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void(o.status[m]?c():setTimeout(i,4))}())}function c(){u.push(layui[m]),e.length>1?f.use(e.slice(1),t,u):"function"==typeof t&&t.apply(layui,u)}var f=this,d=o.dir=o.dir?o.dir:i,y=n.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(f.each(e,function(t,n){"jquery"===n&&e.splice(t,1)}),layui.jquery=jQuery);var m=e[0],v=0;if(u=u||[],o.host=o.host||(d.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&a[m]||!layui["layui.all"]&&layui["layui.mobile"]&&a[m])return c(),f;var p=n.createElement("script"),h=(a[m]?d+"lay/":o.base||"")+(f.modules[m]||m)+".js";return p.async=!0,p.charset="utf-8",p.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),o.modules[m]?!function g(){return++v>1e3*o.timeout/4?r(m+" is not a valid module"):void("string"==typeof o.modules[m]&&o.status[m]?c():setTimeout(g,4))}():(y.appendChild(p),!p.attachEvent||p.attachEvent.toString&&p.attachEvent.toString().indexOf("[native code")<0||l?p.addEventListener("load",function(e){s(e,h)},!1):p.attachEvent("onreadystatechange",function(e){s(e,h)})),o.modules[m]=h,f},t.fn.getStyle=function(t,n){var o=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return o[o.getPropertyValue?"getPropertyValue":"getAttribute"](n)},t.fn.link=function(e,t,i){var l=this,a=n.createElement("link"),u=n.getElementsByTagName("head")[0];"string"==typeof t&&(i=t);var s=(i||e).replace(/\.|\//g,""),c=a.id="layuicss-"+s,f=0;a.rel="stylesheet",a.href=e+(o.debug?"?v="+(new Date).getTime():""),a.media="all",n.getElementById(c)||u.appendChild(a),"function"==typeof t&&!function d(){return++f>1e3*o.timeout/100?r(e+" timeout"):void(1989===parseInt(l.getStyle(n.getElementById(c),"width"))?function(){t()}():setTimeout(d,100))}()},t.fn.addcss=function(e,t,n){layui.link(o.dir+"css/"+e,t,n)},t.fn.img=function(e,t,n){var o=new Image;return o.src=e,o.complete?t(o):(o.onload=function(){o.onload=null,t(o)},void(o.onerror=function(e){o.onerror=null,n(e)}))},t.fn.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},t.fn.modules=function(){var e={};for(var t in a)e[t]=a[t];return e}(),t.fn.extend=function(e){var t=this;e=e||{};for(var n in e)t[n]||t.modules[n]?r("模块名 "+n+" 已被占用"):t.modules[n]=e[n];return t},t.fn.router=function(e){for(var t,n=(e||location.hash).replace(/^#/,"").split("/")||[],o={dir:[]},i=0;i/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var n="Laytpl Error:";return"object"==typeof console&&console.error(n+e+"\n"+(r||"")),n+e}},c=n.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=c("^"+r.open+"#",""),l=c(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(c(r.open+"#"),r.open+"# ").replace(c(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(/(?="|')/g,"\\").replace(n.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(n.query(1),function(e){var n='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(c(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),n='"+_escape_('),n+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,n.escape)}catch(u){return delete o.cache,n.error(u,p)}},t.pt.render=function(e,r){var c,t=this;return e?(c=t.cache?t.cache(e,n.escape):t.parse(t.tpl,e),r?void r(c):c):n.error("no data")};var o=function(e){return"string"!=typeof e?n.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var n in e)r[n]=e[n]},o.v="1.2.0",e("laytpl",o)});layui.define(function(a){"use strict";function t(a){new p(a)}var e=document,r="getElementById",n="getElementsByTagName",s=0,p=function(a){var t=this,e=t.config=a||{};e.item=s++,t.render(!0)};p.on=function(a,t,e){return a.attachEvent?a.attachEvent("on"+t,function(){e.call(a,window.even)}):a.addEventListener(t,e,!1),p},p.prototype.type=function(){var a=this.config;if("object"==typeof a.cont)return void 0===a.cont.length?2:3},p.prototype.view=function(){var a=this,t=a.config,e=[],r={};if(t.pages=0|t.pages,t.curr=0|t.curr||1,t.groups="groups"in t?0|t.groups:5,t.first="first"in t?t.first:"首页",t.last="last"in t?t.last:"末页",t.prev="prev"in t?t.prev:"上一页",t.next="next"in t?t.next:"下一页",t.pages<=1)return"";for(t.groups>t.pages&&(t.groups=t.pages),r.index=Math.ceil((t.curr+(t.groups>1&&t.groups!==t.pages?1:0))/(0===t.groups?1:t.groups)),t.curr>1&&t.prev&&e.push(''+t.prev+""),r.index>1&&t.first&&0!==t.groups&&e.push(''+t.first+"…"),r.poor=Math.floor((t.groups-1)/2),r.start=r.index>1?t.curr-r.poor:1,r.end=r.index>1?function(){var a=t.curr+(t.groups-r.poor-1);return a>t.pages?t.pages:a}():t.groups,r.end-r.start"+r.start+""):e.push(''+r.start+"");return t.pages>t.groups&&r.end…'+t.last+""),r.flow=!t.prev&&0===t.groups,(t.curr!==t.pages&&t.next||r.flow)&&e.push(function(){return r.flow&&t.curr===t.pages?''+t.next+"":''+t.next+""}()),''+e.join("")+function(){return t.skip?'到第 页 ':""}()+"
"},p.prototype.jump=function(a){if(a){for(var t=this,e=t.config,r=a.children,s=a[n]("button")[0],i=a[n]("input")[0],u=0,o=r.length;un.maxs[0]?s=["y",1]:e>=n.mins[0]&&e<=n.maxs[0]&&(e==n.mins[0]&&(tn.maxs[1]?s=["m",1]:t==n.maxs[1]&&a>n.maxs[2]&&(s=["d",1]))),s},n.timeVoid=function(e,t){if(n.ymd[1]+1==n.mins[1]&&n.ymd[2]==n.mins[2]){if(0===t&&en.maxs[3])return 1;if(1===t&&e>n.maxs[4])return 1;if(2===t&&e>n.maxs[5])return 1}if(e>(t?59:23))return 1},n.check=function(){var e=n.options.format.replace(/YYYY|MM|DD|hh|mm|ss/g,"\\d+\\").replace(/\\$/g,""),t=new RegExp(e),a=n.elem[d.elemv],s=a.match(/\d+/g)||[],i=n.checkVoid(s[0],s[1],s[2]);if(""!==a.replace(/\s/g,"")){if(!t.test(a))return n.elem[d.elemv]="",n.msg("日期不符合格式,请重新选择。"),1;if(i[0])return n.elem[d.elemv]="",n.msg("日期不在有效期内,请重新选择。"),1;i.value=n.elem[d.elemv].match(t).join(),s=i.value.match(/\d+/g),s[1]<1?(s[1]=1,i.auto=1):s[1]>12?(s[1]=12,i.auto=1):s[1].length<2&&(i.auto=1),s[2]<1?(s[2]=1,i.auto=1):s[2]>n.months[(0|s[1])-1]?(s[2]=31,i.auto=1):s[2].length<2&&(i.auto=1),s.length>3&&(n.timeVoid(s[3],0)&&(i.auto=1),n.timeVoid(s[4],1)&&(i.auto=1),n.timeVoid(s[5],2)&&(i.auto=1)),i.auto?n.creation([s[0],0|s[1],0|s[2]],1):i.value!==n.elem[d.elemv]&&(n.elem[d.elemv]=i.value)}},n.months=[31,null,31,30,31,30,31,31,30,31,30,31],n.viewDate=function(e,t,a){var s=(n.query,{}),i=new Date;e<(0|n.mins[0])&&(e=0|n.mins[0]),e>(0|n.maxs[0])&&(e=0|n.maxs[0]),i.setFullYear(e,t,a),s.ymd=[i.getFullYear(),i.getMonth(),i.getDate()],n.months[1]=n.isleap(s.ymd[0])?29:28,i.setFullYear(s.ymd[0],s.ymd[1],1),s.FDay=i.getDay(),s.PDay=n.months[0===t?11:t-1]-s.FDay+1,s.NDay=1,n.each(d.tds,function(e,t){var a,i=s.ymd[0],o=s.ymd[1]+1;t.className="",e=s.FDay&&e'+e+"年":''+(e-7+t)+"年"}),t("#laydate_ys").innerHTML=a,n.each(t("#laydate_ys li"),function(e,t){"y"===n.checkVoid(t.getAttribute("y"))[0]?n.addClass(t,d[1]):n.on(t,"click",function(e){n.stopmp(e).reshow(),n.viewDate(0|this.getAttribute("y"),n.ymd[1],n.ymd[2])})})},n.initDate=function(){var e=(n.query,new Date),t=n.elem[d.elemv].match(/\d+/g)||[];t.length<3&&(t=n.options.start.match(/\d+/g)||[],t.length<3&&(t=[e.getFullYear(),e.getMonth()+1,e.getDate()])),n.inymd=t,n.viewDate(t[0],t[1]-1,t[2])},n.iswrite=function(){var e=n.query,t={time:e("#laydate_hms")};n.shde(t.time,!n.options.istime),n.shde(d.oclear,!("isclear"in n.options?n.options.isclear:1)),n.shde(d.otoday,!("istoday"in n.options?n.options.istoday:1)),n.shde(d.ok,!("issure"in n.options?n.options.issure:1))},n.orien=function(e,t){var a,s=n.elem.getBoundingClientRect();e.style.left=s.left+(t?0:n.scroll(1))+"px",a=s.bottom+e.offsetHeight/1.5<=n.winarea()?s.bottom-1:s.top>e.offsetHeight/1.5?s.top-e.offsetHeight+1:n.winarea()-e.offsetHeight,e.style.top=Math.max(a+(t?0:n.scroll()),1)+"px"},n.follow=function(e){n.options.fixed?(e.style.position="fixed",n.orien(e,1)):(e.style.position="absolute",n.orien(e))},n.viewtb=function(){var e,t=[],a=["日","一","二","三","四","五","六"],o={},d=s[i]("table"),r=s[i]("thead");return r.appendChild(s[i]("tr")),o.creath=function(e){var t=s[i]("th");t.innerHTML=a[e],r[l]("tr")[0].appendChild(t),t=null},n.each(new Array(6),function(a){t.push([]),e=d.insertRow(0),n.each(new Array(7),function(n){t[a][n]=0,0===a&&o.creath(n),e.insertCell(n)})}),d.insertBefore(r,d.children[0]),d.id=d.className="laydate_table",e=t=null,d.outerHTML.toLowerCase()}(),n.view=function(e,t){var o,l=n.query,r={};t=t||e,n.elem=e,n.options=t,n.options.format||(n.options.format=a.format),n.options.start=n.options.start||"",n.mm=r.mm=[n.options.min||a.min,n.options.max||a.max],n.mins=r.mm[0].match(/\d+/g),n.maxs=r.mm[1].match(/\d+/g),n.box?n.shde(n.box):(o=s[i]("div"),o.id=d[0],o.className=d[0],o.style.cssText="position: absolute;",o.setAttribute("name","laydate-v"+laydate.v),o.innerHTML=r.html='"+n.viewtb+'",s.body.appendChild(o),n.box=l("#"+d[0]),n.events(),o=null),n.follow(n.box),t.zIndex?n.box.style.zIndex=t.zIndex:n.removeCssAttr(n.box,"z-index"),n.stopMosup("click",n.box),n.initDate(),n.iswrite(),n.check()},n.reshow=function(){return n.each(n.query("#"+d[0]+" .laydate_show"),function(e,t){n.removeClass(t,"laydate_show")}),this},n.close=function(){n.reshow(),n.shde(n.query("#"+d[0]),1),n.elem=null},n.parse=function(e,t,s){return e=e.concat(t),s=s||(n.options?n.options.format:a.format),s.replace(/YYYY|MM|DD|hh|mm|ss/g,function(t,a){return e.index=0|++e.index,n.digit(e[e.index])})},n.creation=function(e,t){var a=(n.query,n.hmsin),s=n.parse(e,[a[0].value,a[1].value,a[2].value]);n.elem[d.elemv]=s,t||(n.close(),"function"==typeof n.options.choose&&n.options.choose(s))},n.events=function(){var e=n.query,a={box:"#"+d[0]};n.addClass(s.body,"laydate_body"),d.tds=e("#laydate_table td"),d.mms=e("#laydate_ms span"),d.year=e("#laydate_y"),d.month=e("#laydate_m"),n.each(e(a.box+" .laydate_ym"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.addClass(this[l]("div")[0],"laydate_show"),e||(a.YY=parseInt(d.year.value),n.viewYears(a.YY))})}),n.on(e(a.box),"click",function(){n.reshow()}),a.tabYear=function(e){0===e?n.ymd[0]--:1===e?n.ymd[0]++:2===e?a.YY-=14:a.YY+=14,e<2?(n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2]),n.reshow()):n.viewYears(a.YY)},n.each(e("#laydate_YY .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t),a.tabYear(e)})}),a.tabMonth=function(e){e?(n.ymd[1]++,12===n.ymd[1]&&(n.ymd[0]++,n.ymd[1]=0)):(n.ymd[1]--,n.ymd[1]===-1&&(n.ymd[0]--,n.ymd[1]=11)),n.viewDate(n.ymd[0],n.ymd[1],n.ymd[2])},n.each(e("#laydate_MM .laydate_tab"),function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),a.tabMonth(e)})}),n.each(e("#laydate_ms span"),function(e,t){n.on(t,"click",function(e){n.stopmp(e).reshow(),n.hasClass(this,d[1])||n.viewDate(n.ymd[0],0|this.getAttribute("m"),n.ymd[2])})}),n.each(e("#laydate_table td"),function(e,t){n.on(t,"click",function(e){n.hasClass(this,d[1])||(n.stopmp(e),n.creation([0|this.getAttribute("y"),0|this.getAttribute("m"),0|this.getAttribute("d")]))})}),d.oclear=e("#laydate_clear"),n.on(d.oclear,"click",function(){n.elem[d.elemv]="",n.close()}),d.otoday=e("#laydate_today"),n.on(d.otoday,"click",function(){var e=new Date;n.creation([e.getFullYear(),e.getMonth()+1,e.getDate()])}),d.ok=e("#laydate_ok"),n.on(d.ok,"click",function(){n.valid&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])}),a.times=e("#laydate_time"),n.hmsin=a.hmsin=e("#laydate_hms input"),a.hmss=["小时","分钟","秒数"],a.hmsarr=[],n.msg=function(t,s){var i=''+(s||"提示")+"×
";"string"==typeof t?(i+=""+t+"
",n.shde(e("#"+d[0])),n.removeClass(a.times,"laydate_time1").addClass(a.times,"laydate_msg")):(a.hmsarr[t]?i=a.hmsarr[t]:(i+='',n.each(new Array(0===t?24:60),function(e){i+=""+e+""}),i+="
",a.hmsarr[t]=i),n.removeClass(a.times,"laydate_msg"),n[0===t?"removeClass":"addClass"](a.times,"laydate_time1")),n.addClass(a.times,"laydate_show"),a.times.innerHTML=i},a.hmson=function(t,a){var s=e("#laydate_hmsno span"),i=n.valid?null:1;n.each(s,function(e,s){i?n.addClass(s,d[1]):n.timeVoid(e,a)?n.addClass(s,d[1]):n.on(s,"click",function(e){n.hasClass(this,d[1])||(t.value=n.digit(0|this.innerHTML))})}),n.addClass(s[0|t.value],"laydate_click")},n.each(a.hmsin,function(e,t){n.on(t,"click",function(t){n.stopmp(t).reshow(),n.msg(e,a.hmss[e]),a.hmson(this,e)})}),n.on(s,"mouseup",function(){var t=e("#"+d[0]);t&&"none"!==t.style.display&&(n.check()||n.close())}).on(s,"keydown",function(e){e=e||t.event;var a=e.keyCode;13===a&&n.elem&&n.creation([n.ymd[0],n.ymd[1]+1,n.ymd[2]])})},laydate.reset=function(){n.box&&n.elem&&n.follow(n.box)},laydate.now=function(e,t){var a=new Date(0|e?function(e){return e<864e5?+new Date+864e5*e:e}(parseInt(e)):+new Date);return n.parse([a.getFullYear(),a.getMonth()+1,a.getDate()],[a.getHours(),a.getMinutes(),a.getSeconds()],t)},layui.addcss("modules/laydate/laydate.css",function(){},"laydatecss"),e("laydate",laydate)});!function(e,t){"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){function n(e){var t=!!e&&"length"in e&&e.length,n=pe.type(e);return"function"!==n&&!pe.isWindow(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),
+l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.lengtha",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,""],area:[1,""],param:[1,""],thead:[1,""],tr:[2,""],col:[2,""],td:[3,""],_default:fe.htmlSerialize?[0,"",""]:[1,"X","
"]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/
+
+