diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..df52c328e60323f9b115db59ade40c04fed21750
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,19 @@
+root = true
+
+[*]
+; 设定文件编码
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+; 使用空格来做缩进
+indent_style = space
+; 缩进长度为两个空格
+indent_size = 4
+; 移除文件尾部多余的空格
+trim_trailing_whitespace = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[*.{yml,yaml}]
+indent_size = 2
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000000000000000000000000000000000000..de583d0940d6ec7a20f3b3a29172729e87173fcf
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,5 @@
+# just a flag
+ENV = 'development'
+
+# base api
+VUE_APP_BASE_API = '/dev-api'
diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000000000000000000000000000000000000..7492cb47c4d4eecd3dd2f38e62725384d20ef4e1
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,60 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=
+APP_DEBUG=true
+APP_URL=http://localhost
+
+LOG_CHANNEL=daily
+LOG_LEVEL=debug
+
+DB_CONNECTION=mysql
+DB_HOST=127.0.0.1
+DB_PORT=3306
+DB_DATABASE=laravel
+DB_USERNAME=root
+DB_PASSWORD=
+DB_PREFIX=cnpscy_
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+# MEMCACHED_HOST=127.0.0.1
+MEMCACHED_HOST=memcached
+
+# REDIS_HOST=127.0.0.1
+REDIS_HOST=redis
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_MAILER=smtp
+MAIL_HOST=mailhog
+MAIL_PORT=1025
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+MAIL_FROM_ADDRESS=null
+MAIL_FROM_NAME="${APP_NAME}"
+
+AWS_ACCESS_KEY_ID=
+AWS_SECRET_ACCESS_KEY=
+AWS_DEFAULT_REGION=us-east-1
+AWS_BUCKET=
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_APP_CLUSTER=mt1
+
+MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+
+#filesystem
+FILESYSTEM_DRIVER=public
+
+APP_TIMEZONE=Asia/Shanghai
+APP_LOCALE=zh-CN
+
+JWT_SECRET=uuKSCoJpNKumzY7xOdjfpAxF0MMuI5j98iaO4uk3JVwbFCUapvsB7XGohKOBjd92
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000000000000000000000000000000000000..80c810301f3fbaca271b9f3ef4fc1011a3904d8a
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,6 @@
+# just a flag
+ENV = 'production'
+
+# base api
+VUE_APP_BASE_API = '/prod-api'
+
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000000000000000000000000000000000000..967315dd3d16d50942fa7abd383dfb95ec685491
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,5 @@
+* text=auto
+*.css linguist-vendored
+*.scss linguist-vendored
+*.js linguist-vendored
+CHANGELOG.md export-ignore
diff --git a/.gitignore b/.gitignore
index 6552ddf8a06abec2834f50984354df938588faad..1501035b232833aa72b21e22bdfaedd05c4ca8cf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,13 @@ storage/*.key
Homestead.yaml
Homestead.json
/.vagrant
+
+
+# vue-webpack
+public/css
+public/fonts
+public/images
+public/js
+
+# other
+demos-blog
\ No newline at end of file
diff --git a/.styleci.yml b/.styleci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9231873a112ba0ded2550a45741bad544e7a1998
--- /dev/null
+++ b/.styleci.yml
@@ -0,0 +1,13 @@
+php:
+ preset: laravel
+ disabled:
+ - no_unused_imports
+ finder:
+ not-name:
+ - index.php
+ - server.php
+js:
+ finder:
+ not-name:
+ - webpack.mix.js
+css: true
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
new file mode 100644
index 0000000000000000000000000000000000000000..c24df94547a51449cd67d945d19b279a7eefb6f5
--- /dev/null
+++ b/app/Console/Kernel.php
@@ -0,0 +1,57 @@
+command('inspire')->hourly();
+
+ // var_dump('schedule:' . date('Y-m-d H:i:s'));
+
+ // 每月1号调用:按月分表自动生成
+ $schedule->command('autotablebuild')->monthlyOn();
+ }
+
+ /**
+ * Register the commands for the application.
+ *
+ * @return void
+ */
+ protected function commands()
+ {
+ $this->load(__DIR__.'/Commands');
+
+ /**
+ * 自动加载多模块的自定义命令行
+ */
+ $modules_path = config('modules.paths.modules');
+ if ($dirs = get_dir_files($modules_path)){
+ foreach ($dirs as $dir){
+ if (is_dir($console_path = $modules_path . '/' . $dir . '/Console'))
+ $this->load($console_path = $modules_path . '/' . $dir . '/Console');
+ }
+ }
+
+ require base_path('routes/console.php');
+ }
+}
diff --git a/app/Exceptions/Admin/AuthException.php b/app/Exceptions/Admin/AuthException.php
new file mode 100644
index 0000000000000000000000000000000000000000..dbac6721ffc7a1e95df533459f90000c3fd07f9a
--- /dev/null
+++ b/app/Exceptions/Admin/AuthException.php
@@ -0,0 +1,28 @@
+admin_id = $admin_id;
+ }
+
+ public function render(Request $request)
+ {
+ if ($request->expectsJson()) {
+ // 登录日志
+ AdminLoginLog::getInstance()->add($this->admin_id, 0, $this->msg);
+
+ $this->setHttpCode(401);
+ return $this->errorJson($this->msg);
+ }
+ }
+}
diff --git a/app/Exceptions/Admin/AuthTokenException.php b/app/Exceptions/Admin/AuthTokenException.php
new file mode 100644
index 0000000000000000000000000000000000000000..70d58bd884c87a069ae4d13581f598532192e3cd
--- /dev/null
+++ b/app/Exceptions/Admin/AuthTokenException.php
@@ -0,0 +1,28 @@
+admin_id = $admin_id;
+ }
+
+ public function render(Request $request)
+ {
+ if ($request->expectsJson()) {
+ // 登录日志
+ AdminLoginLog::getInstance()->add($this->admin_id, 0, $this->msg);
+
+ $this->setHttpCode(401);
+ return $this->errorJson($this->msg);
+ }
+ }
+}
diff --git a/app/Exceptions/Exception.php b/app/Exceptions/Exception.php
new file mode 100644
index 0000000000000000000000000000000000000000..a8bf4b2271d27549e41e9bf858dfab800ee14bfd
--- /dev/null
+++ b/app/Exceptions/Exception.php
@@ -0,0 +1,20 @@
+msg = $message;
+ }
+}
diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php
new file mode 100644
index 0000000000000000000000000000000000000000..48a509985bce8e4996e5feb466354cad662a6e17
--- /dev/null
+++ b/app/Exceptions/Handler.php
@@ -0,0 +1,67 @@
+reportable(function (Throwable $e) {
+
+ });
+
+ }
+
+ /**
+ * Render an exception into an HTTP response.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \Throwable $exception
+ * @return \Symfony\Component\HttpFoundation\Response
+ *
+ * @throws \Throwable
+ */
+ public function render($request, Throwable $exception)
+ {
+ // 验证器类的错误监听
+ if($exception instanceof \Illuminate\Validation\ValidationException){
+ return $this->errorJson($exception->validator->errors()->first());
+ }
+
+ return parent::render($request, $exception);
+ }
+}
diff --git a/app/Exceptions/InternalException.php b/app/Exceptions/InternalException.php
new file mode 100644
index 0000000000000000000000000000000000000000..b9429b263b54b628a4123be4376a92f775aa479b
--- /dev/null
+++ b/app/Exceptions/InternalException.php
@@ -0,0 +1,21 @@
+msg = $msg;
+ }
+
+ public function render(Request $request)
+ {
+ if ($request->expectsJson()) {
+ return response()->json(['msg' => $this->msg], $this->code);
+ }
+ }
+}
diff --git a/app/Exceptions/InvalidRequestException.php b/app/Exceptions/InvalidRequestException.php
new file mode 100644
index 0000000000000000000000000000000000000000..954e53a066d79a7d8bb654dfd753db704324f6de
--- /dev/null
+++ b/app/Exceptions/InvalidRequestException.php
@@ -0,0 +1,20 @@
+expectsJson()) {
+ return $this->errorJson($this->msg);
+ }
+ }
+}
diff --git a/app/Helper/builtin-functions.php b/app/Helper/builtin-functions.php
new file mode 100644
index 0000000000000000000000000000000000000000..664c1b8ec56980502bf42e5d06d3170e2297f7d8
--- /dev/null
+++ b/app/Helper/builtin-functions.php
@@ -0,0 +1,292 @@
+roles;
+ $rabc = $menu_lists = [];
+ foreach ($roles as $key => $role) {
+ $menus = $role->{$with_func}->toArray();
+ $rabc[$role->role_id] = array_flip(array_unique(array_column($menus, 'menu_url')));
+ $menu_lists = array_merge($menu_lists, $menus);
+ }
+ return ['rabc' => $rabc, 'menu' => $menu_lists];
+}
+
+function get_request_post()
+{
+ return request()->isMethod('post');
+}
+
+function cnpscy_config(string $config_name = '', string $default = '')
+{
+ return config('cnpscy.' . $config_name, $default);
+}
+
+//快速修改.env文件
+function modifyEnv(array $data)
+{
+ $envPath = base_path() . DIRECTORY_SEPARATOR . '.env';
+ $contentArray = collect(file($envPath, FILE_IGNORE_NEW_LINES));
+ $contentArray->transform(function ($item) use ($data)
+ {
+ foreach ($data as $key => $value) {
+ if (str_contains($item, $key)) {
+ return $key . '=' . $value;
+ }
+ }
+ return $item;
+ });
+ $content = implode($contentArray->toArray(), "\n");
+ File::put($envPath, $content);
+}
+
+/*************** 缓存函数 开始 ***************/
+
+/**
+ * [set_cache]
+ *
+ * @param [type] $key [description]
+ * @param [type] $data [description]
+ * @param [type] $minutes [description]$minutes = 7*24*60*60
+ *
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :设置缓存
+ * @englishAnnotation :
+ */
+function set_cache($key, $data, $minutes = 1 * 60)
+{
+ return \Cache::put($key, $data, $minutes);
+}
+
+/**
+ * [get_cache]
+ *
+ * @param [type] $key [description]
+ *
+ * @return [type] [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :获取缓存的数据
+ * @englishAnnotation :
+ */
+function get_cache($key)
+{
+ return \Cache::get($key) ?? '';
+}
+
+/**
+ * [has_cache]
+ *
+ * @param [type] $key [description]
+ *
+ * @return boolean [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :是否存在该key的缓存
+ * @englishAnnotation :
+ */
+function has_cache($key)
+{
+ return \Cache::has($key) ? true : false;
+}
+
+/**
+ * [del_cache]
+ *
+ * @param [type] $key [description]
+ *
+ * @return [type] [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :删除缓存
+ * @englishAnnotation :
+ */
+function del_cache($key)
+{
+ return \Cache::forget($key) ?? false;
+}
+
+/*************** 缓存函数 结束 ***************/
+
+
+/**
+ * [logs_data]
+ *
+ * @param [type] $data [description]
+ *
+ * @return [type] [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :日志数据的过滤
+ * @englishAnnotation :
+ */
+function logs_data($data, $ip_agent)
+{
+ $data['data'] = json_encode(request()->all());
+ $data['action'] = request()->route()->getActionName();
+ $data['description'] = $data['description'] ?? '';
+ $data['add_time'] = $data['add_time'] ?? time();
+ $data['ip'] = $ip_agent['ip'] ?? get_ip();
+ $data['browser_type'] = $ip_agent['agent'] ?? $_SERVER['HTTP_USER_AGENT'];
+ return $data;
+}
+
+/**
+ * 刷新用户权限、角色
+ * 多角色管理
+ */
+if (!function_exists('setAdminRabc')) {
+ function setAdminRabc()
+ {
+ $admin = auth('admin')->user();
+ $roles = $menus = [];
+ $rolesResources = $admin->roles()->orderBy('role_id', 'ASC')->get();
+ foreach ($rolesResources as $key => $roleResources) {
+ if ($key == 0) $role_id = $roleResources->role_id;
+ $roles[$roleResources->role_id] = $roleResources;
+ $menus[$roleResources->role_id] = array_filter($roleResources->left_menus()->get()->pluck('api_url')->toArray());
+ }
+
+ //默认使用第一个角色
+ if (empty($admin->use_role)) \App\Models\BasicAdmin\Admin::where('admin_id', $admin->admin_id)->update(['use_role' => $role_id]);
+
+ // 缓存用户权限
+ cache()->forever('admin_rabc_' . $admin->admin_id, [
+ 'roles' => $roles,
+ 'menus' => $menus
+ ]);
+ }
+}
+
+/**
+ * 获取当前用户-当前角色-权限
+ */
+if (!function_exists('getAdminRabc')) {
+ function getAdminRabc()
+ {
+ $admin = auth('admin')->user();
+ $key = 'admin_rabc_' . $admin->admin_id;
+ if (cache()->has($key)) {
+ $admin_rabc = cache($key);
+ return [
+ 'roles' => empty($admin->use_role) ? [] : $admin_rabc['roles'][$admin->use_role],
+ 'menus' => empty($admin->use_role) ? [] : $admin_rabc['menus'][$admin->use_role],
+ ];
+ }
+ setAdminRabc();
+ return cache($key);
+ }
+}
+
+
+function getWebUserHome(int $user_id = 0)
+{
+ return url('user/' . $user_id);
+}
+
+function route_class()
+{
+ return str_replace('.', '-', Route::currentRouteName());
+}
+
+function category_nav_active($category_id)
+{
+ return active_class((if_route('categories.show') && if_route_param('category', $category_id)));
+}
+
+function make_excerpt($value, $length = 200)
+{
+ $excerpt = trim(preg_replace('/\r\n|\r|\n+/', ' ', strip_tags($value)));
+ return Str::limit($excerpt, $length);
+}
+
+function model_admin_link($title, $model)
+{
+ return model_link($title, $model, 'admin');
+}
+
+function model_link($title, $model, $prefix = '')
+{
+ // 获取数据模型的复数蛇形命名
+ $model_name = model_plural_name($model);
+
+ // 初始化前缀
+ $prefix = $prefix ? "/$prefix/" : '/';
+
+ // 使用站点 URL 拼接全量 URL
+ $url = config('app.url') . $prefix . $model_name . '/' . $model->id;
+
+ // 拼接 HTML A 标签,并返回
+ return '' . $title . ' ';
+}
+
+function model_plural_name($model)
+{
+ // 从实体中获取完整类名,例如:App\Models\User
+ $full_class_name = get_class($model);
+
+ // 获取基础类名,例如:传参 `App\Models\User` 会得到 `User`
+ $class_name = class_basename($full_class_name);
+
+ // 蛇形命名,例如:传参 `User` 会得到 `user`, `FooBar` 会得到 `foo_bar`
+ $snake_case_name = Str::snake($class_name);
+
+ // 获取子串的复数形式,例如:传参 `user` 会得到 `users`
+ return Str::plural($snake_case_name);
+}
+
+function get_web_admin_url(string $method, string $controller = '', int $is_compel = 0): string
+{
+ if (empty($method)) return '';
+ $prefix = ltrim(request()->route()->getPrefix(), '/');
+ // 如果后台访问地址对不上,关闭下行的注释
+ // $prefix = str_replace(head(explode('/', $prefix)), cnpscy_config('web_admin_prefix'), $prefix);
+ if (empty($controller) && $is_compel == 0) {
+ $url = $prefix . '/' . ltrim($method, '/');
+ } else {
+ $url = str_replace(last(explode('/', $prefix)), $controller, $prefix) . (empty($controller) ? '' : '/') . ltrim($method, '/');
+ }
+ return url($url);
+}
+
+function get_api_admin_url(string $method, string $controller = '', int $is_compel = 0)
+{
+ if (empty($method)) return '';
+ $prefix = ltrim(request()->route()->getPrefix(), '/');
+ $prefix = str_replace(head(explode('/', $prefix)), cnpscy_config('api_admin_prefix'), $prefix);
+ if (empty($controller) && $is_compel == 0) {
+ $url = 'api/' . $prefix . '/' . ltrim($method, '/');
+ } else {
+ $url = 'api/' . str_replace(last(explode('/', $prefix)), $controller, $prefix) . (empty($controller) ? '' : '/') . ltrim($method, '/');
+ }
+ return url($url);
+}
+
+function get_model_url(string $method, string $controller = '', int $is_compel = 0)
+{
+ if (empty($method)) return url('/');
+ $prefix = ltrim(request()->route()->getPrefix(), '/');
+ if (empty($controller) && $is_compel == 0) {
+ $url = $prefix . '/' . ltrim($method, '/');
+ } else {
+ $url = str_replace(last(explode('/', $prefix)), $controller, $prefix) . (empty($controller) ? '' : '/') . $method;
+ }
+ return url($url);
+}
+
+function getControllerAndFunction()
+{
+ $action = \Route::current()->getActionName();
+ list($class, $method) = explode('@', $action);
+ $class = substr(strrchr($class, '\\'), 1);
+ return ['controller' => $class, 'method' => $method];
+}
+
+function getControllerRoutePrefix()
+{
+ $controller = getControllerAndFunction()['controller'] ?? '';
+ return strtolower(str_replace('Controller', '', $controller));
+}
diff --git a/app/Helper/functions.php b/app/Helper/functions.php
new file mode 100644
index 0000000000000000000000000000000000000000..6148d071c022f5dce40e21b59f025a8c806bd91d
--- /dev/null
+++ b/app/Helper/functions.php
@@ -0,0 +1,3953 @@
+= $maxLimit ) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+}
+
+if ( !function_exists('psQty_num') ) {
+ /**
+ * 获取指定进程的数量
+ *
+ * @param string $search
+ *
+ * @return int
+ */
+ function psQty_num(string $search)
+ {
+ return count(psQty_res($search));
+ }
+}
+
+if ( !function_exists('run_exec') ) {
+ function run_exec(string $command_name)
+ {
+ $command = 'php ' . $command_name;
+
+ $output = 0;
+
+ $return_val = '';
+
+ exec($command, $output, $return_val);
+
+ return $output;
+ }
+}
+
+if ( !function_exists('make_signature') ) {
+ /**
+ * 生成签名
+ *
+ * @param array $args
+ * @param string $key
+ *
+ * @return string
+ */
+ function make_signature(array $args, string $key)
+ {
+ //排序
+ ksort($args);
+ //生成sign
+ $str = urldecode(http_build_query($args)) . '&key=' . $key;
+ $sign = strtoupper(md5($str));
+ return $sign;
+ }
+}
+
+if ( !function_exists('get_difference_hours') ) {
+ /**
+ * 计算两个时间戳之间相差的小时
+ *
+ * @param int $start_time 开始时间戳
+ * @param int $end_time 结束时间戳
+ *
+ * @return int
+ */
+ function get_difference_hours(int $start_time, int $end_time):float
+ {
+ if ( $start_time < $end_time ) {
+ $starttime = $start_time;
+ $endtime = $end_time;
+ } else {
+ $starttime = $end_time;
+ $endtime = $start_time;
+ }
+ //计算小时
+ $timediff = $endtime - $starttime;
+ return floatval($timediff / 3600);
+ }
+}
+
+if ( !function_exists('array_merge_multiple') ) {
+ /**
+ * 多维数组合并
+ *
+ * @param $array1
+ * @param $array2
+ *
+ * @return array
+ */
+ function array_merge_multiple($array1, $array2)
+ {
+ $merge = $array1 + $array2;
+ $data = [];
+ foreach ($merge as $key => $val) {
+ if ( isset($array1[$key]) && is_array($array1[$key]) && isset($array2[$key]) && is_array($array2[$key]) ) {
+ $data[$key] = array_merge_multiple($array1[$key], $array2[$key]);
+ } else {
+ $data[$key] = isset($array2[$key]) ? $array2[$key] : $array1[$key];
+ }
+ }
+ return $data;
+ }
+}
+
+if ( !function_exists('export_excel') ) {
+ /**
+ * 数据导出到excel(csv文件)
+ *
+ * @param $fileName
+ * @param array $tileArray
+ * @param array $dataArray
+ */
+ function export_excel($fileName, $tileArray = [], $dataArray = [])
+ {
+ ini_set('memory_limit', '1024M');
+ ini_set('max_execution_time', 0);
+ ob_end_clean();
+ ob_start();
+ header("Content-Type: text/csv");
+ header("Content-Disposition:filename=" . $fileName);
+ $fp = fopen('php://output', 'w');
+ fwrite($fp, chr(0xEF) . chr(0xBB) . chr(0xBF));// 转码 防止乱码(比如微信昵称)
+ fputcsv($fp, $tileArray);
+ $index = 0;
+ foreach ($dataArray as $item) {
+ if ( $index == 1000 ) {
+ $index = 0;
+ ob_flush();
+ flush();
+ }
+ $index++;
+ fputcsv($fp, $item);
+ }
+ ob_flush();
+ flush();
+ ob_end_clean();
+ }
+}
+
+if ( !function_exists('is_json') ) {
+ /**
+ * 判断字符串是否为 Json 格式
+ *
+ * @param string $data Json 字符串
+ * @param bool $assoc 是否返回关联数组。默认返回对象
+ *
+ * @return array|bool|object 成功返回转换后的对象或数组,失败返回 false
+ */
+ function is_json($data = '', $assoc = false)
+ {
+ if ( PHP_VERSION > 5.3 ) {
+ json_decode($data);
+ return (json_last_error() == JSON_ERROR_NONE);
+ } else {
+ $data = json_decode($data, $assoc);
+ if ( ($data && is_object($data)) || (is_array($data) && !empty($data)) ) {
+ return $data;
+ }
+ return false;
+ }
+ }
+}
+
+if ( function_exists('get_request_method') ) {
+ function get_request_method() : string
+ {
+ return strtoupper($_SERVER['REQUEST_METHOD'] ?? '');
+ }
+}
+
+
+if (!function_exists('my_json_encode') ) {
+ /**
+ * 统一的json_encode
+ *
+ * @param array $data
+ * @param string $options
+ *
+ * @return false|string
+ */
+ function my_json_encode($data, string $options = '')
+ {
+ //$data = is_object($data) ? (array)$data : $data;
+ return json_encode($data, empty($options) ? (JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : $options);
+ }
+}
+
+
+if ( !function_exists('my_json_decode') ) {
+ /**
+ * 统一的 json_decode
+ *
+ * @param string $string
+ * @param bool $assoc
+ *
+ * @return mixed
+ */
+ function my_json_decode(string $string, bool $assoc = true)
+ {
+ return json_decode($string, $assoc);
+ }
+}
+
+/**
+ * 输出xml字符
+ */
+function ToXml($arr = [])
+{
+ if ( !is_array($arr) || count($arr) <= 0 ) {
+ exception("数组数据异常!");
+ }
+
+ $xml = "";
+ foreach ($arr as $key => $val) {
+ if ( is_numeric($val) ) {
+ $xml .= "<" . $key . ">" . $val . "" . $key . ">";
+ } else {
+ $xml .= "<" . $key . ">" . $key . ">";
+ }
+ }
+ $xml .= " ";
+ return $xml;
+}
+
+/**
+ * 将xml转为array
+ */
+function xml_to_array($xml)
+{
+ if ( !$xml ) {
+ \Exception("xml数据异常!");
+ }
+
+ // 解决部分json数据误入的问题
+ $arr = json_decode($xml, true);
+ if ( is_array($arr) && !empty($arr) ) {
+ return $arr;
+ }
+ // 将XML转为array
+ $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
+ return $arr;
+}
+
+// 生成签名
+function make_sign($paraMap = [], $partner_key = '')
+{
+ $buff = "";
+ ksort($paraMap);
+ $paraMap['key'] = $partner_key;
+ foreach ($paraMap as $k => $v) {
+ if ( null != $v && "null" != $v && '' != $v && "sign" != $k ) {
+ $buff .= $k . "=" . $v . "&";
+ }
+ }
+ $reqPar = '';
+ if ( strlen($buff) > 0 ) {
+ $reqPar = substr($buff, 0, strlen($buff) - 1);
+ }
+
+ return strtoupper(md5($reqPar));
+}
+
+/**
+ * 前端获取后端的数据结果集
+ *
+ * @param $data
+ *
+ * @return string
+ */
+function html_get_res_from_admin($data)
+{
+ return addslashes(my_json_encode($data));
+}
+
+if ( !function_exists('axios_request') ) {
+ /**
+ * 跨域问题设置
+ */
+ function axios_request()
+ {
+ $http_origin = !isset($_SERVER['HTTP_ORIGIN']) ? "*" : $_SERVER['HTTP_ORIGIN'];
+
+ $http_origin = (empty($http_origin) || $http_origin == null || $http_origin == 'null') ? '*' : $http_origin;
+
+ $_SERVER['HTTP_ORIGIN'] = $http_origin;
+
+ //if(strtoupper($_SERVER['REQUEST_METHOD'] ?? "") == 'OPTIONS'){ //vue 的 axios 发送 OPTIONS 请求,进行验证
+ // exit;
+ //}
+
+ header('Access-Control-Allow-Origin: ' . $http_origin);// . $http_origin
+ header('Access-Control-Allow-Credentials: true');//【如果请求方存在域名请求,那么为true;否则为false】
+ header('Access-Control-Allow-Headers: Authorization, Origin, X-Requested-With, Content-Type, Access-Control-Allow-Headers, x-xsrf-token, Accept, x-file-name, x-frame-options, X-Requested-With');
+ header('Access-Control-Allow-Methods: *');
+ header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, PATCH');
+ //header('X-Frame-Options:SAMEORIGIN');
+ }
+}
+
+if ( !function_exists('string_underscore_lowercase') ) {
+ /**
+ * 字符串如果存在大小,那么自动转换成 _小写
+ *
+ * @param $string
+ * @param string $format
+ *
+ * @return string|string[]|null
+ */
+ function string_underscore_lowercase($string, $format = '_')
+ {
+ return preg_replace('/((?<=[a-z])(?=[A-Z]))/', $format, $string);
+ }
+}
+
+if ( !function_exists('convert_underline') ) {
+ // 下划线的字符串转骆驼峰
+ function convert_underline($str, $ucfirst = true)
+ {
+ $str = ucwords(str_replace('_', ' ', $str));
+ $str = str_replace(' ', '', lcfirst($str));
+ return $ucfirst ? ucfirst($str) : $str;
+ }
+}
+
+if ( !function_exists('get_string_pluralize') ) {
+ /**
+ * 获得指定字符串的复数
+ *
+ * @param $string
+ *
+ * @return mixed|string|string[]|null
+ */
+ function get_string_pluralize(string $string)
+ {
+ $plural = [
+ [
+ '/(quiz)$/i',
+ "$1zes",
+ ],
+ [
+ '/^(ox)$/i',
+ "$1en",
+ ],
+ [
+ '/([m|l])ouse$/i',
+ "$1ice",
+ ],
+ [
+ '/(matr|vert|ind)ix|ex$/i',
+ "$1ices",
+ ],
+ [
+ '/(x|ch|ss|sh)$/i',
+ "$1es",
+ ],
+ [
+ '/([^aeiouy]|qu)y$/i',
+ "$1ies",
+ ],
+ [
+ '/([^aeiouy]|qu)ies$/i',
+ "$1y",
+ ],
+ [
+ '/(hive)$/i',
+ "$1s",
+ ],
+ [
+ '/(?:([^f])fe|([lr])f)$/i',
+ "$1$2ves",
+ ],
+ [
+ '/sis$/i',
+ "ses",
+ ],
+ [
+ '/([ti])um$/i',
+ "$1a",
+ ],
+ [
+ '/(buffal|tomat)o$/i',
+ "$1oes",
+ ],
+ [
+ '/(bu)s$/i',
+ "$1ses",
+ ],
+ [
+ '/(alias|status)$/i',
+ "$1es",
+ ],
+ [
+ '/(octop|vir)us$/i',
+ "$1i",
+ ],
+ [
+ '/(ax|test)is$/i',
+ "$1es",
+ ],
+ [
+ '/s$/i',
+ "s",
+ ],
+ [
+ '/$/',
+ "s",
+ ],
+ ];
+
+ $singular = [
+ [
+ "/s$/",
+ "",
+ ],
+ [
+ "/(n)ews$/",
+ "$1ews",
+ ],
+ [
+ "/([ti])a$/",
+ "$1um",
+ ],
+ [
+ "/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/",
+ "$1$2sis",
+ ],
+ [
+ "/(^analy)ses$/",
+ "$1sis",
+ ],
+ [
+ "/([^f])ves$/",
+ "$1fe",
+ ],
+ [
+ "/(hive)s$/",
+ "$1",
+ ],
+ [
+ "/(tive)s$/",
+ "$1",
+ ],
+ [
+ "/([lr])ves$/",
+ "$1f",
+ ],
+ [
+ "/([^aeiouy]|qu)ies$/",
+ "$1y",
+ ],
+ [
+ "/(s)eries$/",
+ "$1eries",
+ ],
+ [
+ "/(m)ovies$/",
+ "$1ovie",
+ ],
+ [
+ "/(x|ch|ss|sh)es$/",
+ "$1",
+ ],
+ [
+ "/([m|l])ice$/",
+ "$1ouse",
+ ],
+ [
+ "/(bus)es$/",
+ "$1",
+ ],
+ [
+ "/(o)es$/",
+ "$1",
+ ],
+ [
+ "/(shoe)s$/",
+ "$1",
+ ],
+ [
+ "/(cris|ax|test)es$/",
+ "$1is",
+ ],
+ [
+ "/([octop|vir])i$/",
+ "$1us",
+ ],
+ [
+ "/(alias|status)es$/",
+ "$1",
+ ],
+ [
+ "/^(ox)en/",
+ "$1",
+ ],
+ [
+ "/(vert|ind)ices$/",
+ "$1ex",
+ ],
+ [
+ "/(matr)ices$/",
+ "$1ix",
+ ],
+ [
+ "/(quiz)zes$/",
+ "$1",
+ ],
+ ];
+
+ $irregular = [
+ [
+ 'move',
+ 'moves',
+ ],
+ [
+ 'sex',
+ 'sexes',
+ ],
+ [
+ 'child',
+ 'children',
+ ],
+ [
+ 'man',
+ 'men',
+ ],
+ [
+ 'person',
+ 'people',
+ ],
+ ];
+
+ $uncountable = [
+ 'sheep',
+ 'fish',
+ 'series',
+ 'species',
+ 'money',
+ 'rice',
+ 'information',
+ 'equipment',
+ ];
+
+ if ( in_array(strtolower($string), $uncountable) ) return $string;
+
+ foreach ($irregular as $noun) {
+ if ( strtolower($string) == $noun[0] ) return $noun[1];
+ }
+ foreach ($plural as $pattern) {
+ $str = preg_replace($pattern[0], $pattern[1], $string);
+ if ( $str !== null && $str != $string ) return $str;
+ }
+ }
+}
+
+if ( !function_exists('get_month_range') ) {
+ /**
+ * 指定日期范围之内的所有月份
+ *
+ * @param string $start_date 开始日期
+ * @param string $end_date 结束日期
+ * @param string $format 返回格式
+ *
+ * @return array
+ */
+ function get_month_range(string $start_date, string $end_date, string $format = 'Y-m')
+ {
+ $end = date($format, strtotime($end_date)); // 转换为月
+ $range = [];
+ $i = 0;
+ do {
+ $month = date($format, strtotime($start_date . ' + ' . $i . ' month'));
+ $range[] = $month;
+ $i++;
+ } while ( $month < $end );
+ return $range;
+ }
+}
+
+if ( !function_exists('get_year_range') ) {
+ function get_year_range(string $start_date, string $end_date, string $format = 'Y')
+ {
+ $end = date($format, strtotime($end_date)); // 转换为月
+ $range = [];
+ $i = 0;
+ do {
+ $month = date($format, strtotime($start_date . ' + ' . $i . ' year'));
+ $range[] = $month;
+ $i++;
+ } while ( $month < $end );
+ return $range;
+ }
+}
+
+if ( !function_exists('load_vendor') ) {
+ /**
+ * 加载composer的包 - vendor文件目录下
+ */
+ function load_vendor()
+ {
+ /*
+ |--------------------------------------------------------------------------
+ | 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 ROOT . '/vendor/autoload.php';
+ }
+}
+
+if ( !function_exists('data_get') ) {
+ /**
+ * Get an item from an array or object using "dot" notation.
+ *
+ * @param mixed $target
+ * @param string|array|int $key
+ * @param mixed $default
+ *
+ * @return mixed
+ */
+ function data_get($target, $key, $default = null)
+ {
+ if ( is_null($key) ) {
+ return $target;
+ }
+
+ $key = is_array($key) ? $key : explode('.', $key);
+
+ while ( !is_null($segment = array_shift($key)) ) {
+ if ( $segment === '*' ) {
+ if ( $target instanceof Collection ) {
+ $target = $target->all();
+ } elseif ( !is_array($target) ) {
+ return ($default);
+ }
+
+ $result = [];
+
+ foreach ($target as $item) {
+ $result[] = data_get($item, $key);
+ }
+
+ return in_array('*', $key) ? \system\exp\Cnpscy\Library\Arr::collapse($result) : $result;
+ }
+
+ if ( \system\exp\Cnpscy\Library\Arr::accessible($target) && \system\exp\Cnpscy\Library\Arr::exists($target, $segment) ) {
+ $target = $target[$segment];
+ } elseif ( is_object($target) && isset($target->{$segment}) ) {
+ $target = $target->{$segment};
+ } else {
+ return ($default);
+ }
+ }
+
+ return $target;
+ }
+}
+
+if ( !function_exists('data_set') ) {
+ /**
+ * Set an item on an array or object using dot notation.
+ *
+ * @param mixed $target
+ * @param string|array $key
+ * @param mixed $value
+ * @param bool $overwrite
+ *
+ * @return mixed
+ */
+ function data_set(&$target, $key, $value, $overwrite = true)
+ {
+ $segments = is_array($key) ? $key : explode('.', $key);
+
+ if ( ($segment = array_shift($segments)) === '*' ) {
+ if ( !Arr::accessible($target) ) {
+ $target = [];
+ }
+
+ if ( $segments ) {
+ foreach ($target as &$inner) {
+ data_set($inner, $segments, $value, $overwrite);
+ }
+ } elseif ( $overwrite ) {
+ foreach ($target as &$inner) {
+ $inner = $value;
+ }
+ }
+ } elseif ( Arr::accessible($target) ) {
+ if ( $segments ) {
+ if ( !Arr::exists($target, $segment) ) {
+ $target[$segment] = [];
+ }
+
+ data_set($target[$segment], $segments, $value, $overwrite);
+ } elseif ( $overwrite || !Arr::exists($target, $segment) ) {
+ $target[$segment] = $value;
+ }
+ } elseif ( is_object($target) ) {
+ if ( $segments ) {
+ if ( !isset($target->{$segment}) ) {
+ $target->{$segment} = [];
+ }
+
+ data_set($target->{$segment}, $segments, $value, $overwrite);
+ } elseif ( $overwrite || !isset($target->{$segment}) ) {
+ $target->{$segment} = $value;
+ }
+ } else {
+ $target = [];
+
+ if ( $segments ) {
+ data_set($target[$segment], $segments, $value, $overwrite);
+ } elseif ( $overwrite ) {
+ $target[$segment] = $value;
+ }
+ }
+
+ return $target;
+ }
+}
+
+if ( !function_exists('config') ) {
+ /**
+ * Get / set the specified configuration value.
+ *
+ * If an array is passed as the key, we will assume you want to set an array of values.
+ *
+ * @param array|string|null $key
+ * @param mixed $default
+ *
+ * @return mixed|\Illuminate\Config\Repository
+ */
+ function config($key = null, $default = null)
+ {
+ if ( is_null($key) ) {
+ return app('config');
+ }
+
+ if ( is_array($key) ) {
+ return app('config')->set($key);
+ }
+ return app('config')->get($key, $default);
+ }
+}
+
+if ( !function_exists('abort') ) {
+ /**
+ * Throw an HttpException with the given data.
+ *
+ * @param $code
+ * @param string $msg
+ * @param array $headers
+ *
+ * @return mixed
+ */
+ function abort($code, $msg = '', array $headers = [])
+ {
+ return \Cnpscy\Embedded\Router::throwException($msg, $code);
+ exit;
+ //return http_response_code($code);
+
+ try {
+ if ( $code instanceof Response ) {
+ throw new \Cnpscy\Exceptions\HttpResponseException($code);
+ } elseif ( $code instanceof Responsable ) {
+ throw new \Cnpscy\Exceptions\HttpResponseException($code->toResponse(request()));
+ }
+ if ( $code == 404 ) {
+ throw new \Cnpscy\Exceptions\NotFoundHttpException($msg);
+ }
+ throw new \Cnpscy\Exceptions\HttpException($code, $msg, null, $headers);
+ } catch (\Cnpscy\Exceptions\HttpExceptionInterface $e) {
+ http_response_code($e->getStatusCode());
+
+ \Cnpscy\Embedded\Response::new()
+ ->failMsg(\app\lib\code::EMAIL_NO_EXIST, $e->getMessage() ?? $msg);
+ }
+ }
+}
+
+if ( !function_exists('http_response_code') ) {
+ function http_response_code($code = null)
+ {
+ if ( $code !== null ) {
+ switch ($code) {
+ case 100:
+ $text = 'Continue';
+ break;
+ case 101:
+ $text = 'Switching Protocols';
+ break;
+ case 200:
+ $text = 'OK';
+ break;
+ case 201:
+ $text = 'Created';
+ break;
+ case 202:
+ $text = 'Accepted';
+ break;
+ case 203:
+ $text = 'Non-Authoritative Information';
+ break;
+ case 204:
+ $text = 'No Content';
+ break;
+ case 205:
+ $text = 'Reset Content';
+ break;
+ case 206:
+ $text = 'Partial Content';
+ break;
+ case 300:
+ $text = 'Multiple Choices';
+ break;
+ case 301:
+ $text = 'Moved Permanently';
+ break;
+ case 302:
+ $text = 'Moved Temporarily';
+ break;
+ case 303:
+ $text = 'See Other';
+ break;
+ case 304:
+ $text = 'Not Modified';
+ break;
+ case 305:
+ $text = 'Use Proxy';
+ break;
+ case 400:
+ $text = 'Bad Request';
+ break;
+ case 401:
+ $text = 'Unauthorized';
+ break;
+ case 402:
+ $text = 'Payment Required';
+ break;
+ case 403:
+ $text = 'Forbidden';
+ break;
+ case 404:
+ $text = 'Not Found';
+ break;
+ case 405:
+ $text = 'Method Not Allowed';
+ break;
+ case 406:
+ $text = 'Not Acceptable';
+ break;
+ case 407:
+ $text = 'Proxy Authentication Required';
+ break;
+ case 408:
+ $text = 'Request Time-out';
+ break;
+ case 409:
+ $text = 'Conflict';
+ break;
+ case 410:
+ $text = 'Gone';
+ break;
+ case 411:
+ $text = 'Length Required';
+ break;
+ case 412:
+ $text = 'Precondition Failed';
+ break;
+ case 413:
+ $text = 'Request Entity Too Large';
+ break;
+ case 414:
+ $text = 'Request-URI Too Large';
+ break;
+ case 415:
+ $text = 'Unsupported Media Type';
+ break;
+ case 500:
+ $text = 'Internal Server Error';
+ break;
+ case 501:
+ $text = 'Not Implemented';
+ break;
+ case 502:
+ $text = 'Bad Gateway';
+ break;
+ case 503:
+ $text = 'Service Unavailable';
+ break;
+ case 504:
+ $text = 'Gateway Time-out';
+ break;
+ case 505:
+ $text = 'HTTP Version not supported';
+ break;
+ default:
+ exit('Unknown http status code "' . htmlentities($code) . '"');
+ break;
+ }
+
+ $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
+
+ header($protocol . ' ' . $code . ' ' . $text);
+
+ $GLOBALS['http_response_code'] = $code;
+ } else {
+
+ $code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);
+ }
+ return $code;
+ }
+}
+
+if ( !function_exists('filtering_html_tags') ) {
+ /**
+ * 过滤HTML的标签,只保留文本
+ *
+ * @param $string
+ *
+ * @return string
+ */
+ function filtering_html_tags($string)
+ {
+ return strip_tags(htmlspecialchars_decode($string), '');
+ }
+}
+
+if ( !function_exists('hash_make') ) {
+ /**
+ * hash加密
+ *
+ * @param string $password
+ *
+ * @return string
+ */
+ function hash_make(string $password = '123456') : string
+ {
+ return hash_encryption($password);
+ }
+}
+
+if ( !function_exists('hash_encryption') ) {
+ /**
+ * [hash_encryption]
+ *
+ * @param string $pass [description]
+ *
+ * @return string
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :hash加密
+ * @englishAnnotation :
+ * @version :1.0
+ */
+ function hash_encryption($pass = '123456') : string
+ {
+ return password_hash($pass, PASSWORD_DEFAULT);
+ }
+}
+
+if ( !function_exists('hash_verify') ) {
+ /**
+ * [hash_verify]
+ *
+ * @param string $pass [description]
+ * @param string $hash_pass [description]
+ *
+ * @return bool
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :hash解密
+ * @englishAnnotation :
+ *
+ * @version :1.0
+ */
+ function hash_verify(string $pass, string $hash_pass) : bool
+ {
+ return password_verify($pass, $hash_pass);
+ }
+}
+
+/**
+ * 数组按照指定字段进行分组
+ *
+ * @param array $array
+ * @param string $field
+ *
+ * @return array
+ */
+function array_field_group(array $array = [], string $field = '') : array
+{
+ $new_ary = [];
+ foreach ($array as $k => $val) $new_ary[$val[$field]][] = $val;
+ return $new_ary;
+}
+
+//计算中奖概率
+function get_random_probability($proArr)
+{
+ $rs = ''; //z中奖结果
+ $proSum = array_sum($proArr); //概率数组的总概率精度
+ //概率数组循环
+ foreach ($proArr as $key => $proCur) {
+ $randNum = mt_rand(0, $proSum);
+ if ( $randNum <= $proCur ) {
+ $rs = $key;
+ break;
+ } else $proSum -= $proCur;
+ }
+ unset($proArr);
+ return $rs;
+}
+
+/**
+ * 对比数组的不同:
+ * 第二个数组对于第一个数组的不同数据返回
+ * 并不是array_diff数组的效果,找两个数组之间的差集
+ *
+ * @param $array1
+ * @param $array2
+ *
+ * @return array
+ */
+function get_array_diff($array1, $array2)
+{
+ if ( empty($array2) ) return $array1;
+ $diff = [];
+ foreach ($array1 as $key => $val) {
+ if ( !isset($array2[$val]) ) $diff[$val] = $val;
+ }
+ return $diff;
+}
+
+function list_to_tree($list, $primary_key = 'menu_id', $pid = 'parent_id', $child = '_child', $root = 0) : array
+{
+ $tree = [];
+ if ( is_array($list) ) {
+ $refer = [];
+ foreach ($list as $key => $data) $refer[$data[$primary_key]] =& $list[$key];
+ foreach ($list as $key => $data) {
+ $parentId = $data[$pid];
+ if ( $root == $parentId ) $tree[] =& $list[$key]; else {
+ if ( isset($refer[$parentId]) ) {
+ $parent =& $refer[$parentId];
+ $parent[$child][] =& $list[$key];
+ }
+ }
+ }
+ }
+ return $tree;
+}
+
+/**
+ * [login_token]
+ *
+ * @param integer $length [description]
+ *
+ * @return string
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:登录token值
+ * @englishAnnotation:
+ */
+function login_token($length = 60) : string
+{
+ //, '#', '%', '&', '+', '^', '`' --- 会影响参数获取,参数获取不全
+ $chars = [
+ 'a',
+ 'b',
+ 'c',
+ 'd',
+ 'e',
+ 'f',
+ 'g',
+ 'h',
+ 'i',
+ 'j',
+ 'k',
+ 'l',
+ 'm',
+ 'n',
+ 'o',
+ 'p',
+ 'q',
+ 'r',
+ 's',
+ 't',
+ 'u',
+ 'v',
+ 'w',
+ 'x',
+ 'y',
+ 'z',
+ 'A',
+ 'B',
+ 'C',
+ 'D',
+ 'E',
+ 'F',
+ 'G',
+ 'H',
+ 'I',
+ 'J',
+ 'K',
+ 'L',
+ 'M',
+ 'N',
+ 'O',
+ 'P',
+ 'Q',
+ 'R',
+ 'S',
+ 'T',
+ 'U',
+ 'V',
+ 'W',
+ 'X',
+ 'Y',
+ 'Z',
+ '0',
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6',
+ '7',
+ '8',
+ '9',
+ '!',
+ '@',
+ '$',
+ '*',
+ '(',
+ ')',
+ '-',
+ '_',
+ '[',
+ ']',
+ '{',
+ '}',
+ '<',
+ '>',
+ '~',
+ '=',
+ ',',
+ '.',
+ ';',
+ ':',
+ '/',
+ '?',
+ '|',
+ ];
+ $array = rand_array_fill($chars, $length);
+ $rand = '';
+ for ($i = 0; $i < $length; $i++) $rand .= $chars[$array[$i]];
+
+ unset($length, $array, $chars);
+
+ return $rand;
+}
+
+function rand_array_fill(&$ary, $length)
+{
+ $count = count($ary);
+ if ( $count < $length ) {
+ $new_ary = [];
+ for ($i = 0; $i < ceil($length / $count); $i++) {
+ for ($j = 0; $j < count($ary); $j++) {
+ array_push($new_ary, $ary[$j]);
+ }
+ }
+ $ary = $new_ary;
+ return array_rand($new_ary, $length);
+ } else return array_rand($ary, $length);
+}
+
+if ( !function_exists('get_client_info') ) {
+ /**
+ * 获取IP与浏览器信息、语言
+ *
+ * @return array
+ */
+ function get_client_info() : array
+ {
+ if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
+ $XFF = $_SERVER['HTTP_X_FORWARDED_FOR'];
+ $client_pos = strpos($XFF, ', ');
+ $client_ip = false !== $client_pos ? substr($XFF, 0, $client_pos) : $XFF;
+ unset($XFF, $client_pos);
+ } else $client_ip = $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['REMOTE_ADDR'] ?? $_SERVER['LOCAL_ADDR'] ?? '0.0.0.0';
+ $client_lang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 5) : '';
+ $client_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
+ return [
+ 'ip' => &$client_ip,
+ 'lang' => &$client_lang,
+ 'agent' => &$client_agent,
+ ];
+ }
+}
+
+if ( !function_exists('get_ip') ) {
+ function get_ip() : string
+ {
+ $data = get_client_info();
+ return $data['ip'] ?? '';
+ }
+}
+
+if ( !function_exists('get_this_url') ) {
+ function get_this_url()
+ {
+ return 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . '?' . $_SERVER['QUERY_STRING'];
+ }
+}
+
+if ( !function_exists('get_request_url') ) {
+ function get_request_url()
+ {
+ return $_SERVER['REQUEST_URI'];
+ }
+}
+
+/**
+ * [request_post 模拟post进行url请求]
+ *
+ * @Author :cnpscy——<[2278757482@qq.com]>
+ * @DateTime :2017-09-25
+ * @chineseAnnotation:模拟post进行url请求
+ * @englishAnnotation:Simulate post for URL requests
+ *
+ * @param string $url [url地址]
+ * @param array $post_data [提交的数据]
+ * @param boolean $ispost [是否是post请求]
+ * @param string $type [返回格式]
+ *
+ * @return array [description]
+ */
+function request_post(string $url = '', array $post_data = [], $ispost = true, $type = 'json')
+{
+ @header("Content-type: text/html; charset=utf-8");
+ if ( empty($url) ) return false;
+ $o = "";
+ if ( !empty($post_data) ) {
+ foreach ($post_data as $k => $v) $o .= "$k=" . urlencode($v) . "&";
+ $post_data = substr($o, 0, -1);
+ $key = md5(base64_encode($post_data));
+ } else $key = 'key';
+ if ( $ispost ) {
+ $url = $url;
+ $curlPost = $post_data;
+ } else {
+ $url = $url . '?' . implode(',', $post_data);
+ $curlPost = 'key=' . $key;
+ }
+ $ch = curl_init();//初始化curl
+ curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
+ curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
+ if ( $ispost ) {
+ curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
+ }
+ $data = curl_exec($ch);//运行curl
+ curl_close($ch);
+ $object = json_decode($data);
+ $return = object_to_array($object);
+ return $return;
+}
+
+/**
+ * [object_to_array 对象转为数组]
+ *
+ * @Author :cnpscy——<[2278757482@qq.com]>
+ * @DateTime :2017-09-26
+ * @chineseAnnotation:对象转为数组
+ * @englishAnnotation:The object is converted to an array
+ *
+ * @param object $array [需要转换的对象]
+ *
+ * @return array [description]
+ */
+function object_to_array($array)
+{
+ if ( is_object($array) ) $array = (array)$array;
+ if ( is_array($array) ) {
+ foreach ($array as $key => $value) $array[$key] = object_to_array($value);
+ }
+ return $array;
+}
+
+/**
+ * [config_array_analysis]
+ *
+ * @param [type] $data [需要解析的数组]
+ *
+ * @return [type] [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :配置多维数组的解析
+ * @englishAnnotation :
+ */
+function config_array_analysis($data)
+{
+ $value_extra = preg_split('/[,;\r\n]+/', trim($data, ",;\r\n"));
+ if ( strpos($data, ':') ) {
+ $array = [];
+ foreach ($value_extra as $val) {
+ [
+ $k,
+ $v,
+ ] = explode(':', $val);
+ $array[$k] = $v;
+ }
+ } else $array = $value_extra;
+ return $array ?? [];
+}
+
+/**
+ * [is_base64]
+ *
+ * @param [type] $str [description]
+ *
+ * @return boolean [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :检测是否为base64位编码
+ * @englishAnnotation :
+ */
+function is_base64($str)
+{
+ //这里多了个纯字母和纯数字的正则判断
+ if ( @preg_match('/^[0-9]*$/', $str) || @preg_match('/^[a-zA-Z]*$/', $str) ) return false; elseif ( is_utf8(base64_decode($str)) && base64_decode($str) != '' ) return true;
+ return false;
+}
+
+/**
+ * [is_utf8]
+ *
+ * @param [type] $str [description]
+ *
+ * @return boolean [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :判断否为UTF-8编码
+ * @englishAnnotation :
+ */
+function is_utf8($str)
+{
+ $len = strlen($str);
+ for ($i = 0; $i < $len; $i++) {
+ $c = ord($str[$i]);
+ if ( $c > 128 ) {
+ if ( ($c > 247) ) return false; elseif ( $c > 239 ) $bytes = 4;
+ elseif ( $c > 223 ) $bytes = 3;
+ elseif ( $c > 191 ) $bytes = 2;
+ else return false;
+ if ( ($i + $bytes) > $len ) return false;
+ while ( $bytes > 1 ) {
+ $i++;
+ $b = ord($str[$i]);
+ if ( $b < 128 || $b > 191 ) return false;
+ $bytes--;
+ }
+ }
+ }
+ return true;
+}
+
+function getMillisecond()
+{
+ [
+ $t1,
+ $t2,
+ ] = explode(' ', microtime());
+ return (float)sprintf('%.0f', (floatval($t1) + floatval($t2)) * 1000);
+}
+
+/**
+ * [check_url]
+ *
+ * @param string $_url [description]
+ *
+ * @return [type] [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :检测URL地址格式
+ * @englishAnnotation :
+ * @version :1.0
+ */
+if ( !function_exists('check_url') ) {
+ function check_url(string $url) : bool
+ {
+ $str = "/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/";
+ if ( !preg_match($str, $url) ) return false; else return true;
+ }
+}
+
+if ( !function_exists('filter_url') ) {
+ function filter_url(string $url) : bool
+ {
+ return filter_var($url, FILTER_VALIDATE_URL) !== false ? false : true;
+ }
+}
+
+/**
+ * [array_ksort_to_string]
+ *
+ * @param [type] $data [description]
+ *
+ * @return string
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :数组升序转成字符串
+ * @englishAnnotation :
+ * @version :1.0
+ */
+function array_ksort_to_string($data) : string
+{
+ if ( is_string($data) ) return $data;
+ ksort($data);
+ $tmps = [];
+ foreach ($data as $k => $v) $tmps[] = $k . $v;
+ return implode('', $tmps);
+}
+
+/**
+ * [mobile_web]
+ *
+ * @return boolean [description]
+ * @version :1.0
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:是否为手机端访问
+ * @englishAnnotation:
+ */
+function mobile_web() : bool
+{
+ $useragent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
+ $useragent_commentsblock = preg_match('|\(.*?\)|', $useragent, $matches) > 0 ? $matches[0] : '';
+
+ $mobile_os_list = [
+ 'Google Wireless Transcoder',
+ 'Windows CE',
+ 'WindowsCE',
+ 'Symbian',
+ 'Android',
+ 'armv6l',
+ 'armv5',
+ 'Mobile',
+ 'CentOS',
+ 'mowser',
+ 'AvantGo',
+ 'Opera Mobi',
+ 'J2ME/MIDP',
+ 'Smartphone',
+ 'Go.Web',
+ 'Palm',
+ 'iPAQ',
+ ];
+ $mobile_token_list = [
+ 'Profile/MIDP',
+ 'Configuration/CLDC-',
+ '160×160',
+ '176×220',
+ '240×240',
+ '240×320',
+ '320×240',
+ 'UP.Browser',
+ 'UP.Link',
+ 'SymbianOS',
+ 'PalmOS',
+ 'PocketPC',
+ 'SonyEricsson',
+ 'Nokia',
+ 'BlackBerry',
+ 'Vodafone',
+ 'BenQ',
+ 'Novarra-Vision',
+ 'Iris',
+ 'NetFront',
+ 'HTC_',
+ 'Xda_',
+ 'SAMSUNG-SGH',
+ 'Wapaka',
+ 'DoCoMo',
+ 'iPhone',
+ 'iPod',
+ ];
+
+ $found_mobile = CheckSubstrs($mobile_os_list, $useragent_commentsblock) || CheckSubstrs($mobile_token_list, $useragent);
+
+ if ( $found_mobile ) return true; else return false;
+}
+
+function CheckSubstrs($substrs, $text)
+{
+ foreach ($substrs as $substr) {
+ if ( false !== strpos($text, $substr) ) return true;
+ }
+ return false;
+}
+
+/**
+ * [is_app]
+ *
+ * @return boolean [description]
+ * @version :1.0
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:检测是否为App
+ * @englishAnnotation:
+ */
+function is_app()
+{
+ if ( isset ($_SERVER['HTTP_X_WAP_PROFILE']) ) return true;// 如果有HTTP_X_WAP_PROFILE则一定是移动设备
+ // 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息
+ if ( isset ($_SERVER['HTTP_VIA']) ) return stristr($_SERVER['HTTP_VIA'], "wap") ? true : false;// 找不到为flase,否则为true
+ // 脑残法,判断手机发送的客户端标志,兼容性有待提高
+ if ( isset ($_SERVER['HTTP_USER_AGENT']) ) {
+ $clientkeywords = [
+ 'nokia',
+ 'sony',
+ 'ericsson',
+ 'mot',
+ 'samsung',
+ 'htc',
+ 'sgh',
+ 'lg',
+ 'sharp',
+ 'sie-',
+ 'philips',
+ 'panasonic',
+ 'alcatel',
+ 'lenovo',
+ 'iphone',
+ 'ipod',
+ 'blackberry',
+ 'meizu',
+ 'android',
+ 'netfront',
+ 'symbian',
+ 'ucweb',
+ 'windowsce',
+ 'palm',
+ 'operamini',
+ 'operamobi',
+ 'openwave',
+ 'nexusone',
+ 'cldc',
+ 'midp',
+ 'wap',
+ 'mobile',
+ ];
+ // 从HTTP_USER_AGENT中查找手机浏览器的关键字
+ if ( preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT'])) ) return true;
+ }
+ // 协议法,因为有可能不准确,放到最后判断
+ if ( isset ($_SERVER['HTTP_ACCEPT']) ) {
+ // 如果只支持wml并且不支持html那一定是移动设备
+ // 如果支持wml和html但是wml在html之前则是移动设备
+ if ( (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))) ) return true;
+ }
+ return false;
+}
+
+/**
+ * 检测身份证号码
+ *
+ * @param string $id
+ *
+ * @return bool
+ */
+function check_idcard(string $id) : bool
+{
+ $id = strtoupper($id);
+ $regx = "/(^\d{15}$)|(^\d{17}([0-9]|X)$)/";
+ $arr_split = [];
+ if ( !preg_match($regx, $id) ) return false;
+ if ( 15 == strlen($id) ) { //检查15位
+ $regx = "/^(\d{6})+(\d{2})+(\d{2})+(\d{2})+(\d{3})$/";
+ @preg_match($regx, $id, $arr_split);
+ //检查生日日期是否正确
+ $dtm_birth = "19" . $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4];
+ if ( !strtotime($dtm_birth) ) return false; else return true;
+ } else { //检查18位
+ $regx = "/^(\d{6})+(\d{4})+(\d{2})+(\d{2})+(\d{3})([0-9]|X)$/";
+ @preg_match($regx, $id, $arr_split);
+ $dtm_birth = $arr_split[2] . '/' . $arr_split[3] . '/' . $arr_split[4];
+ if ( !strtotime($dtm_birth) ) return false;//检查生日日期是否正确
+ else {
+ //检验18位身份证的校验码是否正确。
+ //校验位按照ISO 7064:1983.MOD 11-2的规定生成,X可以认为是数字10。
+ $arr_int = [
+ 7,
+ 9,
+ 10,
+ 5,
+ 8,
+ 4,
+ 2,
+ 1,
+ 6,
+ 3,
+ 7,
+ 9,
+ 10,
+ 5,
+ 8,
+ 4,
+ 2,
+ ];
+ $arr_ch = [
+ '1',
+ '0',
+ 'X',
+ '9',
+ '8',
+ '7',
+ '6',
+ '5',
+ '4',
+ '3',
+ '2',
+ ];
+ $sign = 0;
+ for ($i = 0; $i < 17; $i++) {
+ $b = (int)$id{$i};
+ $w = $arr_int[$i];
+ $sign += $b * $w;
+ }
+ $n = $sign % 11;
+ $val_num = $arr_ch[$n];
+ if ( $val_num != substr($id, 17, 1) ) return false; else return true;//phpfensi.com
+ }
+ }
+}
+
+/**
+ * [round_down_decimal]
+ *
+ * @param float|integer $money_num [description]
+ * @param int|integer $length [description]
+ *
+ * @return float
+ * @version :1.0
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:保留几位小数,向下取,就是直接截断 3 为小数即可。
+ * @englishAnnotation:
+ */
+function round_down_decimal(float $money_num = 0, int $length = 2) : float
+{
+ return substr($money_num, 0, strlen($money_num) - _getFloatLength($money_num) + $length);
+}
+
+/**
+ * [_getFloatLength]
+ *
+ * @param [type] $num [description]
+ *
+ * @return int
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :计算小数部分的长度
+ * @englishAnnotation :
+ * @version :1.0
+ */
+function _getFloatLength($num) : int
+{
+ $count = 0;
+ $temp = explode('.', $num);
+ if ( sizeof($temp) > 1 ) {
+ $decimal = end($temp);
+ $count = strlen($decimal);
+ }
+ return $count;
+}
+
+/**
+ * [set_money_conversion]
+ *
+ * @param float|integer $money [description]
+ * @param int|integer $length [description]
+ *
+ * @return float
+ *
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:金额插入数据库的时候,单位转换为“分”【具体根据$length长度而定】
+ * @englishAnnotation:
+ * @version :1.0
+ */
+function set_money_conversion(float $money = 0, int $length = 2) : float
+{
+ return floatval($money) * pow(10, $length);
+}
+
+/**
+ * [get_money_conversion]
+ *
+ * @param float|integer $money [description]
+ * @param int|integer $length [description]
+ *
+ * @return [type] [description]
+ * @version :1.0
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :金额取出的时候,由“分”转化为“元”【具体根据$length长度而定】
+ * @englishAnnotation :
+ */
+function get_money_conversion(float $money = 0, int $length = 2) : float
+{
+ return floatval($money) / pow(10, $length);
+}
+
+/**
+ * [is_date]
+ *
+ * @param string $date [description]
+ *
+ * @return boolean [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:是否为日期格式
+ * @englishAnnotation:
+ * @version :1.0
+ */
+function is_date(string $date) : bool
+{
+ $ret = strtotime($date);
+ return $ret !== false && $ret != -1;
+
+ // if (date('Y-m-d H:i:s', strtotime($date)) === $date) return true;
+ // else return false;
+}
+
+/**
+ * [month_list]
+ *
+ * @param int $start [description]
+ * @param int $end [description]
+ *
+ * @return [type] [description]
+ * @version :1.0
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :
+ * @englishAnnotation :
+ */
+function month_list(int $start, int $end) : array
+{
+ if ( !is_numeric($start) || !is_numeric($end) || ($end <= $start) ) return '';
+ $start = date('Y-m', $start);
+ $end = date('Y-m', $end);
+ //转为时间戳
+ $start = strtotime($start . '-01');
+ $end = strtotime($end . '-01');
+ $i = 0;
+ $d = [];
+ while ( $start <= $end ) {
+ //这里累加每个月的的总秒数 计算公式:上一月1号的时间戳秒数减去当前月的时间戳秒数
+ $d[$i] = trim(date('Y-m', $start), ' ');
+ $start += strtotime('+1 month', $start) - $start;
+ $i++;
+ }
+ return $d;
+}
+
+function get_errors_list(array $data = []) : string
+{
+ $html = '';
+ if ( !empty($data) ) {
+ foreach ($data as $k => $v) $html .= $k + 1 . '.' . $v . PHP_EOL;
+ }
+ return $html;
+}
+
+//内存占用空间
+function memory_usage()
+{
+ $memory = ( !function_exists('memory_get_usage')) ? '0' : round(memory_get_usage() / 1024 / 1024, 2) . 'MB';
+ return $memory;
+}
+
+/**
+ * 参数说明
+ * $string 欲截取的字符串
+ * $sublen 截取的长度
+ * $start 从第几个字节截取,默认为0
+ * $code 字符编码,默认UTF-8
+ */
+function cut_str(string $string, int $sublen = 100, int $start = 0, $code = 'UTF-8')
+{
+ if ( $code == 'UTF-8' ) {
+ $pa = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/";
+ preg_match_all($pa, $string, $t_string);
+ if ( count($t_string[0]) - $start > $sublen ) return join('', array_slice($t_string[0], $start, $sublen)) . ".....";
+ return join('', array_slice($t_string[0], $start, $sublen));
+ } else {
+ $start = $start * 2;
+ $sublen = $sublen * 2;
+ $strlen = strlen($string);
+ $tmpstr = '';
+ for ($i = 0; $i < $strlen; $i++) {
+ if ( $i >= $start && $i < ($start + $sublen) ) {
+ if ( ord(substr($string, $i, 1)) > 129 ) {
+ $tmpstr .= substr($string, $i, 2);
+ } else {
+ $tmpstr .= substr($string, $i, 1);
+ }
+ }
+ if ( ord(substr($string, $i, 1)) > 129 ) $i++;
+ }
+ if ( strlen($tmpstr) < $strlen ) $tmpstr .= "";
+ return $tmpstr;
+ }
+}
+
+/**
+ * [strToHex]
+ *
+ * @param [type] $string [description]
+ *
+ * @return [type] [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :字符串转16进制
+ * @englishAnnotation :
+ * @version :1.0
+ */
+function strToHex($string)
+{
+ $this_i = $hex = "";
+ for ($i = 0; $i < strlen($string); $i++) {
+ $this_i = dechex(ord($string[$i]));
+ if ( strlen($this_i) == 0 ) $this_i = '00'; elseif ( strlen($this_i) == 1 ) $this_i = '0' . $this_i;
+ $hex .= $this_i;
+ }
+ $hex = strtoupper($hex);
+ return $hex;
+}
+
+/**
+ * [hexToStr]
+ *
+ * @param [type] $hex [description]
+ *
+ * @return [type] [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :16进制转字符串
+ * @englishAnnotation :
+ * @version :1.0
+ */
+function hexToStr($hex)
+{
+ $sendStrArray = str_split(str_replace(' ', '', $hex), 2); // 将16进制数据转换成两个一组的数组
+ $send_info = '';
+ for ($j = 0; $j < count($sendStrArray); $j++) {
+ $send_info .= chr(hexdec($sendStrArray[$j]));
+ }
+ return $send_info;
+}
+
+function crc16($string, $start_reverse = 0)
+{
+ $string = pack('H*', $string);
+ $crc = 0xFFFF;
+ for ($x = 0; $x < strlen($string); $x++) {
+ $crc = $crc ^ ord($string[$x]);
+ for ($y = 0; $y < 8; $y++) {
+ if ( ($crc & 0x0001) == 0x0001 ) {
+ $crc = (($crc >> 1) ^ 0xA001);
+ } else {
+ $crc = $crc >> 1;
+ }
+ }
+ }
+ $more_data = strlen(dechex(floor($crc % 256))) < 2 ? '0' . dechex($crc % 256) : dechex($crc % 256);
+ $less_data = strlen(dechex(floor($crc / 256))) < 2 ? '0' . dechex($crc / 256) : dechex($crc / 256);
+ return strtoupper($start_reverse == 0 ? ($more_data . $less_data) : ($less_data . $more_data));
+}
+
+function gencrc16($string)
+{
+ $crc = 0xFFFF;
+ for ($x = 0; $x < strlen($string); $x++) {
+ $crc = $crc ^ ord($string[$x]);
+ for ($y = 0; $y < 8; $y++) {
+ if ( ($crc & 0x0001) == 0x0001 ) {
+ $crc = (($crc >> 1) ^ 0xA001);
+ } else {
+ $crc = $crc >> 1;
+ }
+ }
+ }
+ return strtoupper($crc);
+}
+
+/**
+ * @param $lat1
+ * @param $lng1
+ * @param $lat2
+ * @param $lng2
+ *
+ * @return int
+ *
+ * 经纬度计算两点之间的距离
+ */
+function getDistance($lat1, $lng1, $lat2, $lng2)
+{
+
+ // 将角度转为狐度
+ $radLat1 = deg2rad($lat1);// deg2rad()函数将角度转换为弧度
+ $radLat2 = deg2rad($lat2);
+ $radLng1 = deg2rad($lng1);
+ $radLng2 = deg2rad($lng2);
+
+ $a = $radLat1 - $radLat2;
+ $b = $radLng1 - $radLng2;
+
+ $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))) * 6378.137;
+
+ return $s;
+}
+
+/**
+ * @param $lat1
+ * @param $lon1
+ * @param $lat2
+ * @param $lon2
+ * @param float $radius 星球半径 KM
+ *
+ * @return float
+ *
+ * 经纬度计算两点之间的距离
+ */
+function distance($lat1, $lon1, $lat2, $lon2, $radius = 6378.137)
+{
+ $rad = floatval(M_PI / 180.0);
+
+ $lat1 = floatval($lat1) * $rad;
+ $lon1 = floatval($lon1) * $rad;
+ $lat2 = floatval($lat2) * $rad;
+ $lon2 = floatval($lon2) * $rad;
+
+ $theta = $lon2 - $lon1;
+
+ $dist = acos(sin($lat1) * sin($lat2) + cos($lat1) * cos($lat2) * cos($theta));
+
+ if ( $dist < 0 ) {
+ $dist += M_PI;
+ }
+ return $dist = $dist * $radius;
+}
+
+function request_function(string $url = '', array $post_data = [], $ispost = true, $json_conversion = 1)
+{
+ if ( empty($url) ) return false;
+ $o = "";
+ if ( !empty($post_data) ) {
+ foreach ($post_data as $k => $v) $o .= "$k=" . urlencode($v) . "&";
+ $post_data = substr($o, 0, -1);
+ $key = md5(base64_encode($post_data));
+ } else $key = 'key';
+ if ( $ispost ) {
+ $url = $url;
+ $curlPost = $post_data;
+ } else {
+ $url = $url . '?' . $post_data;
+ $curlPost = 'key=' . $key;
+ }
+ $ch = curl_init();//初始化curl
+ curl_setopt($ch, CURLOPT_URL, $url);//抓取指定网页
+ curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //禁止 cURL 验证对等证书
+ curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); //是否检测服务器的域名与证书上的是否一致
+ if ( $ispost ) {
+ curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
+ }
+ $data = curl_exec($ch);//运行curl
+ curl_close($ch);
+ return $json_conversion ? json_decode($data, true) : $data;
+}
+
+/**
+ * [set_field_filtering]
+ *
+ * @param string $field [数据]
+ * @param string $field_type [数据的类型]
+ * @param string $default_val [默认值]
+ *
+ * @version :1.0
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:数据类型过滤
+ * @englishAnnotation:
+ */
+function set_field_filtering($field = '', $field_type = 'string', $default_val = '')
+{
+ if ( isset($field) || $field == null ) return $field;
+ $field_type = strtolower(trim($field_type));
+ if ( in_array($field_type, [
+ 'str',
+ 'string',
+ 'varchar',
+ ]) ) return trim($field ?? $default_val); elseif ( in_array($field_type, [
+ 'int',
+ 'intval',
+ 'number',
+ ]) ) return intval($field ?? $default_val);
+ elseif ( in_array($field_type, [
+ 'double',
+ 'float',
+ 'floatval',
+ ]) ) return floatval($field ?? $default_val);
+}
+
+function get_server_url() : string
+{
+ $pact = isset($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS'] ? 'https://' : 'http://';
+ return $pact . ($_SERVER['SERVER_NAME'] ?? '');
+}
+
+function set_server_url($str) : string
+{
+ return get_server_url() . $str;
+ // return get_server_url() . $str;
+}
+
+function remove_server_url(string $img) : string
+{
+ return str_replace(get_server_url(), "", $img);
+}
+
+//生成随机数
+function get_rand($sum = 6)
+{
+ $rand = '';
+ for ($i = 1; $i <= $sum; $i++) $rand .= rand(0, 9);
+ return $rand;
+}
+
+/**
+ * 获取随机字符串
+ *
+ * @param int $randLength 长度
+ * @param int $create_time 是否加入当前时间戳
+ * @param int $includenumber 是否包含数字
+ *
+ * @return string
+ */
+if ( !function_exists('rand_str') ) {
+ function rand_str($randLength = 6, $create_time = 1, $includenumber = 1)
+ {
+ if ( $includenumber ) {
+ $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQEST123456789';
+ } else {
+ $chars = 'abcdefghijklmnopqrstuvwxyz';
+ }
+ $len = strlen($chars);
+ $randStr = '';
+ for ($i = 0; $i < $randLength; $i++) {
+ $randStr .= $chars[mt_rand(0, $len - 1)];
+ }
+ $tokenvalue = $randStr;
+ if ( $create_time ) {
+ $tokenvalue = $randStr . '-' . time();
+ }
+ return $tokenvalue;
+ }
+}
+
+/**
+ * 倒计时 转化成 天-时分秒 展示
+ *
+ * @param $time
+ *
+ * @return string
+ */
+function countdown_conversion_time($time)
+{
+ if ( empty($time) ) return '';
+ $day = intval($time / (60 * 60 * 24));
+ $hour = intval($time / (60 * 60) - $day * 24);
+ $minute = intval($time / 60 - $day * 24 * 60 - $hour * 60);
+ $second = intval($time - $day * 24 * 60 * 60 - $hour * 60 * 60 - $minute * 60);
+
+ $day = (intval($day) <= 0) ? '' : $day . '天 ';
+ if ( intval($hour) <= 9 ) $hour = '0' . $hour;
+ if ( intval($minute) <= 9 ) $minute = '0' . $minute;
+ if ( intval($second) <= 9 ) $second = '0' . $second;
+ return $day . $hour . '时' . $minute . '分' . $second . '秒';
+}
+
+function amount_conversion($money, $length = 2)
+{
+ return round(floatval($money), $length);
+}
+
+/**
+ * 金额格式化
+ *
+ * @param [float] $value [金额]
+ * @param [int] $decimals [保留的位数]
+ * @param [string] $dec_point [保留小数分隔符]
+ */
+function PriceNumberFormat($value, $decimals = 2, $dec_point = '.')
+{
+ return number_format($value, $decimals, $dec_point, '');
+}
+
+function getWxPayMoeny($moeny)
+{
+ return $moeny * 100;//以分为单位
+}
+
+/*
+ * 检测银行卡
+ 16-19 位卡号校验位采用 Luhm 校验方法计算:
+ 1,将未带校验位的 15 位卡号从右依次编号 1 到 15,位于奇数位号上的数字乘以 2
+ 2,将奇位乘积的个十位全部相加,再加上所有偶数位上的数字
+ 3,将加法和加上校验位能被 10 整除。
+*/
+function check_bank_card($bankCardNo)
+{
+ $strlen = strlen($bankCardNo);
+ if ( $strlen < 15 || $strlen > 19 ) {
+ return false;
+ }
+ if ( !preg_match("/^\d{15}$/i", $bankCardNo) && !preg_match("/^\d{16}$/i", $bankCardNo) && !preg_match("/^\d{17}$/i", $bankCardNo) && !preg_match("/^\d{18}$/i", $bankCardNo) && !preg_match("/^\d{19}$/i", $bankCardNo) ) {
+ return false;
+ }
+ $arr_no = str_split($bankCardNo);
+ $last_n = $arr_no[count($arr_no) - 1];
+ krsort($arr_no);
+ $i = 1;
+ $total = 0;
+ foreach ($arr_no as $n) {
+ if ( $i % 2 == 0 ) {
+ $ix = $n * 2;
+ if ( $ix >= 10 ) {
+ $nx = 1 + ($ix % 10);
+ $total += $nx;
+ } else {
+ $total += $ix;
+ }
+ } else {
+ $total += $n;
+ }
+ $i++;
+ }
+ $total -= $last_n;
+ $x = 10 - ($total % 10);
+ if ( $x != $last_n ) {
+ return false;
+ }
+ return true;
+}
+
+/**
+ * 生成混合code
+ *
+ * @param integer $length [description]
+ *
+ * @return [type] [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :登录token值
+ * @englishAnnotation :
+ */
+function make_blend_code($length = 20) : string
+{
+ $chars = [
+ 'a',
+ 'b',
+ 'c',
+ 'd',
+ 'e',
+ 'f',
+ 'g',
+ 'h',
+ 'i',
+ 'j',
+ 'k',
+ 'l',
+ 'm',
+ 'n',
+ 'o',
+ 'p',
+ 'q',
+ 'r',
+ 's',
+ 't',
+ 'u',
+ 'v',
+ 'w',
+ 'x',
+ 'y',
+ 'z',
+ 'A',
+ 'B',
+ 'C',
+ 'D',
+ 'E',
+ 'F',
+ 'G',
+ 'H',
+ 'I',
+ 'J',
+ 'K',
+ 'L',
+ 'M',
+ 'N',
+ 'O',
+ 'P',
+ 'Q',
+ 'R',
+ 'S',
+ 'T',
+ 'U',
+ 'V',
+ 'W',
+ 'X',
+ 'Y',
+ 'Z',
+ '0',
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6',
+ '7',
+ '8',
+ '9',
+ ];
+ $array = array_rand($chars, $length);
+ $rand = '';
+ for ($i = 0; $i < $length; $i++) $rand .= $chars[$array[$i]];
+ return $rand;
+}
+
+/**
+ * 生成UUID
+ *
+ * @param string $string
+ *
+ * @return string
+ */
+if ( !function_exists('make_uuid') ) {
+ /**
+ * 生成UUID
+ *
+ * @param string $string
+ *
+ * @return string
+ */
+ function make_uuid(string $string = '') : string
+ {
+ $string = '' === $string ? uniqid(mt_rand(), true) : (0 === (int)preg_match('/[A-Z]/', $string) ? $string : mb_strtolower($string, 'UTF-8'));
+ $code = hash('sha1', $string . ':UUID');
+ $uuid = substr($code, 0, 10);
+ $uuid .= substr($code, 10, 4);
+ $uuid .= substr($code, 16, 4);
+ $uuid .= substr($code, 22, 4);
+ $uuid .= substr($code, 28, 12);
+ $uuid = strtoupper($uuid);
+ unset($string, $code);
+ return $uuid;
+ }
+}
+
+/**
+ * Generate UUID (string hash based)
+ *
+ * @param string $string
+ *
+ * @return string
+ */
+function get_uuid(string $string = '') : string
+{
+ if ( '' === $string ) {
+ //Create random string
+ $string = uniqid(microtime() . getmypid() . mt_rand(), true);
+ }
+
+ $start = 0;
+ $codes = [];
+ $length = [
+ 8,
+ 4,
+ 4,
+ 4,
+ 12,
+ ];
+ $string = hash('md5', $string);
+
+ foreach ($length as $len) {
+ $codes[] = substr($string, $start, $len);
+ $start += $len;
+ }
+
+ $uuid = implode('-', $codes);
+
+ unset($string, $start, $codes, $length, $len);
+ return $uuid;
+}
+
+function getFirstChar($s)
+{
+ $s0 = mb_substr($s, 0, 3); //获取名字的姓
+ $s = iconv('UTF-8', 'gb2312', $s0); //将UTF-8转换成GB2312编码
+ if ( ord($s0) > 128 ) { //汉字开头,汉字没有以U、V开头的
+ $asc = ord($s{0}) * 256 + ord($s{1}) - 65536;
+ if ( $asc >= -20319 and $asc <= -20284 ) return "A";
+ if ( $asc >= -20283 and $asc <= -19776 ) return "B";
+ if ( $asc >= -19775 and $asc <= -19219 ) return "C";
+ if ( $asc >= -19218 and $asc <= -18711 ) return "D";
+ if ( $asc >= -18710 and $asc <= -18527 ) return "E";
+ if ( $asc >= -18526 and $asc <= -18240 ) return "F";
+ if ( $asc >= -18239 and $asc <= -17760 ) return "G";
+ if ( $asc >= -17759 and $asc <= -17248 ) return "H";
+ if ( $asc >= -17247 and $asc <= -17418 ) return "I";
+ if ( $asc >= -17417 and $asc <= -16475 ) return "J";
+ if ( $asc >= -16474 and $asc <= -16213 ) return "K";
+ if ( $asc >= -16212 and $asc <= -15641 ) return "L";
+ if ( $asc >= -15640 and $asc <= -15166 ) return "M";
+ if ( $asc >= -15165 and $asc <= -14923 ) return "N";
+ if ( $asc >= -14922 and $asc <= -14915 ) return "O";
+ if ( $asc >= -14914 and $asc <= -14631 ) return "P";
+ if ( $asc >= -14630 and $asc <= -14150 ) return "Q";
+ if ( $asc >= -14149 and $asc <= -14091 ) return "R";
+ if ( $asc >= -14090 and $asc <= -13319 ) return "S";
+ if ( $asc >= -13318 and $asc <= -12839 ) return "T";
+ if ( $asc >= -12838 and $asc <= -12557 ) return "W";
+ if ( $asc >= -12556 and $asc <= -11848 ) return "X";
+ if ( $asc >= -11847 and $asc <= -11056 ) return "Y";
+ if ( $asc >= -11055 and $asc <= -10247 ) return "Z";
+ } elseif ( ord($s) >= 48 and ord($s) <= 57 ) { //数字开头
+ switch (iconv_substr($s, 0, 1, 'utf-8')) {
+ case 1:
+ return "Y";
+ case 2:
+ return "E";
+ case 3:
+ return "S";
+ case 4:
+ return "S";
+ case 5:
+ return "W";
+ case 6:
+ return "L";
+ case 7:
+ return "Q";
+ case 8:
+ return "B";
+ case 9:
+ return "J";
+ case 0:
+ return "L";
+ }
+ } elseif ( ord($s) >= 65 and ord($s) <= 90 ) { //大写英文开头
+ return substr($s, 0, 1);
+ } elseif ( ord($s) >= 97 and ord($s) <= 122 ) { //小写英文开头
+ return strtoupper(substr($s, 0, 1));
+ } else {
+ return iconv_substr($s0, 0, 1, 'utf-8');
+ //中英混合的词语,不适合上面的各种情况,因此直接提取首个字符即可
+ }
+}
+
+function strip_html_tags($tags, $str)
+{
+ $html = [];
+ foreach ($tags as $tag) $html[] = "/(<(?:\/" . $tag . "|" . $tag . ")[^>]*>)/i";
+ $data = preg_replace($html, '', $str);
+ return $data;
+}
+
+//获取本地存储的文件
+function GetLocalFileByPath($path)
+{
+ return asset('uploads') . '/' . $path;
+}
+
+//参数1:访问的URL,参数2:post数据(不填则为GET),参数3:提交的$cookies,参数4:是否返回$cookies
+function curl_request($url, $post = '', $json = false, $header = [])
+{
+ $curl = curl_init();
+ curl_setopt($curl, CURLOPT_URL, $url);
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
+ curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)');
+ curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0);
+ curl_setopt($curl, CURLOPT_AUTOREFERER, 0);
+ //curl_setopt($curl, CURLOPT_REFERER, "http://XXX");
+ if ( $json ) {
+ curl_setopt($curl, CURLOPT_POST, 1);
+ curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
+ curl_setopt($curl, CURLOPT_HTTPHEADER, array_merge([
+ 'Content-Type: application/json; charset=utf-8',
+ //伪造IP
+ //'CLIENT-IP:85.25.105.77','X-FORWARDED-FOR:85.25.105.77',//此处可以改为任意假IP
+ 'Content-Length: ' . (empty($post) ? 0 : strlen(http_build_query($post))),
+ ], $header));
+ }
+ curl_setopt($curl, CURLOPT_TIMEOUT, 60);
+ //不输出头信息
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+ $data = curl_exec($curl);
+ if ( curl_errno($curl) ) {
+ return false;
+ //throw new Exception("Error:".curl_error($curl));
+ }
+ curl_close($curl);
+ return $data;
+}
+
+function curlRequest($url, $params = [], $method = 'POST', $header = [], $type = 'json', $options = [])
+{
+ if (empty($options)) {
+ $options = [CURLOPT_CONNECTTIMEOUT => 30, CURLOPT_TIMEOUT => 30, CURLOPT_SSL_VERIFYPEER => false, CURLOPT_HTTPHEADER => ['X-REQUESTED-WITH: XMLHttpRequest']];
+ }
+
+ $method = strtoupper($method);
+ $protocol = substr($url, 0, 5);
+
+ if ($type == 'json' && is_array($params)) {
+ $query_string = json_encode($params, JSON_UNESCAPED_UNICODE);
+ }else{
+ $query_string = is_array($params) ? http_build_query($params) : $params;
+ }
+
+ $ch = curl_init();
+ $defaults = [];
+ if ('GET' == $method) {
+ $geturl = $query_string ? $url . (stripos($url, '?') !== false ? '&' : '?') . $query_string : $url;
+ $defaults[CURLOPT_URL] = $geturl;
+ } else {
+ $defaults[CURLOPT_URL] = $url;
+ if ($method == 'POST') {
+ $defaults[CURLOPT_POST] = 1;
+ } else {
+ $defaults[CURLOPT_CUSTOMREQUEST] = $method;
+ }
+ $defaults[CURLOPT_POSTFIELDS] = $query_string;
+ }
+
+ $defaults[CURLOPT_HEADER] = false;
+ $defaults[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.98 Safari/537.36';
+ $defaults[CURLOPT_FOLLOWLOCATION] = true;
+ $defaults[CURLOPT_RETURNTRANSFER] = true;
+ $defaults[CURLOPT_CONNECTTIMEOUT] = 3;
+ $defaults[CURLOPT_TIMEOUT] = 3;
+
+ // disable 100-continue
+ curl_setopt($ch, CURLOPT_HTTPHEADER, ['Expect:']);
+
+ if ('https' == $protocol) {
+ $defaults[CURLOPT_SSL_VERIFYPEER] = false;
+ $defaults[CURLOPT_SSL_VERIFYHOST] = false;
+ }
+
+ curl_setopt_array($ch, (array)$options + $defaults);
+
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array_merge([
+ 'Content-Type: application/json; charset=utf-8',
+ //伪造IP
+ 'CLIENT-IP:85.25.105.77',
+ 'X-FORWARDED-FOR:85.25.105.77',//此处可以改为任意假IP
+ 'Content-Length: ' . strlen($query_string),
+ ], $header)
+ );
+
+ $ret = curl_exec($ch);
+ $err = curl_error($ch);
+
+ curl_close($ch);
+
+ return json_decode($ret, true);
+}
+
+//过滤值为空的数组
+function filterEmptyArr($array)
+{
+
+ if ( !is_array($array) ) return false;
+
+ $return_arr = [];
+ foreach ($array as $k => $v) {
+ if ( is_array($v) ) {
+
+ foreach ($v as $k1 => $v1) {
+ if ( $v1 ) {
+ $return_arr[$k] = $v;
+ }
+ }
+ } elseif ( $v ) {
+ $return_arr[$k] = $v;
+ }
+ }
+
+ return $return_arr;
+}
+
+//验证数组是否为空,除了指定的key
+function CheckArrIsEmpty($arr, $except = [])
+{
+ if ( !is_array($arr) ) return false;
+ foreach ($arr as $k => $value) {
+ if ( is_array($value) ) {
+ CheckArrIsEmpty($value);
+ } elseif ( !$value && $value != 0 ) {
+ if ( !in_array($k, $except) ) {
+ throw new Exception($k . " is empty.", 40000);
+ }
+ }
+ }
+}
+
+/**
+ * 获取客户端浏览器信息
+ *
+ * @param null
+ *
+ * @return string
+ * @author huang
+ */
+function get_broswer()
+{
+ $sys = $_SERVER['HTTP_USER_AGENT']; //获取用户代理字符串
+ if ( stripos($sys, "Firefox/") > 0 ) {
+ preg_match("/Firefox\/([^;)]+)+/i", $sys, $b);
+ $exp[0] = "Firefox";
+ $exp[1] = $b[1]; //获取火狐浏览器的版本号
+ } elseif ( stripos($sys, "Maxthon") > 0 ) {
+ preg_match("/Maxthon\/([\d\.]+)/", $sys, $aoyou);
+ $exp[0] = "傲游";
+ $exp[1] = $aoyou[1];
+ } elseif ( stripos($sys, "MSIE") > 0 ) {
+ preg_match("/MSIE\s+([^;)]+)+/i", $sys, $ie);
+ $exp[0] = "IE";
+ $exp[1] = $ie[1]; //获取IE的版本号
+ } elseif ( stripos($sys, "OPR") > 0 ) {
+ preg_match("/OPR\/([\d\.]+)/", $sys, $opera);
+ $exp[0] = "Opera";
+ $exp[1] = $opera[1];
+ } elseif ( stripos($sys, "Edge") > 0 ) {
+ //win10 Edge浏览器 添加了chrome内核标记 在判断Chrome之前匹配
+ preg_match("/Edge\/([\d\.]+)/", $sys, $Edge);
+ $exp[0] = "Edge";
+ $exp[1] = $Edge[1];
+ } elseif ( stripos($sys, "Chrome") > 0 ) {
+ preg_match("/Chrome\/([\d\.]+)/", $sys, $google);
+ $exp[0] = "Chrome";
+ $exp[1] = $google[1]; //获取google chrome的版本号
+ } elseif ( stripos($sys, 'rv:') > 0 && stripos($sys, 'Gecko') > 0 ) {
+ preg_match("/rv:([\d\.]+)/", $sys, $IE);
+ $exp[0] = "IE";
+ $exp[1] = $IE[1];
+ } else {
+ $exp[0] = "未知浏览器";
+ $exp[1] = "";
+ }
+ return $exp[0] . '(' . $exp[1] . ')';
+}
+
+/**
+ * 获取客户端操作系统信息,包括win10
+ *
+ * @param null
+ *
+ * @return string
+ * @author huang
+ */
+function get_os()
+{
+
+ $agent = $_SERVER['HTTP_USER_AGENT'];
+ $os = false;
+
+ if ( preg_match('/win/i', $agent) && strpos($agent, '95') ) {
+ $os = 'Windows 95';
+ } elseif ( preg_match('/win 9x/i', $agent) && strpos($agent, '4.90') ) {
+ $os = 'Windows ME';
+ } elseif ( preg_match('/win/i', $agent) && preg_match('/98/i', $agent) ) {
+ $os = 'Windows 98';
+ } elseif ( preg_match('/win/i', $agent) && preg_match('/nt 6.0/i', $agent) ) {
+ $os = 'Windows Vista';
+ } elseif ( preg_match('/win/i', $agent) && preg_match('/nt 6.1/i', $agent) ) {
+ $os = 'Windows 7';
+ } elseif ( preg_match('/win/i', $agent) && preg_match('/nt 6.2/i', $agent) ) {
+ $os = 'Windows 8';
+ } elseif ( preg_match('/win/i', $agent) && preg_match('/nt 10.0/i', $agent) ) {
+ $os = 'Windows 10';#添加win10判断
+ } elseif ( preg_match('/win/i', $agent) && preg_match('/nt 5.1/i', $agent) ) {
+ $os = 'Windows XP';
+ } elseif ( preg_match('/win/i', $agent) && preg_match('/nt 5/i', $agent) ) {
+ $os = 'Windows 2000';
+ } elseif ( preg_match('/win/i', $agent) && preg_match('/nt/i', $agent) ) {
+ $os = 'Windows NT';
+ } elseif ( preg_match('/win/i', $agent) && preg_match('/32/i', $agent) ) {
+ $os = 'Windows 32';
+ } elseif ( preg_match('/linux/i', $agent) ) {
+ $os = 'Linux';
+ } elseif ( preg_match('/unix/i', $agent) ) {
+ $os = 'Unix';
+ } elseif ( preg_match('/sun/i', $agent) && preg_match('/os/i', $agent) ) {
+ $os = 'SunOS';
+ } elseif ( preg_match('/ibm/i', $agent) && preg_match('/os/i', $agent) ) {
+ $os = 'IBM OS/2';
+ } elseif ( preg_match('/Mac/i', $agent) && preg_match('/PC/i', $agent) ) {
+ $os = 'Macintosh';
+ } elseif ( preg_match('/PowerPC/i', $agent) ) {
+ $os = 'PowerPC';
+ } elseif ( preg_match('/AIX/i', $agent) ) {
+ $os = 'AIX';
+ } elseif ( preg_match('/HPUX/i', $agent) ) {
+ $os = 'HPUX';
+ } elseif ( preg_match('/NetBSD/i', $agent) ) {
+ $os = 'NetBSD';
+ } elseif ( preg_match('/BSD/i', $agent) ) {
+ $os = 'BSD';
+ } elseif ( preg_match('/OSF1/i', $agent) ) {
+ $os = 'OSF1';
+ } elseif ( preg_match('/IRIX/i', $agent) ) {
+ $os = 'IRIX';
+ } elseif ( preg_match('/FreeBSD/i', $agent) ) {
+ $os = 'FreeBSD';
+ } elseif ( preg_match('/teleport/i', $agent) ) {
+ $os = 'teleport';
+ } elseif ( preg_match('/flashget/i', $agent) ) {
+ $os = 'flashget';
+ } elseif ( preg_match('/webzip/i', $agent) ) {
+ $os = 'webzip';
+ } elseif ( preg_match('/offline/i', $agent) ) {
+ $os = 'offline';
+ } else {
+ $os = '未知操作系统';
+ }
+ return $os;
+}
+
+//生成树形结构数据
+
+function listToTree($list, $pk = 'id', $pid = 'pid', $child = '_child', $root = 0)
+{
+ $tree = [];
+ if ( is_array($list) ) {
+ $refer = [];
+ foreach ($list as $key => $data) {
+ $refer[$data[$pk]] = &$list[$key];
+ }
+
+ foreach ($list as $key => $data) {
+ // 判断是否存在parent
+ $parentId = $data[$pid];
+
+ if ( $root == $parentId ) {
+ $tree[$data[$pk]] = &$list[$key];
+ } else {
+ if ( isset($refer[$parentId]) ) {
+ $parent = &$refer[$parentId];
+ $parent[$child][$data[$pk]] = &$list[$key];
+ }
+ }
+ }
+ }
+
+ return $tree;
+}
+
+//获取本地翻译语言
+function getTranslateByKey($key)
+{
+ //echo (__("admin.zh.index_allow_curl"));
+ echo __(session("admin_current_language")["shortcode"] . "." . $key);
+}
+
+function getHomeByKey($key)
+{
+ echo __(session("home_current_language")["shortcode"] . "." . $key);
+}
+
+//获取上一页的URL
+function getPreUrl()
+{
+ return url()->previous();
+}
+
+function excelTime($date, $time = false)
+{
+ if ( function_exists('GregorianToJD') ) {
+ if ( is_numeric($date) ) {
+ $jd = GregorianToJD(1, 1, 1970);
+ $gregorian = JDToGregorian($jd + intval($date) - 25569);
+ $date = explode('/', $gregorian);
+ $date_str = str_pad($date [2], 4, '0', STR_PAD_LEFT) . "-" . str_pad($date [0], 2, '0', STR_PAD_LEFT) . "-" . str_pad($date [1], 2, '0', STR_PAD_LEFT) . ($time ? " 00:00:00" : '');
+ return $date_str;
+ }
+ } else {
+ $date = $date > 25568 ? $date + 1 : 25569;
+ /*There was a bug if Converting date before 1-1-1970 (tstamp 0)*/
+ $ofs = (70 * 365 + 17 + 2) * 86400;
+ $date = date("Y-m-d", ($date * 86400) - $ofs) . ($time ? " 00:00:00" : '');
+ }
+ return $date;
+}
+
+//判断是否是微信浏览器
+function is_weixin()
+{
+
+ if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) {
+ return true;
+ }
+ return false;
+}
+
+//是否为手机号码
+if ( !function_exists('is_mobile') ) {
+ function is_mobile(string $text)
+ {
+ $search = '/^0?1[3|4|5|6|7|8][0-9]\d{8}$/';
+ if ( preg_match($search, $text) ) return true; else return false;
+ }
+}
+
+//手机号码 中间4位加密
+if ( !function_exists('get_encryption_mobile') ) {
+ function get_encryption_mobile($tel)
+ {
+ $new_tel = preg_replace('/(\d{3})\d{4}(\d{4})/', '$1****$2', $tel);
+ return $new_tel;
+ }
+}
+
+//API统一的数据返回格式
+if ( !function_exists('return_api_format') ) {
+ function return_api_format($return = [])
+ {
+ $return['data'] = !isset($return['data']) ? [] : $return['data'];
+ $return['msg'] = !isset($return['msg']) ? '获取成功' : $return['msg'];
+ $return['status'] = !isset($return['status']) ? (empty($return['data']) ? 40000 : 200) : $return['status'];
+ return response()->json($return);
+ }
+}
+
+if ( !function_exists('del_dir_files') ) {
+ /**
+ * 删除文件夹与下方的所有文件
+ *
+ * @param $dirName 文件夹名称
+ * @param int $delete_dir 是否删除文件夹【1.删除;0.不删除】
+ */
+ function del_dir_files($dirName, $delete_dir = 1)
+ {
+ if ( $handle = @opendir($dirName) ) {
+ while ( false !== ($item = @readdir($handle)) ) {
+ if ( $item != '.' && $item != '..' ) {
+ if ( is_dir($dirName . '/' . $item) ) del_dir_files($dirName . '/' . $item); else @unlink($dirName . '/' . $item);
+ }
+ }
+ @closedir($handle);
+ }
+ if ( $delete_dir == 1 ) @rmdir($dirName);
+ }
+}
+
+if ( !function_exists('get_file_filtering') ) {
+ /**
+ * 获取指定格式的文件
+ *
+ * @param array $array
+ * @param array $format
+ *
+ * @return array
+ */
+ function get_file_filtering($array = [], $format = [])
+ {
+ $return = [];
+ if ( empty($array) || empty($format) ) return $return;
+ foreach ($array as $key => $value) {
+ $arr = pathinfo($value);
+ if ( !empty($arr['extension']) && in_array($arr['extension'], $format) ) $return[] = $value;
+ }
+ return $return;
+ }
+}
+
+if ( !function_exists('write_lock_file') ) {
+ /**
+ * 写入锁文件
+ *
+ * @param $path
+ */
+ function write_lock_file($path, $content = '')
+ {
+ $lock_file = fopen($path . '/lock', 'w+');//创建 锁文件
+ fwrite($lock_file, empty($content) ? date('Y-m-d H:i:s') : $content);//写入
+ }
+}
+
+if ( !function_exists('del_dir_files') ) {
+ /**
+ * 删除文件夹与下方的所有文件
+ *
+ * @param $dirName 文件夹名称
+ * @param int $delete_dir 是否删除文件夹【1.删除;0.不删除】
+ */
+ function del_dir_files($dirName, $delete_dir = 1)
+ {
+ if ( $handle = @opendir($dirName) ) {
+ while ( false !== ($item = @readdir($handle)) ) {
+ if ( $item != '.' && $item != '..' ) {
+ if ( is_dir($dirName . '/' . $item) ) del_dir_files($dirName . '/' . $item); else @unlink($dirName . '/' . $item);
+ }
+ }
+ @closedir($handle);
+ }
+ if ( $delete_dir == 1 ) @rmdir($dirName);
+ }
+}
+
+if ( !function_exists('get_client_info') ) {
+ /**
+ * 获取IP与浏览器信息、语言
+ */
+ function get_client_info() : array
+ {
+ if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) ) {
+ $XFF = $_SERVER['HTTP_X_FORWARDED_FOR'];
+ $client_pos = strpos($XFF, ', ');
+ $client_ip = false !== $client_pos ? substr($XFF, 0, $client_pos) : $XFF;
+ unset($XFF, $client_pos);
+ } else $client_ip = $_SERVER['HTTP_CLIENT_IP'] ?? $_SERVER['REMOTE_ADDR'] ?? $_SERVER['LOCAL_ADDR'] ?? '0.0.0.0';
+ $client_lang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 5) : '';
+ $client_agent = $_SERVER['HTTP_USER_AGENT'] ?? '';
+ return [
+ 'ip' => &$client_ip,
+ 'lang' => &$client_lang,
+ 'agent' => &$client_agent,
+ ];
+ }
+}
+
+if ( !function_exists('get_ip') ) {
+ function get_ip() : string
+ {
+ $data = get_client_info();
+ return empty($data['ip']) ? '' : $data['ip'];
+ }
+}
+
+if ( !function_exists('get_month_days') ) {
+ /**
+ * 获取某月份的所有日期列表
+ *
+ * @param string $time
+ * @param string $format
+ *
+ * @return array
+ */
+ function get_month_days($time = '', $format = 'Y-m-d')
+ {
+ $time = $time != '' ? $time : time();
+ //获取当前周几
+ $week = date('d', $time);
+ $date = [];
+ for ($i = 1; $i <= date('t', $time); $i++) {
+ $date[$i] = date($format, strtotime('+' . $i - $week . ' days', $time));
+ }
+ return $date;
+ }
+}
+
+if ( !function_exists('get_month_range') ) {
+ /**
+ * 指定日期范围之内的所有月份
+ *
+ * @param string $start_date 开始日期
+ * @param string $end_date 结束日期
+ * @param string $format 返回格式
+ *
+ * @return array
+ */
+ function get_month_range(string $start_date, string $end_date, string $format = 'Y-m')
+ {
+ $end = date($format, strtotime($end_date)); // 转换为月
+ $range = [];
+ $i = 0;
+ do {
+ $month = date($format, strtotime($start_date . ' + ' . $i . ' month'));
+ $range[] = $month;
+ $i++;
+ } while ( $month < $end );
+ return $range;
+ }
+}
+
+if ( !function_exists('get_days_range') ) {
+ /**
+ * 指定日期范围之内的所有天
+ *
+ * @param string $start_date 开始日期
+ * @param string $end_date 结束日期
+ * @param string $format 返回格式
+ *
+ * @return array
+ */
+ function get_days_range(string $start_date, string $end_date, string $format = 'Y-m-d')
+ {
+ $end = date($format, strtotime($end_date)); // 转换为月
+ $range = [];
+ $i = 0;
+ do {
+ $day = date($format, strtotime($start_date . ' + ' . $i . ' day'));
+ $range[] = $day;
+ $i++;
+ } while ( $day < $end );
+ return $range;
+ }
+}
+
+if ( !function_exists('get_years_range') ) {
+ /**
+ * 指定日期范围之内的所有年份
+ *
+ * @param string $start_date 开始日期
+ * @param string $end_date 结束日期
+ * @param string $format 返回格式
+ *
+ * @return array
+ */
+ function get_years_range(string $start_date, string $end_date, string $format = 'Y')
+ {
+ $start_date = date('Y-m-d', strtotime($start_date . '-01-01'));
+ $end = date($format, strtotime($end_date)); // 转换为年
+ $range = [];
+ $i = 0;
+ do {
+ $year = date($format, strtotime($start_date . ' + ' . $i . ' year'));
+ $range[] = $year;
+ $i++;
+ } while ( $year < $end );
+ return $range;
+ }
+}
+
+if ( !function_exists('set_month_format') ) {
+ /**
+ * 设置 月份 的格式统一
+ *
+ * @param $month
+ *
+ * @return string
+ */
+ function set_month_format($month)
+ {
+ return (string)(strlen($month) == 1 ? '0' . $month : $month);
+ }
+}
+
+if ( !function_exists('get_mail_template_message') ) {
+ /**
+ * 获取模板消息内容
+ *
+ * @param $content
+ * @param string $change 也可以是数组
+ * @param string $code 对应数组
+ *
+ * @return mixed
+ */
+ function get_mail_template_message($content, $change = '', $code = '{$code}')
+ {
+ return str_replace($code, $change, $content);
+ }
+}
+
+/**
+ * 获取当前host域名
+ *
+ * @return string
+ */
+function get_host()
+{
+ if ( isset($_SERVER['HTTP_HOST']) ) {
+ $scheme = empty($_SERVER['HTTPS']) ? 'http://' : 'https://';
+ $SCRIPT_NAME = $_SERVER['SCRIPT_NAME'];
+ $arr = explode('/', $SCRIPT_NAME);
+ $url = $scheme . $_SERVER['HTTP_HOST'] . substr($SCRIPT_NAME, 0, -strlen($arr[count($arr) - 2])) . '/';
+ return $url;
+ //$scheme = empty($_SERVER['HTTPS']) ? 'http://' : 'https://';
+ //$SCRIPT_NAME = rtrim($_SERVER['REQUEST_URI'], '/');
+ //$arr = explode('/', $SCRIPT_NAME);
+ //$url = $scheme . $_SERVER['HTTP_HOST'] . substr($SCRIPT_NAME, 0, -strlen($arr[count($arr) - 2]));
+ //return $url;
+ } else {
+ if ( empty($baseUrl) ) {
+ $request = \think\facade\Request::instance();
+ $subDir = str_replace('\\', '/', dirname($request->server('PHP_SELF')));
+ $baseUrl = $request->scheme() . '://' . $request->host() . $subDir . ($subDir === '/' ? '' : '/');
+ }
+
+ return trim($baseUrl, '/');
+ }
+}
+
+/**
+ * [is_email]
+ *
+ * @param string $email [description]
+ *
+ * @return boolean [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:检测邮箱格式
+ * @englishAnnotation:
+ * @version :1.0
+ */
+function is_email(string $email) : bool
+{
+ // '/^[a-z0-9]+([._-][a-z0-9]+)*@([0-9a-z]+\.[a-z]{2,14}(\.[a-z]{2})?)$/i';
+ $checkmail = "/\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/";//定义正则表达式
+ if ( preg_match($checkmail, $email) ) return true; else return false;
+}
+
+/**
+ * [is_mobile]
+ *
+ * @param [type] $text [description]
+ *
+ * @return bool|boolean [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :检测手机号格式是否正确
+ * @englishAnnotation :
+ * @version :1.0
+ */
+function is_mobile(string $text) : bool
+{
+ $search = '/^0?1[3|4|5|6|7|8][0-9]\d{8}$/';
+ if ( preg_match($search, $text) ) return true; else return false;
+}
+
+/**
+ * [check_url]
+ *
+ * @param string $_url [description]
+ *
+ * @return bool
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:检测URL地址格式
+ * @englishAnnotation:
+ * @version :1.0
+ */
+function check_url(string $_url) : bool
+{
+ $str = "/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/";
+ if ( !preg_match($str, $_url) ) return false; else return true;
+}
+
+/**
+ * [roundDownDecimal]
+ *
+ * @param float|integer $money_num [description]
+ * @param int|integer $length [description]
+ *
+ * @return float
+ * @version :1.0
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:保留几位小数,向下取,就是直接截断 3 为小数即可。
+ * @englishAnnotation:
+ */
+function roundDownDecimal(float $money_num = 0, int $length = 2) : float
+{
+ return substr($money_num, 0, strlen($money_num) - _getFloatLength($money_num) + $length);
+}
+
+if ( !function_exists('writeLog') ) {
+ function writeLog($msg, $file_name, $path = __DIR__)
+ {
+ /**
+ * 第一部分路径
+ */
+ $dirPath = $path . '/logs';
+ if ( !is_dir($dirPath) ) @mkdir($dirPath);
+ $dirPath .= '/' . date('Y');
+ if ( !is_dir($dirPath) ) @mkdir($dirPath);
+ $dirPath .= '/' . date('n');
+ if ( !is_dir($dirPath) ) @mkdir($dirPath);
+ /**
+ * 第二部分
+ */
+ file_put_contents($dirPath . '/' . (empty($file_name) ? date('j') : $file_name) . '.txt', "\n\n" . date('Y-m-d H:i:s') . "\n", FILE_APPEND);
+ file_put_contents($dirPath . '/' . (empty($file_name) ? date('j') : $file_name) . '.txt', print_r($msg, true), FILE_APPEND);
+ }
+}
+
+/**
+ * 通过省市区的名称获取对应的经纬度
+ *
+ * @param string $area_name
+ *
+ * @return string
+ */
+function getNameAcquisitionLongitudeAndLatitude($area_name = '')
+{
+ if ( empty($area_name) ) return '';
+ $res = request_function('https://restapi.amap.com/v3/geocode/geo', [
+ 'address' => $area_name,
+ 'key' => MyC('common_lbsamap_apikey'),
+ 'output' => 'JSON',
+ ], false);
+ if ( $res['status'] == 1 ) return empty($res['geocodes']) ? '' : $res['geocodes'][0]['location'];
+ return '';
+}
+
+/**
+ * 倒计时 转化成 天-时分秒 展示
+ *
+ * @param $time
+ *
+ * @return string
+ */
+function countdownConversionTime($time)
+{
+ if ( empty($time) ) return '';
+ $day = intval($time / (60 * 60 * 24));
+ $hour = intval($time / (60 * 60) - $day * 24);
+ $minute = intval($time / 60 - $day * 24 * 60 - $hour * 60);
+ $second = intval($time - $day * 24 * 60 * 60 - $hour * 60 * 60 - $minute * 60);
+
+ $day = (intval($day) <= 0) ? '' : $day . '天 ';
+ if ( intval($hour) <= 9 ) $hour = '0' . $hour;
+ if ( intval($minute) <= 9 ) $minute = '0' . $minute;
+ if ( intval($second) <= 9 ) $second = '0' . $second;
+ return $day . $hour . ':' . $minute . ':' . $second . '';
+}
+
+if ( !function_exists('returnLastPage') ) {
+ function returnLastPage()
+ {
+ echo '';
+ }
+}
+
+if ( !function_exists('array_key_first') ) {
+ /**
+ * Gets the first key of an array
+ *
+ * @param array $array
+ *
+ * @return mixed
+ */
+ function array_key_first(array $array)
+ {
+ if ( count($array) ) {
+ reset($array);
+ return key($array);
+ }
+ return null;
+ }
+}
+
+function hidden_mobile(string $text) : string
+{
+ $start = substr($text, 0, 3);
+ $end = substr($text, -4, 4);
+ return $start . ' **** ' . $end;
+}
+
+function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true)
+{
+ if ( function_exists("mb_substr") ) {
+ if ( $suffix ) return mb_substr($str, $start, $length, $charset) . "..."; else
+ return mb_substr($str, $start, $length, $charset);
+ } elseif ( function_exists('iconv_substr') ) {
+ if ( $suffix ) return iconv_substr($str, $start, $length, $charset) . "..."; else
+ return iconv_substr($str, $start, $length, $charset);
+ }
+ $re['utf-8'] = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef]
+[x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";
+ $re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";
+ $re['gbk'] = "/[x01-x7f]|[x81-xfe][x40-xfe]/";
+ $re['big5'] = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";
+ preg_match_all($re[$charset], $str, $match);
+ $slice = join("", array_slice($match[0], $start, $length));
+ if ( $suffix ) return $slice . "…";
+ return $slice;
+}
+
+// function hidden_bank(string $text, $start = 1): string
+// {
+// $start = substr($text, 0, 6);
+// $end = substr($text, -4, 4);
+// return $start . ($start == 1 ? ' ' : '') . '········' . ($start == 1 ? ' ' : '') . $end;
+// return $start . ($start == 1 ? ' ' : '') . '**** ****' . ($start == 1 ? ' ' : '') . $end;
+// }
+
+function hidden_bank(string $text) : string
+{
+ $start = substr($text, 0, 4);
+ $end = substr($text, -4, 4);
+ return $start . ' **** **** ' . $end;
+}
+
+function get_month_first_day()
+{
+ return date('Y-m-01', strtotime(date("Y-m-d", time())));
+}
+
+function get_month_last_day()
+{
+ $date = date('Y-m-01', strtotime(date("Y-m-d", time())));
+ return date('Y-m-d', strtotime("$date +1 month -1 day"));
+}
+
+/**
+ * [Xml_Array xml转数组]
+ *
+ * @param [xml] $xmlstring [xml数据]
+ *
+ * @return [array] [array数组]
+ */
+function Xml_Array($xmlstring)
+{
+ return json_decode(json_encode((array)simplexml_load_string($xmlstring)), true);
+}
+
+/**
+ * [IsMobile 是否是手机访问]
+ *
+ * @return [boolean] [手机访问true, 则false]
+ */
+function IsMobile()
+{
+ /* 如果有HTTP_X_WAP_PROFILE则一定是移动设备 */
+ if ( isset($_SERVER['HTTP_X_WAP_PROFILE']) ) return true;
+
+ /* 此条摘自TPM智能切换模板引擎,适合TPM开发 */
+ if ( isset($_SERVER['HTTP_CLIENT']) && 'PhoneClient' == $_SERVER['HTTP_CLIENT'] ) return true;
+
+ /* 如果via信息含有wap则一定是移动设备,部分服务商会屏蔽该信息 */
+ if ( isset($_SERVER['HTTP_VIA']) && stristr($_SERVER['HTTP_VIA'], 'wap') !== false ) return true;
+
+ /* 判断手机发送的客户端标志,兼容性有待提高 */
+ if ( isset($_SERVER['HTTP_USER_AGENT']) ) {
+ $clientkeywords = [
+ 'nokia',
+ 'sony',
+ 'ericsson',
+ 'mot',
+ 'samsung',
+ 'htc',
+ 'sgh',
+ 'lg',
+ 'sharp',
+ 'sie-',
+ 'philips',
+ 'panasonic',
+ 'alcatel',
+ 'lenovo',
+ 'iphone',
+ 'ipad',
+ 'ipod',
+ 'blackberry',
+ 'meizu',
+ 'android',
+ 'netfront',
+ 'symbian',
+ 'ucweb',
+ 'windowsce',
+ 'palm',
+ 'operamini',
+ 'operamobi',
+ 'openwave',
+ 'nexusone',
+ 'cldc',
+ 'midp',
+ 'wap',
+ 'mobile',
+ ];
+ /* 从HTTP_USER_AGENT中查找手机浏览器的关键字 */
+ if ( preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower($_SERVER['HTTP_USER_AGENT'])) ) {
+ return true;
+ }
+ }
+
+ /* 协议法,因为有可能不准确,放到最后判断 */
+ if ( isset($_SERVER['HTTP_ACCEPT']) ) {
+ /* 如果只支持wml并且不支持html那一定是移动设备 */
+ /* 如果支持wml和html但是wml在html之前则是移动设备 */
+ if ( (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))) ) return true;
+ }
+ return false;
+}
+
+/**
+ * [EmptyDir 清空目录下所有文件]
+ *
+ * @param [string] $dir_path [目录地址]
+ *
+ * @return [boolean] [成功true, 失败false]
+ */
+function EmptyDir($dir_path)
+{
+ if ( is_dir($dir_path) ) {
+ $dn = @opendir($dir_path);
+ if ( $dn !== false ) {
+ while ( false !== ($file = readdir($dn)) ) {
+ if ( $file != '.' && $file != '..' ) {
+ if ( !unlink($dir_path . $file) ) {
+ return false;
+ }
+ }
+ }
+ } else {
+ return false;
+ }
+ }
+ return true;
+}
+
+/**
+ * [FileSizeByteToUnit 文件大小转常用单位]
+ *
+ * @param [int] $bit [字节数]
+ *
+ * @return string
+ */
+function FileSizeByteToUnit($bit) : string
+{
+ //单位每增大1024,则单位数组向后移动一位表示相应的单位
+ $type = [
+ 'Bytes',
+ 'KB',
+ 'MB',
+ 'GB',
+ 'TB',
+ ];
+ for ($i = 0; $bit >= 1024; $i++) {
+ $bit /= 1024;
+ }
+
+ //floor是取整函数,为了防止出现一串的小数,这里取了两位小数
+ return (floor($bit * 100) / 100) . $type[$i];
+}
+
+/**
+ * json带格式输出
+ *
+ * @param [array] $data [数据]
+ * @param [string] $indent [缩进字符,默认4个空格 ]
+ *
+ * @return string
+ */
+function JsonFormat($data, $indent = null) : string
+{
+ // json encode
+ $data = json_encode($data, JSON_UNESCAPED_UNICODE);
+
+ // 缩进处理
+ $ret = '';
+ $pos = 0;
+ $length = strlen($data);
+ $indent = isset($indent) ? $indent : ' ';
+ $newline = "\n";
+ $prevchar = '';
+ $outofquotes = true;
+
+ for ($i = 0; $i <= $length; $i++) {
+ $char = substr($data, $i, 1);
+
+ if ( $char == '"' && $prevchar != '\\' ) {
+ $outofquotes = !$outofquotes;
+ } elseif ( ($char == '}' || $char == ']') && $outofquotes ) {
+ $ret .= $newline;
+ $pos--;
+ for ($j = 0; $j < $pos; $j++) {
+ $ret .= $indent;
+ }
+ }
+
+ $ret .= $char;
+
+ if ( ($char == ',' || $char == '{' || $char == '[') && $outofquotes ) {
+ $ret .= $newline;
+ if ( $char == '{' || $char == '[' ) {
+ $pos++;
+ }
+
+ for ($j = 0; $j < $pos; $j++) {
+ $ret .= $indent;
+ }
+ }
+
+ $prevchar = $char;
+ }
+
+ return $ret;
+}
+
+/**
+ * 根据身份证号码得到年龄
+ *
+ * @param $id
+ *
+ * @return float|int|string
+ */
+function getAgeByID(string $id)
+{ //过了这年的生日才算多了1周岁
+
+ if ( empty($id) ) return '';
+
+ $date = strtotime(substr($id, 6, 8)); //获得出生年月日的时间戳
+
+ $today = strtotime('today'); //获得今日的时间戳
+
+ $diff = floor(($today - $date) / 86400 / 365); //得到两个日期相差的大体年数
+
+ //strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比
+
+ $age = strtotime(substr($id, 6, 8) . '+' . $diff . 'years') > $today ? ($diff + 1) : $diff;
+
+ return $age;
+}
+
+/**
+ * [api_url]
+ *
+ * @return [string] [URL]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :API请求地址
+ * @englishAnnotation :API request URL address
+ */
+function web_url()
+{
+ return http_type() . $_SERVER['HTTP_HOST'];
+}
+
+/**
+ * [http_type]
+ *
+ * @return [string] [description]
+ * @author :cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation :获取http类型:http\https
+ * @englishAnnotation :Get the HTTP type: http\https
+ */
+function http_type() : string
+{
+ return $http_type = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')) ? 'https://' : 'http://';
+}
+
+/**
+ * 格式化字节大小
+ *
+ * @param number $size 字节数
+ * @param string $delimiter 数字和单位分隔符
+ *
+ * @return string 格式化后的带单位的大小
+ */
+function format_bytes($size, $delimiter = '')
+{
+ $units = [
+ 'B',
+ 'KB',
+ 'MB',
+ 'GB',
+ 'TB',
+ 'PB',
+ ];
+ for ($i = 0; $size >= 1024 && $i < 5; $i++) {
+ $size /= 1024;
+ }
+ return $size . $delimiter . $units[$i];
+}
+
+/**
+ * CURL发送Request请求,含POST和REQUEST
+ *
+ * @param string $url 请求的链接
+ * @param mixed $params 传递的参数
+ * @param string $method 请求的方法
+ * @param mixed $options CURL的参数
+ *
+ * @return array
+ */
+function send_request($url, $params = [], $method = 'POST', $type = 'json', $options = [])
+{
+ if ( empty($options) ) {
+ $options = [
+ CURLOPT_CONNECTTIMEOUT => 30,
+ CURLOPT_TIMEOUT => 30,
+ CURLOPT_SSL_VERIFYPEER => false,
+ CURLOPT_HTTPHEADER => ['X-REQUESTED-WITH: XMLHttpRequest'],
+ ];
+ }
+
+ $params = array_merge([
+ 'origin_host' => get_host(),
+ 'origin_url' => $_SERVER['REQUEST_URI'],
+ 'origin_ip' => get_ip(),
+ ], $params);
+ $method = strtoupper($method);
+ $protocol = substr($url, 0, 5);
+ if ( $type == 'json' && is_array($params) ) {
+ $params = json_encode($params, JSON_UNESCAPED_UNICODE);
+ }
+ $query_string = is_array($params) ? http_build_query($params) : $params;
+
+ $ch = curl_init();
+ $defaults = [];
+ if ( 'GET' == $method ) {
+ $geturl = $query_string ? $url . (stripos($url, '?') !== false ? '&' : '?') . $query_string : $url;
+ $defaults[CURLOPT_URL] = $geturl;
+ } else {
+ $defaults[CURLOPT_URL] = $url;
+ if ( $method == 'POST' ) {
+ $defaults[CURLOPT_POST] = 1;
+ } else {
+ $defaults[CURLOPT_CUSTOMREQUEST] = $method;
+ }
+ $defaults[CURLOPT_POSTFIELDS] = $query_string;
+ }
+
+ $defaults[CURLOPT_HEADER] = false;
+ $defaults[CURLOPT_USERAGENT] = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.98 Safari/537.36';
+ $defaults[CURLOPT_FOLLOWLOCATION] = true;
+ $defaults[CURLOPT_RETURNTRANSFER] = true;
+ $defaults[CURLOPT_CONNECTTIMEOUT] = 3;
+ $defaults[CURLOPT_TIMEOUT] = 3;
+
+ // disable 100-continue
+ curl_setopt($ch, CURLOPT_HTTPHEADER, ['Expect:']);
+
+ if ( 'https' == $protocol ) {
+ $defaults[CURLOPT_SSL_VERIFYPEER] = false;
+ $defaults[CURLOPT_SSL_VERIFYHOST] = false;
+ }
+
+ curl_setopt_array($ch, (array)$options + $defaults);
+
+ $ret = curl_exec($ch);
+ $err = curl_error($ch);
+
+ if ( false === $ret || !empty($err) ) {
+ $errno = curl_errno($ch);
+ $info = curl_getinfo($ch);
+ curl_close($ch);
+ return [
+ 'ret' => false,
+ 'errno' => $errno,
+ 'msg' => $err,
+ 'info' => $info,
+ ];
+ }
+ curl_close($ch);
+
+ return json_decode($ret, true);
+}
+
+//随机验证码
+if ( !function_exists('random_verification_code') ) {
+ function random_verification_code($length = 6)
+ {
+ $code = '';
+ for ($i = 0; $i < $length; $i++) $code .= mt_rand(0, 9);
+ return $code;
+ }
+}
+
+if ( !function_exists('get_dir_files') ) {
+
+ //获取某目录下所有子文件和子目录,可以过滤
+ function get_dir_files($path, $filter = [], $onlydir = false)
+ {
+ if ( !is_dir($path) ) {
+ return false;
+ }
+ //scandir方法
+ $arr = [];
+ $data = scandir($path);
+ foreach ($data as $value) {
+ if ( $value != '.' && $value != '..' && $value != ".DS_Store" && !in_array($value, $filter) ) {
+ if ( $onlydir ) {
+ if ( is_dir($path . "/" . $value) ) {
+ $arr[] = $value;
+ } else {
+ continue;
+ }
+ } else {
+ $arr[] = $value;
+ }
+ }
+ }
+ return $arr;
+ }
+
+ // 列出指定目录下所有目录和文件
+ function get_dir_files1($dir)
+ {
+ $arr = [];
+ if ( is_dir($dir) ) {//如果是目录,则进行下一步操作
+ $d = opendir($dir);//打开目录
+ if ( $d ) {//目录打开正常
+ while ( ($file = readdir($d)) !== false ) {//循环读出目录下的文件,直到读不到为止
+ if ( $file != '.' && $file != '..' ) {//排除一个点和两个点
+ if ( is_dir($file) ) {//如果当前是目录
+ $arr[$file] = get_dir_files($file);//进一步获取该目录里的文件
+ } else {
+ $arr[] = $file;//记录文件名
+ }
+ }
+ }
+ }
+ closedir($d);//关闭句柄
+ }
+ return $arr;
+ }
+}
+
+if ( !function_exists('write_lock_file') ) {
+ /**
+ * 写入锁文件
+ *
+ * @param $path
+ * @param string $content
+ */
+ function write_lock_file($path, $content = '')
+ {
+ $lock_file = fopen($path . '/lock', 'w+');//创建 锁文件
+ fwrite($lock_file, empty($content) ? date('Y-m-d H:i:s') : $content);//写入
+ }
+}
+
+if ( !function_exists('put_file_to_zip') ) {
+ /**
+ * 把指定文件目录下的所有文件,打包压缩至压缩包内
+ *
+ * @param string $path
+ * @param $zip
+ * @param string $old_filename
+ * @param array $limit_dir 限制压缩的文件目录
+ */
+ function put_file_to_zip(string $path, $zip, string $old_filename, $limit_dir = [])
+ {
+ header('content-type:text/html;charset=utf-8');
+ $handler = opendir($path); //打开当前文件夹由$path指定。
+ while ( ($filename = readdir($handler)) !== false ) {
+ if ( $filename != '.' && $filename != '..' ) {//文件夹文件名字为'.'和‘..’,不要对他们进行操作
+ if ( is_dir($path . '/' . $filename) ) {// 如果读取的某个对象是文件夹,则递归
+ if ( !empty($limit_dir) && !in_array($filename, $limit_dir) ) continue;
+ $old_filename = (empty($old_filename) ? '' : ($old_filename . '/'));
+ $zip->addEmptyDir($old_filename . $filename);
+ put_file_to_zip($path . '/' . $filename, $zip, $old_filename . $filename);
+ } else { //将文件加入zip对象
+ $zip->addFile($path . '/' . $filename, (empty($old_filename) ? '' : ($old_filename . '/')) . $filename);
+ }
+ }
+ }
+ @closedir($path);
+ }
+}
+
+if ( !function_exists('check_http_file_exists') ) {
+ //判断远程文件是否存在
+ function check_http_file_exists($url)
+ {
+ $curl = curl_init($url);
+ // 不取回数据
+ curl_setopt($curl, CURLOPT_NOBODY, true);
+ // 发送请求
+ $result = curl_exec($curl);
+ $found = false;
+ // 如果请求没有发送失败
+ if ( $result !== false ) {
+ $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
+ if ( $statusCode == 200 ) $found = true;
+ }
+ curl_close($curl);
+ return $found;
+ }
+}
+
+if ( !function_exists('check_dir_exits') ) {
+ /**
+ * 检测目录是否存在,不存在则创建目录
+ *
+ * @param string $dir_path
+ */
+ function check_dir_exits(string $dir_path) : void
+ {
+ if ( !is_dir($dir_path) ) @mkdir($dir_path, 0755, true);
+ }
+}
+
+function get_url() : string
+{
+ $scheme = empty($_SERVER['HTTPS']) ? 'http://' : 'https://';
+ $url = $scheme . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] . '/' . $_SERVER['REQUEST_URI'];
+ return $url;
+}
+
+//把时间戳转换为几分钟或几小时前或几天前
+function formatting_timestamp($time) : string
+{
+ $time = (int)substr($time, 0, 10);
+ $int = time() - $time;
+ $str = '';
+ if ( $int <= 30 ) {
+ $str = sprintf('刚刚', $int);
+ } elseif ( $int < 60 ) {
+ $str = sprintf('%d秒前', $int);
+ } elseif ( $int < 3600 ) {
+ $str = sprintf('%d分钟前', floor($int / 60));
+ } elseif ( $int < 86400 ) {
+ $str = sprintf('%d小时前', floor($int / 3600));
+ } elseif ( $int < 2592000 ) {
+ $str = sprintf('%d天前', floor($int / 86400));
+ } elseif ( date('Y', $time) == date('Y') ) {
+ $str = date('m-d H:i:s', $time);
+ } else {
+ $str = date('Y-m-d H:i:s', $time);
+ }
+ return $str;
+}
+
+// 统计字数
+function comment_count_word($str)
+{
+ //$str =characet($str);
+ //判断是否存在替换字符
+ $is_tihuan_count = substr_count($str, "龘");
+ try {
+ //先将回车换行符做特殊处理
+ $str = preg_replace('/(\r\n+|\s+| +)/', "龘", $str);
+ //处理英文字符数字,连续字母、数字、英文符号视为一个单词
+ $str = preg_replace('/[a-z_A-Z0-9-\.!@#\$%\\\^&\*\)\(\+=\{\}\[\]\/",\'<>~`\?:;|]/', "m", $str);
+ //合并字符m,连续字母、数字、英文符号视为一个单词
+ $str = preg_replace('/m+/', "*", $str);
+ //去掉回车换行符
+ $str = preg_replace('/龘+/', "", $str);
+ //返回字数
+ return mb_strlen($str) + $is_tihuan_count;
+ } catch (Exception $e) {
+ return 0;
+ }
+}
+
+// 二分查找法
+function Binary_Search()
+{
+ //function binary_search($nums, $num)
+ //{
+ // return binary_search_internal($nums, $num, 0, count($nums) - 1);
+ //}
+ //
+ //function binary_search_internal($nums, $num, $low, $high)
+ //{
+ // if ($low > $high) {
+ // return -1;
+ // }
+ //
+ // $mid = floor(($low + $high) / 2);
+ // if ($num > $nums[$mid]) {
+ // return binary_search_internal($nums, $num, $mid + 1, $high);
+ // } elseif ($num < $nums[$mid]) {
+ // return binary_search_internal($nums, $num, $low, $mid - 1);
+ // } else {
+ // return $mid;
+ // }
+ //}
+ //
+ //$nums = [1, 2, 3, 4, 5, 6];
+ //$index = binary_search($nums, 5);
+ //print $index;
+}
+
+function exist_http($str) : bool
+{
+ return preg_match('/(http:\/\/)|(https:\/\/)/i', $str);
+}
+
+/**
+ * 生成订单号
+ *
+ * @return string
+ */
+function order_no()
+{
+ return date('Ymd') . substr(implode(null, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
+}
diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php
new file mode 100644
index 0000000000000000000000000000000000000000..a0a2a8a34a6221e4dceb24a759ed14e911f74c57
--- /dev/null
+++ b/app/Http/Controllers/Controller.php
@@ -0,0 +1,13 @@
+ [
+ \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:api',
+ \Illuminate\Routing\Middleware\SubstituteBindings::class,
+ ],
+ ];
+
+ /**
+ * The application's route middleware.
+ *
+ * These middleware may be assigned to groups or used individually.
+ *
+ * @var array
+ */
+ protected $routeMiddleware = [
+ 'auth' => \App\Http\Middleware\Authenticate::class,
+ 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
+ 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
+ 'can' => \Illuminate\Auth\Middleware\Authorize::class,
+ 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+ 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
+ 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
+ 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
+ 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
+ ];
+}
diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php
new file mode 100644
index 0000000000000000000000000000000000000000..704089a7fe757c137d99241b758c912d8391e19d
--- /dev/null
+++ b/app/Http/Middleware/Authenticate.php
@@ -0,0 +1,21 @@
+expectsJson()) {
+ return route('login');
+ }
+ }
+}
diff --git a/app/Http/Middleware/ConvertEmptyStringsToNull.php b/app/Http/Middleware/ConvertEmptyStringsToNull.php
new file mode 100644
index 0000000000000000000000000000000000000000..386c627cefbe52a9b0b37813c14ce682d7f2b59a
--- /dev/null
+++ b/app/Http/Middleware/ConvertEmptyStringsToNull.php
@@ -0,0 +1,32 @@
+getMethod());
+ if (
+ $method == 'POST'
+ ||
+ $method == 'PUT'
+ ){
+ // 希望在POST、PUT时,新增与更新数据时,移除[空字符串自动转换为null的中间件]效果。
+ }else{
+ (new \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull)->handle($request, $next);
+ }
+
+ return $next($request);
+ }
+}
diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php
new file mode 100644
index 0000000000000000000000000000000000000000..033136ad128b7687558bc41b03cc92f39cf69149
--- /dev/null
+++ b/app/Http/Middleware/EncryptCookies.php
@@ -0,0 +1,17 @@
+check()) {
+ return redirect(RouteServiceProvider::HOME);
+ }
+ }
+
+ return $next($request);
+ }
+}
diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php
new file mode 100644
index 0000000000000000000000000000000000000000..5a50e7b5c8bd8a5c853ee7edb8170508f2ff4f86
--- /dev/null
+++ b/app/Http/Middleware/TrimStrings.php
@@ -0,0 +1,18 @@
+allSubdomainsOfApplicationUrl(),
+ ];
+ }
+}
diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php
new file mode 100644
index 0000000000000000000000000000000000000000..14befceb006114d1b6bb607bd0cfcf489dd50f42
--- /dev/null
+++ b/app/Http/Middleware/TrustProxies.php
@@ -0,0 +1,23 @@
+setUserAgent('Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Mobile Safari/537.36 Edg/87.0.664.75');
+
+ $content = $http->fetch();
+ var_dump($content);
+ var_dump($http->getHttpCode());
+ var_dump($http->getLastError());
+ }
+
+ //Pre-defined content types
+ const CONTENT_TYPE_XML = 'application/xml; charset=UTF-8';
+ const CONTENT_TYPE_JSON = 'application/json; charset=UTF-8';
+ const CONTENT_TYPE_FORM_DATA = 'multipart/form-data';
+ const CONTENT_TYPE_URL_ENCODED = 'application/x-www-form-urlencoded';
+
+ //Job info
+ public $data = [];
+ public $file = [];
+ public $header = [];
+
+ public $url = '';
+ public $etag = '';
+ public $cookie = '';
+ public $referer = '';
+ public $modified = '';
+ public $curl_error = '';
+
+ public $proxy = '';
+ public $proxy_passwd = '';
+
+ public $max_follow = 0;
+ public $response_code = 0;
+
+ public $http_ver = 'HTTP/2'; //HTTP Version
+ public $method = 'GET'; //Request method
+ public $user_agent = 'Mozilla/5.0 (Compatible; NervSys/111)'; //User Agent string
+ public $connection = 'keep-alive'; //Connection type
+
+ public $content_type = self::CONTENT_TYPE_URL_ENCODED; //Content type
+ public $accept_charset = 'UTF-8,*;q=0'; //Accept charset
+ public $accept_encoding = 'gzip,deflate,identity,*;q=0'; //Accept encoding
+ public $accept_language = 'en-US,en,zh-CN,zh,*;q=0'; //Accept language
+
+ public $accept_type = 'application/json;q=0.9,application/xml;q=0.8,text/plain;q=0.7,text/html;q=0.6,*/*;q=0.5'; //Accept types
+
+ /**
+ * libHttp constructor.
+ *
+ * @param string $url
+ */
+ public function __construct(string $url = '')
+ {
+ $this->url = &$url;
+ unset($url);
+ }
+
+ /**
+ * Add request data
+ *
+ * @param array ...$data
+ *
+ * @return $this
+ */
+ public function addData(array ...$data): self
+ {
+ foreach ($data as $item) {
+ $this->data += $item;
+ }
+
+ unset($data, $item);
+ return $this;
+ }
+
+ /**
+ * Add upload file
+ *
+ * @param array ...$file
+ *
+ * @return $this
+ */
+ public function addFile(array ...$file): self
+ {
+ foreach ($file as $key => $val) {
+ if (file_exists($val)) {
+ $this->file[$key] = new \CURLFile($val);
+ }
+ }
+
+ unset($file, $key, $val);
+ return $this;
+ }
+
+ /**
+ * Add header data
+ *
+ * @param array $header
+ *
+ * @return $this
+ */
+ public function addHeader(array $header): self
+ {
+ $this->header += $header;
+
+ unset($header);
+ return $this;
+ }
+
+ /**
+ * Add cookie data
+ *
+ * @param array $cookie
+ *
+ * @return $this
+ */
+ public function addCookie(array $cookie): self
+ {
+ foreach ($cookie as $key => $val) {
+ if ('' !== $this->cookie) {
+ $this->cookie .= '; ';
+ }
+
+ $this->cookie .= $key . '=' . $val;
+ }
+
+ unset($cookie, $key, $val);
+ return $this;
+ }
+
+ /**
+ * Set method
+ *
+ * @param string $method
+ *
+ * @return $this
+ */
+ public function setMethod(string $method = 'POST'): self
+ {
+ $this->method = strtoupper($method);
+
+ unset($method);
+ return $this;
+ }
+
+ /**
+ * Set content type
+ *
+ * @param string $content_type
+ *
+ * @return $this
+ */
+ public function setContentType(string $content_type = self::CONTENT_TYPE_URL_ENCODED): self
+ {
+ $this->content_type = &$content_type;
+
+ unset($content_type);
+ return $this;
+ }
+
+ /**
+ * Set referer URL
+ *
+ * @param string $referer
+ *
+ * @return $this
+ */
+ public function setReferer(string $referer): self
+ {
+ $this->referer = &$referer;
+
+ unset($referer);
+ return $this;
+ }
+
+ /**
+ * Set User-Agent string
+ *
+ * @param string $user_agent
+ *
+ * @return $this
+ */
+ public function setUserAgent(string $user_agent): self
+ {
+ $this->user_agent = &$user_agent;
+
+ unset($user_agent);
+ return $this;
+ }
+
+ /**
+ * Set max follows
+ *
+ * @param int $max_follow
+ *
+ * @return $this
+ */
+ public function setMaxFollow(int $max_follow): self
+ {
+ $this->max_follow = &$max_follow;
+
+ unset($max_follow);
+ return $this;
+ }
+
+ /**
+ * Set HTTP accept types
+ *
+ * @param string $accept_type
+ *
+ * @return $this
+ */
+ public function setAcceptType(string $accept_type): self
+ {
+ $this->accept_type = &$accept_type;
+
+ unset($accept_type);
+ return $this;
+ }
+
+ /**
+ * Set ETag value
+ *
+ * @param string $etag
+ *
+ * @return $this
+ */
+ public function setETag(string $etag): self
+ {
+ $this->etag = &$etag;
+
+ unset($etag);
+ return $this;
+ }
+
+ /**
+ * Set modified since value
+ *
+ * @param string $last_modified
+ *
+ * @return $this
+ */
+ public function setLastModified(string $last_modified): self
+ {
+ $this->modified = &$last_modified;
+
+ unset($last_modified);
+ return $this;
+ }
+
+ /**
+ * Set proxy
+ *
+ * @param string $proxy
+ * @param string $proxy_passwd
+ *
+ * @return $this
+ */
+ public function setProxy(string $proxy, string $proxy_passwd): self
+ {
+ $this->proxy = &$proxy;
+ $this->proxy_passwd = &$proxy_passwd;
+
+ unset($proxy, $proxy_passwd);
+ return $this;
+ }
+
+ /**
+ * Fetch response data
+ *
+ * @param bool $with_body
+ * @param bool $with_header
+ *
+ * @return string
+ * @throws \Exception
+ */
+ public function fetch(bool $with_body = true, bool $with_header = false): string
+ {
+ if ('' === $this->url) {
+ throw new \Exception('URL not set!', E_USER_NOTICE);
+ }
+
+ //Prepare data
+ if (!empty($this->file)) {
+ $this->data += $this->file;
+ $this->content_type = self::CONTENT_TYPE_FORM_DATA;
+ }
+
+ //Set method
+ if (!empty($this->data)) {
+ $this->method = 'POST';
+ }
+
+ //Get URL units
+ $url_unit = $this->getUrlUnit($this->url);
+
+ //Get cURL headers
+ $header = $this->getHeader($url_unit);
+
+ //Initialize
+ $opt = [];
+ $curl = curl_init();
+
+ //Build options
+ $opt[CURLOPT_URL] = $this->url;
+ $opt[CURLOPT_PORT] = &$url_unit['port'];
+ $opt[CURLOPT_TIMEOUT] = 60;
+ $opt[CURLOPT_NOSIGNAL] = true;
+ $opt[CURLOPT_AUTOREFERER] = true;
+ $opt[CURLOPT_COOKIESESSION] = true;
+ $opt[CURLOPT_RETURNTRANSFER] = true;
+ $opt[CURLOPT_SSL_VERIFYHOST] = 2;
+ $opt[CURLOPT_SSL_VERIFYPEER] = false;
+ $opt[CURLOPT_HTTPHEADER] = &$header;
+ $opt[CURLOPT_ENCODING] = $this->accept_encoding;
+ $opt[CURLOPT_USERAGENT] = $this->user_agent;
+ $opt[CURLOPT_CUSTOMREQUEST] = strtoupper($this->method);
+ $opt[CURLOPT_POST] = ('POST' === $this->method);
+ $opt[CURLOPT_NOBODY] = !$with_body;
+ $opt[CURLOPT_HEADER] = &$with_header;
+
+ if ('' !== $this->cookie) {
+ $opt[CURLOPT_COOKIE] = $this->cookie;
+ }
+
+ if ('' !== $this->referer) {
+ $opt[CURLOPT_REFERER] = $this->referer;
+ }
+
+ if (0 < $this->max_follow) {
+ $opt[CURLOPT_FOLLOWLOCATION] = true;
+ $opt[CURLOPT_MAXREDIRS] = $this->max_follow;
+ }
+
+ if ('' !== $this->proxy) {
+ $opt[CURLOPT_PROXY] = $this->proxy;
+
+ if ('' !== $this->proxy_passwd) {
+ $opt[CURLOPT_PROXYUSERPWD] = $this->proxy_passwd;
+ }
+ }
+
+ if (!empty($this->data)) {
+ switch ($this->content_type) {
+ case self::CONTENT_TYPE_JSON:
+ $opt[CURLOPT_POSTFIELDS] = json_encode($this->data);
+ break;
+
+ case self::CONTENT_TYPE_XML:
+ $opt[CURLOPT_POSTFIELDS] = IOUnit::new()->toXml($this->data);
+ break;
+
+ case self::CONTENT_TYPE_URL_ENCODED:
+ $opt[CURLOPT_POSTFIELDS] = http_build_query($this->data);
+ break;
+
+ default:
+ $opt[CURLOPT_POSTFIELDS] = &$this->data;
+ break;
+ }
+ }
+
+ //Set cURL options
+ curl_setopt_array($curl, $opt);
+
+ //Get response
+ $response = curl_exec($curl);
+
+ //Collect HTTP CODE or ERROR
+ false !== $response
+ ? $this->response_code = curl_getinfo($curl, CURLINFO_RESPONSE_CODE)
+ : $this->curl_error = curl_error($curl);
+
+ //Close cURL handle
+ curl_close($curl);
+
+ unset($opt, $curl, $key, $val);
+ return (string)$response;
+ }
+
+ /**
+ * Get last HTTP response code
+ *
+ * @return string
+ */
+ public function getHttpCode()
+ {
+ return $this->response_code;
+ }
+
+ /**
+ * Get last HTTP curl error
+ *
+ * @return string
+ */
+ public function getLastError(): string
+ {
+ return $this->curl_error;
+ }
+
+ /**
+ * Extract URL units
+ *
+ * @param string $url
+ *
+ * @return array
+ */
+ private function getUrlUnit(string $url): array
+ {
+ //Parse URL
+ $unit = parse_url($url);
+
+ //Check main components
+ if (false === $unit || !isset($unit['scheme']) || !isset($unit['host'])) {
+ return [];
+ }
+
+ //Prepare URL unit
+ if (!isset($unit['path'])) {
+ $unit['path'] = '/';
+ }
+
+ $unit['query'] = isset($unit['query']) ? '?' . $unit['query'] : '';
+
+ if (!isset($unit['port'])) {
+ $unit['port'] = 'https' === $unit['scheme'] ? 443 : 80;
+ }
+
+ unset($url);
+ return $unit;
+ }
+
+ /**
+ * get request header
+ *
+ * @param array $url_unit
+ *
+ * @return array
+ */
+ private function getHeader(array $url_unit): array
+ {
+ $header_list = ['Host' => $url_unit['host'] . ':' . $url_unit['port']];
+
+ if (!empty($this->header)) {
+ $header_list += $this->header;
+ }
+
+ if ('' !== $this->cookie) {
+ $header_list['Cookie'] = $this->cookie;
+ }
+
+ if ('' !== $this->etag) {
+ $header_list['If-None-Match'] = $this->etag;
+ }
+
+ if ('' !== $this->modified) {
+ $header_list['If-Modified-Since'] = $this->modified;
+ }
+
+ $header_list += [
+ 'Accept' => $this->accept_type,
+ 'Accept-Charset' => $this->accept_charset,
+ 'Accept-Encoding' => $this->accept_encoding,
+ 'Accept-Language' => $this->accept_language,
+ 'Content-Type' => $this->content_type,
+ 'User-Agent' => $this->user_agent,
+ 'Connection' => $this->connection
+ ];
+
+ $headers = [$this->method . ' ' . $url_unit['path'] . $url_unit['query'] . ' ' . $this->http_ver];
+
+ foreach ($header_list as $key => $val) {
+ $headers[] = $key . ': ' . $val;
+ }
+
+ unset($url_unit, $header_list, $key, $val);
+ return $headers;
+ }
+}
diff --git a/app/Library/SystemInfo.php b/app/Library/SystemInfo.php
new file mode 100644
index 0000000000000000000000000000000000000000..1bf1755de9964990663aa523deadcdf81f194fc0
--- /dev/null
+++ b/app/Library/SystemInfo.php
@@ -0,0 +1,191 @@
+ 0,
+ // 空闲磁盘
+ 'free' => 0,
+ // 已使用的磁盘
+ 'used' => 0,
+ // 磁盘占用率
+ 'usage_ratio' => 0,
+
+ // 单位符
+ 'unit_symbol' => 'G',
+ ];
+
+ /**
+ * 获取磁盘相关数据
+ *
+ * @return array
+ */
+ public function getDisk()
+ {
+ if ( is_windows() ) { //windows服务器
+ // 总磁盘(kb -> k -> M -> G)
+ $this->disk['total'] = round(disk_total_space("C:") / 1024 / 1024 / 1024, 2);
+ $this->disk['free'] = round(disk_free_space("C:") / 1024 / 1024 / 1024, 2);
+ $this->disk['used'] = round($this->disk['total'] - $this->disk['free'], 2);
+ $this->disk['usage_ratio'] = round(round($this->disk['free'] / $this->disk['total'], 4) * 100, 2);
+ } else {
+ //获取磁盘占用率
+ $fp = popen('df -lh | grep -E "^(/)"', "r");
+ $rs = fread($fp, 1024);
+ pclose($fp);
+ $rs = preg_replace('/\s{2,}/', ' ', $rs); //把多个空格换成 “_”
+ $hd = explode(" ", $rs);
+ $this->disk['total'] = trim($hd[1], 'G');//可用空间G
+ $this->disk['used'] = trim($hd[2], 'G');//可用空间G
+ $this->disk['free'] = trim($hd[3], 'G');//可用空间G
+ $this->disk['usage_ratio'] = trim($hd[4], '%');//已使用百分比
+ }
+ return $this->disk;
+ }
+
+ // 内存
+ private $memory = [
+ // 总内存
+ 'total' => 0,
+ // 空闲内存
+ 'free' => 0,
+ // 已使用的内存
+ 'used' => 0,
+ // 内存占用率
+ 'usage_ratio' => 0,
+ // 单位符
+ 'unit_symbol' => 'M',
+ ];
+
+ /**
+ * 获取内存相关数据
+ *
+ * @return array
+ */
+ public function getMemory()
+ {
+ if ( is_windows() ) { // windows服务器
+ $path = $this->getMemoryUsageVbsPathByWindows();
+ exec("cscript -nologo $path", $usage);
+ $memory = my_json_decode($usage[0], true);
+
+ $this->memory['total'] = round($memory['TotalVisibleMemorySize'] / 1024, 2);
+ $this->memory['free'] = round($memory['FreePhysicalMemory'] / 1024, 2);
+ $this->memory['used'] = round($this->memory['total'] - $this->memory['free'], 2);
+ $this->memory['usage_ratio'] = round(round($this->memory['used'] / $this->memory['total'], 4) * 100, 2);
+ } else {
+ //内存使用率
+ $fp = popen('top -b -n 2 | grep -E "(Mem)"', "r");
+ $rs = fread($fp, 1024);
+ $sys_info = explode("\n", $rs);
+ $mem_info = explode(",", $sys_info[2]); //内存占有量 数组
+ $this->memory['total'] = trim(trim($mem_info[0], 'KiB Mem : '), ' total');
+ $this->memory['used'] = trim(trim($mem_info[2], 'used'));
+ $this->memory['buffer_cache'] = trim(trim($mem_info[3], 'buff/cache'));
+ $this->memory['free'] = trim(trim($mem_info[1], 'free'));
+ $this->memory['usage_ratio'] = round($this->memory['used'] / intval($this->memory['total']), 4) * 100; //百分比
+ }
+ return $this->memory;
+ }
+
+ // Cpu
+ private $cpu = [
+ // 总Cpu
+ 'total' => 0,
+ // 空闲Cpu
+ 'free' => 0,
+ // 已使用的Cpu
+ 'used' => 0,
+ // Cpu占用率
+ 'usage_ratio' => 0,
+ ];
+
+ /**
+ * 获取Cpu相关数据
+ *
+ * @return array
+ */
+ public function getCpu()
+ {
+ if ( is_windows() ) { // windows服务器
+ // WINDOWS的CPU是极为不准确的。
+ $this->cpu['usage_ratio'] = (float)$this->getCpuUsage();
+ } else {
+ //获取CPU使用率以及内存使用率
+ $fp = popen('top -b -n 2 | grep -E "(Cpu)"', "r");
+ $rs = fread($fp, 1024);
+ $sys_info = explode("\n", $rs);
+ $this->cpu['usage_ratio'] = (float)trim(current(explode(',', trim($sys_info[0], '%Cpu(s): '))), 'us'); //百分比;
+ }
+ return $this->cpu;
+ }
+
+ /**
+ * 获得总内存及可用物理内存JSON vbs文件生成函数
+ *
+ * @return string 返回vbs文件路径
+ */
+ private function getMemoryUsageVbsPathByWindows()
+ {
+ return $this->getFilePath('memory_usage.vbs', "On Error Resume Next
+ Set objWMI = GetObject(\"winmgmts:\\\\.\\root\cimv2\")
+ Set colOS = objWMI.InstancesOf(\"Win32_OperatingSystem\")
+ For Each objOS in colOS
+ Wscript.Echo(\"{\"\"TotalVisibleMemorySize\"\":\" & objOS.TotalVisibleMemorySize & \",\"\"FreePhysicalMemory\"\":\" & objOS.FreePhysicalMemory & \"}\")
+ Next");
+ }
+
+ /**
+ * 判断指定路径下指定文件是否存在,如不存在则创建
+ *
+ * @param string $fileName 文件名
+ * @param string $content 文件内容
+ *
+ * @return string 返回文件路径
+ */
+ private function getFilePath($fileName, $content)
+ {
+ $path = dirname(__FILE__) . "\\$fileName";
+ if ( !file_exists($path) ) {
+ file_put_contents($path, $content);
+ }
+ return $path;
+ }
+
+ /**
+ * 获得CPU使用率
+ *
+ * @return Number
+ */
+ private function getCpuUsage()
+ {
+ $path = $this->getCupUsageVbsPathByWindows();
+ exec("cscript -nologo $path", $usage);
+ return $usage[0];
+ }
+
+ /**
+ * 获得cpu使用率vbs文件生成函数
+ *
+ * @return string 返回vbs文件路径
+ */
+ private function getCupUsageVbsPathByWindows()
+ {
+ return $this->getFilePath('cpu_usage.vbs', "On Error Resume Next
+ Set objProc = GetObject(\"winmgmts:\\\\.\\root\cimv2:win32_processor='cpu0'\")
+ WScript.Echo(objProc.LoadPercentage)");
+ }
+}
diff --git a/app/Library/cpu_usage.vbs b/app/Library/cpu_usage.vbs
new file mode 100644
index 0000000000000000000000000000000000000000..60a7bddb9421ae21e1131e4482d83637a4897853
--- /dev/null
+++ b/app/Library/cpu_usage.vbs
@@ -0,0 +1,3 @@
+On Error Resume Next
+ Set objProc = GetObject("winmgmts:\\.\root\cimv2:win32_processor='cpu0'")
+ WScript.Echo(objProc.LoadPercentage)
\ No newline at end of file
diff --git a/app/Library/memory_usage.vbs b/app/Library/memory_usage.vbs
new file mode 100644
index 0000000000000000000000000000000000000000..4c4218f308656747c35bb246896630c714f99d69
--- /dev/null
+++ b/app/Library/memory_usage.vbs
@@ -0,0 +1,6 @@
+On Error Resume Next
+ Set objWMI = GetObject("winmgmts:\\.\root\cimv2")
+ Set colOS = objWMI.InstancesOf("Win32_OperatingSystem")
+ For Each objOS in colOS
+ Wscript.Echo("{""TotalVisibleMemorySize"":" & objOS.TotalVisibleMemorySize & ",""FreePhysicalMemory"":" & objOS.FreePhysicalMemory & "}")
+ Next
\ No newline at end of file
diff --git a/app/Listeners/QueryListener.php b/app/Listeners/QueryListener.php
new file mode 100644
index 0000000000000000000000000000000000000000..63368e5656ad83987d64adab1d97e9b5decbb12e
--- /dev/null
+++ b/app/Listeners/QueryListener.php
@@ -0,0 +1,52 @@
+log = new Logger('mysql');
+
+ // 创建mysql文件夹
+ $dir_path = dirname(dirname(__DIR__)) . '/storage/logs/' . $this->log->getName();
+ if (!is_dir($dir_path)) mkdir($dir_path, 0755);
+
+ $log_path = storage_path('logs/' . $this->log->getName() . '/' . date('Y-m-d') . '.log');
+ if (!file_exists($log_path)) {
+ fopen($log_path, "w");
+ }
+
+ $this->log->pushHandler(new StreamHandler($log_path, Logger::DEBUG));
+ }
+
+ /**
+ * Handle the event.
+ *
+ * @param object $event
+ *
+ * @return void
+ */
+ public function handle($event): void
+ {
+ if (env('APP_DEBUG') == true) {
+ /**
+ * sql语句的监听
+ */
+ $sql = str_replace("?", "'%s'", $event->sql);
+ $log = vsprintf($sql, $event->bindings);
+
+ $this->log->addRecord(Logger::DEBUG, '[' . $event->time . '] | ' . $log . ' |');
+ }
+ }
+}
diff --git a/app/Models/Model.php b/app/Models/Model.php
new file mode 100644
index 0000000000000000000000000000000000000000..50b47798c814b9ee28db5e2b28f111f1e44bc30e
--- /dev/null
+++ b/app/Models/Model.php
@@ -0,0 +1,92 @@
+attributes[self::CREATED_AT];
+ }
+
+ public function getUpdatedTimeAttribute()
+ {
+ return $this->attributes[self::UPDATED_AT];
+ }
+
+ /**
+ * 自定义的软删除
+ */
+ protected $is_delete = 1; //是否开启删除(1.开启删除,就是直接删除;0.假删除)
+ protected $delete_field = 'is_delete'; //删除字段
+
+ public function getIsDelete()
+ {
+ return $this->is_delete;
+ }
+
+ public function getDeleteField()
+ {
+ return $this->delete_field;
+ }
+
+ /**
+ * 不可批量赋值的属性
+ *
+ * @var array
+ */
+ protected $guarded = [];
+
+ /**
+ * 模型的 "booted" 方法
+ *
+ * 应用全局作用域
+ *
+ * @return void
+ */
+ protected static function booted()
+ {
+ // 假删除的作用域
+ static::addGlobalScope(new DeleteScope(new static));
+ }
+
+ public static function firstByWhere($where)
+ {
+ return self::where($where)->first();
+ }
+}
diff --git a/app/Models/MonthModel.php b/app/Models/MonthModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..e79223fbda4572d33770bb9c6b73e617fe9ef780
--- /dev/null
+++ b/app/Models/MonthModel.php
@@ -0,0 +1,100 @@
+setMonthTable();
+ }
+
+ public function getMonth(): string
+ {
+ return $this->month;
+ }
+
+
+ /**
+ * 设置按月分表
+ *
+ * @param string $month
+ *
+ * @return $this
+ */
+ public function setMonthTable(string $month = '')
+ {
+ $month = empty($month) ? date(self::MONTH_FORMAT) : date(self::MONTH_FORMAT, strtotime($month));
+ // 替换为日期格式,否则将无法转化为时间戳(有效的日期格式 - 拼接才可以)
+ $month = str_replace('_', '-', $month);
+
+ // 当表名大于最小表名时,设置表名。
+ if ( $month >= str_replace('_', '-', self::MIN_TABLE) ) {
+ $this->month = date(self::MONTH_FORMAT, strtotime($month));
+ $this->table = $this->getOldTableName() . '_' . $this->month;
+ }
+
+ return $this;
+ }
+
+ /**
+ * 获取从开始分表到今天为止,所有的月份
+ *
+ * @return array
+ */
+ public function getAllMonthes() : array
+ {
+ $monthes = get_month_range(str_replace('_', '-', self::MIN_TABLE), date('Y-m'));
+ krsort($monthes);
+ return $monthes;
+ }
+
+ /**
+ * 获取原始表名(移除月份表的后缀)【包含前缀】
+ *
+ * @return string
+ */
+ public function getOldTableName():string
+ {
+ $table_name = $this->getTable();
+ $suffix_len = strlen(self::MIN_TABLE);
+ $suffix = substr($table_name, -$suffix_len, $suffix_len);
+ // 检测当前表名是否为按月分表的表名
+ if (preg_match ("/^([0-9]{4})_([0-9]{2})$/", $suffix, $parts)){
+ // 减1是因为默认还有一个下划线
+ $table_name = substr($table_name, 0, -$suffix_len - 1);
+ }
+ return $table_name;
+ }
+
+ /**
+ * 生成新表
+ *
+ * @param string $new_table
+ * @param string $time
+ * @param string $format
+ * @param string $old_table
+ *
+ * @return bool
+ */
+ public function createMonthTable(string $new_table = '', $time = '', $format = self::MONTH_FORMAT, string $old_table = '')
+ {
+ $new_table = empty($new_table) ? $this->getOldTableName() . '_' . date($format, empty($time) ? time() : $time) : $new_table;
+
+ // 数据表前缀
+ $db_prefix = env('DB_PREFIX');
+
+ return $this->setCopyTable($db_prefix . $new_table, $db_prefix . $this->getOldTableName());
+ }
+}
diff --git a/app/Models/User.php b/app/Models/User.php
new file mode 100644
index 0000000000000000000000000000000000000000..804799bafe1da2889c0cc8ae43ff3c307f017e3c
--- /dev/null
+++ b/app/Models/User.php
@@ -0,0 +1,43 @@
+ 'datetime',
+ ];
+}
diff --git a/app/Models/YearModel.php b/app/Models/YearModel.php
new file mode 100644
index 0000000000000000000000000000000000000000..316ef1e0e854c802cf78aeb5a5d9b8a1605572fd
--- /dev/null
+++ b/app/Models/YearModel.php
@@ -0,0 +1,89 @@
+setMonthTable();
+ }
+
+ /**
+ * 获取从开始分表到明年为止,所有的年份
+ *
+ * @return array
+ */
+ public function getAllMonthes(): array
+ {
+ $years = get_year_range(self::MIN_TABLE . '-01', date('Y-01', strtotime('+1 year')));
+ krsort($years);
+ return $years;
+ }
+
+ /**
+ * 设置按年分表
+ *
+ * @param string $month
+ *
+ * @return $this
+ */
+ public function setMonthTable(string $month = '')
+ {
+ $month = empty($month) ? date(self::MONTH_FORMAT) : (strlen($month) == 4 ? $month : date(self::MONTH_FORMAT, strtotime($month)));
+ // 替换为日期格式,否则将无法转化为时间戳(有效的日期格式 - 拼接才可以)
+ $month = str_replace('_', '-', $month);
+
+ // 当表名大于最小表名时,设置表名。
+ if ( $month >= self::MIN_TABLE ) {
+ $this->month = $month;
+ $this->table = $this->getOldTableName() . '_' . $this->month;
+ }
+
+ return $this;
+ }
+
+ /**
+ * 生成新表
+ *
+ * @param string $new_table
+ * @param string $time
+ * @param string $format
+ * @param string $old_table
+ *
+ * @return bool
+ */
+ public function createMonthTable(string $new_table = '', $time = '', $format = self::MONTH_FORMAT, string $old_table = '')
+ {
+ $new_table = empty($new_table) ? $this->getOldTableName() . '_' . date($format, empty($time) ? time() : $time) : $new_table;
+
+ // 数据表前缀
+ $db_prefix = env('DB_PREFIX');
+
+ return $this->setCopyTable($db_prefix . $new_table, $db_prefix . $this->getOldTableName());
+ }
+
+ /**
+ * 获取原始表名(移除年份表的后缀)【包含前缀】
+ *
+ * @return string
+ */
+ public function getOldTableName():string
+ {
+ $table_name = $this->getTable();
+ $suffix_len = strlen(self::MIN_TABLE);
+ $suffix = substr($table_name, -$suffix_len, $suffix_len);
+ // 检测当前表名是否为按年分表的表名
+ if (preg_match ("/^([0-9]{4})$/", $suffix, $parts)){
+ // 减1是因为默认还有一个下划线
+ $table_name = substr($table_name, 0, -$suffix_len - 1);
+ }
+ return $table_name;
+ }
+}
diff --git a/app/Modules/Admin/Config/.gitkeep b/app/Modules/Admin/Config/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Config/config.php b/app/Modules/Admin/Config/config.php
new file mode 100644
index 0000000000000000000000000000000000000000..0fa4b426518ee0066eb63724f10ece2a16a1eba1
--- /dev/null
+++ b/app/Modules/Admin/Config/config.php
@@ -0,0 +1,5 @@
+ 'Admin'
+];
diff --git a/app/Modules/Admin/Console/.gitkeep b/app/Modules/Admin/Console/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Console/AutoTableBuild.php b/app/Modules/Admin/Console/AutoTableBuild.php
new file mode 100644
index 0000000000000000000000000000000000000000..88c27747dae2e642dec44a8cbecb482478521548
--- /dev/null
+++ b/app/Modules/Admin/Console/AutoTableBuild.php
@@ -0,0 +1,77 @@
+model_lists as $model){
+ (new $model)->createMonthTable('', strtotime('+1 month'));
+ }
+ }
+
+ /**
+ * Get the console command arguments.
+ *
+ * @return array
+ */
+ protected function getArguments()
+ {
+ return [
+ ['example', InputArgument::REQUIRED, 'An example argument.'],
+ ];
+ }
+
+ /**
+ * Get the console command options.
+ *
+ * @return array
+ */
+ protected function getOptions()
+ {
+ return [
+ ['example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null],
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Database/Migrations/.gitkeep b/app/Modules/Admin/Database/Migrations/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Database/Seeders/.gitkeep b/app/Modules/Admin/Database/Seeders/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Database/Seeders/AdminDatabaseSeeder.php b/app/Modules/Admin/Database/Seeders/AdminDatabaseSeeder.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a8738e2f09b9049df5438802abfbfbf01445644
--- /dev/null
+++ b/app/Modules/Admin/Database/Seeders/AdminDatabaseSeeder.php
@@ -0,0 +1,21 @@
+call("OthersTableSeeder");
+ }
+}
diff --git a/app/Modules/Admin/Database/factories/.gitkeep b/app/Modules/Admin/Database/factories/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Entities/.gitkeep b/app/Modules/Admin/Entities/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Entities/Article/Article.php b/app/Modules/Admin/Entities/Article/Article.php
new file mode 100644
index 0000000000000000000000000000000000000000..cda0eeea82bc5fd240c9c2eda6991dcd52373ad3
--- /dev/null
+++ b/app/Modules/Admin/Entities/Article/Article.php
@@ -0,0 +1,35 @@
+attributes['article_cover'] = str_replace(Storage::url('/'), '', $key);
+ }
+ }
+
+ public function category()
+ {
+ return $this->hasOne(ArticleCategory::class, 'category_id', 'category_id');
+ }
+
+ public function labels()
+ {
+ return $this->belongsToMany(ArticleLabel::class, ArticleWithLabel::class, 'article_id' , 'label_id' , 'article_id', 'label_id')->withPivot(['article_id', 'label_id']);
+ }
+}
diff --git a/app/Modules/Admin/Entities/Article/ArticleCategory.php b/app/Modules/Admin/Entities/Article/ArticleCategory.php
new file mode 100644
index 0000000000000000000000000000000000000000..82ef61fcd7b55d7a22cb868358e45419c32b67bc
--- /dev/null
+++ b/app/Modules/Admin/Entities/Article/ArticleCategory.php
@@ -0,0 +1,87 @@
+getCacheTree();
+ }
+
+ /**
+ * 删除缓存
+ *
+ * @return bool
+ */
+ public function delCache()
+ {
+ Cache::forget($this->cache_key);
+ return true;
+ }
+
+ /**
+ * 获取文章分类的数据缓存
+ *
+ * @param string $get_type
+ *
+ * @return mixed
+ */
+ private function getCache(string $get_type = '')
+ {
+ return Cache::remember($this->cache_key, 3600, function() use ($get_type) {
+ $all = $this->orderBy('category_sort', 'ASC')->get()->toArray();
+ $tree = list_to_tree($all, $this->getKeyName());
+ return compact('all', 'tree');
+ });
+ }
+
+ /**
+ * 获取Tree格式化数据
+ *
+ * @return array|mixed
+ */
+ public function getCacheTree()
+ {
+ return $this->getCache()['tree'] ?? [];
+ }
+
+ /**
+ * 获取所有文章数据
+ *
+ * @return array|mixed
+ */
+ public function getCacheAll()
+ {
+ return $this->getCache()['all'] ?? [];
+ }
+
+ /**
+ * 获取所有子集的Id集合(包含自己)
+ *
+ * @param int $parent_id
+ * @param array $all
+ *
+ * @return array|int[]
+ */
+ public function getChildIds(int $parent_id, array $all = [])
+ {
+ $ids = [$parent_id];
+ empty($all) && $all = $this->getCacheAll();
+ foreach ($all as $key => $value) {
+ if ( $value['parent_id'] == $parent_id ) {
+ unset($all[$key]);
+ $child_ids = $this->getChildIds((int)$value['category_id'], $all);
+ !empty($child_ids) && $ids = array_merge($ids, $child_ids);
+ }
+ }
+ return $ids;
+ }
+}
diff --git a/app/Modules/Admin/Entities/Article/ArticleLabel.php b/app/Modules/Admin/Entities/Article/ArticleLabel.php
new file mode 100644
index 0000000000000000000000000000000000000000..8910298463c9c82766a6610cc4334519480a83e9
--- /dev/null
+++ b/app/Modules/Admin/Entities/Article/ArticleLabel.php
@@ -0,0 +1,11 @@
+belongsTo(Admin::class, 'admin_id', 'admin_id');
+ }
+
+ public function getLogDurationAttribute($key)
+ {
+ return floatval($key);
+ }
+}
diff --git a/app/Modules/Admin/Entities/Log/AdminLoginLog.php b/app/Modules/Admin/Entities/Log/AdminLoginLog.php
new file mode 100644
index 0000000000000000000000000000000000000000..063c8d0e253fbc551454f62d4f5e708e9f15029d
--- /dev/null
+++ b/app/Modules/Admin/Entities/Log/AdminLoginLog.php
@@ -0,0 +1,38 @@
+belongsTo(Admin::class, 'admin_id', 'admin_id');
+ }
+
+ public function getLogDurationAttribute($key)
+ {
+ return floatval($key);
+ }
+
+ public function add(int $admin_id = 0, int $log_status = 1, $description = '登录成功')
+ {
+ $ip_agent = get_client_info();
+ return $this->setMonthTable()->create([
+ 'admin_id' => $admin_id,
+ 'created_ip' => $ip_agent['ip'] ?? get_ip(),
+ 'browser_type' => $ip_agent['agent'] ?? $_SERVER['HTTP_USER_AGENT'],
+ 'log_status' => $log_status,
+ 'description' => $description,
+ 'log_action' => request()->route()->getActionName(),
+ 'log_method' => request()->getMethod(),
+ 'log_duration' => microtime(true) - LARAVEL_START,
+ 'request_data' => json_encode(request()->all()),
+ ]);
+ }
+}
diff --git a/app/Modules/Admin/Entities/Rabc/Admin.php b/app/Modules/Admin/Entities/Rabc/Admin.php
new file mode 100644
index 0000000000000000000000000000000000000000..891b305287e2ace1e089325c17bcaa1d69a5e775
--- /dev/null
+++ b/app/Modules/Admin/Entities/Rabc/Admin.php
@@ -0,0 +1,145 @@
+is_delete;
+ }
+
+ public function getDeleteField()
+ {
+ return $this->delete_field;
+ }
+
+ /**
+ * 是否主动维护时间戳
+ *
+ * @var bool
+ */
+ public $timestamps = false;
+
+ protected $hidden = ['password'];
+
+ /**
+ * 不可批量赋值的属性
+ *
+ * @var array
+ */
+ protected $guarded = [];
+
+ /**
+ * 模型的 "booted" 方法
+ *
+ * 应用全局作用域
+ *
+ * @return void
+ */
+ protected static function booted()
+ {
+ // 假删除的作用域
+ $static = new static;
+ static::addGlobalScope('delete', function(Builder $builder) use ($static){
+ if ($static->is_delete == 0) $builder->where($static->delete_field, $static->is_delete);
+ });
+ }
+
+ public function getAdminByName(string $admin_name)
+ {
+ return $this->where('admin_name', $admin_name)->first();
+ }
+
+ public function setPasswordAttribute($key)
+ {
+ if (empty($key)) unset($this->attributes['password']);
+ else $this->attributes['password'] = hash_encryption($key);
+ }
+
+ /**
+ * 获取会储存到 jwt 声明中的标识
+ * @return mixed
+ */
+ public function getJWTIdentifier()
+ {
+ return $this->getKey();
+ }
+
+ /**
+ * 返回包含要添加到 jwt 声明中的自定义键值对数组
+ * @return array
+ */
+ public function getJWTCustomClaims()
+ {
+ return ['role' => 'admin'];
+ }
+
+ public function adminInfo()
+ {
+ return $this->hasOne(AdminInfo::class, $this->primaryKey, $this->primaryKey);
+ }
+
+ public function roles()
+ {
+ return $this->belongsToMany(AdminRole::class, AdminWithRole::class, 'admin_id', 'role_id')->withPivot(['admin_id', 'role_id']);
+ }
+
+ /**
+ * @Function assignRole
+ *
+ * @param $roles
+ *
+ * @return bool
+ * @author : cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:给用户分配角色
+ * @englishAnnotation:
+ */
+ public function assignRole($roles)
+ {
+ return $this->roles()->save($roles);
+ }
+
+ /**
+ * @Function deleteRole
+ *
+ * @param $roles
+ *
+ * @return mixed
+ * @author : cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:取消用户分配的角色,取消而不是删除
+ * @englishAnnotation:
+ */
+ public function deleteRole($roles)
+ {
+ return $this->roles()->detach($roles);
+ }
+
+ public function getAdminHeadAttribute($key)
+ {
+ if (empty($key)) return $key;
+ return Storage::url($key);
+ }
+
+ public function setAdminHeadAttribute($key)
+ {
+ if (!empty($key)) {
+ $this->attributes['admin_head'] = str_replace(Storage::url('/'), '', $key);
+ }
+ }
+}
diff --git a/app/Modules/Admin/Entities/Rabc/AdminInfo.php b/app/Modules/Admin/Entities/Rabc/AdminInfo.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c0ed7d22eea0e59a00a0037bb104ba09a82495e
--- /dev/null
+++ b/app/Modules/Admin/Entities/Rabc/AdminInfo.php
@@ -0,0 +1,10 @@
+orderBy('menu_sort', 'ASC')->get();
+ }
+
+ public function getSelectLists()
+ {
+ return list_to_tree($this->orderBy('menu_sort', 'ASC')->get()->toArray());
+ }
+
+ public function getMenusByIds(array $menu_ids)
+ {
+ return $this->whereIn('menu_id', $menu_ids)
+ ->orderBy('menu_sort', 'ASC')
+ ->get();
+ }
+
+ public function getMenusByIdsForRabc(array $menu_ids)
+ {
+ return $this->whereIn('menu_id', $menu_ids)->where('api_url', '<>', '')->pluck('api_method', 'api_url');
+ }
+}
diff --git a/app/Modules/Admin/Entities/Rabc/AdminRole.php b/app/Modules/Admin/Entities/Rabc/AdminRole.php
new file mode 100644
index 0000000000000000000000000000000000000000..496acaa705f2fdd851083a5d00d73c28c1f57006
--- /dev/null
+++ b/app/Modules/Admin/Entities/Rabc/AdminRole.php
@@ -0,0 +1,48 @@
+belongsToMany(AdminMenu::class, 'admin_role_with_menus', 'role_id', 'menu_id')
+ ->where(['is_delete' => 0, 'is_check' => 1])
+ ->orderBy('menu_sort', 'ASC');
+ }
+
+ /**
+ * @Function grantMenus
+ *
+ * @param $menus
+ *
+ * @return bool
+ * @author : cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:给角色赋予权限
+ * @englishAnnotation:
+ */
+ public function grantMenus($menus)
+ {
+ return AdminRoleWithMenu::create($menus);
+ }
+
+ /**
+ * @Function deleteMenus
+ *
+ * @param $menus
+ *
+ * @return mixed
+ * @author : cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:取消角色赋予的权限
+ * @englishAnnotation:
+ */
+ public function deleteMenus($menus)
+ {
+ return AdminRoleWithMenu::where($menus)->delete();
+ }
+}
diff --git a/app/Modules/Admin/Entities/Rabc/AdminRoleWithMenu.php b/app/Modules/Admin/Entities/Rabc/AdminRoleWithMenu.php
new file mode 100644
index 0000000000000000000000000000000000000000..28aeb42d98060b484dbe6944689dc535ee56fcd4
--- /dev/null
+++ b/app/Modules/Admin/Entities/Rabc/AdminRoleWithMenu.php
@@ -0,0 +1,16 @@
+whereIn('role_id', $role_ids)->select('menu_id')->get()->toArray(), 'menu_id'));
+ }
+}
diff --git a/app/Modules/Admin/Entities/Rabc/AdminWithRole.php b/app/Modules/Admin/Entities/Rabc/AdminWithRole.php
new file mode 100644
index 0000000000000000000000000000000000000000..89fed335f80f4c8b97117288b7df48e11d473d8b
--- /dev/null
+++ b/app/Modules/Admin/Entities/Rabc/AdminWithRole.php
@@ -0,0 +1,10 @@
+attributes['banner_cover'] = str_replace(Storage::url('/'), '', $key);
+ }
+ }
+}
diff --git a/app/Modules/Admin/Entities/System/Config.php b/app/Modules/Admin/Entities/System/Config.php
new file mode 100644
index 0000000000000000000000000000000000000000..91b85bf5631c58a7b960b957c6e5c75d984fc1e0
--- /dev/null
+++ b/app/Modules/Admin/Entities/System/Config.php
@@ -0,0 +1,92 @@
+where('is_check', 1)
+ ->select('config_value', 'config_name', 'config_type')
+ ->get()
+ ->toArray();//字段进行过滤
+ $_data = $data_list = [];
+ array_walk($config_data, function ($value) use (&$data_list) {
+ /**
+ * 对于数组格式的处理
+ *
+ * in_array(strtoupper($value['config_name']), ['CONFIG_GROUP_LIST', 'CONFIG_TYPE_LIST', 'MENU_TYPE_LIST']) ||
+ */
+ if ($value['config_type'] == 3) {
+ $value_ary = array_filter(explode('|', str_replace(["\r", "\r\n", "\n"], '|', $value['config_value'])));
+ foreach ($value_ary as $k => $v) {
+ if (empty($value['config_name'])) continue;
+ $array = explode(':', str_replace(["'", '"', "\r", "\r\n", "\n"], '', $v));
+ $_data[$array[0]] = $array[1];
+ }
+ $data_list[$value['config_name']] = $_data;
+ }else{
+ /**
+ * 配置项的值,对于不同字符类型的格式进行处理
+ */
+ switch ($value['config_type']){
+ case 2: // 数字
+ $config_value = floatval($value['config_value']);
+ break;
+ default:
+ $config_value = $value['config_value'];
+ break;
+ }
+ /**
+ * 如果存在某一类的设置项:
+ * 如:user.login_days、user.pass 这一类,自动设置为数据格式数据,便于使用config的 . 找到数组下坐标
+ */
+ if (strstr($value['config_name'], '.')){
+ $ary = explode('.', $value['config_name']);
+ if (count($ary) > 2){
+ list($key, $val, $third) = $ary;
+ $data_list[$key][$val][$third] = $config_value;
+ }else{
+ list($key, $val) = $ary;
+ $data_list[$key][$val] = $config_value;
+ }
+ }else{
+ $data_list[$value['config_name']] = $config_value;
+ }
+ }
+ });
+ // 文件写入
+ $res = file_put_contents( config_path() . '/cnpscy.php', 'select()->toArray();
+ if (!empty($configs)) {
+ foreach ($configs as &$v) {
+ if (in_array($v['config_type'], [4])){
+ if (!empty($v['config_extra'])) $v['config_extra'] = config_array_analysis($v['config_extra']);
+ }
+ }
+ }
+ $configs = array_field_group($configs, 'config_group');//按照配置进行分组
+ if (empty($configs[0])) $configs[0] = [];
+ return $configs;
+ }
+}
diff --git a/app/Modules/Admin/Entities/System/Friendlink.php b/app/Modules/Admin/Entities/System/Friendlink.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e03f1a0b2842037f0c95ac6ce00acc0b866a007
--- /dev/null
+++ b/app/Modules/Admin/Entities/System/Friendlink.php
@@ -0,0 +1,25 @@
+attributes['link_cover'] = str_replace(Storage::url('/'), '', $key);
+ }
+ }
+}
diff --git a/app/Modules/Admin/Entities/System/Protocol.php b/app/Modules/Admin/Entities/System/Protocol.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4fd0e4d40ef5c860d76d1aeecf7c088858c046e
--- /dev/null
+++ b/app/Modules/Admin/Entities/System/Protocol.php
@@ -0,0 +1,11 @@
+service = $articleCategoryService;
+ }
+
+ public function create(ArticleCategoryRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(ArticleCategoryRequest $request)
+ {
+ return $this->updateService($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/Article/ArticleController.php b/app/Modules/Admin/Http/Controllers/Article/ArticleController.php
new file mode 100644
index 0000000000000000000000000000000000000000..cb9385c962eb5bd113d17bf14ce4a834c4cee37b
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/Article/ArticleController.php
@@ -0,0 +1,25 @@
+service = $articleService;
+ }
+
+ public function create(ArticleRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(ArticleRequest $request)
+ {
+ return $this->updateService($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/Article/ArticleLabelController.php b/app/Modules/Admin/Http/Controllers/Article/ArticleLabelController.php
new file mode 100644
index 0000000000000000000000000000000000000000..7aaf19da1c109545dd37e2061f1e22365281e806
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/Article/ArticleLabelController.php
@@ -0,0 +1,25 @@
+service = $articleLabelService;
+ }
+
+ public function create(ArticleLabelRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(ArticleLabelRequest $request)
+ {
+ return $this->updateService($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/AuthController.php b/app/Modules/Admin/Http/Controllers/AuthController.php
new file mode 100644
index 0000000000000000000000000000000000000000..e811b8cc32da7bb22e44a8c1dccfb112b017ea03
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/AuthController.php
@@ -0,0 +1,64 @@
+service = $authService;
+ }
+
+ /**
+ * 登录流程
+ *
+ * @param LoginRequest $request
+ * @return \Illuminate\Http\JsonResponse
+ * @throws \App\Exceptions\Admin\AuthException
+ * @throws \App\Exceptions\InvalidRequestException
+ */
+ public function login(LoginRequest $request)
+ {
+ $data = $request->validated();
+
+ // 登录流程
+ $token = $this->service->login($data);
+
+ return $this->successJson($token);
+ }
+
+ /**
+ * 获取登录管理员信息
+ *
+ * @return \Illuminate\Http\JsonResponse
+ * @throws \App\Exceptions\Admin\AuthException
+ */
+ public function me()
+ {
+ if (\request()->getMethod() == 'OPTIONS'){
+ return $this->successJson();
+ }
+
+ return $this->successJson($this->service->me());
+ }
+
+ /**
+ * 退出登录
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function logout()
+ {
+ return $this->successJson($this->service->logout());
+ }
+
+ public function getRabcList()
+ {
+ // 临时测试数据
+ return $this->successJson(list_to_tree(AdminMenu::getInstance()->getAllMenus()->toArray()));
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/BaseController.php b/app/Modules/Admin/Http/Controllers/BaseController.php
new file mode 100644
index 0000000000000000000000000000000000000000..6006d7ceed566951c17129216cf020d4c7493251
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/BaseController.php
@@ -0,0 +1,147 @@
+service)){
+ return $this->successJson([], '请先设置Service或者重写方法!');
+ }
+ return $this->successJson($this->service->lists($request->all()));
+ }
+
+ /**
+ * 详情
+ *
+ * @param int $id
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function detail(Request $request)
+ {
+ if (!isset($this->service)){
+ return $this->successJson([], '请先设置Service或者重写方法!');
+ }
+ if ($detail = $this->service->detail($request)){
+ return $this->successJson($detail);
+ }else{
+ return $this->errorJson('数据不存在!');
+ }
+ }
+
+ /**
+ * 新增流程
+ *
+ * @param $request
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function createService($request)
+ {
+ if ($request instanceof FormRequest){
+ $request->validated();
+ }
+
+ if (!isset($this->service)){
+ return $this->successJson([], '请先设置Service或者重写方法!');
+ }
+ if ($this->service->create($request->all())){
+ return $this->successJson([], $this->service->getError());
+ }else{
+ return $this->errorJson($this->service->getError());
+ }
+ }
+
+ /**
+ * 更新流程
+ *
+ * @param $request
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function updateService($request)
+ {
+ if ($request instanceof FormRequest){
+ $request->validated();
+ }
+
+ if (!isset($this->service)){
+ return $this->successJson([], '请先设置Service或者重写方法!');
+ }
+ if ($this->service->update($request->all())){
+ return $this->successJson([], $this->service->getError());
+ }else{
+ return $this->errorJson($this->service->getError());
+ }
+ }
+
+ /**
+ * 删除
+ *
+ * @param \Illuminate\Http\Request $request
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function delete(Request $request)
+ {
+ if (!isset($this->service)){
+ return $this->successJson([], '请先设置Service或者重写方法!');
+ }
+ if ($this->service->delete($request->all())){
+ return $this->successJson([], $this->service->getError());
+ }else{
+ return $this->errorJson($this->service->getError());
+ }
+ }
+
+ /**
+ * 指定字段变更操作
+ *
+ * @param \Illuminate\Http\Request $request
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function changeFiledStatus(Request $request)
+ {
+ if (!isset($this->service)){
+ return $this->successJson([], '请先设置Service或者重写方法!');
+ }
+
+ if ($this->service->changeFiledStatus($request->all())){
+ return $this->successJson([], $this->service->getError());
+ }else{
+ return $this->errorJson($this->service->getError());
+ }
+ }
+
+ /**
+ * 下拉筛选列表(可搜索)
+ *
+ * @param \Illuminate\Http\Request $request
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function getSelectLists(Request $request)
+ {
+ $lists = $this->service->getSelectLists($request);
+ return $this->successJson($lists);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/IndexController.php b/app/Modules/Admin/Http/Controllers/IndexController.php
new file mode 100644
index 0000000000000000000000000000000000000000..a46eab31581f48930c6befe06e2969cae8638571
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/IndexController.php
@@ -0,0 +1,78 @@
+service = $indexService;
+ }
+
+ public function index(Request $request)
+ {
+ return $this->successJson($this->service->index());
+ }
+
+ /**
+ * 按照日志类型的统计图数据
+ *
+ * @param \Illuminate\Http\Request $request
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function logsStatistics(Request $request)
+ {
+ return $this->successJson($this->service->logsStatistics());
+ }
+
+ /**
+ * 月份表列表
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function getMonthList()
+ {
+ return $this->successJson(MonthModel::getInstance()->getAllMonthes());
+ }
+
+ /**
+ * 编辑登录管理员信息
+ *
+ * @param \Illuminate\Http\Request $request
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function update(Request $request)
+ {
+ if ( $this->service->updateAdmin($request) ) {
+ return $this->successJson([], $this->service->getError());
+ } else {
+ return $this->errorJson($this->service->getError());
+ }
+ }
+
+ /**
+ * 版本历史记录
+ *
+ * @return mixed
+ */
+ public function versionLogs()
+ {
+ return $this->successJson($this->service->versionLogs());
+ }
+
+ /**
+ * 获取服务器状态
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function getServerStatus()
+ {
+ return $this->successJson($this->service->getServerStatus());
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/Log/AdminLogController.php b/app/Modules/Admin/Http/Controllers/Log/AdminLogController.php
new file mode 100644
index 0000000000000000000000000000000000000000..7ca869b99c284c9c112af29940a289ec564dd9d8
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/Log/AdminLogController.php
@@ -0,0 +1,14 @@
+service = $adminLogService;
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/Log/AdminLoginLogController.php b/app/Modules/Admin/Http/Controllers/Log/AdminLoginLogController.php
new file mode 100644
index 0000000000000000000000000000000000000000..47811b5a17b850a0d76a20a97dadad5eb28c4a1f
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/Log/AdminLoginLogController.php
@@ -0,0 +1,14 @@
+service = $adminLoginLogService;
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/Rabc/AdminController.php b/app/Modules/Admin/Http/Controllers/Rabc/AdminController.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4a03fd6956390365e7f5db487c11657250a3d98
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/Rabc/AdminController.php
@@ -0,0 +1,25 @@
+service = $adminService;
+ }
+
+ public function create(AdminRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(AdminRequest $request)
+ {
+ return $this->updateService($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/Rabc/AdminMenuController.php b/app/Modules/Admin/Http/Controllers/Rabc/AdminMenuController.php
new file mode 100644
index 0000000000000000000000000000000000000000..40d95e9aab972383567b2f44b2320092746ee87e
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/Rabc/AdminMenuController.php
@@ -0,0 +1,25 @@
+service = $adminMenuService;
+ }
+
+ public function create(AdminMenuRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(AdminMenuRequest $request)
+ {
+ return $this->updateService($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/Rabc/AdminRoleController.php b/app/Modules/Admin/Http/Controllers/Rabc/AdminRoleController.php
new file mode 100644
index 0000000000000000000000000000000000000000..5ff9f1eb1cf0e7e61ca7b3de70ab1fffd4f7f195
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/Rabc/AdminRoleController.php
@@ -0,0 +1,25 @@
+service = $adminRoleService;
+ }
+
+ public function create(AdminRoleRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(AdminRoleRequest $request)
+ {
+ return $this->updateService($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/System/BannerController.php b/app/Modules/Admin/Http/Controllers/System/BannerController.php
new file mode 100644
index 0000000000000000000000000000000000000000..11598c26f11286fec96550bee6994091901746f9
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/System/BannerController.php
@@ -0,0 +1,25 @@
+service = $bannerService;
+ }
+
+ public function create(BannerRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(BannerRequest $request)
+ {
+ return $this->updateService($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/System/ConfigController.php b/app/Modules/Admin/Http/Controllers/System/ConfigController.php
new file mode 100644
index 0000000000000000000000000000000000000000..3ab6f3097d634a227194b8f3f49cb08b276030df
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/System/ConfigController.php
@@ -0,0 +1,59 @@
+service = $configService;
+ }
+
+ public function create(ConfigRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(ConfigRequest $request)
+ {
+ return $this->updateService($request);
+ }
+
+ public function getConfigGroupType()
+ {
+ $config_type_list = $config_group_list = [];
+ $config_group = cnpscy_config('config_group_list');
+ foreach ($config_group as $key => $value){
+ $config_group_list[] = [
+ 'value' => $key,
+ 'name' => $value,
+ ];
+ }
+ $config_type = cnpscy_config('config_type_list');
+ foreach ($config_type as $key => $value){
+ $config_type_list[] = [
+ 'value' => $key,
+ 'name' => $value,
+ ];
+ }
+ return $this->successJson([
+ 'config_group_list' => $config_group_list,
+ 'config_type_list' => $config_type_list,
+ ]);
+ }
+
+ /**
+ * 同步配置
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function pushRefreshConfig()
+ {
+ $this->service->pushRefreshConfig();
+ return $this->successJson([], '配置文件已同步成功!');
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/System/FriendlinkController.php b/app/Modules/Admin/Http/Controllers/System/FriendlinkController.php
new file mode 100644
index 0000000000000000000000000000000000000000..3cecbac7d3c3c04237fcbd46a67a004f1f52fe7c
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/System/FriendlinkController.php
@@ -0,0 +1,25 @@
+service = $friendlinkService;
+ }
+
+ public function create(FriendlinkRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(FriendlinkRequest $request)
+ {
+ return $this->updateService($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/System/ProtocolController.php b/app/Modules/Admin/Http/Controllers/System/ProtocolController.php
new file mode 100644
index 0000000000000000000000000000000000000000..86ab72687fbe6d13029afc39f9dbb93fbd922ddd
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/System/ProtocolController.php
@@ -0,0 +1,25 @@
+service = $protocolService;
+ }
+
+ public function create(ProtocolRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(ProtocolRequest $request)
+ {
+ return $this->updateService($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/System/VersionController.php b/app/Modules/Admin/Http/Controllers/System/VersionController.php
new file mode 100644
index 0000000000000000000000000000000000000000..768cfdb4db17d88e7c6d8fc60a3a55863a89716c
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/System/VersionController.php
@@ -0,0 +1,25 @@
+service = $versionService;
+ }
+
+ public function create(VersionRequest $request)
+ {
+ return $this->createService($request);
+ }
+
+ public function update(VersionRequest $request)
+ {
+ return $this->updateService($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Controllers/UploadController.php b/app/Modules/Admin/Http/Controllers/UploadController.php
new file mode 100644
index 0000000000000000000000000000000000000000..5277dc1110d46c53bb99f80ce692b5aa81b8ebc9
--- /dev/null
+++ b/app/Modules/Admin/Http/Controllers/UploadController.php
@@ -0,0 +1,31 @@
+file($file))){
+ return $this->errorJson('请上传文件!');
+ }
+
+ $path = $request->file($file)->storePublicly(
+ date('Ym'),
+ config('filesystems')
+ );
+
+ return $this->successJson($path, '上传成功', ['path_url' => Storage::url($path)]);
+ }
+}
diff --git a/app/Modules/Admin/Http/Middleware/.gitkeep b/app/Modules/Admin/Http/Middleware/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Http/Middleware/AdminLog.php b/app/Modules/Admin/Http/Middleware/AdminLog.php
new file mode 100644
index 0000000000000000000000000000000000000000..c07e6a39374f2679029621ef8af33da17cd52416
--- /dev/null
+++ b/app/Modules/Admin/Http/Middleware/AdminLog.php
@@ -0,0 +1,43 @@
+getMethod());
+
+ if ($method != 'GET'){
+ $ip_agent = get_client_info();
+ \App\Modules\Admin\Entities\Log\AdminLog::getInstance()->create([
+ 'request_data' => json_encode($request->all()),
+ 'admin_id' => !empty(auth($guard)->user()) ? auth($guard)->user()->admin_id : 0,
+ 'created_ip' => $ip_agent['ip'] ?? get_ip(),
+ 'browser_type' => $ip_agent['agent'] ?? $_SERVER['HTTP_USER_AGENT'],
+ 'created_time' => time(),
+ 'log_action' => request()->route()->getActionName(),
+ 'log_method' => $method,
+ 'log_duration' => microtime(true) - LARAVEL_START,
+ 'request_url' => URL::full() ?? get_this_url(),
+ ]);
+ }
+
+ return $resource;
+ }
+}
diff --git a/app/Modules/Admin/Http/Middleware/CheckAuth.php b/app/Modules/Admin/Http/Middleware/CheckAuth.php
new file mode 100644
index 0000000000000000000000000000000000000000..5e297bdf72e87fefedf2b09be0fce79bd94d0a80
--- /dev/null
+++ b/app/Modules/Admin/Http/Middleware/CheckAuth.php
@@ -0,0 +1,44 @@
+guard = 'admin';
+// // Auth认证
+// $auth = Auth()->guard($this->guard);
+// try {
+// if ( !$auth->check() ) { //未登录踢回,给予错误返回提示
+// return $this->errorJson('认证失败,请重新登录!');
+// }
+// } catch (TokenExpiredException $e) {
+// return $this->errorJson($e->getMessage());
+// } catch (TokenInvalidException $e) {
+// return $this->errorJson($e->getMessage());
+// } catch (JWTException $e) {
+// return $this->errorJson($e->getMessage());
+// }
+
+ return $next($request);
+ }
+}
diff --git a/app/Modules/Admin/Http/Middleware/CheckRabc.php b/app/Modules/Admin/Http/Middleware/CheckRabc.php
new file mode 100644
index 0000000000000000000000000000000000000000..9940d4e27231768c342603b3f79c4eaac746def5
--- /dev/null
+++ b/app/Modules/Admin/Http/Middleware/CheckRabc.php
@@ -0,0 +1,64 @@
+guard = 'admin';
+// // 开始验证路由权限
+// if (!$this->checkRabc($request, Auth()->guard($this->guard)->user()->getAuthIdentifier(), $load_error)){
+// return $this->errorJson('无权限' . (empty($load_error) ? '!' : ',' . $load_error), -2);
+// }
+
+ return $next($request);
+ }
+
+ private function checkRabc($request, int $admin_id, &$load_error = ''):bool
+ {
+ // 超级管理员账户无需验证
+ if ($admin_id == 1) return true;
+
+ $roles = Admin::getInstance()->detail($admin_id)->roles->toArray();
+ if (empty($roles)) return false;
+ $role_ids = array_column($roles, 'role_id');
+ if (empty($role_ids)) return false;
+ $menu_ids = AdminRoleWithMenu::getInstance()->getMenuIdsByRoles($role_ids);
+ if (empty($menu_ids)) return false;
+ $menus = AdminMenu::getInstance()->getMenusByIdsForRabc($menu_ids)->toArray();
+ if (empty($menus)) return false;
+
+ // 获取当前路由
+ $route_path = $request->route()->uri();
+ // 检测是否存在当前API
+ if (isset($menus[$route_path])){
+ // 验证请求方式
+ if ($menus[$route_path] == $request->getMethod()){
+ return true;
+ }
+ $load_error = '请求方式有误!';
+ }
+ return false;
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/.gitkeep b/app/Modules/Admin/Http/Requests/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Http/Requests/Article/ArticleCategoryRequest.php b/app/Modules/Admin/Http/Requests/Article/ArticleCategoryRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c66d42132bab6e8e448f6c8a2b47772454a345f3
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/Article/ArticleCategoryRequest.php
@@ -0,0 +1,42 @@
+instance = ArticleCategory::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'category_name' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',category_name' . $this->validate_id
+ ],
+ 'category_sort' => [
+ 'required',
+ ]
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'category_name.required' => '请输入分类名称!',
+ 'category_name.max' => '分类名称字数不可超过 256!',
+ 'category_name.unique' => '分类名称已存在,请更换!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/Article/ArticleLabelRequest.php b/app/Modules/Admin/Http/Requests/Article/ArticleLabelRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc7dd143fe68ae64de3b717658d045c0480ea250
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/Article/ArticleLabelRequest.php
@@ -0,0 +1,39 @@
+instance = ArticleLabel::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'label_name' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',label_name' . $this->validate_id
+ ],
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'label_name.required' => '请输入标签名称!',
+ 'label_name.max' => '标签名称字数不可超过 256!',
+ 'label_name.unique' => '标签名称已存在,请更换!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/Article/ArticleRequest.php b/app/Modules/Admin/Http/Requests/Article/ArticleRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8336bf2cb7fd6966c0c69789bc98a6c6f5d0ef8e
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/Article/ArticleRequest.php
@@ -0,0 +1,47 @@
+instance = Article::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'article_title' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',article_title' . $this->validate_id,
+ ],
+ 'category_id' => [
+ 'required',
+ ],
+ 'article_cover' => [
+ 'required',
+ ],
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'article_title.required' => '请输入文章标题!',
+ 'article_title.max' => '标题字数不可超过 256!',
+ 'article_title.unique' => '文章标题已存在,请更换!',
+ 'category_id.required' => '请选择文章分类!',
+ 'article_cover.required' => '请上传封面!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/BaseRequest.php b/app/Modules/Admin/Http/Requests/BaseRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..00711c4917e48c3a137ef9992ea7c724f53394fc
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/BaseRequest.php
@@ -0,0 +1,52 @@
+setInstance();
+ }
+
+ $this->setValidateId();
+ }
+
+ protected function setValidateId()
+ {
+ if ($this->instance){
+ $primarykey = $this->instance->getKeyName();
+ $this->validate_id = ',' . request()->input($primarykey, 0) . ',' . $primarykey . ($this->instance->getIsDelete() == 0 ? ',is_delete,0' : '');
+ }
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ //
+ ];
+ }
+
+ /**
+ * Determine if the user is authorized to make this request.
+ *
+ * @return bool
+ */
+ public function authorize()
+ {
+ return true;
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/LoginRequest.php b/app/Modules/Admin/Http/Requests/LoginRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b2b022d80b8f3e892bddecca248449c7075d54bd
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/LoginRequest.php
@@ -0,0 +1,27 @@
+ 'required',
+ 'password' => 'required',
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'admin_name.required' => '管理员账户为必填项!',
+ 'password.required' => '管理员密码为必填项!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/Rabc/AdminMenuRequest.php b/app/Modules/Admin/Http/Requests/Rabc/AdminMenuRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..be8ffb659eef03e72fbf7d6ea8324fe46fc2c904
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/Rabc/AdminMenuRequest.php
@@ -0,0 +1,37 @@
+instance = AdminMenu::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'menu_name' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',menu_name' . $this->validate_id
+ ],
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'menu_name.required' => '请输入菜单名称!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php b/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5b597501fd6c0babf76231f0a7cc79bf57accac0
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/Rabc/AdminRequest.php
@@ -0,0 +1,52 @@
+instance = Admin::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'admin_name' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',admin_name' . $this->validate_id
+ ],
+ 'admin_email' => [
+ 'required',
+ 'max:256',
+ 'email',
+ ],
+ 'password' => [
+// 'confirmed',
+ ],
+ 'password_confirmation' => [
+
+ ],
+ 'is_check' => [
+ 'required',
+ ]
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'admin_name.required' => '请输入管理员账户!',
+ 'password.confirmed' => '密码确认不匹配!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php b/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..c52ba766290b8f4f07b32d5a6a4fe0c610ac4abc
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/Rabc/AdminRoleRequest.php
@@ -0,0 +1,40 @@
+instance = AdminRole::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'role_name' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',role_name' . $this->validate_id
+ ],
+ 'is_check' => [
+ 'required',
+ ]
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'role_name.required' => '请输入角色名称!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/System/BannerRequest.php b/app/Modules/Admin/Http/Requests/System/BannerRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7671babe0a77db44e6e2420cfcd2d734cd321101
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/System/BannerRequest.php
@@ -0,0 +1,41 @@
+instance = Banner::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'banner_title' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',banner_title' . $this->validate_id
+ ],
+ 'banner_cover' => [
+ 'required',
+ ]
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'banner_title.required' => '请输入Banner标题!',
+ 'banner_cover.required' => '请上传Banner封面!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/System/ConfigRequest.php b/app/Modules/Admin/Http/Requests/System/ConfigRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ba37ccb02d780dba704e8699bbd346a81f346b23
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/System/ConfigRequest.php
@@ -0,0 +1,42 @@
+instance = Config::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'config_title' => [
+ 'required',
+ 'max:256',
+ ],
+ 'config_name' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',config_name' . $this->validate_id
+ ]
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'config_title.required' => '请输入配置标题!',
+ 'config_name.required' => '请输入配置标识!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/System/FriendlinkRequest.php b/app/Modules/Admin/Http/Requests/System/FriendlinkRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf1248a769e297e09bcfb60473dd75ec5f0d069f
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/System/FriendlinkRequest.php
@@ -0,0 +1,50 @@
+instance = Friendlink::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'link_name' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',link_name' . $this->validate_id
+ ],
+ 'link_url' => [
+ 'url',
+ ],
+ 'link_cover' => [
+ 'required',
+ ],
+ 'link_sort' => [
+ 'required',
+ ],
+ 'is_check' => [
+ 'required',
+ ]
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'link_name.required' => '请输入友链名称!',
+ 'link_cover.required' => '请上传友链图标!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/System/ProtocolRequest.php b/app/Modules/Admin/Http/Requests/System/ProtocolRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..d339d534cac23cf2c6564aa5f65741833ea53f4d
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/System/ProtocolRequest.php
@@ -0,0 +1,47 @@
+instance = Protocol::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'protocol_name' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',protocol_name' . $this->validate_id
+ ],
+ 'protocol_type' => [
+ 'required',
+ ],
+ 'protocol_content' => [
+ 'required',
+ ],
+ 'is_check' => [
+ 'required',
+ ]
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'protocol_name.required' => '请输入版本名称!',
+ 'protocol_type.required' => '请输入版本号!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Http/Requests/System/VersionRequest.php b/app/Modules/Admin/Http/Requests/System/VersionRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..33e84159ba4cb13f50ac7029608e5e7c92965fba
--- /dev/null
+++ b/app/Modules/Admin/Http/Requests/System/VersionRequest.php
@@ -0,0 +1,55 @@
+instance = Version::getInstance();
+ }
+
+ /**
+ * Get the validation rules that apply to the request.
+ *
+ * @return array
+ */
+ public function rules()
+ {
+ return [
+ 'version_name' => [
+ 'required',
+ 'max:256',
+ 'unique:' . $this->instance->getTable() . ',version_name' . $this->validate_id,
+ ],
+ 'version_number' => [
+ 'required',
+ 'unique:' . $this->instance->getTable() . ',version_number' . $this->validate_id,
+ ],
+ 'publish_date' => [
+ 'date_format:Y-m-d H:i:s'
+ ],
+ 'version_content' => [
+ 'required',
+ ],
+ 'version_sort' => [
+ 'min:0',
+ ],
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'version_name.required' => '请输入版本名称!',
+ 'version_name.unique' => '版本名称已存在,请更换!',
+ 'version_number.required' => '请输入版本号!',
+ 'version_number.unique' => '版本号已存在,请更换!',
+ 'publish_date.date_format' => '请选择有效的发布时间!',
+ 'version_content.required' => '请输入版本内容!',
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Providers/.gitkeep b/app/Modules/Admin/Providers/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Providers/AdminServiceProvider.php b/app/Modules/Admin/Providers/AdminServiceProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c6c1031999a7994d38464d401d1d451650df7cc
--- /dev/null
+++ b/app/Modules/Admin/Providers/AdminServiceProvider.php
@@ -0,0 +1,112 @@
+registerTranslations();
+ $this->registerConfig();
+ $this->registerViews();
+ $this->loadMigrationsFrom(module_path($this->moduleName, 'Database/Migrations'));
+ }
+
+ /**
+ * Register the service provider.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $this->app->register(RouteServiceProvider::class);
+ }
+
+ /**
+ * Register config.
+ *
+ * @return void
+ */
+ protected function registerConfig()
+ {
+ $this->publishes([
+ module_path($this->moduleName, 'Config/config.php') => config_path($this->moduleNameLower . '.php'),
+ ], 'config');
+ $this->mergeConfigFrom(
+ module_path($this->moduleName, 'Config/config.php'), $this->moduleNameLower
+ );
+ }
+
+ /**
+ * Register views.
+ *
+ * @return void
+ */
+ public function registerViews()
+ {
+ $viewPath = resource_path('views/modules/' . $this->moduleNameLower);
+
+ $sourcePath = module_path($this->moduleName, 'Resources/views');
+
+ $this->publishes([
+ $sourcePath => $viewPath
+ ], ['views', $this->moduleNameLower . '-module-views']);
+
+ $this->loadViewsFrom(array_merge($this->getPublishableViewPaths(), [$sourcePath]), $this->moduleNameLower);
+ }
+
+ /**
+ * Register translations.
+ *
+ * @return void
+ */
+ public function registerTranslations()
+ {
+ $langPath = resource_path('lang/modules/' . $this->moduleNameLower);
+
+ if (is_dir($langPath)) {
+ $this->loadTranslationsFrom($langPath, $this->moduleNameLower);
+ } else {
+ $this->loadTranslationsFrom(module_path($this->moduleName, 'Resources/lang'), $this->moduleNameLower);
+ }
+ }
+
+ /**
+ * Get the services provided by the provider.
+ *
+ * @return array
+ */
+ public function provides()
+ {
+ return [];
+ }
+
+ private function getPublishableViewPaths(): array
+ {
+ $paths = [];
+ foreach (\Config::get('view.paths') as $path) {
+ if (is_dir($path . '/modules/' . $this->moduleNameLower)) {
+ $paths[] = $path . '/modules/' . $this->moduleNameLower;
+ }
+ }
+ return $paths;
+ }
+}
diff --git a/app/Modules/Admin/Providers/RouteServiceProvider.php b/app/Modules/Admin/Providers/RouteServiceProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d654862f345a3f2fdd8c45452e1ffa518f95b3b
--- /dev/null
+++ b/app/Modules/Admin/Providers/RouteServiceProvider.php
@@ -0,0 +1,69 @@
+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->moduleNamespace)
+ ->group(module_path('Admin', '/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->moduleNamespace)
+ ->group(module_path('Admin', '/Routes/api.php'));
+ }
+}
diff --git a/app/Modules/Admin/Resources/assets/.gitkeep b/app/Modules/Admin/Resources/assets/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Resources/assets/js/app.js b/app/Modules/Admin/Resources/assets/js/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Resources/assets/sass/app.scss b/app/Modules/Admin/Resources/assets/sass/app.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Resources/lang/.gitkeep b/app/Modules/Admin/Resources/lang/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Resources/views/.gitkeep b/app/Modules/Admin/Resources/views/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Resources/views/admin.blade.php b/app/Modules/Admin/Resources/views/admin.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..1ff0628a33ee6ce2bcfd9a333e22bffeaa73923d
--- /dev/null
+++ b/app/Modules/Admin/Resources/views/admin.blade.php
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+ Title
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/views/index.blade.php b/app/Modules/Admin/Resources/views/index.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..4ae9069cd0d33d0f87bdc59ffe18624e040e920c
--- /dev/null
+++ b/app/Modules/Admin/Resources/views/index.blade.php
@@ -0,0 +1,9 @@
+@extends('admin::layouts.master')
+
+@section('content')
+ Hello World
+
+
+ This view is loaded from module: {!! config('admin.name') !!}
+
+@endsection
diff --git a/app/Modules/Admin/Resources/views/layouts/master.blade.php b/app/Modules/Admin/Resources/views/layouts/master.blade.php
new file mode 100644
index 0000000000000000000000000000000000000000..b09a67f07881aefda4e58287f186933685b65537
--- /dev/null
+++ b/app/Modules/Admin/Resources/views/layouts/master.blade.php
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ Module Admin
+
+ {{-- Laravel Mix - CSS File --}}
+ {{-- --}}
+
+
+
+ @yield('content')
+
+ {{-- Laravel Mix - JS File --}}
+ {{-- --}}
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/App.vue b/app/Modules/Admin/Resources/vue-element-admin/App.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ec9032c1c638e918ec97e413aa081993a95048f4
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/App.vue
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/.idea/api.iml b/app/Modules/Admin/Resources/vue-element-admin/api/.idea/api.iml
new file mode 100644
index 0000000000000000000000000000000000000000..d6ebd4805981b8400db3e3291c74a743fef9a824
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/.idea/api.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/.idea/misc.xml b/app/Modules/Admin/Resources/vue-element-admin/api/.idea/misc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7e5bdf89fec4690a0218e8d99983b379c8218059
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/.idea/misc.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/.idea/modules.xml b/app/Modules/Admin/Resources/vue-element-admin/api/.idea/modules.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d50cf45fff2a9543c62b951c0f04316cf6df042a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/.idea/vcs.xml b/app/Modules/Admin/Resources/vue-element-admin/api/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..821e530ddc3b630be065c610c6d0f2f9dfba9472
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/.idea/workspace.xml b/app/Modules/Admin/Resources/vue-element-admin/api/.idea/workspace.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4b8a53ee641cc2abdd751d3ebf4564f11c2c9ddf
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/.idea/workspace.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1610455420023
+
+
+ 1610455420023
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/admin_menus.js b/app/Modules/Admin/Resources/vue-element-admin/api/admin_menus.js
new file mode 100644
index 0000000000000000000000000000000000000000..05c2fd5946f643e006273ab9e80851c10f2e6f82
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/admin_menus.js
@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+
+export function getMenusSelect() {
+ return request({
+ url: '/admin_menus/getSelectLists',
+ method: 'get'
+ })
+}
+
+export function getList(params) {
+ return request({
+ url: 'admin_menus',
+ method: 'get',
+ params
+ })
+}
+
+export function create(data) {
+ return request({
+ url: '/admin_menus/create',
+ method: 'post',
+ data
+ })
+}
+
+export function update(data) {
+ return request({
+ url: `/admin_menus/update`,
+ method: 'put',
+ data
+ })
+}
+
+export function setDel(data) {
+ return request({
+ url: `/admin_menus/delete`,
+ method: 'delete',
+ data
+ })
+}
+
+export function changeFiledStatus(data) {
+ return request({
+ url: `/admin_menus/changeFiledStatus`,
+ method: 'put',
+ data
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/admin_roles.js b/app/Modules/Admin/Resources/vue-element-admin/api/admin_roles.js
new file mode 100644
index 0000000000000000000000000000000000000000..150c68079d4193d4af9e84e953ee45de16c08cad
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/admin_roles.js
@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+
+export function getRolesSelect() {
+ return request({
+ url: '/admin_roles/getSelectLists',
+ method: 'get'
+ })
+}
+
+export function getList(params) {
+ return request({
+ url: 'admin_roles',
+ method: 'get',
+ params
+ })
+}
+
+export function create(data) {
+ return request({
+ url: '/admin_roles/create',
+ method: 'post',
+ data
+ })
+}
+
+export function update(data) {
+ return request({
+ url: `/admin_roles/update`,
+ method: 'put',
+ data
+ })
+}
+
+export function setDel(data) {
+ return request({
+ url: `/admin_roles/delete`,
+ method: 'delete',
+ data
+ })
+}
+
+export function changeFiledStatus(data) {
+ return request({
+ url: `/admin_roles/changeFiledStatus`,
+ method: 'put',
+ data
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/adminloginlogs.js b/app/Modules/Admin/Resources/vue-element-admin/api/adminloginlogs.js
new file mode 100644
index 0000000000000000000000000000000000000000..2e3fea3b57442fcc4c596752398af06a4085092d
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/adminloginlogs.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+export function getList(params) {
+ return request({
+ url: 'adminloginlogs',
+ method: 'get',
+ params
+ })
+}
+
+export function setDel(data) {
+ return request({
+ url: `/adminloginlogs/delete`,
+ method: 'delete',
+ data
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/adminlogs.js b/app/Modules/Admin/Resources/vue-element-admin/api/adminlogs.js
new file mode 100644
index 0000000000000000000000000000000000000000..c303f103dcea0b4a0575fabd1f430d1351738db5
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/adminlogs.js
@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+export function getList(params) {
+ return request({
+ url: 'adminlogs',
+ method: 'get',
+ params
+ })
+}
+
+export function setDel(data) {
+ return request({
+ url: `/adminlogs/delete`,
+ method: 'delete',
+ data
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/admins.js b/app/Modules/Admin/Resources/vue-element-admin/api/admins.js
new file mode 100644
index 0000000000000000000000000000000000000000..201bbe3451f0e5874739e9ad5abe3f08b2de6f47
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/admins.js
@@ -0,0 +1,57 @@
+import request from '@/utils/request'
+
+export function getAdminsSelect(params) {
+ return request({
+ url: '/admins/getSelectLists',
+ method: 'get',
+ params
+ });
+}
+
+export function getList(params) {
+ return request({
+ url: 'admins',
+ method: 'get',
+ params
+ })
+}
+
+// export function detail(data) {
+// return request({
+// url: '/admins/detail',
+// method: 'post',
+// data
+// })
+// }
+
+export function create(data) {
+ return request({
+ url: '/admins/create',
+ method: 'post',
+ data
+ })
+}
+
+export function update(data) {
+ return request({
+ url: `/admins/update`,
+ method: 'put',
+ data
+ })
+}
+
+export function setDel(data) {
+ return request({
+ url: `/admins/delete`,
+ method: 'delete',
+ data
+ })
+}
+
+export function changeFiledStatus(data) {
+ return request({
+ url: `/admins/changeFiledStatus`,
+ method: 'put',
+ data
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/article_categories.js b/app/Modules/Admin/Resources/vue-element-admin/api/article_categories.js
new file mode 100644
index 0000000000000000000000000000000000000000..99b3a5d6ba213a7112f16b63587021537d195e30
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/article_categories.js
@@ -0,0 +1,48 @@
+import request from '@/utils/request'
+
+export function getCategorySelect() {
+ return request({
+ url: '/article_categories/getSelectLists',
+ method: 'get'
+ })
+}
+
+export function getList(params) {
+ return request({
+ url: 'article_categories',
+ method: 'get',
+ params
+ })
+}
+
+export function create(data) {
+ return request({
+ url: '/article_categories/create',
+ method: 'post',
+ data
+ })
+}
+
+export function update(data) {
+ return request({
+ url: `/article_categories/update`,
+ method: 'put',
+ data
+ })
+}
+
+export function setDel(data) {
+ return request({
+ url: `/article_categories/delete`,
+ method: 'delete',
+ data
+ })
+}
+
+export function changeFiledStatus(data) {
+ return request({
+ url: `/article_categories/changeFiledStatus`,
+ method: 'put',
+ data
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/article_labels.js b/app/Modules/Admin/Resources/vue-element-admin/api/article_labels.js
new file mode 100644
index 0000000000000000000000000000000000000000..ebc012661ce2950d43e8bbc45000299467ee964d
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/article_labels.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export function getArticleLabelSelect(params) {
+ return request({
+ url: '/article_labels/getSelectLists',
+ method: 'get',
+ params
+ });
+}
+
+export function getList(params) {
+ return request({
+ url: '/article_labels',
+ method: 'get',
+ params
+ });
+}
+
+export function create(data) {
+ return request({
+ url: '/article_labels/create',
+ method: 'post',
+ data
+ });
+}
+
+export function update(data) {
+ return request({
+ url: '/article_labels/update',
+ method: 'put',
+ data
+ });
+}
+
+export function setDel(data) {
+ return request({
+ url: '/article_labels/delete',
+ method: 'delete',
+ data
+ });
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/articles.js b/app/Modules/Admin/Resources/vue-element-admin/api/articles.js
new file mode 100644
index 0000000000000000000000000000000000000000..74cc0609b1164390c044ec44598088f84f03352d
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/articles.js
@@ -0,0 +1,56 @@
+import request from '@/utils/request'
+
+export function getCategoriesSelect() {
+ return request({
+ url: '/article_categories/getSelectLists',
+ method: 'get'
+ })
+}
+
+export function getList(params) {
+ return request({
+ url: 'articles',
+ method: 'get',
+ params
+ })
+}
+
+export function detail(id) {
+ return request({
+ url: '/articles/detail',
+ method: 'get',
+ params: { article_id:id }
+ })
+}
+
+export function create(data) {
+ return request({
+ url: '/articles/create',
+ method: 'post',
+ data
+ })
+}
+
+export function update(data) {
+ return request({
+ url: `/articles/update`,
+ method: 'put',
+ data
+ })
+}
+
+export function setDel(data) {
+ return request({
+ url: `/articles/delete`,
+ method: 'delete',
+ data
+ })
+}
+
+export function changeFiledStatus(data) {
+ return request({
+ url: '/articles/changeFiledStatus',
+ method: 'put',
+ data
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/banners.js b/app/Modules/Admin/Resources/vue-element-admin/api/banners.js
new file mode 100644
index 0000000000000000000000000000000000000000..188f87d583b16875db4d23b0a4764bf3e22c3495
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/banners.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export function getList(params) {
+ return request({
+ url: '/banners',
+ method: 'get',
+ params
+ });
+}
+
+export function create(data) {
+ return request({
+ url: '/banners/create',
+ method: 'post',
+ data
+ });
+}
+
+export function update(data) {
+ return request({
+ url: '/banners/update',
+ method: 'put',
+ data
+ });
+}
+
+export function setDel(data) {
+ return request({
+ url: '/banners/delete',
+ method: 'delete',
+ data
+ });
+}
+
+export function changeFiledStatus(data) {
+ return request({
+ url: '/banners/changeFiledStatus',
+ method: 'put',
+ data
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/common.js b/app/Modules/Admin/Resources/vue-element-admin/api/common.js
new file mode 100644
index 0000000000000000000000000000000000000000..7f287edce0f7eff0f3a14c7a4a4486b256e459d9
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/common.js
@@ -0,0 +1,16 @@
+import request from '@/utils/request'
+
+export function getUploadUrl() {
+ return process.env.VUE_APP_BASE_API + '/upload_file'
+}
+
+export function getBatchUploadUrl() {
+ return process.env.VUE_APP_BASE_API + '/upload_files'
+}
+
+export function getMonthLists() {
+ return request({
+ url: '/get_month_lists',
+ method: 'get'
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/configs.js b/app/Modules/Admin/Resources/vue-element-admin/api/configs.js
new file mode 100644
index 0000000000000000000000000000000000000000..4a9b2fa72b387da34999ff24cbcffc0fe0221629
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/configs.js
@@ -0,0 +1,65 @@
+import request from '@/utils/request'
+
+export function getList(query) {
+ return request({
+ url: '/configs',
+ method: 'get',
+ params: query
+ })
+}
+
+// 获取配置分组与配置类型
+export function getConfigGroupType() {
+ return request({
+ url: '/configs/getConfigGroupType',
+ method: 'get',
+ })
+}
+
+export function detail(id) {
+ return request({
+ url: '/configs/detail',
+ method: 'get',
+ params: { config_id:id }
+ })
+}
+
+export function create(data) {
+ return request({
+ url: '/configs/create',
+ method: 'post',
+ data
+ })
+}
+
+export function update(data) {
+ return request({
+ url: '/configs/update',
+ method: 'put',
+ data
+ })
+}
+
+export function setDel(data) {
+ return request({
+ url: '/configs/delete',
+ method: 'delete',
+ data
+ })
+}
+
+export function changeFiledStatus(data) {
+ return request({
+ url: '/configs/changeFiledStatus',
+ method: 'put',
+ data
+ })
+}
+
+// 同步配置文件
+export function pushRefreshConfig() {
+ return request({
+ url: '/configs/pushRefreshConfig',
+ method: 'put',
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/friendlinks.js b/app/Modules/Admin/Resources/vue-element-admin/api/friendlinks.js
new file mode 100644
index 0000000000000000000000000000000000000000..7635f0979f31f71060e0b9c3ec9cba04de9cf014
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/friendlinks.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export function getList(params) {
+ return request({
+ url: '/friendlinks',
+ method: 'get',
+ params
+ })
+}
+
+export function create(data) {
+ return request({
+ url: '/friendlinks/create',
+ method: 'post',
+ data
+ })
+}
+
+export function update(data) {
+ return request({
+ url: '/friendlinks/update',
+ method: 'put',
+ data
+ })
+}
+
+export function setDel(data) {
+ return request({
+ url: '/friendlinks/delete',
+ method: 'delete',
+ data
+ })
+}
+
+export function changeFiledStatus(data) {
+ return request({
+ url: '/friendlinks/changeFiledStatus',
+ method: 'put',
+ data
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js b/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js
new file mode 100644
index 0000000000000000000000000000000000000000..44a4d46ab5d6a13a9d6dadca224fa21689021a77
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/indexs.js
@@ -0,0 +1,42 @@
+import request from '@/utils/request'
+
+// 首页 - 基础统计数据
+export function statistics() {
+ return request({
+ url: '/indexs',
+ method: 'get'
+ })
+}
+
+// 首页 - 请求日志统计表数据
+export function logsStatistics() {
+ return request({
+ url: '/logsStatistics',
+ method: 'get'
+ })
+}
+
+// 编辑登录管理员信息
+export function updateAdmin(data) {
+ return request({
+ url: '/updateAdmin',
+ method: 'put',
+ data,
+ })
+}
+
+// 版本历史记录
+export function versionLogs() {
+ return request({
+ url: '/versionLogs',
+ method: 'get',
+ })
+}
+
+// 服务器状态
+export function getServerStatus() {
+ return request({
+ url: '/getServerStatus',
+ method: 'get',
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/login.js b/app/Modules/Admin/Resources/vue-element-admin/api/login.js
new file mode 100644
index 0000000000000000000000000000000000000000..13124efabd22c77bc0907f7ff6a5688a3bf54315
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/login.js
@@ -0,0 +1,30 @@
+import request from '@/utils/request'
+
+export function login(data) {
+ return request({
+ url: '/auth/login',
+ method: 'post',
+ data
+ })
+}
+
+export function getInfo() {
+ return request({
+ url: '/auth/me',
+ method: 'post'
+ })
+}
+
+export function getMenus() {
+ return request({
+ url: '/auth/getRabcList',
+ method: 'post'
+ })
+}
+
+export function logout() {
+ return request({
+ url: '/auth/logout',
+ method: 'post'
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/api/versions.js b/app/Modules/Admin/Resources/vue-element-admin/api/versions.js
new file mode 100644
index 0000000000000000000000000000000000000000..0abb5508998118cee6aac38370b3e6f06f1990d5
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/api/versions.js
@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+export function getList(params) {
+ return request({
+ url: '/versions',
+ method: 'get',
+ params
+ });
+}
+
+export function create(data) {
+ return request({
+ url: '/versions/create',
+ method: 'post',
+ data
+ });
+}
+
+export function update(data) {
+ return request({
+ url: '/versions/update',
+ method: 'put',
+ data
+ });
+}
+
+export function setDel(data) {
+ return request({
+ url: '/versions/delete',
+ method: 'delete',
+ data
+ });
+}
+
+export function changeFiledStatus(data) {
+ return request({
+ url: '/versions/changeFiledStatus',
+ method: 'put',
+ data
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/assets/401_images/401.gif b/app/Modules/Admin/Resources/vue-element-admin/assets/401_images/401.gif
new file mode 100644
index 0000000000000000000000000000000000000000..cd6e0d9433421b3f29d0ec0c40f755e354728000
Binary files /dev/null and b/app/Modules/Admin/Resources/vue-element-admin/assets/401_images/401.gif differ
diff --git a/app/Modules/Admin/Resources/vue-element-admin/assets/404_images/404.png b/app/Modules/Admin/Resources/vue-element-admin/assets/404_images/404.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d8e2305cc973ad2121403aee4bf08728f76c461
Binary files /dev/null and b/app/Modules/Admin/Resources/vue-element-admin/assets/404_images/404.png differ
diff --git a/app/Modules/Admin/Resources/vue-element-admin/assets/404_images/404_cloud.png b/app/Modules/Admin/Resources/vue-element-admin/assets/404_images/404_cloud.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6281d09013e0a2c5f8e699a0a6038d9480291e5
Binary files /dev/null and b/app/Modules/Admin/Resources/vue-element-admin/assets/404_images/404_cloud.png differ
diff --git a/app/Modules/Admin/Resources/vue-element-admin/assets/custom-theme/fonts/element-icons.ttf b/app/Modules/Admin/Resources/vue-element-admin/assets/custom-theme/fonts/element-icons.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..570a3e11b2f002c146d7fdc20528951442f6fd93
Binary files /dev/null and b/app/Modules/Admin/Resources/vue-element-admin/assets/custom-theme/fonts/element-icons.ttf differ
diff --git a/app/Modules/Admin/Resources/vue-element-admin/assets/custom-theme/fonts/element-icons.woff b/app/Modules/Admin/Resources/vue-element-admin/assets/custom-theme/fonts/element-icons.woff
new file mode 100644
index 0000000000000000000000000000000000000000..c2bcc00509acd81fe152f08f39eef93984a0453a
Binary files /dev/null and b/app/Modules/Admin/Resources/vue-element-admin/assets/custom-theme/fonts/element-icons.woff differ
diff --git a/app/Modules/Admin/Resources/vue-element-admin/assets/custom-theme/index.css b/app/Modules/Admin/Resources/vue-element-admin/assets/custom-theme/index.css
new file mode 100644
index 0000000000000000000000000000000000000000..dcdb9c1cdc3cc7df1de1d352c9fa1df9845f7421
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/assets/custom-theme/index.css
@@ -0,0 +1,22420 @@
+@charset "UTF-8";
+.custom-theme .fade-in-linear-enter-active, .custom-theme .fade-in-linear-leave-active {
+ -webkit-transition: opacity .2s linear;
+ transition: opacity .2s linear
+}
+
+.custom-theme .fade-in-linear-enter, .custom-theme .fade-in-linear-leave, .custom-theme .fade-in-linear-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-fade-in-linear-enter-active, .custom-theme .el-fade-in-linear-leave-active {
+ -webkit-transition: opacity .2s linear;
+ transition: opacity .2s linear
+}
+
+.custom-theme .el-fade-in-linear-enter, .custom-theme .el-fade-in-linear-leave, .custom-theme .el-fade-in-linear-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-fade-in-enter-active, .custom-theme .el-fade-in-leave-active {
+ -webkit-transition: all .3s cubic-bezier(.55, 0, .1, 1);
+ transition: all .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-fade-in-enter, .custom-theme .el-fade-in-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-zoom-in-center-enter-active, .custom-theme .el-zoom-in-center-leave-active {
+ -webkit-transition: all .3s cubic-bezier(.55, 0, .1, 1);
+ transition: all .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-zoom-in-center-enter, .custom-theme .el-zoom-in-center-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleX(0);
+ transform: scaleX(0)
+}
+
+.custom-theme .el-zoom-in-top-enter-active, .custom-theme .el-zoom-in-top-leave-active {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: center top;
+ transform-origin: center top
+}
+
+.custom-theme .el-zoom-in-top-enter, .custom-theme .el-zoom-in-top-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0)
+}
+
+.custom-theme .el-zoom-in-bottom-enter-active, .custom-theme .el-zoom-in-bottom-leave-active {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom
+}
+
+.custom-theme .el-zoom-in-bottom-enter, .custom-theme .el-zoom-in-bottom-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0)
+}
+
+.custom-theme .el-zoom-in-left-enter-active, .custom-theme .el-zoom-in-left-leave-active {
+ opacity: 1;
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: top left;
+ transform-origin: top left
+}
+
+.custom-theme .el-zoom-in-left-enter, .custom-theme .el-zoom-in-left-leave-active {
+ opacity: 0;
+ -webkit-transform: scale(.45, .45);
+ transform: scale(.45, .45)
+}
+
+.custom-theme .collapse-transition {
+ -webkit-transition: .3s height ease-in-out, .3s padding-top ease-in-out, .3s padding-bottom ease-in-out;
+ transition: .3s height ease-in-out, .3s padding-top ease-in-out, .3s padding-bottom ease-in-out
+}
+
+.custom-theme .horizontal-collapse-transition {
+ -webkit-transition: .3s width ease-in-out, .3s padding-left ease-in-out, .3s padding-right ease-in-out;
+ transition: .3s width ease-in-out, .3s padding-left ease-in-out, .3s padding-right ease-in-out
+}
+
+.custom-theme .el-list-enter-active, .custom-theme .el-list-leave-active {
+ -webkit-transition: all 1s;
+ transition: all 1s
+}
+
+.custom-theme .el-list-enter, .custom-theme .el-list-leave-active {
+ opacity: 0;
+ -webkit-transform: translateY(-30px);
+ transform: translateY(-30px)
+}
+
+.custom-theme .el-opacity-transition {
+ -webkit-transition: opacity .3s cubic-bezier(.55, 0, .1, 1);
+ transition: opacity .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+@font-face {
+ font-family: element-icons;
+ src: url(fonts/element-icons.woff?t=1508751886602) format("woff"), url(fonts/element-icons.ttf?t=1508751886602) format("truetype");
+ font-weight: 400;
+ font-style: normal
+}
+
+.custom-theme [class*=" el-icon-"], .custom-theme [class^=el-icon-] {
+ font-family: element-icons !important;
+ speak: none;
+ font-style: normal;
+ font-weight: 400;
+ font-variant: normal;
+ text-transform: none;
+ line-height: 1;
+ vertical-align: baseline;
+ display: inline-block;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale
+}
+
+.custom-theme .el-icon-upload:before {
+ content: "\e60d"
+}
+
+.custom-theme .el-icon-error:before {
+ content: "\e62c"
+}
+
+.custom-theme .el-icon-success:before {
+ content: "\e62d"
+}
+
+.custom-theme .el-icon-warning:before {
+ content: "\e62e"
+}
+
+.custom-theme .el-icon-sort-down:before {
+ content: "\e630"
+}
+
+.custom-theme .el-icon-sort-up:before {
+ content: "\e631"
+}
+
+.custom-theme .el-icon-arrow-left:before {
+ content: "\e600"
+}
+
+.custom-theme .el-icon-circle-plus:before {
+ content: "\e601"
+}
+
+.custom-theme .el-icon-circle-plus-outline:before {
+ content: "\e602"
+}
+
+.custom-theme .el-icon-arrow-down:before {
+ content: "\e603"
+}
+
+.custom-theme .el-icon-arrow-right:before {
+ content: "\e604"
+}
+
+.custom-theme .el-icon-arrow-up:before {
+ content: "\e605"
+}
+
+.custom-theme .el-icon-back:before {
+ content: "\e606"
+}
+
+.custom-theme .el-icon-circle-close:before {
+ content: "\e607"
+}
+
+.custom-theme .el-icon-date:before {
+ content: "\e608"
+}
+
+.custom-theme .el-icon-circle-close-outline:before {
+ content: "\e609"
+}
+
+.custom-theme .el-icon-caret-left:before {
+ content: "\e60a"
+}
+
+.custom-theme .el-icon-caret-bottom:before {
+ content: "\e60b"
+}
+
+.custom-theme .el-icon-caret-top:before {
+ content: "\e60c"
+}
+
+.custom-theme .el-icon-caret-right:before {
+ content: "\e60e"
+}
+
+.custom-theme .el-icon-close:before {
+ content: "\e60f"
+}
+
+.custom-theme .el-icon-d-arrow-left:before {
+ content: "\e610"
+}
+
+.custom-theme .el-icon-check:before {
+ content: "\e611"
+}
+
+.custom-theme .el-icon-delete:before {
+ content: "\e612"
+}
+
+.custom-theme .el-icon-d-arrow-right:before {
+ content: "\e613"
+}
+
+.custom-theme .el-icon-document:before {
+ content: "\e614"
+}
+
+.custom-theme .el-icon-d-caret:before {
+ content: "\e615"
+}
+
+.custom-theme .el-icon-edit-outline:before {
+ content: "\e616"
+}
+
+.custom-theme .el-icon-download:before {
+ content: "\e617"
+}
+
+.custom-theme .el-icon-goods:before {
+ content: "\e618"
+}
+
+.custom-theme .el-icon-search:before {
+ content: "\e619"
+}
+
+.custom-theme .el-icon-info:before {
+ content: "\e61a"
+}
+
+.custom-theme .el-icon-message:before {
+ content: "\e61b"
+}
+
+.custom-theme .el-icon-edit:before {
+ content: "\e61c"
+}
+
+.custom-theme .el-icon-location:before {
+ content: "\e61d"
+}
+
+.custom-theme .el-icon-loading:before {
+ content: "\e61e"
+}
+
+.custom-theme .el-icon-location-outline:before {
+ content: "\e61f"
+}
+
+.custom-theme .el-icon-menu:before {
+ content: "\e620"
+}
+
+.custom-theme .el-icon-minus:before {
+ content: "\e621"
+}
+
+.custom-theme .el-icon-bell:before {
+ content: "\e622"
+}
+
+.custom-theme .el-icon-mobile-phone:before {
+ content: "\e624"
+}
+
+.custom-theme .el-icon-news:before {
+ content: "\e625"
+}
+
+.custom-theme .el-icon-more:before {
+ content: "\e646"
+}
+
+.custom-theme .el-icon-more-outline:before {
+ content: "\e626"
+}
+
+.custom-theme .el-icon-phone:before {
+ content: "\e627"
+}
+
+.custom-theme .el-icon-phone-outline:before {
+ content: "\e628"
+}
+
+.custom-theme .el-icon-picture:before {
+ content: "\e629"
+}
+
+.custom-theme .el-icon-picture-outline:before {
+ content: "\e62a"
+}
+
+.custom-theme .el-icon-plus:before {
+ content: "\e62b"
+}
+
+.custom-theme .el-icon-printer:before {
+ content: "\e62f"
+}
+
+.custom-theme .el-icon-rank:before {
+ content: "\e632"
+}
+
+.custom-theme .el-icon-refresh:before {
+ content: "\e633"
+}
+
+.custom-theme .el-icon-question:before {
+ content: "\e634"
+}
+
+.custom-theme .el-icon-remove:before {
+ content: "\e635"
+}
+
+.custom-theme .el-icon-share:before {
+ content: "\e636"
+}
+
+.custom-theme .el-icon-star-on:before {
+ content: "\e637"
+}
+
+.custom-theme .el-icon-setting:before {
+ content: "\e638"
+}
+
+.custom-theme .el-icon-circle-check:before {
+ content: "\e639"
+}
+
+.custom-theme .el-icon-service:before {
+ content: "\e63a"
+}
+
+.custom-theme .el-icon-sold-out:before {
+ content: "\e63b"
+}
+
+.custom-theme .el-icon-remove-outline:before {
+ content: "\e63c"
+}
+
+.custom-theme .el-icon-star-off:before {
+ content: "\e63d"
+}
+
+.custom-theme .el-icon-circle-check-outline:before {
+ content: "\e63e"
+}
+
+.custom-theme .el-icon-tickets:before {
+ content: "\e63f"
+}
+
+.custom-theme .el-icon-sort:before {
+ content: "\e640"
+}
+
+.custom-theme .el-icon-zoom-in:before {
+ content: "\e641"
+}
+
+.custom-theme .el-icon-time:before {
+ content: "\e642"
+}
+
+.custom-theme .el-icon-view:before {
+ content: "\e643"
+}
+
+.custom-theme .el-icon-upload2:before {
+ content: "\e644"
+}
+
+.custom-theme .el-icon-zoom-out:before {
+ content: "\e645"
+}
+
+.custom-theme .el-icon-loading {
+ -webkit-animation: rotating 2s linear infinite;
+ animation: rotating 2s linear infinite
+}
+
+.custom-theme .el-icon--right {
+ margin-left: 5px
+}
+
+.custom-theme .el-icon--left {
+ margin-right: 5px
+}
+
+@-webkit-keyframes rotating {
+ 0% {
+ -webkit-transform: rotateZ(0);
+ transform: rotateZ(0)
+ }
+ 100% {
+ -webkit-transform: rotateZ(360deg);
+ transform: rotateZ(360deg)
+ }
+}
+
+@keyframes rotating {
+ 0% {
+ -webkit-transform: rotateZ(0);
+ transform: rotateZ(0)
+ }
+ 100% {
+ -webkit-transform: rotateZ(360deg);
+ transform: rotateZ(360deg)
+ }
+}
+
+.custom-theme .el-popper .popper__arrow, .custom-theme .el-popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-popper .popper__arrow {
+ border-width: 6px;
+ -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03));
+ filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03))
+}
+
+.custom-theme .el-popper .popper__arrow::after {
+ content: " ";
+ border-width: 6px
+}
+
+.custom-theme .el-popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-color: #e6ebf5;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -6px;
+ border-top-color: #fff;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-width: 0;
+ border-bottom-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -6px;
+ border-top-width: 0;
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow {
+ top: 50%;
+ left: -6px;
+ margin-bottom: 3px;
+ border-right-color: #e6ebf5;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow::after {
+ bottom: -6px;
+ left: 1px;
+ border-right-color: #fff;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow {
+ top: 50%;
+ right: -6px;
+ margin-bottom: 3px;
+ border-right-width: 0;
+ border-left-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -6px;
+ margin-left: -6px;
+ border-right-width: 0;
+ border-left-color: #fff
+}
+
+.custom-theme .el-select-dropdown {
+ position: absolute;
+ z-index: 1001;
+ border: solid 1px #dfe4ed;
+ border-radius: 4px;
+ background-color: #fff;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 5px 0
+}
+
+.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected {
+ color: #262729;
+ background-color: #fff
+}
+
+.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover {
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {
+ position: absolute;
+ right: 20px;
+ font-family: element-icons;
+ content: "\E611";
+ font-size: 12px;
+ font-weight: 700;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale
+}
+
+.custom-theme .el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list {
+ padding: 0
+}
+
+.custom-theme .el-select-dropdown .popper__arrow {
+ -webkit-transform: translateX(-400%);
+ transform: translateX(-400%)
+}
+
+.custom-theme .el-select-dropdown.is-arrow-fixed .popper__arrow {
+ -webkit-transform: translateX(-200%);
+ transform: translateX(-200%)
+}
+
+.custom-theme .el-select-dropdown__empty {
+ padding: 10px 0;
+ margin: 0;
+ text-align: center;
+ color: #999;
+ font-size: 14px
+}
+
+.custom-theme .el-select-dropdown__wrap {
+ max-height: 274px
+}
+
+.custom-theme .el-select-dropdown__list {
+ list-style: none;
+ padding: 6px 0;
+ margin: 0;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-tag {
+ background-color: rgba(38, 39, 41, .1);
+ display: inline-block;
+ padding: 0 10px;
+ height: 32px;
+ line-height: 30px;
+ font-size: 12px;
+ color: #262729;
+ border-radius: 4px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid rgba(38, 39, 41, .2);
+ white-space: nowrap
+}
+
+.custom-theme .el-tag .el-icon-close {
+ border-radius: 50%;
+ text-align: center;
+ position: relative;
+ cursor: pointer;
+ font-size: 12px;
+ height: 18px;
+ width: 18px;
+ line-height: 18px;
+ vertical-align: middle;
+ top: -1px;
+ right: -5px;
+ color: #262729
+}
+
+.custom-theme .el-tag .el-icon-close::before {
+ display: block
+}
+
+.custom-theme .el-tag .el-icon-close:hover {
+ background-color: #262729;
+ color: #fff
+}
+
+.custom-theme .el-tag--info {
+ background-color: rgba(10, 118, 164, .1);
+ border-color: rgba(10, 118, 164, .2);
+ color: #0a76a4
+}
+
+.custom-theme .el-tag--info.is-hit {
+ border-color: #0a76a4
+}
+
+.custom-theme .el-tag--info .el-tag__close {
+ color: #0a76a4
+}
+
+.custom-theme .el-tag--info .el-tag__close:hover {
+ background-color: #0a76a4;
+ color: #fff
+}
+
+.custom-theme .el-tag--success {
+ background-color: rgba(64, 145, 103, .1);
+ border-color: rgba(64, 145, 103, .2);
+ color: #409167
+}
+
+.custom-theme .el-tag--success.is-hit {
+ border-color: #409167
+}
+
+.custom-theme .el-tag--success .el-tag__close {
+ color: #409167
+}
+
+.custom-theme .el-tag--success .el-tag__close:hover {
+ background-color: #409167;
+ color: #fff
+}
+
+.custom-theme .el-tag--warning {
+ background-color: rgba(157, 164, 8, .1);
+ border-color: rgba(157, 164, 8, .2);
+ color: #9da408
+}
+
+.custom-theme .el-tag--warning.is-hit {
+ border-color: #9da408
+}
+
+.custom-theme .el-tag--warning .el-tag__close {
+ color: #9da408
+}
+
+.custom-theme .el-tag--warning .el-tag__close:hover {
+ background-color: #9da408;
+ color: #fff
+}
+
+.custom-theme .el-tag--danger {
+ background-color: rgba(179, 69, 14, .1);
+ border-color: rgba(179, 69, 14, .2);
+ color: #b3450e
+}
+
+.custom-theme .el-tag--danger.is-hit {
+ border-color: #b3450e
+}
+
+.custom-theme .el-tag--danger .el-tag__close {
+ color: #b3450e
+}
+
+.custom-theme .el-tag--danger .el-tag__close:hover {
+ background-color: #b3450e;
+ color: #fff
+}
+
+.custom-theme .el-tag--medium {
+ height: 28px;
+ line-height: 26px
+}
+
+.custom-theme .el-tag--medium .el-icon-close {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-tag--small {
+ height: 24px;
+ padding: 0 8px;
+ line-height: 22px
+}
+
+.custom-theme .el-tag--small .el-icon-close {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-tag--mini {
+ height: 20px;
+ padding: 0 5px;
+ line-height: 19px
+}
+
+.custom-theme .el-tag--mini .el-icon-close {
+ margin-left: -3px;
+ -webkit-transform: scale(.7);
+ transform: scale(.7)
+}
+
+.custom-theme .el-select-dropdown__item {
+ font-size: 14px;
+ padding: 0 20px;
+ position: relative;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: #5a5e66;
+ height: 34px;
+ line-height: 34px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer
+}
+
+.custom-theme .el-select-dropdown__item.is-disabled {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-select-dropdown__item.is-disabled:hover {
+ background-color: #fff
+}
+
+.custom-theme .el-select-dropdown__item.hover, .custom-theme .el-select-dropdown__item:hover {
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-select-dropdown__item.selected {
+ color: #262729;
+ font-weight: 700
+}
+
+.custom-theme .el-select-dropdown__item span {
+ line-height: 34px !important
+}
+
+.custom-theme .el-select-group {
+ margin: 0;
+ padding: 0
+}
+
+.custom-theme .el-select-group__wrap {
+ position: relative;
+ list-style: none;
+ margin: 0;
+ padding: 0
+}
+
+.custom-theme .el-select-group__wrap:not(:last-of-type) {
+ padding-bottom: 24px
+}
+
+.custom-theme .el-select-group__wrap:not(:last-of-type)::after {
+ content: '';
+ position: absolute;
+ display: block;
+ left: 20px;
+ right: 20px;
+ bottom: 12px;
+ height: 1px;
+ background: #dfe4ed
+}
+
+.custom-theme .el-select-group__title {
+ padding-left: 20px;
+ font-size: 12px;
+ color: #0a76a4;
+ line-height: 30px
+}
+
+.custom-theme .el-select-group .el-select-dropdown__item {
+ padding-left: 20px
+}
+
+.custom-theme .el-scrollbar {
+ overflow: hidden;
+ position: relative
+}
+
+.custom-theme .el-scrollbar:active > .el-scrollbar__bar, .custom-theme .el-scrollbar:focus > .el-scrollbar__bar, .custom-theme .el-scrollbar:hover > .el-scrollbar__bar {
+ opacity: 1;
+ -webkit-transition: opacity 340ms ease-out;
+ transition: opacity 340ms ease-out
+}
+
+.custom-theme .el-scrollbar__wrap {
+ overflow: scroll;
+ height: 100%
+}
+
+.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar {
+ width: 0;
+ height: 0
+}
+
+.custom-theme .el-scrollbar__thumb {
+ position: relative;
+ display: block;
+ width: 0;
+ height: 0;
+ cursor: pointer;
+ border-radius: inherit;
+ background-color: rgba(135, 141, 153, .3);
+ -webkit-transition: .3s background-color;
+ transition: .3s background-color
+}
+
+.custom-theme .el-scrollbar__thumb:hover {
+ background-color: rgba(135, 141, 153, .5)
+}
+
+.custom-theme .el-scrollbar__bar {
+ position: absolute;
+ right: 2px;
+ bottom: 2px;
+ z-index: 1;
+ border-radius: 4px;
+ opacity: 0;
+ -webkit-transition: opacity 120ms ease-out;
+ transition: opacity 120ms ease-out
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical {
+ width: 6px;
+ top: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical > div {
+ width: 100%
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal {
+ height: 6px;
+ left: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal > div {
+ height: 100%
+}
+
+.custom-theme .el-select {
+ display: inline-block;
+ position: relative
+}
+
+.custom-theme .el-select:hover .el-input__inner {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-select .el-input__inner {
+ cursor: pointer;
+ padding-right: 35px
+}
+
+.custom-theme .el-select .el-input__inner:focus {
+ border-color: #262729
+}
+
+.custom-theme .el-select .el-input .el-select__caret {
+ color: #b4bccc;
+ font-size: 14px;
+ -webkit-transition: -webkit-transform .3s;
+ transition: -webkit-transform .3s;
+ transition: transform .3s;
+ transition: transform .3s, -webkit-transform .3s;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ line-height: 16px;
+ cursor: pointer
+}
+
+.custom-theme .el-select .el-input .el-select__caret.is-reverse {
+ -webkit-transform: rotateZ(0);
+ transform: rotateZ(0)
+}
+
+.custom-theme .el-select .el-input .el-select__caret.is-show-close {
+ font-size: 14px;
+ text-align: center;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ border-radius: 100%;
+ color: #b4bccc;
+ -webkit-transition: color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-select .el-input .el-select__caret.is-show-close:hover {
+ color: #878d99
+}
+
+.custom-theme .el-select .el-input.is-disabled .el-input__inner {
+ cursor: not-allowed
+}
+
+.custom-theme .el-select .el-input.is-disabled .el-input__inner:hover {
+ border-color: #dfe4ed
+}
+
+.custom-theme .el-select > .el-input {
+ display: block
+}
+
+.custom-theme .el-select__input {
+ border: none;
+ outline: 0;
+ padding: 0;
+ margin-left: 15px;
+ color: #666;
+ font-size: 14px;
+ vertical-align: baseline;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ height: 28px;
+ background-color: transparent
+}
+
+.custom-theme .el-select__input.is-mini {
+ height: 14px
+}
+
+.custom-theme .el-select__close {
+ cursor: pointer;
+ position: absolute;
+ top: 8px;
+ z-index: 1000;
+ right: 25px;
+ color: #b4bccc;
+ line-height: 18px;
+ font-size: 14px
+}
+
+.custom-theme .el-select__close:hover {
+ color: #878d99
+}
+
+.custom-theme .el-select__tags {
+ position: absolute;
+ line-height: normal;
+ white-space: normal;
+ z-index: 1;
+ top: 50%;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%)
+}
+
+.custom-theme .el-select .el-tag__close {
+ margin-top: -2px
+}
+
+.custom-theme .el-select .el-tag {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border-color: transparent;
+ margin: 3px 0 3px 6px;
+ background-color: #f0f2f5
+}
+
+.custom-theme .el-select .el-tag__close.el-icon-close {
+ background-color: #b4bccc;
+ right: -7px;
+ color: #fff
+}
+
+.custom-theme .el-select .el-tag__close.el-icon-close:hover {
+ background-color: #878d99
+}
+
+.custom-theme .el-select .el-tag__close.el-icon-close::before {
+ display: block;
+ -webkit-transform: translate(0, .5px);
+ transform: translate(0, .5px)
+}
+
+.custom-theme .el-select__tag {
+ display: inline-block;
+ height: 24px;
+ line-height: 24px;
+ font-size: 14px;
+ border-radius: 4px;
+ color: #fff;
+ background-color: #262729
+}
+
+.custom-theme .el-select__tag .el-icon-close {
+ font-size: 14px
+}
+
+.custom-theme .el-pagination {
+ white-space: nowrap;
+ padding: 2px 5px;
+ color: #2d2f33;
+ font-weight: 700
+}
+
+.custom-theme .el-pagination::after, .custom-theme .el-pagination::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-pagination::after {
+ clear: both
+}
+
+.custom-theme .el-pagination button, .custom-theme .el-pagination span:not([class*=suffix]) {
+ display: inline-block;
+ font-size: 13px;
+ min-width: 35.5px;
+ height: 28px;
+ line-height: 28px;
+ vertical-align: top;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-pagination .el-input__inner {
+ text-align: center
+}
+
+.custom-theme .el-pagination .el-input__suffix {
+ right: 0;
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-pagination .el-select .el-input {
+ width: 100px;
+ margin: 0 5px
+}
+
+.custom-theme .el-pagination .el-select .el-input .el-input__inner {
+ padding-right: 25px;
+ border-radius: 3px;
+ height: 28px
+}
+
+.custom-theme .el-pagination button {
+ border: none;
+ padding: 0 6px;
+ background: 0 0
+}
+
+.custom-theme .el-pagination button:focus {
+ outline: 0
+}
+
+.custom-theme .el-pagination button:hover {
+ color: #262729
+}
+
+.custom-theme .el-pagination button.disabled {
+ color: #b4bccc;
+ background-color: #fff;
+ cursor: not-allowed
+}
+
+.custom-theme .el-pagination .btn-next, .custom-theme .el-pagination .btn-prev {
+ background: center center no-repeat;
+ background-size: 16px;
+ background-color: #fff;
+ cursor: pointer;
+ margin: 0;
+ color: #2d2f33
+}
+
+.custom-theme .el-pagination .btn-next .el-icon, .custom-theme .el-pagination .btn-prev .el-icon {
+ display: block;
+ font-size: 12px
+}
+
+.custom-theme .el-pagination .btn-prev {
+ padding-right: 12px
+}
+
+.custom-theme .el-pagination .btn-next {
+ padding-left: 12px
+}
+
+.custom-theme .el-pagination--small .btn-next, .custom-theme .el-pagination--small .btn-prev, .custom-theme .el-pagination--small .el-pager li, .custom-theme .el-pagination--small .el-pager li:last-child {
+ border-color: transparent;
+ font-size: 12px;
+ line-height: 22px;
+ height: 22px;
+ min-width: 22px
+}
+
+.custom-theme .el-pagination--small .arrow.disabled {
+ visibility: hidden
+}
+
+.custom-theme .el-pagination__sizes {
+ margin: 0 10px 0 0;
+ font-weight: 400;
+ color: #5a5e66
+}
+
+.custom-theme .el-pagination__sizes .el-input .el-input__inner {
+ font-size: 13px;
+ padding-left: 8px
+}
+
+.custom-theme .el-pagination__sizes .el-input .el-input__inner:hover {
+ border-color: #262729
+}
+
+.custom-theme .el-pagination__total {
+ margin-right: 10px;
+ font-weight: 400;
+ color: #5a5e66
+}
+
+.custom-theme .el-pagination__jump {
+ margin-left: 24px;
+ font-weight: 400;
+ color: #5a5e66
+}
+
+.custom-theme .el-pagination__jump .el-input__inner {
+ padding: 0 3px
+}
+
+.custom-theme .el-pagination__rightwrapper {
+ float: right
+}
+
+.custom-theme .el-pagination__editor {
+ line-height: 18px;
+ padding: 0 2px;
+ height: 28px;
+ text-align: center;
+ margin: 0 2px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border-radius: 3px;
+ -moz-appearance: textfield
+}
+
+.custom-theme .el-pagination__editor.el-input {
+ width: 50px
+}
+
+.custom-theme .el-pagination__editor.el-input .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-pagination__editor .el-input__inner::-webkit-inner-spin-button, .custom-theme .el-pagination__editor .el-input__inner::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0
+}
+
+.custom-theme .el-pager {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ list-style: none;
+ display: inline-block;
+ vertical-align: top;
+ font-size: 0;
+ padding: 0;
+ margin: 0
+}
+
+.custom-theme .el-pager .el-icon-more::before {
+ vertical-align: -4px
+}
+
+.custom-theme .el-pager li {
+ padding: 0 4px;
+ background: #fff;
+ vertical-align: top;
+ display: inline-block;
+ font-size: 13px;
+ min-width: 35.5px;
+ height: 28px;
+ line-height: 28px;
+ cursor: pointer;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ margin: 0
+}
+
+.custom-theme .el-pager li.btn-quicknext, .custom-theme .el-pager li.btn-quickprev {
+ line-height: 28px;
+ color: #2d2f33
+}
+
+.custom-theme .el-pager li.btn-quickprev:hover {
+ cursor: pointer
+}
+
+.custom-theme .el-pager li.btn-quicknext:hover {
+ cursor: pointer
+}
+
+.custom-theme .el-pager li.active + li {
+ border-left: 0
+}
+
+.custom-theme .el-pager li:hover {
+ color: #262729
+}
+
+.custom-theme .el-pager li.active {
+ color: #262729;
+ cursor: default
+}
+
+.custom-theme .v-modal-enter {
+ -webkit-animation: v-modal-in .2s ease;
+ animation: v-modal-in .2s ease
+}
+
+.custom-theme .v-modal-leave {
+ -webkit-animation: v-modal-out .2s ease forwards;
+ animation: v-modal-out .2s ease forwards
+}
+
+@-webkit-keyframes v-modal-in {
+ 0% {
+ opacity: 0
+ }
+}
+
+@keyframes v-modal-in {
+ 0% {
+ opacity: 0
+ }
+}
+
+@-webkit-keyframes v-modal-out {
+ 100% {
+ opacity: 0
+ }
+}
+
+@keyframes v-modal-out {
+ 100% {
+ opacity: 0
+ }
+}
+
+.custom-theme .v-modal {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ opacity: .5;
+ background: #000
+}
+
+.custom-theme .el-dialog {
+ position: relative;
+ margin: 0 auto 50px;
+ background: #fff;
+ border-radius: 2px;
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
+ box-shadow: 0 1px 3px rgba(0, 0, 0, .3);
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 50%
+}
+
+.custom-theme .el-dialog.is-fullscreen {
+ width: 100%;
+ margin-top: 0;
+ margin-bottom: 0;
+ height: 100%;
+ overflow: auto
+}
+
+.custom-theme .el-dialog__wrapper {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ overflow: auto;
+ margin: 0
+}
+
+.custom-theme .el-dialog__header {
+ padding: 15px;
+ padding-bottom: 10px
+}
+
+.custom-theme .el-dialog__headerbtn {
+ position: absolute;
+ top: 15px;
+ right: 15px;
+ padding: 0;
+ background: 0 0;
+ border: none;
+ outline: 0;
+ cursor: pointer;
+ font-size: 16px
+}
+
+.custom-theme .el-dialog__headerbtn .el-dialog__close {
+ color: #0a76a4
+}
+
+.custom-theme .el-dialog__headerbtn:focus .el-dialog__close, .custom-theme .el-dialog__headerbtn:hover .el-dialog__close {
+ color: #262729
+}
+
+.custom-theme .el-dialog__title {
+ line-height: 24px;
+ font-size: 18px;
+ color: #2d2f33
+}
+
+.custom-theme .el-dialog__body {
+ padding: 30px 20px;
+ color: #5a5e66;
+ line-height: 24px;
+ font-size: 14px
+}
+
+.custom-theme .el-dialog__footer {
+ padding: 15px;
+ padding-top: 10px;
+ text-align: right;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-dialog--center {
+ text-align: center
+}
+
+.custom-theme .el-dialog--center .el-dialog__header {
+ padding-top: 30px
+}
+
+.custom-theme .el-dialog--center .el-dialog__body {
+ text-align: initial;
+ padding: 25px 27px 30px
+}
+
+.custom-theme .el-dialog--center .el-dialog__footer {
+ text-align: inherit;
+ padding-bottom: 30px
+}
+
+.custom-theme .dialog-fade-enter-active {
+ -webkit-animation: dialog-fade-in .3s;
+ animation: dialog-fade-in .3s
+}
+
+.custom-theme .dialog-fade-leave-active {
+ -webkit-animation: dialog-fade-out .3s;
+ animation: dialog-fade-out .3s
+}
+
+@-webkit-keyframes dialog-fade-in {
+ 0% {
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ opacity: 0
+ }
+ 100% {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+}
+
+@keyframes dialog-fade-in {
+ 0% {
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ opacity: 0
+ }
+ 100% {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+}
+
+@-webkit-keyframes dialog-fade-out {
+ 0% {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+ 100% {
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ opacity: 0
+ }
+}
+
+@keyframes dialog-fade-out {
+ 0% {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+ 100% {
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ opacity: 0
+ }
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-scrollbar {
+ overflow: hidden;
+ position: relative
+}
+
+.custom-theme .el-scrollbar:active > .el-scrollbar__bar, .custom-theme .el-scrollbar:focus > .el-scrollbar__bar, .custom-theme .el-scrollbar:hover > .el-scrollbar__bar {
+ opacity: 1;
+ -webkit-transition: opacity 340ms ease-out;
+ transition: opacity 340ms ease-out
+}
+
+.custom-theme .el-scrollbar__wrap {
+ overflow: scroll;
+ height: 100%
+}
+
+.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar {
+ width: 0;
+ height: 0
+}
+
+.custom-theme .el-scrollbar__thumb {
+ position: relative;
+ display: block;
+ width: 0;
+ height: 0;
+ cursor: pointer;
+ border-radius: inherit;
+ background-color: rgba(135, 141, 153, .3);
+ -webkit-transition: .3s background-color;
+ transition: .3s background-color
+}
+
+.custom-theme .el-scrollbar__thumb:hover {
+ background-color: rgba(135, 141, 153, .5)
+}
+
+.custom-theme .el-scrollbar__bar {
+ position: absolute;
+ right: 2px;
+ bottom: 2px;
+ z-index: 1;
+ border-radius: 4px;
+ opacity: 0;
+ -webkit-transition: opacity 120ms ease-out;
+ transition: opacity 120ms ease-out
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical {
+ width: 6px;
+ top: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical > div {
+ width: 100%
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal {
+ height: 6px;
+ left: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal > div {
+ height: 100%
+}
+
+.custom-theme .el-popper .popper__arrow, .custom-theme .el-popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-popper .popper__arrow {
+ border-width: 6px;
+ -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03));
+ filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03))
+}
+
+.custom-theme .el-popper .popper__arrow::after {
+ content: " ";
+ border-width: 6px
+}
+
+.custom-theme .el-popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-color: #e6ebf5;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -6px;
+ border-top-color: #fff;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-width: 0;
+ border-bottom-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -6px;
+ border-top-width: 0;
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow {
+ top: 50%;
+ left: -6px;
+ margin-bottom: 3px;
+ border-right-color: #e6ebf5;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow::after {
+ bottom: -6px;
+ left: 1px;
+ border-right-color: #fff;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow {
+ top: 50%;
+ right: -6px;
+ margin-bottom: 3px;
+ border-right-width: 0;
+ border-left-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -6px;
+ margin-left: -6px;
+ border-right-width: 0;
+ border-left-color: #fff
+}
+
+.custom-theme .el-autocomplete {
+ position: relative;
+ display: inline-block
+}
+
+.custom-theme .el-autocomplete-suggestion {
+ margin: 5px 0;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ border-radius: 4px
+}
+
+.custom-theme .el-autocomplete-suggestion.el-popper .popper__arrow {
+ left: 24px !important
+}
+
+.custom-theme .el-autocomplete-suggestion__wrap {
+ max-height: 280px;
+ padding: 10px 0;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ overflow: auto;
+ background-color: #fff;
+ border: 1px solid #dfe4ed;
+ border-radius: 4px
+}
+
+.custom-theme .el-autocomplete-suggestion__list {
+ margin: 0;
+ padding: 0
+}
+
+.custom-theme .el-autocomplete-suggestion li {
+ padding: 0 20px;
+ margin: 0;
+ line-height: 34px;
+ cursor: pointer;
+ color: #5a5e66;
+ font-size: 14px;
+ list-style: none;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis
+}
+
+.custom-theme .el-autocomplete-suggestion li:hover {
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-autocomplete-suggestion li.highlighted {
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-autocomplete-suggestion li.divider {
+ margin-top: 6px;
+ border-top: 1px solid #000
+}
+
+.custom-theme .el-autocomplete-suggestion li.divider:last-child {
+ margin-bottom: -6px
+}
+
+.custom-theme .el-autocomplete-suggestion.is-loading li {
+ text-align: center;
+ height: 100px;
+ line-height: 100px;
+ font-size: 20px;
+ color: #999
+}
+
+.custom-theme .el-autocomplete-suggestion.is-loading li::after {
+ display: inline-block;
+ content: "";
+ height: 100%;
+ vertical-align: middle
+}
+
+.custom-theme .el-autocomplete-suggestion.is-loading li:hover {
+ background-color: #fff
+}
+
+.custom-theme .el-autocomplete-suggestion.is-loading .el-icon-loading {
+ vertical-align: middle
+}
+
+.custom-theme .el-button {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+ background: #fff;
+ border: 1px solid #d8dce5;
+ border-color: #d8dce5;
+ color: #5a5e66;
+ -webkit-appearance: none;
+ text-align: center;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ -webkit-transition: .1s;
+ transition: .1s;
+ font-weight: 500;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ padding: 12px 20px;
+ font-size: 14px;
+ border-radius: 4px
+}
+
+.custom-theme .el-button + .el-button {
+ margin-left: 10px
+}
+
+.custom-theme .el-button.is-round {
+ padding: 12px 20px
+}
+
+.custom-theme .el-button:focus, .custom-theme .el-button:hover {
+ color: #262729;
+ border-color: #bebebf;
+ background-color: #e9e9ea
+}
+
+.custom-theme .el-button:active {
+ color: #222325;
+ border-color: #222325;
+ outline: 0
+}
+
+.custom-theme .el-button::-moz-focus-inner {
+ border: 0
+}
+
+.custom-theme .el-button [class*=el-icon-] + span {
+ margin-left: 5px
+}
+
+.custom-theme .el-button.is-plain:focus, .custom-theme .el-button.is-plain:hover {
+ background: #fff;
+ border-color: #262729;
+ color: #262729
+}
+
+.custom-theme .el-button.is-plain:active {
+ background: #fff;
+ border-color: #222325;
+ color: #222325;
+ outline: 0
+}
+
+.custom-theme .el-button.is-active {
+ color: #222325;
+ border-color: #222325
+}
+
+.custom-theme .el-button.is-disabled, .custom-theme .el-button.is-disabled:focus, .custom-theme .el-button.is-disabled:hover {
+ color: #b4bccc;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: #fff;
+ border-color: #e6ebf5
+}
+
+.custom-theme .el-button.is-disabled.el-button--text {
+ background-color: transparent
+}
+
+.custom-theme .el-button.is-disabled.is-plain, .custom-theme .el-button.is-disabled.is-plain:focus, .custom-theme .el-button.is-disabled.is-plain:hover {
+ background-color: #fff;
+ border-color: #e6ebf5;
+ color: #b4bccc
+}
+
+.custom-theme .el-button.is-loading {
+ position: relative;
+ pointer-events: none
+}
+
+.custom-theme .el-button.is-loading:before {
+ pointer-events: none;
+ content: '';
+ position: absolute;
+ left: -1px;
+ top: -1px;
+ right: -1px;
+ bottom: -1px;
+ border-radius: inherit;
+ background-color: rgba(255, 255, 255, .35)
+}
+
+.custom-theme .el-button.is-round {
+ border-radius: 20px;
+ padding: 12px 23px
+}
+
+.custom-theme .el-button--primary {
+ color: #fff;
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-button--primary:focus, .custom-theme .el-button--primary:hover {
+ background: #515254;
+ border-color: #515254;
+ color: #fff
+}
+
+.custom-theme .el-button--primary:active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--primary.is-active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff
+}
+
+.custom-theme .el-button--primary.is-disabled, .custom-theme .el-button--primary.is-disabled:active, .custom-theme .el-button--primary.is-disabled:focus, .custom-theme .el-button--primary.is-disabled:hover {
+ color: #fff;
+ background-color: #939394;
+ border-color: #939394
+}
+
+.custom-theme .el-button--primary.is-plain {
+ color: #262729;
+ background: #e9e9ea;
+ border-color: #a8a9a9
+}
+
+.custom-theme .el-button--primary.is-plain:focus, .custom-theme .el-button--primary.is-plain:hover {
+ background: #262729;
+ border-color: #262729;
+ color: #fff
+}
+
+.custom-theme .el-button--primary.is-plain:active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--primary.is-plain.is-disabled, .custom-theme .el-button--primary.is-plain.is-disabled:active, .custom-theme .el-button--primary.is-plain.is-disabled:focus, .custom-theme .el-button--primary.is-plain.is-disabled:hover {
+ color: #7d7d7f;
+ background-color: #e9e9ea;
+ border-color: #d4d4d4
+}
+
+.custom-theme .el-button--success {
+ color: #fff;
+ background-color: #409167;
+ border-color: #409167
+}
+
+.custom-theme .el-button--success:focus, .custom-theme .el-button--success:hover {
+ background: #66a785;
+ border-color: #66a785;
+ color: #fff
+}
+
+.custom-theme .el-button--success:active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--success.is-active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff
+}
+
+.custom-theme .el-button--success.is-disabled, .custom-theme .el-button--success.is-disabled:active, .custom-theme .el-button--success.is-disabled:focus, .custom-theme .el-button--success.is-disabled:hover {
+ color: #fff;
+ background-color: #a0c8b3;
+ border-color: #a0c8b3
+}
+
+.custom-theme .el-button--success.is-plain {
+ color: #409167;
+ background: #ecf4f0;
+ border-color: #b3d3c2
+}
+
+.custom-theme .el-button--success.is-plain:focus, .custom-theme .el-button--success.is-plain:hover {
+ background: #409167;
+ border-color: #409167;
+ color: #fff
+}
+
+.custom-theme .el-button--success.is-plain:active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--success.is-plain.is-disabled, .custom-theme .el-button--success.is-plain.is-disabled:active, .custom-theme .el-button--success.is-plain.is-disabled:focus, .custom-theme .el-button--success.is-plain.is-disabled:hover {
+ color: #8cbda4;
+ background-color: #ecf4f0;
+ border-color: #d9e9e1
+}
+
+.custom-theme .el-button--warning {
+ color: #fff;
+ background-color: #9da408;
+ border-color: #9da408
+}
+
+.custom-theme .el-button--warning:focus, .custom-theme .el-button--warning:hover {
+ background: #b1b639;
+ border-color: #b1b639;
+ color: #fff
+}
+
+.custom-theme .el-button--warning:active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--warning.is-active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff
+}
+
+.custom-theme .el-button--warning.is-disabled, .custom-theme .el-button--warning.is-disabled:active, .custom-theme .el-button--warning.is-disabled:focus, .custom-theme .el-button--warning.is-disabled:hover {
+ color: #fff;
+ background-color: #ced284;
+ border-color: #ced284
+}
+
+.custom-theme .el-button--warning.is-plain {
+ color: #9da408;
+ background: #f5f6e6;
+ border-color: #d8db9c
+}
+
+.custom-theme .el-button--warning.is-plain:focus, .custom-theme .el-button--warning.is-plain:hover {
+ background: #9da408;
+ border-color: #9da408;
+ color: #fff
+}
+
+.custom-theme .el-button--warning.is-plain:active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--warning.is-plain.is-disabled, .custom-theme .el-button--warning.is-plain.is-disabled:active, .custom-theme .el-button--warning.is-plain.is-disabled:focus, .custom-theme .el-button--warning.is-plain.is-disabled:hover {
+ color: #c4c86b;
+ background-color: #f5f6e6;
+ border-color: #ebedce
+}
+
+.custom-theme .el-button--danger {
+ color: #fff;
+ background-color: #b3450e;
+ border-color: #b3450e
+}
+
+.custom-theme .el-button--danger:focus, .custom-theme .el-button--danger:hover {
+ background: #c26a3e;
+ border-color: #c26a3e;
+ color: #fff
+}
+
+.custom-theme .el-button--danger:active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--danger.is-active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff
+}
+
+.custom-theme .el-button--danger.is-disabled, .custom-theme .el-button--danger.is-disabled:active, .custom-theme .el-button--danger.is-disabled:focus, .custom-theme .el-button--danger.is-disabled:hover {
+ color: #fff;
+ background-color: #d9a287;
+ border-color: #d9a287
+}
+
+.custom-theme .el-button--danger.is-plain {
+ color: #b3450e;
+ background: #f7ece7;
+ border-color: #e1b59f
+}
+
+.custom-theme .el-button--danger.is-plain:focus, .custom-theme .el-button--danger.is-plain:hover {
+ background: #b3450e;
+ border-color: #b3450e;
+ color: #fff
+}
+
+.custom-theme .el-button--danger.is-plain:active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--danger.is-plain.is-disabled, .custom-theme .el-button--danger.is-plain.is-disabled:active, .custom-theme .el-button--danger.is-plain.is-disabled:focus, .custom-theme .el-button--danger.is-plain.is-disabled:hover {
+ color: #d18f6e;
+ background-color: #f7ece7;
+ border-color: #f0dacf
+}
+
+.custom-theme .el-button--info {
+ color: #fff;
+ background-color: #0a76a4;
+ border-color: #0a76a4
+}
+
+.custom-theme .el-button--info:focus, .custom-theme .el-button--info:hover {
+ background: #3b91b6;
+ border-color: #3b91b6;
+ color: #fff
+}
+
+.custom-theme .el-button--info:active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--info.is-active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff
+}
+
+.custom-theme .el-button--info.is-disabled, .custom-theme .el-button--info.is-disabled:active, .custom-theme .el-button--info.is-disabled:focus, .custom-theme .el-button--info.is-disabled:hover {
+ color: #fff;
+ background-color: #85bbd2;
+ border-color: #85bbd2
+}
+
+.custom-theme .el-button--info.is-plain {
+ color: #0a76a4;
+ background: #e7f1f6;
+ border-color: #9dc8db
+}
+
+.custom-theme .el-button--info.is-plain:focus, .custom-theme .el-button--info.is-plain:hover {
+ background: #0a76a4;
+ border-color: #0a76a4;
+ color: #fff
+}
+
+.custom-theme .el-button--info.is-plain:active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--info.is-plain.is-disabled, .custom-theme .el-button--info.is-plain.is-disabled:active, .custom-theme .el-button--info.is-plain.is-disabled:focus, .custom-theme .el-button--info.is-plain.is-disabled:hover {
+ color: #6cadc8;
+ background-color: #e7f1f6;
+ border-color: #cee4ed
+}
+
+.custom-theme .el-button--medium {
+ padding: 10px 20px;
+ font-size: 14px;
+ border-radius: 4px
+}
+
+.custom-theme .el-button--medium.is-round {
+ padding: 10px 20px
+}
+
+.custom-theme .el-button--small {
+ padding: 9px 15px;
+ font-size: 12px;
+ border-radius: 3px
+}
+
+.custom-theme .el-button--small.is-round {
+ padding: 9px 15px
+}
+
+.custom-theme .el-button--mini {
+ padding: 7px 15px;
+ font-size: 12px;
+ border-radius: 3px
+}
+
+.custom-theme .el-button--mini.is-round {
+ padding: 7px 15px
+}
+
+.custom-theme .el-button--text {
+ border: none;
+ color: #262729;
+ background: 0 0;
+ padding-left: 0;
+ padding-right: 0
+}
+
+.custom-theme .el-button--text:focus, .custom-theme .el-button--text:hover {
+ color: #515254;
+ border-color: transparent;
+ background-color: transparent
+}
+
+.custom-theme .el-button--text:active {
+ color: #222325;
+ border-color: transparent;
+ background-color: transparent
+}
+
+.custom-theme .el-button-group {
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-button-group::after, .custom-theme .el-button-group::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-button-group::after {
+ clear: both
+}
+
+.custom-theme .el-button-group .el-button {
+ float: left;
+ position: relative
+}
+
+.custom-theme .el-button-group .el-button + .el-button {
+ margin-left: 0
+}
+
+.custom-theme .el-button-group .el-button:first-child {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:last-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child) {
+ border-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:not(:last-child) {
+ margin-right: -1px
+}
+
+.custom-theme .el-button-group .el-button:active, .custom-theme .el-button-group .el-button:focus, .custom-theme .el-button-group .el-button:hover {
+ z-index: 1
+}
+
+.custom-theme .el-button-group .el-button.is-active {
+ z-index: 1
+}
+
+.custom-theme .el-button-group .el-button--primary:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--primary:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-popper .popper__arrow, .custom-theme .el-popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-popper .popper__arrow {
+ border-width: 6px;
+ -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03));
+ filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03))
+}
+
+.custom-theme .el-popper .popper__arrow::after {
+ content: " ";
+ border-width: 6px
+}
+
+.custom-theme .el-popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-color: #e6ebf5;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -6px;
+ border-top-color: #fff;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-width: 0;
+ border-bottom-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -6px;
+ border-top-width: 0;
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow {
+ top: 50%;
+ left: -6px;
+ margin-bottom: 3px;
+ border-right-color: #e6ebf5;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow::after {
+ bottom: -6px;
+ left: 1px;
+ border-right-color: #fff;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow {
+ top: 50%;
+ right: -6px;
+ margin-bottom: 3px;
+ border-right-width: 0;
+ border-left-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -6px;
+ margin-left: -6px;
+ border-right-width: 0;
+ border-left-color: #fff
+}
+
+.custom-theme .el-dropdown {
+ display: inline-block;
+ position: relative;
+ color: #5a5e66;
+ font-size: 14px
+}
+
+.custom-theme .el-dropdown .el-button-group {
+ display: block
+}
+
+.custom-theme .el-dropdown .el-button-group .el-button {
+ float: none
+}
+
+.custom-theme .el-dropdown .el-dropdown__caret-button {
+ padding-left: 5px;
+ padding-right: 5px;
+ position: relative;
+ border-left: none
+}
+
+.custom-theme .el-dropdown .el-dropdown__caret-button::before {
+ content: '';
+ position: absolute;
+ display: block;
+ width: 1px;
+ top: 5px;
+ bottom: 5px;
+ left: 0;
+ background: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-dropdown .el-dropdown__caret-button:hover::before {
+ top: 0;
+ bottom: 0
+}
+
+.custom-theme .el-dropdown .el-dropdown__caret-button .el-dropdown__icon {
+ padding-left: 0
+}
+
+.custom-theme .el-dropdown__icon {
+ font-size: 12px;
+ margin: 0 3px
+}
+
+.custom-theme .el-dropdown-menu {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 10;
+ padding: 10px 0;
+ margin: 5px 0;
+ background-color: #fff;
+ border: 1px solid #e6ebf5;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1)
+}
+
+.custom-theme .el-dropdown-menu__item {
+ list-style: none;
+ line-height: 36px;
+ padding: 0 20px;
+ margin: 0;
+ font-size: 14px;
+ color: #5a5e66;
+ cursor: pointer
+}
+
+.custom-theme .el-dropdown-menu__item:not(.is-disabled):hover {
+ background-color: #e9e9ea;
+ color: #515254
+}
+
+.custom-theme .el-dropdown-menu__item--divided {
+ position: relative;
+ margin-top: 6px;
+ border-top: 1px solid #e6ebf5
+}
+
+.custom-theme .el-dropdown-menu__item--divided:before {
+ content: '';
+ height: 6px;
+ display: block;
+ margin: 0 -20px;
+ background-color: #fff
+}
+
+.custom-theme .el-dropdown-menu__item.is-disabled {
+ cursor: default;
+ color: #bbb;
+ pointer-events: none
+}
+
+.custom-theme .el-dropdown-menu--medium {
+ padding: 6px 0
+}
+
+.custom-theme .el-dropdown-menu--medium .el-dropdown-menu__item {
+ line-height: 30px;
+ padding: 0 17px;
+ font-size: 14px
+}
+
+.custom-theme .el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided {
+ margin-top: 6px
+}
+
+.custom-theme .el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before {
+ height: 6px;
+ margin: 0 -17px
+}
+
+.custom-theme .el-dropdown-menu--small {
+ padding: 6px 0
+}
+
+.custom-theme .el-dropdown-menu--small .el-dropdown-menu__item {
+ line-height: 27px;
+ padding: 0 15px;
+ font-size: 13px
+}
+
+.custom-theme .el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided {
+ margin-top: 4px
+}
+
+.custom-theme .el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before {
+ height: 4px;
+ margin: 0 -15px
+}
+
+.custom-theme .el-dropdown-menu--mini {
+ padding: 3px 0
+}
+
+.custom-theme .el-dropdown-menu--mini .el-dropdown-menu__item {
+ line-height: 24px;
+ padding: 0 10px;
+ font-size: 12px
+}
+
+.custom-theme .el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided {
+ margin-top: 3px
+}
+
+.custom-theme .el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before {
+ height: 3px;
+ margin: 0 -10px
+}
+
+.custom-theme .el-menu {
+ border-right: solid 1px #e6e6e6;
+ list-style: none;
+ position: relative;
+ margin: 0;
+ padding-left: 0;
+ background-color: #fff
+}
+
+.custom-theme .el-menu::after, .custom-theme .el-menu::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-menu::after {
+ clear: both
+}
+
+.custom-theme .el-menu li {
+ list-style: none
+}
+
+.custom-theme .el-menu--horizontal {
+ border-right: none;
+ border-bottom: solid 1px #e6e6e6
+}
+
+.custom-theme .el-menu--horizontal .el-menu-item {
+ float: left;
+ height: 60px;
+ line-height: 60px;
+ margin: 0;
+ cursor: pointer;
+ position: relative;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border-bottom: 2px solid transparent;
+ color: #878d99
+}
+
+.custom-theme .el-menu--horizontal .el-menu-item a, .custom-theme .el-menu--horizontal .el-menu-item a:hover {
+ color: inherit
+}
+
+.custom-theme .el-menu--horizontal .el-menu-item:focus, .custom-theme .el-menu--horizontal .el-menu-item:hover {
+ background-color: #fff
+}
+
+.custom-theme .el-menu--horizontal .el-submenu {
+ float: left;
+ position: relative
+}
+
+.custom-theme .el-menu--horizontal .el-submenu:focus {
+ outline: 0
+}
+
+.custom-theme .el-menu--horizontal .el-submenu:focus > .el-submenu__title {
+ color: #2d2f33
+}
+
+.custom-theme .el-menu--horizontal .el-submenu > .el-menu {
+ position: absolute;
+ top: 65px;
+ left: 0;
+ border: none;
+ padding: 5px 0;
+ background-color: #fff;
+ z-index: 100;
+ min-width: 100%;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ border-radius: 2px
+}
+
+.custom-theme .el-menu--horizontal .el-submenu .el-submenu__title {
+ height: 60px;
+ line-height: 60px;
+ border-bottom: 2px solid transparent;
+ color: #878d99
+}
+
+.custom-theme .el-menu--horizontal .el-submenu .el-submenu__title:hover {
+ background-color: #fff
+}
+
+.custom-theme .el-menu--horizontal .el-submenu .el-menu-item {
+ background-color: #fff;
+ float: none;
+ height: 36px;
+ line-height: 36px;
+ padding: 0 10px
+}
+
+.custom-theme .el-menu--horizontal .el-submenu .el-submenu__icon-arrow {
+ position: static;
+ vertical-align: middle;
+ margin-left: 8px;
+ margin-top: -3px
+}
+
+.custom-theme .el-menu--horizontal .el-menu-item:focus, .custom-theme .el-menu--horizontal .el-menu-item:hover, .custom-theme .el-menu--horizontal .el-submenu__title:hover {
+ outline: 0;
+ color: #2d2f33
+}
+
+.custom-theme .el-menu--horizontal > .el-menu-item.is-active, .custom-theme .el-menu--horizontal > .el-submenu.is-active .el-submenu__title {
+ border-bottom: 2px solid #262729;
+ color: #2d2f33
+}
+
+.custom-theme .el-menu--collapse {
+ width: 64px
+}
+
+.custom-theme .el-menu--collapse > .el-menu-item [class^=el-icon-], .custom-theme .el-menu--collapse > .el-submenu > .el-submenu__title [class^=el-icon-] {
+ margin: 0;
+ vertical-align: middle;
+ width: 24px;
+ text-align: center
+}
+
+.custom-theme .el-menu--collapse > .el-menu-item .el-submenu__icon-arrow, .custom-theme .el-menu--collapse > .el-submenu > .el-submenu__title .el-submenu__icon-arrow {
+ display: none
+}
+
+.custom-theme .el-menu--collapse > .el-menu-item span, .custom-theme .el-menu--collapse > .el-submenu > .el-submenu__title span {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block
+}
+
+.custom-theme .el-menu--collapse > .el-menu-item.is-active i {
+ color: inherit
+}
+
+.custom-theme .el-menu--collapse .el-menu .el-submenu {
+ min-width: 200px
+}
+
+.custom-theme .el-menu--collapse .el-submenu {
+ position: relative
+}
+
+.custom-theme .el-menu--collapse .el-submenu .el-menu {
+ position: absolute;
+ margin-left: 5px;
+ top: 0;
+ left: 100%;
+ z-index: 10;
+ border: 1px solid #dfe4ed;
+ border-radius: 2px;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1)
+}
+
+.custom-theme .el-menu--collapse .el-submenu.is-opened > .el-submenu__title .el-submenu__icon-arrow {
+ -webkit-transform: none;
+ transform: none
+}
+
+.custom-theme .el-menu-item {
+ height: 56px;
+ line-height: 56px;
+ font-size: 14px;
+ color: #2d2f33;
+ padding: 0 20px;
+ cursor: pointer;
+ position: relative;
+ -webkit-transition: border-color .3s, background-color .3s, color .3s;
+ transition: border-color .3s, background-color .3s, color .3s;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ white-space: nowrap
+}
+
+.custom-theme .el-menu-item [class^=el-icon-] {
+ margin-right: 5px;
+ width: 24px;
+ text-align: center;
+ font-size: 18px
+}
+
+.custom-theme .el-menu-item * {
+ vertical-align: middle
+}
+
+.custom-theme .el-menu-item:first-child {
+ margin-left: 0
+}
+
+.custom-theme .el-menu-item:last-child {
+ margin-right: 0
+}
+
+.custom-theme .el-menu-item:focus, .custom-theme .el-menu-item:hover {
+ outline: 0;
+ background-color: #e9e9ea
+}
+
+.custom-theme .el-menu-item i {
+ color: #878d99
+}
+
+.custom-theme .el-menu-item.is-active {
+ color: #262729
+}
+
+.custom-theme .el-menu-item.is-active i {
+ color: inherit
+}
+
+.custom-theme .el-submenu__title {
+ position: relative;
+ height: 56px;
+ line-height: 56px;
+ font-size: 14px;
+ color: #2d2f33;
+ padding: 0 20px;
+ cursor: pointer;
+ position: relative;
+ -webkit-transition: border-color .3s, background-color .3s, color .3s;
+ transition: border-color .3s, background-color .3s, color .3s;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ white-space: nowrap
+}
+
+.custom-theme .el-submenu__title * {
+ vertical-align: middle
+}
+
+.custom-theme .el-submenu__title i {
+ color: #878d99
+}
+
+.custom-theme .el-submenu__title:hover {
+ background-color: #e9e9ea
+}
+
+.custom-theme .el-submenu .el-menu {
+ border: none
+}
+
+.custom-theme .el-submenu .el-menu-item {
+ height: 50px;
+ line-height: 50px;
+ padding: 0 45px;
+ min-width: 200px
+}
+
+.custom-theme .el-submenu__icon-arrow {
+ position: absolute;
+ top: 50%;
+ right: 20px;
+ margin-top: -7px;
+ -webkit-transition: -webkit-transform .3s;
+ transition: -webkit-transform .3s;
+ transition: transform .3s;
+ transition: transform .3s, -webkit-transform .3s;
+ font-size: 12px
+}
+
+.custom-theme .el-submenu.is-active .el-submenu__title {
+ border-bottom-color: #262729
+}
+
+.custom-theme .el-submenu.is-opened > .el-submenu__title .el-submenu__icon-arrow {
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg)
+}
+
+.custom-theme .el-submenu [class^=el-icon-] {
+ vertical-align: middle;
+ margin-right: 5px;
+ width: 24px;
+ text-align: center;
+ font-size: 18px
+}
+
+.custom-theme .el-menu-item-group > ul {
+ padding: 0
+}
+
+.custom-theme .el-menu-item-group__title {
+ padding: 7px 0 7px 20px;
+ line-height: normal;
+ font-size: 12px;
+ color: #878d99
+}
+
+.custom-theme .horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow {
+ -webkit-transition: .2s;
+ transition: .2s;
+ opacity: 0
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input-number {
+ position: relative;
+ display: inline-block;
+ width: 180px;
+ line-height: 38px
+}
+
+.custom-theme .el-input-number .el-input {
+ display: block
+}
+
+.custom-theme .el-input-number .el-input__inner {
+ -webkit-appearance: none;
+ padding-left: 50px;
+ padding-right: 50px;
+ text-align: center
+}
+
+.custom-theme .el-input-number__decrease, .custom-theme .el-input-number__increase {
+ position: absolute;
+ z-index: 1;
+ top: 1px;
+ width: 40px;
+ height: auto;
+ text-align: center;
+ background: #f5f7fa;
+ color: #5a5e66;
+ cursor: pointer;
+ font-size: 13px
+}
+
+.custom-theme .el-input-number__decrease:hover, .custom-theme .el-input-number__increase:hover {
+ color: #262729
+}
+
+.custom-theme .el-input-number__decrease:hover:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled), .custom-theme .el-input-number__increase:hover:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled) {
+ border-color: #262729
+}
+
+.custom-theme .el-input-number__decrease.is-disabled, .custom-theme .el-input-number__increase.is-disabled {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input-number__increase {
+ right: 1px;
+ border-radius: 0 4px 4px 0;
+ border-left: 1px solid #d8dce5
+}
+
+.custom-theme .el-input-number__decrease {
+ left: 1px;
+ border-radius: 4px 0 0 4px;
+ border-right: 1px solid #d8dce5
+}
+
+.custom-theme .el-input-number.is-disabled .el-input-number__decrease, .custom-theme .el-input-number.is-disabled .el-input-number__increase {
+ border-color: #dfe4ed;
+ color: #dfe4ed
+}
+
+.custom-theme .el-input-number.is-disabled .el-input-number__decrease:hover, .custom-theme .el-input-number.is-disabled .el-input-number__increase:hover {
+ color: #dfe4ed;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input-number--medium {
+ width: 200px;
+ line-height: 34px
+}
+
+.custom-theme .el-input-number--medium .el-input-number__decrease, .custom-theme .el-input-number--medium .el-input-number__increase {
+ width: 36px;
+ font-size: 14px
+}
+
+.custom-theme .el-input-number--medium .el-input__inner {
+ padding-left: 43px;
+ padding-right: 43px
+}
+
+.custom-theme .el-input-number--small {
+ width: 130px;
+ line-height: 30px
+}
+
+.custom-theme .el-input-number--small .el-input-number__decrease, .custom-theme .el-input-number--small .el-input-number__increase {
+ width: 32px;
+ font-size: 13px
+}
+
+.custom-theme .el-input-number--small .el-input-number__decrease [class*=el-icon], .custom-theme .el-input-number--small .el-input-number__increase [class*=el-icon] {
+ -webkit-transform: scale(.9);
+ transform: scale(.9)
+}
+
+.custom-theme .el-input-number--small .el-input__inner {
+ padding-left: 39px;
+ padding-right: 39px
+}
+
+.custom-theme .el-input-number--mini {
+ width: 130px;
+ line-height: 26px
+}
+
+.custom-theme .el-input-number--mini .el-input-number__decrease, .custom-theme .el-input-number--mini .el-input-number__increase {
+ width: 28px;
+ font-size: 12px
+}
+
+.custom-theme .el-input-number--mini .el-input-number__decrease [class*=el-icon], .custom-theme .el-input-number--mini .el-input-number__increase [class*=el-icon] {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-input-number--mini .el-input__inner {
+ padding-left: 35px;
+ padding-right: 35px
+}
+
+.custom-theme .el-input-number.is-without-controls .el-input__inner {
+ padding-left: 15px;
+ padding-right: 15px
+}
+
+.custom-theme .el-input-number.is-controls-right .el-input__inner {
+ padding-left: 15px;
+ padding-right: 50px
+}
+
+.custom-theme .el-input-number.is-controls-right .el-input-number__decrease, .custom-theme .el-input-number.is-controls-right .el-input-number__increase {
+ height: auto;
+ line-height: 19px
+}
+
+.custom-theme .el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon], .custom-theme .el-input-number.is-controls-right .el-input-number__increase [class*=el-icon] {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-input-number.is-controls-right .el-input-number__increase {
+ border-radius: 0 4px 0 0;
+ border-bottom: 1px solid #d8dce5
+}
+
+.custom-theme .el-input-number.is-controls-right .el-input-number__decrease {
+ right: 1px;
+ bottom: 1px;
+ top: auto;
+ left: auto;
+ border-right: none;
+ border-left: 1px solid #d8dce5;
+ border-radius: 0 0 4px 0
+}
+
+.custom-theme .el-input-number.is-controls-right[class*=medium] [class*=decrease], .custom-theme .el-input-number.is-controls-right[class*=medium] [class*=increase] {
+ line-height: 17px
+}
+
+.custom-theme .el-input-number.is-controls-right[class*=small] [class*=decrease], .custom-theme .el-input-number.is-controls-right[class*=small] [class*=increase] {
+ line-height: 15px
+}
+
+.custom-theme .el-input-number.is-controls-right[class*=mini] [class*=decrease], .custom-theme .el-input-number.is-controls-right[class*=mini] [class*=increase] {
+ line-height: 13px
+}
+
+.custom-theme .el-radio {
+ color: #5a5e66;
+ font-weight: 500;
+ line-height: 1;
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ white-space: nowrap;
+ outline: 0;
+ font-size: 14px;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none
+}
+
+.custom-theme .el-radio.is-bordered {
+ padding: 10px 20px 10px 10px;
+ border-radius: 4px;
+ border: 1px solid #d8dce5
+}
+
+.custom-theme .el-radio.is-bordered.is-checked {
+ border-color: #262729
+}
+
+.custom-theme .el-radio.is-bordered.is-disabled {
+ cursor: not-allowed;
+ border-color: #e6ebf5
+}
+
+.custom-theme .el-radio.is-bordered + .el-radio.is-bordered {
+ margin-left: 10px
+}
+
+.custom-theme .el-radio--medium.is-bordered {
+ padding: 8px 20px 8px 10px;
+ border-radius: 4px
+}
+
+.custom-theme .el-radio--medium.is-bordered .el-radio__label {
+ font-size: 14px
+}
+
+.custom-theme .el-radio--medium.is-bordered .el-radio__inner {
+ height: 14px;
+ width: 14px
+}
+
+.custom-theme .el-radio--small.is-bordered {
+ padding: 6px 15px 6px 10px;
+ border-radius: 3px
+}
+
+.custom-theme .el-radio--small.is-bordered .el-radio__label {
+ font-size: 12px
+}
+
+.custom-theme .el-radio--small.is-bordered .el-radio__inner {
+ height: 12px;
+ width: 12px
+}
+
+.custom-theme .el-radio--mini.is-bordered {
+ padding: 4px 15px 4px 10px;
+ border-radius: 3px
+}
+
+.custom-theme .el-radio--mini.is-bordered .el-radio__label {
+ font-size: 12px
+}
+
+.custom-theme .el-radio--mini.is-bordered .el-radio__inner {
+ height: 12px;
+ width: 12px
+}
+
+.custom-theme .el-radio + .el-radio {
+ margin-left: 30px
+}
+
+.custom-theme .el-radio__input {
+ white-space: nowrap;
+ cursor: pointer;
+ outline: 0;
+ display: inline-block;
+ line-height: 1;
+ position: relative;
+ vertical-align: middle
+}
+
+.custom-theme .el-radio__input.is-disabled .el-radio__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ cursor: not-allowed
+}
+
+.custom-theme .el-radio__input.is-disabled .el-radio__inner::after {
+ cursor: not-allowed;
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-radio__input.is-disabled .el-radio__inner + .el-radio__label {
+ cursor: not-allowed
+}
+
+.custom-theme .el-radio__input.is-disabled.is-checked .el-radio__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed
+}
+
+.custom-theme .el-radio__input.is-disabled.is-checked .el-radio__inner::after {
+ background-color: #b4bccc
+}
+
+.custom-theme .el-radio__input.is-disabled + span.el-radio__label {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-radio__input.is-checked .el-radio__inner {
+ border-color: #262729;
+ background: #262729
+}
+
+.custom-theme .el-radio__input.is-checked .el-radio__inner::after {
+ -webkit-transform: translate(-50%, -50%) scale(1);
+ transform: translate(-50%, -50%) scale(1)
+}
+
+.custom-theme .el-radio__input.is-checked + .el-radio__label {
+ color: #262729
+}
+
+.custom-theme .el-radio__input.is-focus .el-radio__inner {
+ border-color: #262729
+}
+
+.custom-theme .el-radio__inner {
+ border: 1px solid #d8dce5;
+ border-radius: 100%;
+ width: 14px;
+ height: 14px;
+ background-color: #fff;
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-radio__inner:hover {
+ border-color: #262729
+}
+
+.custom-theme .el-radio__inner::after {
+ width: 4px;
+ height: 4px;
+ border-radius: 100%;
+ background-color: #fff;
+ content: "";
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ -webkit-transform: translate(-50%, -50%) scale(0);
+ transform: translate(-50%, -50%) scale(0);
+ -webkit-transition: -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6);
+ transition: -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6);
+ transition: transform .15s cubic-bezier(.71, -.46, .88, .6);
+ transition: transform .15s cubic-bezier(.71, -.46, .88, .6), -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6)
+}
+
+.custom-theme .el-radio__original {
+ opacity: 0;
+ outline: 0;
+ position: absolute;
+ z-index: -1;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin: 0
+}
+
+.custom-theme .el-radio:focus:not(.is-focus):not(:active) .el-radio__inner {
+ -webkit-box-shadow: 0 0 2px 2px #262729;
+ box-shadow: 0 0 2px 2px #262729
+}
+
+.custom-theme .el-radio__label {
+ font-size: 14px;
+ padding-left: 10px
+}
+
+.custom-theme .el-radio-group {
+ display: inline-block;
+ line-height: 1;
+ vertical-align: middle;
+ font-size: 0
+}
+
+.custom-theme .el-radio-button {
+ position: relative;
+ display: inline-block;
+ outline: 0
+}
+
+.custom-theme .el-radio-button__inner {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ vertical-align: middle;
+ background: #fff;
+ border: 1px solid #d8dce5;
+ font-weight: 500;
+ border-left: 0;
+ color: #5a5e66;
+ -webkit-appearance: none;
+ text-align: center;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ position: relative;
+ cursor: pointer;
+ -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ padding: 12px 20px;
+ font-size: 14px;
+ border-radius: 0
+}
+
+.custom-theme .el-radio-button__inner.is-round {
+ padding: 12px 20px
+}
+
+.custom-theme .el-radio-button__inner:hover {
+ color: #262729
+}
+
+.custom-theme .el-radio-button__inner [class*=el-icon-] {
+ line-height: .9
+}
+
+.custom-theme .el-radio-button__inner [class*=el-icon-] + span {
+ margin-left: 5px
+}
+
+.custom-theme .el-radio-button__orig-radio {
+ opacity: 0;
+ outline: 0;
+ position: absolute;
+ z-index: -1;
+ left: -999px
+}
+
+.custom-theme .el-radio-button__orig-radio:checked + .el-radio-button__inner {
+ color: #fff;
+ background-color: #262729;
+ border-color: #262729;
+ -webkit-box-shadow: -1px 0 0 0 #262729;
+ box-shadow: -1px 0 0 0 #262729
+}
+
+.custom-theme .el-radio-button__orig-radio:disabled + .el-radio-button__inner {
+ color: #b4bccc;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: #fff;
+ border-color: #e6ebf5;
+ -webkit-box-shadow: none;
+ box-shadow: none
+}
+
+.custom-theme .el-radio-button__orig-radio:disabled:checked + .el-radio-button__inner {
+ background-color: #edf2fc
+}
+
+.custom-theme .el-radio-button:first-child .el-radio-button__inner {
+ border-left: 1px solid #d8dce5;
+ border-radius: 4px 0 0 4px;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important
+}
+
+.custom-theme .el-radio-button:last-child .el-radio-button__inner {
+ border-radius: 0 4px 4px 0
+}
+
+.custom-theme .el-radio-button:first-child:last-child .el-radio-button__inner {
+ border-radius: 4px
+}
+
+.custom-theme .el-radio-button--medium .el-radio-button__inner {
+ padding: 10px 20px;
+ font-size: 14px;
+ border-radius: 0
+}
+
+.custom-theme .el-radio-button--medium .el-radio-button__inner.is-round {
+ padding: 10px 20px
+}
+
+.custom-theme .el-radio-button--small .el-radio-button__inner {
+ padding: 9px 15px;
+ font-size: 12px;
+ border-radius: 0
+}
+
+.custom-theme .el-radio-button--small .el-radio-button__inner.is-round {
+ padding: 9px 15px
+}
+
+.custom-theme .el-radio-button--mini .el-radio-button__inner {
+ padding: 7px 15px;
+ font-size: 12px;
+ border-radius: 0
+}
+
+.custom-theme .el-radio-button--mini .el-radio-button__inner.is-round {
+ padding: 7px 15px
+}
+
+.custom-theme .el-radio-button:focus:not(.is-focus):not(:active) {
+ -webkit-box-shadow: 0 0 2px 2px #262729;
+ box-shadow: 0 0 2px 2px #262729
+}
+
+.custom-theme .el-checkbox {
+ color: #5a5e66;
+ font-weight: 500;
+ font-size: 14px;
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ white-space: nowrap;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none
+}
+
+.custom-theme .el-checkbox.is-bordered {
+ padding: 9px 20px 9px 10px;
+ border-radius: 4px;
+ border: 1px solid #d8dce5
+}
+
+.custom-theme .el-checkbox.is-bordered.is-checked {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox.is-bordered.is-disabled {
+ border-color: #e6ebf5;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox.is-bordered + .el-checkbox.is-bordered {
+ margin-left: 10px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium {
+ padding: 7px 20px 7px 10px;
+ border-radius: 4px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label {
+ line-height: 17px;
+ font-size: 14px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner {
+ height: 14px;
+ width: 14px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small {
+ padding: 3px 15px 7px 10px;
+ border-radius: 3px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label {
+ line-height: 15px;
+ font-size: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner {
+ height: 12px;
+ width: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after {
+ height: 6px;
+ width: 2px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini {
+ padding: 1px 15px 5px 10px;
+ border-radius: 3px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label {
+ line-height: 12px;
+ font-size: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner {
+ height: 12px;
+ width: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after {
+ height: 6px;
+ width: 2px
+}
+
+.custom-theme .el-checkbox__input {
+ white-space: nowrap;
+ cursor: pointer;
+ outline: 0;
+ display: inline-block;
+ line-height: 1;
+ position: relative;
+ vertical-align: middle
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after {
+ cursor: not-allowed;
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner + .el-checkbox__label {
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before {
+ background-color: #b4bccc;
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled + span.el-checkbox__label {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner {
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after {
+ -webkit-transform: rotate(45deg) scaleY(1);
+ transform: rotate(45deg) scaleY(1)
+}
+
+.custom-theme .el-checkbox__input.is-checked + .el-checkbox__label {
+ color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before {
+ content: '';
+ position: absolute;
+ display: block;
+ background-color: #fff;
+ height: 2px;
+ -webkit-transform: scale(.5);
+ transform: scale(.5);
+ left: 0;
+ right: 0;
+ top: 5px
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after {
+ display: none
+}
+
+.custom-theme .el-checkbox__inner {
+ display: inline-block;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 2px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 14px;
+ height: 14px;
+ background-color: #fff;
+ z-index: 1;
+ -webkit-transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46);
+ transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46)
+}
+
+.custom-theme .el-checkbox__inner:hover {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__inner::after {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ content: "";
+ border: 1px solid #fff;
+ border-left: 0;
+ border-top: 0;
+ height: 7px;
+ left: 4px;
+ position: absolute;
+ top: 1px;
+ -webkit-transform: rotate(45deg) scaleY(0);
+ transform: rotate(45deg) scaleY(0);
+ width: 3px;
+ -webkit-transition: -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms, -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ -webkit-transform-origin: center;
+ transform-origin: center
+}
+
+.custom-theme .el-checkbox__original {
+ opacity: 0;
+ outline: 0;
+ position: absolute;
+ margin: 0;
+ width: 0;
+ height: 0;
+ left: -999px
+}
+
+.custom-theme .el-checkbox__label {
+ display: inline-block;
+ padding-left: 10px;
+ line-height: 19px;
+ font-size: 14px
+}
+
+.custom-theme .el-checkbox + .el-checkbox {
+ margin-left: 30px
+}
+
+.custom-theme .el-checkbox-button {
+ position: relative;
+ display: inline-block
+}
+
+.custom-theme .el-checkbox-button__inner {
+ display: inline-block;
+ line-height: 1;
+ font-weight: 500;
+ white-space: nowrap;
+ vertical-align: middle;
+ cursor: pointer;
+ background: #fff;
+ border: 1px solid #d8dce5;
+ border-left: 0;
+ color: #5a5e66;
+ -webkit-appearance: none;
+ text-align: center;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ position: relative;
+ -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ padding: 12px 20px;
+ font-size: 14px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button__inner.is-round {
+ padding: 12px 20px
+}
+
+.custom-theme .el-checkbox-button__inner:hover {
+ color: #262729
+}
+
+.custom-theme .el-checkbox-button__inner [class*=el-icon-] {
+ line-height: .9
+}
+
+.custom-theme .el-checkbox-button__inner [class*=el-icon-] + span {
+ margin-left: 5px
+}
+
+.custom-theme .el-checkbox-button__original {
+ opacity: 0;
+ outline: 0;
+ position: absolute;
+ margin: 0;
+ left: -999px
+}
+
+.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner {
+ color: #fff;
+ background-color: #262729;
+ border-color: #262729;
+ -webkit-box-shadow: -1px 0 0 0 #7d7d7f;
+ box-shadow: -1px 0 0 0 #7d7d7f
+}
+
+.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner {
+ color: #b4bccc;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: #fff;
+ border-color: #e6ebf5;
+ -webkit-box-shadow: none;
+ box-shadow: none
+}
+
+.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner {
+ border-left: 1px solid #d8dce5;
+ border-radius: 4px 0 0 4px;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important
+}
+
+.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner {
+ border-radius: 0 4px 4px 0
+}
+
+.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner {
+ padding: 10px 20px;
+ font-size: 14px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round {
+ padding: 10px 20px
+}
+
+.custom-theme .el-checkbox-button--small .el-checkbox-button__inner {
+ padding: 9px 15px;
+ font-size: 12px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round {
+ padding: 9px 15px
+}
+
+.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner {
+ padding: 7px 15px;
+ font-size: 12px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round {
+ padding: 7px 15px
+}
+
+.custom-theme .el-checkbox-group {
+ font-size: 0
+}
+
+.custom-theme .el-switch {
+ display: inline-block;
+ position: relative;
+ font-size: 14px;
+ line-height: 20px;
+ height: 20px;
+ vertical-align: middle
+}
+
+.custom-theme .el-switch.is-disabled .el-switch__core, .custom-theme .el-switch.is-disabled .el-switch__label {
+ cursor: not-allowed
+}
+
+.custom-theme .el-switch__label {
+ -webkit-transition: .2s;
+ transition: .2s;
+ height: 20px;
+ display: inline-block;
+ font-size: 14px;
+ font-weight: 500;
+ cursor: pointer;
+ vertical-align: middle;
+ color: #2d2f33
+}
+
+.custom-theme .el-switch__label.is-active {
+ color: #262729
+}
+
+.custom-theme .el-switch__label--left {
+ margin-right: 10px
+}
+
+.custom-theme .el-switch__label--right {
+ margin-left: 10px
+}
+
+.custom-theme .el-switch__label * {
+ line-height: 1;
+ font-size: 14px;
+ display: inline-block
+}
+
+.custom-theme .el-switch__input {
+ position: absolute;
+ width: 0;
+ height: 0;
+ opacity: 0;
+ margin: 0
+}
+
+.custom-theme .el-switch__input:focus ~ .el-switch__core {
+ outline: 1px solid #262729
+}
+
+.custom-theme .el-switch__core {
+ margin: 0;
+ display: inline-block;
+ position: relative;
+ width: 40px;
+ height: 20px;
+ border: 1px solid #d8dce5;
+ outline: 0;
+ border-radius: 10px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ background: #d8dce5;
+ cursor: pointer;
+ -webkit-transition: border-color .3s, background-color .3s;
+ transition: border-color .3s, background-color .3s;
+ vertical-align: middle
+}
+
+.custom-theme .el-switch__core .el-switch__button {
+ position: absolute;
+ top: 1px;
+ left: 1px;
+ border-radius: 100%;
+ -webkit-transition: -webkit-transform .3s;
+ transition: -webkit-transform .3s;
+ transition: transform .3s;
+ transition: transform .3s, -webkit-transform .3s;
+ width: 16px;
+ height: 16px;
+ background-color: #fff
+}
+
+.custom-theme .el-switch.is-checked .el-switch__core {
+ border-color: #262729;
+ background-color: #262729
+}
+
+.custom-theme .el-switch.is-disabled {
+ opacity: .6
+}
+
+.custom-theme .el-switch--wide .el-switch__label.el-switch__label--left span {
+ left: 10px
+}
+
+.custom-theme .el-switch--wide .el-switch__label.el-switch__label--right span {
+ right: 10px
+}
+
+.custom-theme .el-switch .label-fade-enter, .custom-theme .el-switch .label-fade-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-popper .popper__arrow, .custom-theme .el-popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-popper .popper__arrow {
+ border-width: 6px;
+ -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03));
+ filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03))
+}
+
+.custom-theme .el-popper .popper__arrow::after {
+ content: " ";
+ border-width: 6px
+}
+
+.custom-theme .el-popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-color: #e6ebf5;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -6px;
+ border-top-color: #fff;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-width: 0;
+ border-bottom-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -6px;
+ border-top-width: 0;
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow {
+ top: 50%;
+ left: -6px;
+ margin-bottom: 3px;
+ border-right-color: #e6ebf5;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow::after {
+ bottom: -6px;
+ left: 1px;
+ border-right-color: #fff;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow {
+ top: 50%;
+ right: -6px;
+ margin-bottom: 3px;
+ border-right-width: 0;
+ border-left-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -6px;
+ margin-left: -6px;
+ border-right-width: 0;
+ border-left-color: #fff
+}
+
+.custom-theme .el-select-dropdown {
+ position: absolute;
+ z-index: 1001;
+ border: solid 1px #dfe4ed;
+ border-radius: 4px;
+ background-color: #fff;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 5px 0
+}
+
+.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected {
+ color: #262729;
+ background-color: #fff
+}
+
+.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover {
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after {
+ position: absolute;
+ right: 20px;
+ font-family: element-icons;
+ content: "\E611";
+ font-size: 12px;
+ font-weight: 700;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale
+}
+
+.custom-theme .el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list {
+ padding: 0
+}
+
+.custom-theme .el-select-dropdown .popper__arrow {
+ -webkit-transform: translateX(-400%);
+ transform: translateX(-400%)
+}
+
+.custom-theme .el-select-dropdown.is-arrow-fixed .popper__arrow {
+ -webkit-transform: translateX(-200%);
+ transform: translateX(-200%)
+}
+
+.custom-theme .el-select-dropdown__empty {
+ padding: 10px 0;
+ margin: 0;
+ text-align: center;
+ color: #999;
+ font-size: 14px
+}
+
+.custom-theme .el-select-dropdown__wrap {
+ max-height: 274px
+}
+
+.custom-theme .el-select-dropdown__list {
+ list-style: none;
+ padding: 6px 0;
+ margin: 0;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-tag {
+ background-color: rgba(38, 39, 41, .1);
+ display: inline-block;
+ padding: 0 10px;
+ height: 32px;
+ line-height: 30px;
+ font-size: 12px;
+ color: #262729;
+ border-radius: 4px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid rgba(38, 39, 41, .2);
+ white-space: nowrap
+}
+
+.custom-theme .el-tag .el-icon-close {
+ border-radius: 50%;
+ text-align: center;
+ position: relative;
+ cursor: pointer;
+ font-size: 12px;
+ height: 18px;
+ width: 18px;
+ line-height: 18px;
+ vertical-align: middle;
+ top: -1px;
+ right: -5px;
+ color: #262729
+}
+
+.custom-theme .el-tag .el-icon-close::before {
+ display: block
+}
+
+.custom-theme .el-tag .el-icon-close:hover {
+ background-color: #262729;
+ color: #fff
+}
+
+.custom-theme .el-tag--info {
+ background-color: rgba(10, 118, 164, .1);
+ border-color: rgba(10, 118, 164, .2);
+ color: #0a76a4
+}
+
+.custom-theme .el-tag--info.is-hit {
+ border-color: #0a76a4
+}
+
+.custom-theme .el-tag--info .el-tag__close {
+ color: #0a76a4
+}
+
+.custom-theme .el-tag--info .el-tag__close:hover {
+ background-color: #0a76a4;
+ color: #fff
+}
+
+.custom-theme .el-tag--success {
+ background-color: rgba(64, 145, 103, .1);
+ border-color: rgba(64, 145, 103, .2);
+ color: #409167
+}
+
+.custom-theme .el-tag--success.is-hit {
+ border-color: #409167
+}
+
+.custom-theme .el-tag--success .el-tag__close {
+ color: #409167
+}
+
+.custom-theme .el-tag--success .el-tag__close:hover {
+ background-color: #409167;
+ color: #fff
+}
+
+.custom-theme .el-tag--warning {
+ background-color: rgba(157, 164, 8, .1);
+ border-color: rgba(157, 164, 8, .2);
+ color: #9da408
+}
+
+.custom-theme .el-tag--warning.is-hit {
+ border-color: #9da408
+}
+
+.custom-theme .el-tag--warning .el-tag__close {
+ color: #9da408
+}
+
+.custom-theme .el-tag--warning .el-tag__close:hover {
+ background-color: #9da408;
+ color: #fff
+}
+
+.custom-theme .el-tag--danger {
+ background-color: rgba(179, 69, 14, .1);
+ border-color: rgba(179, 69, 14, .2);
+ color: #b3450e
+}
+
+.custom-theme .el-tag--danger.is-hit {
+ border-color: #b3450e
+}
+
+.custom-theme .el-tag--danger .el-tag__close {
+ color: #b3450e
+}
+
+.custom-theme .el-tag--danger .el-tag__close:hover {
+ background-color: #b3450e;
+ color: #fff
+}
+
+.custom-theme .el-tag--medium {
+ height: 28px;
+ line-height: 26px
+}
+
+.custom-theme .el-tag--medium .el-icon-close {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-tag--small {
+ height: 24px;
+ padding: 0 8px;
+ line-height: 22px
+}
+
+.custom-theme .el-tag--small .el-icon-close {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-tag--mini {
+ height: 20px;
+ padding: 0 5px;
+ line-height: 19px
+}
+
+.custom-theme .el-tag--mini .el-icon-close {
+ margin-left: -3px;
+ -webkit-transform: scale(.7);
+ transform: scale(.7)
+}
+
+.custom-theme .el-select-dropdown__item {
+ font-size: 14px;
+ padding: 0 20px;
+ position: relative;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: #5a5e66;
+ height: 34px;
+ line-height: 34px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer
+}
+
+.custom-theme .el-select-dropdown__item.is-disabled {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-select-dropdown__item.is-disabled:hover {
+ background-color: #fff
+}
+
+.custom-theme .el-select-dropdown__item.hover, .custom-theme .el-select-dropdown__item:hover {
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-select-dropdown__item.selected {
+ color: #262729;
+ font-weight: 700
+}
+
+.custom-theme .el-select-dropdown__item span {
+ line-height: 34px !important
+}
+
+.custom-theme .el-select-group {
+ margin: 0;
+ padding: 0
+}
+
+.custom-theme .el-select-group__wrap {
+ position: relative;
+ list-style: none;
+ margin: 0;
+ padding: 0
+}
+
+.custom-theme .el-select-group__wrap:not(:last-of-type) {
+ padding-bottom: 24px
+}
+
+.custom-theme .el-select-group__wrap:not(:last-of-type)::after {
+ content: '';
+ position: absolute;
+ display: block;
+ left: 20px;
+ right: 20px;
+ bottom: 12px;
+ height: 1px;
+ background: #dfe4ed
+}
+
+.custom-theme .el-select-group__title {
+ padding-left: 20px;
+ font-size: 12px;
+ color: #0a76a4;
+ line-height: 30px
+}
+
+.custom-theme .el-select-group .el-select-dropdown__item {
+ padding-left: 20px
+}
+
+.custom-theme .el-scrollbar {
+ overflow: hidden;
+ position: relative
+}
+
+.custom-theme .el-scrollbar:active > .el-scrollbar__bar, .custom-theme .el-scrollbar:focus > .el-scrollbar__bar, .custom-theme .el-scrollbar:hover > .el-scrollbar__bar {
+ opacity: 1;
+ -webkit-transition: opacity 340ms ease-out;
+ transition: opacity 340ms ease-out
+}
+
+.custom-theme .el-scrollbar__wrap {
+ overflow: scroll;
+ height: 100%
+}
+
+.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar {
+ width: 0;
+ height: 0
+}
+
+.custom-theme .el-scrollbar__thumb {
+ position: relative;
+ display: block;
+ width: 0;
+ height: 0;
+ cursor: pointer;
+ border-radius: inherit;
+ background-color: rgba(135, 141, 153, .3);
+ -webkit-transition: .3s background-color;
+ transition: .3s background-color
+}
+
+.custom-theme .el-scrollbar__thumb:hover {
+ background-color: rgba(135, 141, 153, .5)
+}
+
+.custom-theme .el-scrollbar__bar {
+ position: absolute;
+ right: 2px;
+ bottom: 2px;
+ z-index: 1;
+ border-radius: 4px;
+ opacity: 0;
+ -webkit-transition: opacity 120ms ease-out;
+ transition: opacity 120ms ease-out
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical {
+ width: 6px;
+ top: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical > div {
+ width: 100%
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal {
+ height: 6px;
+ left: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal > div {
+ height: 100%
+}
+
+.custom-theme .el-select {
+ display: inline-block;
+ position: relative
+}
+
+.custom-theme .el-select:hover .el-input__inner {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-select .el-input__inner {
+ cursor: pointer;
+ padding-right: 35px
+}
+
+.custom-theme .el-select .el-input__inner:focus {
+ border-color: #262729
+}
+
+.custom-theme .el-select .el-input .el-select__caret {
+ color: #b4bccc;
+ font-size: 14px;
+ -webkit-transition: -webkit-transform .3s;
+ transition: -webkit-transform .3s;
+ transition: transform .3s;
+ transition: transform .3s, -webkit-transform .3s;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ line-height: 16px;
+ cursor: pointer
+}
+
+.custom-theme .el-select .el-input .el-select__caret.is-reverse {
+ -webkit-transform: rotateZ(0);
+ transform: rotateZ(0)
+}
+
+.custom-theme .el-select .el-input .el-select__caret.is-show-close {
+ font-size: 14px;
+ text-align: center;
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg);
+ border-radius: 100%;
+ color: #b4bccc;
+ -webkit-transition: color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-select .el-input .el-select__caret.is-show-close:hover {
+ color: #878d99
+}
+
+.custom-theme .el-select .el-input.is-disabled .el-input__inner {
+ cursor: not-allowed
+}
+
+.custom-theme .el-select .el-input.is-disabled .el-input__inner:hover {
+ border-color: #dfe4ed
+}
+
+.custom-theme .el-select > .el-input {
+ display: block
+}
+
+.custom-theme .el-select__input {
+ border: none;
+ outline: 0;
+ padding: 0;
+ margin-left: 15px;
+ color: #666;
+ font-size: 14px;
+ vertical-align: baseline;
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ height: 28px;
+ background-color: transparent
+}
+
+.custom-theme .el-select__input.is-mini {
+ height: 14px
+}
+
+.custom-theme .el-select__close {
+ cursor: pointer;
+ position: absolute;
+ top: 8px;
+ z-index: 1000;
+ right: 25px;
+ color: #b4bccc;
+ line-height: 18px;
+ font-size: 14px
+}
+
+.custom-theme .el-select__close:hover {
+ color: #878d99
+}
+
+.custom-theme .el-select__tags {
+ position: absolute;
+ line-height: normal;
+ white-space: normal;
+ z-index: 1;
+ top: 50%;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%)
+}
+
+.custom-theme .el-select .el-tag__close {
+ margin-top: -2px
+}
+
+.custom-theme .el-select .el-tag {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border-color: transparent;
+ margin: 3px 0 3px 6px;
+ background-color: #f0f2f5
+}
+
+.custom-theme .el-select .el-tag__close.el-icon-close {
+ background-color: #b4bccc;
+ right: -7px;
+ color: #fff
+}
+
+.custom-theme .el-select .el-tag__close.el-icon-close:hover {
+ background-color: #878d99
+}
+
+.custom-theme .el-select .el-tag__close.el-icon-close::before {
+ display: block;
+ -webkit-transform: translate(0, .5px);
+ transform: translate(0, .5px)
+}
+
+.custom-theme .el-select__tag {
+ display: inline-block;
+ height: 24px;
+ line-height: 24px;
+ font-size: 14px;
+ border-radius: 4px;
+ color: #fff;
+ background-color: #262729
+}
+
+.custom-theme .el-select__tag .el-icon-close {
+ font-size: 14px
+}
+
+.custom-theme .el-button {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+ background: #fff;
+ border: 1px solid #d8dce5;
+ border-color: #d8dce5;
+ color: #5a5e66;
+ -webkit-appearance: none;
+ text-align: center;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ -webkit-transition: .1s;
+ transition: .1s;
+ font-weight: 500;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ padding: 12px 20px;
+ font-size: 14px;
+ border-radius: 4px
+}
+
+.custom-theme .el-button + .el-button {
+ margin-left: 10px
+}
+
+.custom-theme .el-button.is-round {
+ padding: 12px 20px
+}
+
+.custom-theme .el-button:focus, .custom-theme .el-button:hover {
+ color: #262729;
+ border-color: #bebebf;
+ background-color: #e9e9ea
+}
+
+.custom-theme .el-button:active {
+ color: #222325;
+ border-color: #222325;
+ outline: 0
+}
+
+.custom-theme .el-button::-moz-focus-inner {
+ border: 0
+}
+
+.custom-theme .el-button [class*=el-icon-] + span {
+ margin-left: 5px
+}
+
+.custom-theme .el-button.is-plain:focus, .custom-theme .el-button.is-plain:hover {
+ background: #fff;
+ border-color: #262729;
+ color: #262729
+}
+
+.custom-theme .el-button.is-plain:active {
+ background: #fff;
+ border-color: #222325;
+ color: #222325;
+ outline: 0
+}
+
+.custom-theme .el-button.is-active {
+ color: #222325;
+ border-color: #222325
+}
+
+.custom-theme .el-button.is-disabled, .custom-theme .el-button.is-disabled:focus, .custom-theme .el-button.is-disabled:hover {
+ color: #b4bccc;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: #fff;
+ border-color: #e6ebf5
+}
+
+.custom-theme .el-button.is-disabled.el-button--text {
+ background-color: transparent
+}
+
+.custom-theme .el-button.is-disabled.is-plain, .custom-theme .el-button.is-disabled.is-plain:focus, .custom-theme .el-button.is-disabled.is-plain:hover {
+ background-color: #fff;
+ border-color: #e6ebf5;
+ color: #b4bccc
+}
+
+.custom-theme .el-button.is-loading {
+ position: relative;
+ pointer-events: none
+}
+
+.custom-theme .el-button.is-loading:before {
+ pointer-events: none;
+ content: '';
+ position: absolute;
+ left: -1px;
+ top: -1px;
+ right: -1px;
+ bottom: -1px;
+ border-radius: inherit;
+ background-color: rgba(255, 255, 255, .35)
+}
+
+.custom-theme .el-button.is-round {
+ border-radius: 20px;
+ padding: 12px 23px
+}
+
+.custom-theme .el-button--primary {
+ color: #fff;
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-button--primary:focus, .custom-theme .el-button--primary:hover {
+ background: #515254;
+ border-color: #515254;
+ color: #fff
+}
+
+.custom-theme .el-button--primary:active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--primary.is-active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff
+}
+
+.custom-theme .el-button--primary.is-disabled, .custom-theme .el-button--primary.is-disabled:active, .custom-theme .el-button--primary.is-disabled:focus, .custom-theme .el-button--primary.is-disabled:hover {
+ color: #fff;
+ background-color: #939394;
+ border-color: #939394
+}
+
+.custom-theme .el-button--primary.is-plain {
+ color: #262729;
+ background: #e9e9ea;
+ border-color: #a8a9a9
+}
+
+.custom-theme .el-button--primary.is-plain:focus, .custom-theme .el-button--primary.is-plain:hover {
+ background: #262729;
+ border-color: #262729;
+ color: #fff
+}
+
+.custom-theme .el-button--primary.is-plain:active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--primary.is-plain.is-disabled, .custom-theme .el-button--primary.is-plain.is-disabled:active, .custom-theme .el-button--primary.is-plain.is-disabled:focus, .custom-theme .el-button--primary.is-plain.is-disabled:hover {
+ color: #7d7d7f;
+ background-color: #e9e9ea;
+ border-color: #d4d4d4
+}
+
+.custom-theme .el-button--success {
+ color: #fff;
+ background-color: #409167;
+ border-color: #409167
+}
+
+.custom-theme .el-button--success:focus, .custom-theme .el-button--success:hover {
+ background: #66a785;
+ border-color: #66a785;
+ color: #fff
+}
+
+.custom-theme .el-button--success:active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--success.is-active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff
+}
+
+.custom-theme .el-button--success.is-disabled, .custom-theme .el-button--success.is-disabled:active, .custom-theme .el-button--success.is-disabled:focus, .custom-theme .el-button--success.is-disabled:hover {
+ color: #fff;
+ background-color: #a0c8b3;
+ border-color: #a0c8b3
+}
+
+.custom-theme .el-button--success.is-plain {
+ color: #409167;
+ background: #ecf4f0;
+ border-color: #b3d3c2
+}
+
+.custom-theme .el-button--success.is-plain:focus, .custom-theme .el-button--success.is-plain:hover {
+ background: #409167;
+ border-color: #409167;
+ color: #fff
+}
+
+.custom-theme .el-button--success.is-plain:active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--success.is-plain.is-disabled, .custom-theme .el-button--success.is-plain.is-disabled:active, .custom-theme .el-button--success.is-plain.is-disabled:focus, .custom-theme .el-button--success.is-plain.is-disabled:hover {
+ color: #8cbda4;
+ background-color: #ecf4f0;
+ border-color: #d9e9e1
+}
+
+.custom-theme .el-button--warning {
+ color: #fff;
+ background-color: #9da408;
+ border-color: #9da408
+}
+
+.custom-theme .el-button--warning:focus, .custom-theme .el-button--warning:hover {
+ background: #b1b639;
+ border-color: #b1b639;
+ color: #fff
+}
+
+.custom-theme .el-button--warning:active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--warning.is-active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff
+}
+
+.custom-theme .el-button--warning.is-disabled, .custom-theme .el-button--warning.is-disabled:active, .custom-theme .el-button--warning.is-disabled:focus, .custom-theme .el-button--warning.is-disabled:hover {
+ color: #fff;
+ background-color: #ced284;
+ border-color: #ced284
+}
+
+.custom-theme .el-button--warning.is-plain {
+ color: #9da408;
+ background: #f5f6e6;
+ border-color: #d8db9c
+}
+
+.custom-theme .el-button--warning.is-plain:focus, .custom-theme .el-button--warning.is-plain:hover {
+ background: #9da408;
+ border-color: #9da408;
+ color: #fff
+}
+
+.custom-theme .el-button--warning.is-plain:active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--warning.is-plain.is-disabled, .custom-theme .el-button--warning.is-plain.is-disabled:active, .custom-theme .el-button--warning.is-plain.is-disabled:focus, .custom-theme .el-button--warning.is-plain.is-disabled:hover {
+ color: #c4c86b;
+ background-color: #f5f6e6;
+ border-color: #ebedce
+}
+
+.custom-theme .el-button--danger {
+ color: #fff;
+ background-color: #b3450e;
+ border-color: #b3450e
+}
+
+.custom-theme .el-button--danger:focus, .custom-theme .el-button--danger:hover {
+ background: #c26a3e;
+ border-color: #c26a3e;
+ color: #fff
+}
+
+.custom-theme .el-button--danger:active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--danger.is-active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff
+}
+
+.custom-theme .el-button--danger.is-disabled, .custom-theme .el-button--danger.is-disabled:active, .custom-theme .el-button--danger.is-disabled:focus, .custom-theme .el-button--danger.is-disabled:hover {
+ color: #fff;
+ background-color: #d9a287;
+ border-color: #d9a287
+}
+
+.custom-theme .el-button--danger.is-plain {
+ color: #b3450e;
+ background: #f7ece7;
+ border-color: #e1b59f
+}
+
+.custom-theme .el-button--danger.is-plain:focus, .custom-theme .el-button--danger.is-plain:hover {
+ background: #b3450e;
+ border-color: #b3450e;
+ color: #fff
+}
+
+.custom-theme .el-button--danger.is-plain:active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--danger.is-plain.is-disabled, .custom-theme .el-button--danger.is-plain.is-disabled:active, .custom-theme .el-button--danger.is-plain.is-disabled:focus, .custom-theme .el-button--danger.is-plain.is-disabled:hover {
+ color: #d18f6e;
+ background-color: #f7ece7;
+ border-color: #f0dacf
+}
+
+.custom-theme .el-button--info {
+ color: #fff;
+ background-color: #0a76a4;
+ border-color: #0a76a4
+}
+
+.custom-theme .el-button--info:focus, .custom-theme .el-button--info:hover {
+ background: #3b91b6;
+ border-color: #3b91b6;
+ color: #fff
+}
+
+.custom-theme .el-button--info:active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--info.is-active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff
+}
+
+.custom-theme .el-button--info.is-disabled, .custom-theme .el-button--info.is-disabled:active, .custom-theme .el-button--info.is-disabled:focus, .custom-theme .el-button--info.is-disabled:hover {
+ color: #fff;
+ background-color: #85bbd2;
+ border-color: #85bbd2
+}
+
+.custom-theme .el-button--info.is-plain {
+ color: #0a76a4;
+ background: #e7f1f6;
+ border-color: #9dc8db
+}
+
+.custom-theme .el-button--info.is-plain:focus, .custom-theme .el-button--info.is-plain:hover {
+ background: #0a76a4;
+ border-color: #0a76a4;
+ color: #fff
+}
+
+.custom-theme .el-button--info.is-plain:active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--info.is-plain.is-disabled, .custom-theme .el-button--info.is-plain.is-disabled:active, .custom-theme .el-button--info.is-plain.is-disabled:focus, .custom-theme .el-button--info.is-plain.is-disabled:hover {
+ color: #6cadc8;
+ background-color: #e7f1f6;
+ border-color: #cee4ed
+}
+
+.custom-theme .el-button--medium {
+ padding: 10px 20px;
+ font-size: 14px;
+ border-radius: 4px
+}
+
+.custom-theme .el-button--medium.is-round {
+ padding: 10px 20px
+}
+
+.custom-theme .el-button--small {
+ padding: 9px 15px;
+ font-size: 12px;
+ border-radius: 3px
+}
+
+.custom-theme .el-button--small.is-round {
+ padding: 9px 15px
+}
+
+.custom-theme .el-button--mini {
+ padding: 7px 15px;
+ font-size: 12px;
+ border-radius: 3px
+}
+
+.custom-theme .el-button--mini.is-round {
+ padding: 7px 15px
+}
+
+.custom-theme .el-button--text {
+ border: none;
+ color: #262729;
+ background: 0 0;
+ padding-left: 0;
+ padding-right: 0
+}
+
+.custom-theme .el-button--text:focus, .custom-theme .el-button--text:hover {
+ color: #515254;
+ border-color: transparent;
+ background-color: transparent
+}
+
+.custom-theme .el-button--text:active {
+ color: #222325;
+ border-color: transparent;
+ background-color: transparent
+}
+
+.custom-theme .el-button-group {
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-button-group::after, .custom-theme .el-button-group::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-button-group::after {
+ clear: both
+}
+
+.custom-theme .el-button-group .el-button {
+ float: left;
+ position: relative
+}
+
+.custom-theme .el-button-group .el-button + .el-button {
+ margin-left: 0
+}
+
+.custom-theme .el-button-group .el-button:first-child {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:last-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child) {
+ border-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:not(:last-child) {
+ margin-right: -1px
+}
+
+.custom-theme .el-button-group .el-button:active, .custom-theme .el-button-group .el-button:focus, .custom-theme .el-button-group .el-button:hover {
+ z-index: 1
+}
+
+.custom-theme .el-button-group .el-button.is-active {
+ z-index: 1
+}
+
+.custom-theme .el-button-group .el-button--primary:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--primary:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-checkbox {
+ color: #5a5e66;
+ font-weight: 500;
+ font-size: 14px;
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ white-space: nowrap;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none
+}
+
+.custom-theme .el-checkbox.is-bordered {
+ padding: 9px 20px 9px 10px;
+ border-radius: 4px;
+ border: 1px solid #d8dce5
+}
+
+.custom-theme .el-checkbox.is-bordered.is-checked {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox.is-bordered.is-disabled {
+ border-color: #e6ebf5;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox.is-bordered + .el-checkbox.is-bordered {
+ margin-left: 10px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium {
+ padding: 7px 20px 7px 10px;
+ border-radius: 4px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label {
+ line-height: 17px;
+ font-size: 14px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner {
+ height: 14px;
+ width: 14px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small {
+ padding: 3px 15px 7px 10px;
+ border-radius: 3px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label {
+ line-height: 15px;
+ font-size: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner {
+ height: 12px;
+ width: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after {
+ height: 6px;
+ width: 2px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini {
+ padding: 1px 15px 5px 10px;
+ border-radius: 3px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label {
+ line-height: 12px;
+ font-size: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner {
+ height: 12px;
+ width: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after {
+ height: 6px;
+ width: 2px
+}
+
+.custom-theme .el-checkbox__input {
+ white-space: nowrap;
+ cursor: pointer;
+ outline: 0;
+ display: inline-block;
+ line-height: 1;
+ position: relative;
+ vertical-align: middle
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after {
+ cursor: not-allowed;
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner + .el-checkbox__label {
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before {
+ background-color: #b4bccc;
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled + span.el-checkbox__label {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner {
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after {
+ -webkit-transform: rotate(45deg) scaleY(1);
+ transform: rotate(45deg) scaleY(1)
+}
+
+.custom-theme .el-checkbox__input.is-checked + .el-checkbox__label {
+ color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before {
+ content: '';
+ position: absolute;
+ display: block;
+ background-color: #fff;
+ height: 2px;
+ -webkit-transform: scale(.5);
+ transform: scale(.5);
+ left: 0;
+ right: 0;
+ top: 5px
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after {
+ display: none
+}
+
+.custom-theme .el-checkbox__inner {
+ display: inline-block;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 2px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 14px;
+ height: 14px;
+ background-color: #fff;
+ z-index: 1;
+ -webkit-transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46);
+ transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46)
+}
+
+.custom-theme .el-checkbox__inner:hover {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__inner::after {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ content: "";
+ border: 1px solid #fff;
+ border-left: 0;
+ border-top: 0;
+ height: 7px;
+ left: 4px;
+ position: absolute;
+ top: 1px;
+ -webkit-transform: rotate(45deg) scaleY(0);
+ transform: rotate(45deg) scaleY(0);
+ width: 3px;
+ -webkit-transition: -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms, -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ -webkit-transform-origin: center;
+ transform-origin: center
+}
+
+.custom-theme .el-checkbox__original {
+ opacity: 0;
+ outline: 0;
+ position: absolute;
+ margin: 0;
+ width: 0;
+ height: 0;
+ left: -999px
+}
+
+.custom-theme .el-checkbox__label {
+ display: inline-block;
+ padding-left: 10px;
+ line-height: 19px;
+ font-size: 14px
+}
+
+.custom-theme .el-checkbox + .el-checkbox {
+ margin-left: 30px
+}
+
+.custom-theme .el-checkbox-button {
+ position: relative;
+ display: inline-block
+}
+
+.custom-theme .el-checkbox-button__inner {
+ display: inline-block;
+ line-height: 1;
+ font-weight: 500;
+ white-space: nowrap;
+ vertical-align: middle;
+ cursor: pointer;
+ background: #fff;
+ border: 1px solid #d8dce5;
+ border-left: 0;
+ color: #5a5e66;
+ -webkit-appearance: none;
+ text-align: center;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ position: relative;
+ -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ padding: 12px 20px;
+ font-size: 14px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button__inner.is-round {
+ padding: 12px 20px
+}
+
+.custom-theme .el-checkbox-button__inner:hover {
+ color: #262729
+}
+
+.custom-theme .el-checkbox-button__inner [class*=el-icon-] {
+ line-height: .9
+}
+
+.custom-theme .el-checkbox-button__inner [class*=el-icon-] + span {
+ margin-left: 5px
+}
+
+.custom-theme .el-checkbox-button__original {
+ opacity: 0;
+ outline: 0;
+ position: absolute;
+ margin: 0;
+ left: -999px
+}
+
+.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner {
+ color: #fff;
+ background-color: #262729;
+ border-color: #262729;
+ -webkit-box-shadow: -1px 0 0 0 #7d7d7f;
+ box-shadow: -1px 0 0 0 #7d7d7f
+}
+
+.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner {
+ color: #b4bccc;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: #fff;
+ border-color: #e6ebf5;
+ -webkit-box-shadow: none;
+ box-shadow: none
+}
+
+.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner {
+ border-left: 1px solid #d8dce5;
+ border-radius: 4px 0 0 4px;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important
+}
+
+.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner {
+ border-radius: 0 4px 4px 0
+}
+
+.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner {
+ padding: 10px 20px;
+ font-size: 14px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round {
+ padding: 10px 20px
+}
+
+.custom-theme .el-checkbox-button--small .el-checkbox-button__inner {
+ padding: 9px 15px;
+ font-size: 12px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round {
+ padding: 9px 15px
+}
+
+.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner {
+ padding: 7px 15px;
+ font-size: 12px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round {
+ padding: 7px 15px
+}
+
+.custom-theme .el-checkbox-group {
+ font-size: 0
+}
+
+.custom-theme .el-tag {
+ background-color: rgba(38, 39, 41, .1);
+ display: inline-block;
+ padding: 0 10px;
+ height: 32px;
+ line-height: 30px;
+ font-size: 12px;
+ color: #262729;
+ border-radius: 4px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid rgba(38, 39, 41, .2);
+ white-space: nowrap
+}
+
+.custom-theme .el-tag .el-icon-close {
+ border-radius: 50%;
+ text-align: center;
+ position: relative;
+ cursor: pointer;
+ font-size: 12px;
+ height: 18px;
+ width: 18px;
+ line-height: 18px;
+ vertical-align: middle;
+ top: -1px;
+ right: -5px;
+ color: #262729
+}
+
+.custom-theme .el-tag .el-icon-close::before {
+ display: block
+}
+
+.custom-theme .el-tag .el-icon-close:hover {
+ background-color: #262729;
+ color: #fff
+}
+
+.custom-theme .el-tag--info {
+ background-color: rgba(10, 118, 164, .1);
+ border-color: rgba(10, 118, 164, .2);
+ color: #0a76a4
+}
+
+.custom-theme .el-tag--info.is-hit {
+ border-color: #0a76a4
+}
+
+.custom-theme .el-tag--info .el-tag__close {
+ color: #0a76a4
+}
+
+.custom-theme .el-tag--info .el-tag__close:hover {
+ background-color: #0a76a4;
+ color: #fff
+}
+
+.custom-theme .el-tag--success {
+ background-color: rgba(64, 145, 103, .1);
+ border-color: rgba(64, 145, 103, .2);
+ color: #409167
+}
+
+.custom-theme .el-tag--success.is-hit {
+ border-color: #409167
+}
+
+.custom-theme .el-tag--success .el-tag__close {
+ color: #409167
+}
+
+.custom-theme .el-tag--success .el-tag__close:hover {
+ background-color: #409167;
+ color: #fff
+}
+
+.custom-theme .el-tag--warning {
+ background-color: rgba(157, 164, 8, .1);
+ border-color: rgba(157, 164, 8, .2);
+ color: #9da408
+}
+
+.custom-theme .el-tag--warning.is-hit {
+ border-color: #9da408
+}
+
+.custom-theme .el-tag--warning .el-tag__close {
+ color: #9da408
+}
+
+.custom-theme .el-tag--warning .el-tag__close:hover {
+ background-color: #9da408;
+ color: #fff
+}
+
+.custom-theme .el-tag--danger {
+ background-color: rgba(179, 69, 14, .1);
+ border-color: rgba(179, 69, 14, .2);
+ color: #b3450e
+}
+
+.custom-theme .el-tag--danger.is-hit {
+ border-color: #b3450e
+}
+
+.custom-theme .el-tag--danger .el-tag__close {
+ color: #b3450e
+}
+
+.custom-theme .el-tag--danger .el-tag__close:hover {
+ background-color: #b3450e;
+ color: #fff
+}
+
+.custom-theme .el-tag--medium {
+ height: 28px;
+ line-height: 26px
+}
+
+.custom-theme .el-tag--medium .el-icon-close {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-tag--small {
+ height: 24px;
+ padding: 0 8px;
+ line-height: 22px
+}
+
+.custom-theme .el-tag--small .el-icon-close {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-tag--mini {
+ height: 20px;
+ padding: 0 5px;
+ line-height: 19px
+}
+
+.custom-theme .el-tag--mini .el-icon-close {
+ margin-left: -3px;
+ -webkit-transform: scale(.7);
+ transform: scale(.7)
+}
+
+.custom-theme .el-table {
+ position: relative;
+ overflow: hidden;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ width: 100%;
+ max-width: 100%;
+ background-color: #fff;
+ font-size: 14px;
+ color: #5a5e66
+}
+
+.custom-theme .el-table__empty-block {
+ position: relative;
+ min-height: 60px;
+ text-align: center;
+ width: 100%;
+ height: 100%
+}
+
+.custom-theme .el-table__empty-text {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ color: color(#262729 s(16%) l(44%))
+}
+
+.custom-theme .el-table__expand-column .cell {
+ padding: 0;
+ text-align: center
+}
+
+.custom-theme .el-table__expand-icon {
+ position: relative;
+ cursor: pointer;
+ color: #666;
+ font-size: 12px;
+ -webkit-transition: -webkit-transform .2s ease-in-out;
+ transition: -webkit-transform .2s ease-in-out;
+ transition: transform .2s ease-in-out;
+ transition: transform .2s ease-in-out, -webkit-transform .2s ease-in-out;
+ height: 20px
+}
+
+.custom-theme .el-table__expand-icon--expanded {
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg)
+}
+
+.custom-theme .el-table__expand-icon > .el-icon {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ margin-left: -5px;
+ margin-top: -5px
+}
+
+.custom-theme .el-table__expanded-cell {
+ background-color: #fff
+}
+
+.custom-theme .el-table__expanded-cell[class*=cell] {
+ padding: 20px 50px
+}
+
+.custom-theme .el-table__expanded-cell:hover {
+ background-color: #f5f7fa !important
+}
+
+.custom-theme .el-table--fit {
+ border-right: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-table--fit td.gutter, .custom-theme .el-table--fit th.gutter {
+ border-right-width: 1px
+}
+
+.custom-theme .el-table thead {
+ color: #878d99;
+ font-weight: 500
+}
+
+.custom-theme .el-table thead.is-group th {
+ background: #f5f7fa
+}
+
+.custom-theme .el-table td, .custom-theme .el-table th {
+ padding: 12px 0;
+ min-width: 0;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-overflow: ellipsis;
+ vertical-align: middle;
+ position: relative
+}
+
+.custom-theme .el-table td.is-center, .custom-theme .el-table th.is-center {
+ text-align: center
+}
+
+.custom-theme .el-table td.is-left, .custom-theme .el-table th.is-left {
+ text-align: left
+}
+
+.custom-theme .el-table td.is-right, .custom-theme .el-table th.is-right {
+ text-align: right
+}
+
+.custom-theme .el-table td.gutter, .custom-theme .el-table th.gutter {
+ width: 15px;
+ border-right-width: 0;
+ border-bottom-width: 0;
+ padding: 0
+}
+
+.custom-theme .el-table td.is-hidden > *, .custom-theme .el-table th.is-hidden > * {
+ visibility: hidden
+}
+
+.custom-theme .el-table--medium td, .custom-theme .el-table--medium th {
+ padding: 10px 0
+}
+
+.custom-theme .el-table--small {
+ font-size: 12px
+}
+
+.custom-theme .el-table--small td, .custom-theme .el-table--small th {
+ padding: 8px 0
+}
+
+.custom-theme .el-table--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-table--mini td, .custom-theme .el-table--mini th {
+ padding: 6px 0
+}
+
+.custom-theme .el-table tr {
+ background-color: #fff
+}
+
+.custom-theme .el-table tr input[type=checkbox] {
+ margin: 0
+}
+
+.custom-theme .el-table td, .custom-theme .el-table th.is-leaf {
+ border-bottom: 1px solid #e6ebf5
+}
+
+.custom-theme .el-table th.is-sortable {
+ cursor: pointer
+}
+
+.custom-theme .el-table th {
+ white-space: nowrap;
+ overflow: hidden;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ text-align: left
+}
+
+.custom-theme .el-table th div {
+ display: inline-block;
+ padding-left: 10px;
+ padding-right: 10px;
+ line-height: 40px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis
+}
+
+.custom-theme .el-table th > .cell {
+ position: relative;
+ word-wrap: normal;
+ text-overflow: ellipsis;
+ display: inline-block;
+ vertical-align: middle;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-table th > .cell.highlight {
+ color: #262729
+}
+
+.custom-theme .el-table th.required > div::before {
+ display: inline-block;
+ content: "";
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background: #ff4d51;
+ margin-right: 5px;
+ vertical-align: middle
+}
+
+.custom-theme .el-table td div {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-table td.gutter {
+ width: 0
+}
+
+.custom-theme .el-table .cell {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: normal;
+ word-break: break-all;
+ line-height: 23px;
+ padding-left: 10px;
+ padding-right: 10px
+}
+
+.custom-theme .el-table .cell.el-tooltip {
+ white-space: nowrap;
+ min-width: 50px
+}
+
+.custom-theme .el-table td:first-child .cell, .custom-theme .el-table th:first-child .cell {
+ padding-left: 0
+}
+
+.custom-theme .el-table--border, .custom-theme .el-table--group {
+ border: 1px solid #e6ebf5
+}
+
+.custom-theme .el-table--border::after, .custom-theme .el-table--group::after, .custom-theme .el-table::before {
+ content: '';
+ position: absolute;
+ background-color: #e6ebf5;
+ z-index: 1
+}
+
+.custom-theme .el-table--border::after, .custom-theme .el-table--group::after {
+ top: 0;
+ right: 0;
+ width: 1px;
+ height: 100%
+}
+
+.custom-theme .el-table::before {
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ height: 1px
+}
+
+.custom-theme .el-table--border {
+ border-right: none;
+ border-bottom: none
+}
+
+.custom-theme .el-table--border td, .custom-theme .el-table--border th {
+ border-right: 1px solid #e6ebf5
+}
+
+.custom-theme .el-table--border td:first-child .cell, .custom-theme .el-table--border th:first-child .cell {
+ padding-left: 10px
+}
+
+.custom-theme .el-table--border .has-gutter td:nth-last-of-type(2), .custom-theme .el-table--border .has-gutter th:nth-last-of-type(2) {
+ border-right: none
+}
+
+.custom-theme .el-table--border th.gutter:last-of-type {
+ border-bottom: 1px solid #e6ebf5;
+ border-bottom-width: 1px
+}
+
+.custom-theme .el-table--border th {
+ border-bottom: 1px solid #e6ebf5
+}
+
+.custom-theme .el-table--hidden {
+ visibility: hidden
+}
+
+.custom-theme .el-table__fixed, .custom-theme .el-table__fixed-right {
+ position: absolute;
+ top: 0;
+ left: 0;
+ overflow-x: hidden;
+ -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, .12);
+ box-shadow: 0 0 10px rgba(0, 0, 0, .12)
+}
+
+.custom-theme .el-table__fixed-right::before, .custom-theme .el-table__fixed::before {
+ content: '';
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ height: 1px;
+ background-color: #e6ebf5;
+ z-index: 4
+}
+
+.custom-theme .el-table__fixed-right-patch {
+ position: absolute;
+ top: -1px;
+ right: 0;
+ background-color: #fff;
+ border-bottom: 1px solid #e6ebf5
+}
+
+.custom-theme .el-table__fixed-right {
+ top: 0;
+ left: auto;
+ right: 0
+}
+
+.custom-theme .el-table__fixed-right .el-table__fixed-body-wrapper, .custom-theme .el-table__fixed-right .el-table__fixed-footer-wrapper, .custom-theme .el-table__fixed-right .el-table__fixed-header-wrapper {
+ left: auto;
+ right: 0
+}
+
+.custom-theme .el-table__fixed-header-wrapper {
+ position: absolute;
+ left: 0;
+ top: 0;
+ z-index: 3
+}
+
+.custom-theme .el-table__fixed-footer-wrapper {
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ z-index: 3
+}
+
+.custom-theme .el-table__fixed-footer-wrapper tbody td {
+ border-top: 1px solid #e6ebf5;
+ background-color: #f5f7fa;
+ color: #5a5e66
+}
+
+.custom-theme .el-table__fixed-body-wrapper {
+ position: absolute;
+ left: 0;
+ top: 37px;
+ overflow: hidden;
+ z-index: 3
+}
+
+.custom-theme .el-table__body-wrapper, .custom-theme .el-table__footer-wrapper, .custom-theme .el-table__header-wrapper {
+ width: 100%
+}
+
+.custom-theme .el-table__footer-wrapper {
+ margin-top: -1px
+}
+
+.custom-theme .el-table__footer-wrapper td {
+ border-top: 1px solid #e6ebf5
+}
+
+.custom-theme .el-table__body, .custom-theme .el-table__footer, .custom-theme .el-table__header {
+ table-layout: fixed
+}
+
+.custom-theme .el-table__footer-wrapper, .custom-theme .el-table__header-wrapper {
+ overflow: hidden
+}
+
+.custom-theme .el-table__footer-wrapper tbody td, .custom-theme .el-table__header-wrapper tbody td {
+ background-color: #f5f7fa;
+ color: #5a5e66
+}
+
+.custom-theme .el-table__body-wrapper {
+ overflow: auto;
+ position: relative
+}
+
+.custom-theme .el-table__body-wrapper.is-scroll-none ~ .el-table__fixed, .custom-theme .el-table__body-wrapper.is-scroll-none ~ .el-table__fixed-right {
+ -webkit-box-shadow: none;
+ box-shadow: none
+}
+
+.custom-theme .el-table__body-wrapper.is-scroll-left ~ .el-table__fixed {
+ -webkit-box-shadow: none;
+ box-shadow: none
+}
+
+.custom-theme .el-table__body-wrapper.is-scroll-right ~ .el-table__fixed-right {
+ -webkit-box-shadow: none;
+ box-shadow: none
+}
+
+.custom-theme .el-table__body-wrapper .el-table--border.is-scroll-right ~ .el-table__fixed-right {
+ border-left: 1px solid #e6ebf5
+}
+
+.custom-theme .el-table__body-wrapper .el-table--border.is-scroll-left ~ .el-table__fixed {
+ border-right: 1px solid #e6ebf5
+}
+
+.custom-theme .el-table .caret-wrapper {
+ position: relative;
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ height: 13px;
+ width: 24px;
+ cursor: pointer;
+ overflow: initial
+}
+
+.custom-theme .el-table .sort-caret {
+ color: #0a76a4;
+ width: 14px;
+ overflow: hidden;
+ font-size: 13px
+}
+
+.custom-theme .el-table .ascending .sort-caret.ascending {
+ color: #262729
+}
+
+.custom-theme .el-table .descending .sort-caret.descending {
+ color: #262729
+}
+
+.custom-theme .el-table .hidden-columns {
+ visibility: hidden;
+ position: absolute;
+ z-index: -1
+}
+
+.custom-theme .el-table--striped .el-table__body tr.el-table__row--striped td {
+ background: #fafafa
+}
+
+.custom-theme .el-table--striped .el-table__body tr.el-table__row--striped.current-row td {
+ background-color: #e9e9ea
+}
+
+.custom-theme .el-table__body tr.hover-row.current-row > td, .custom-theme .el-table__body tr.hover-row.el-table__row--striped.current-row > td, .custom-theme .el-table__body tr.hover-row.el-table__row--striped > td, .custom-theme .el-table__body tr.hover-row > td {
+ background-color: #e9e9ea
+}
+
+.custom-theme .el-table__body tr.current-row > td {
+ background-color: #e9e9ea
+}
+
+.custom-theme .el-table__column-resize-proxy {
+ position: absolute;
+ left: 200px;
+ top: 0;
+ bottom: 0;
+ width: 0;
+ border-left: 1px solid #e6ebf5;
+ z-index: 10
+}
+
+.custom-theme .el-table__column-filter-trigger {
+ display: inline-block;
+ line-height: 34px;
+ cursor: pointer
+}
+
+.custom-theme .el-table__column-filter-trigger i {
+ color: #0a76a4;
+ font-size: 12px;
+ -webkit-transform: scale(.75);
+ transform: scale(.75)
+}
+
+.custom-theme .el-table--enable-row-transition .el-table__body td {
+ -webkit-transition: background-color .25s ease;
+ transition: background-color .25s ease
+}
+
+.custom-theme .el-table--enable-row-hover .el-table__body tr:hover > td {
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-table--fluid-height .el-table__fixed, .custom-theme .el-table--fluid-height .el-table__fixed-right {
+ bottom: 0;
+ overflow: hidden
+}
+
+.custom-theme .el-checkbox {
+ color: #5a5e66;
+ font-weight: 500;
+ font-size: 14px;
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ white-space: nowrap;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none
+}
+
+.custom-theme .el-checkbox.is-bordered {
+ padding: 9px 20px 9px 10px;
+ border-radius: 4px;
+ border: 1px solid #d8dce5
+}
+
+.custom-theme .el-checkbox.is-bordered.is-checked {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox.is-bordered.is-disabled {
+ border-color: #e6ebf5;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox.is-bordered + .el-checkbox.is-bordered {
+ margin-left: 10px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium {
+ padding: 7px 20px 7px 10px;
+ border-radius: 4px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label {
+ line-height: 17px;
+ font-size: 14px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner {
+ height: 14px;
+ width: 14px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small {
+ padding: 3px 15px 7px 10px;
+ border-radius: 3px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label {
+ line-height: 15px;
+ font-size: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner {
+ height: 12px;
+ width: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after {
+ height: 6px;
+ width: 2px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini {
+ padding: 1px 15px 5px 10px;
+ border-radius: 3px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label {
+ line-height: 12px;
+ font-size: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner {
+ height: 12px;
+ width: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after {
+ height: 6px;
+ width: 2px
+}
+
+.custom-theme .el-checkbox__input {
+ white-space: nowrap;
+ cursor: pointer;
+ outline: 0;
+ display: inline-block;
+ line-height: 1;
+ position: relative;
+ vertical-align: middle
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after {
+ cursor: not-allowed;
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner + .el-checkbox__label {
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before {
+ background-color: #b4bccc;
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled + span.el-checkbox__label {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner {
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after {
+ -webkit-transform: rotate(45deg) scaleY(1);
+ transform: rotate(45deg) scaleY(1)
+}
+
+.custom-theme .el-checkbox__input.is-checked + .el-checkbox__label {
+ color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before {
+ content: '';
+ position: absolute;
+ display: block;
+ background-color: #fff;
+ height: 2px;
+ -webkit-transform: scale(.5);
+ transform: scale(.5);
+ left: 0;
+ right: 0;
+ top: 5px
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after {
+ display: none
+}
+
+.custom-theme .el-checkbox__inner {
+ display: inline-block;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 2px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 14px;
+ height: 14px;
+ background-color: #fff;
+ z-index: 1;
+ -webkit-transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46);
+ transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46)
+}
+
+.custom-theme .el-checkbox__inner:hover {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__inner::after {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ content: "";
+ border: 1px solid #fff;
+ border-left: 0;
+ border-top: 0;
+ height: 7px;
+ left: 4px;
+ position: absolute;
+ top: 1px;
+ -webkit-transform: rotate(45deg) scaleY(0);
+ transform: rotate(45deg) scaleY(0);
+ width: 3px;
+ -webkit-transition: -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms, -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ -webkit-transform-origin: center;
+ transform-origin: center
+}
+
+.custom-theme .el-checkbox__original {
+ opacity: 0;
+ outline: 0;
+ position: absolute;
+ margin: 0;
+ width: 0;
+ height: 0;
+ left: -999px
+}
+
+.custom-theme .el-checkbox__label {
+ display: inline-block;
+ padding-left: 10px;
+ line-height: 19px;
+ font-size: 14px
+}
+
+.custom-theme .el-checkbox + .el-checkbox {
+ margin-left: 30px
+}
+
+.custom-theme .el-checkbox-button {
+ position: relative;
+ display: inline-block
+}
+
+.custom-theme .el-checkbox-button__inner {
+ display: inline-block;
+ line-height: 1;
+ font-weight: 500;
+ white-space: nowrap;
+ vertical-align: middle;
+ cursor: pointer;
+ background: #fff;
+ border: 1px solid #d8dce5;
+ border-left: 0;
+ color: #5a5e66;
+ -webkit-appearance: none;
+ text-align: center;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ position: relative;
+ -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ padding: 12px 20px;
+ font-size: 14px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button__inner.is-round {
+ padding: 12px 20px
+}
+
+.custom-theme .el-checkbox-button__inner:hover {
+ color: #262729
+}
+
+.custom-theme .el-checkbox-button__inner [class*=el-icon-] {
+ line-height: .9
+}
+
+.custom-theme .el-checkbox-button__inner [class*=el-icon-] + span {
+ margin-left: 5px
+}
+
+.custom-theme .el-checkbox-button__original {
+ opacity: 0;
+ outline: 0;
+ position: absolute;
+ margin: 0;
+ left: -999px
+}
+
+.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner {
+ color: #fff;
+ background-color: #262729;
+ border-color: #262729;
+ -webkit-box-shadow: -1px 0 0 0 #7d7d7f;
+ box-shadow: -1px 0 0 0 #7d7d7f
+}
+
+.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner {
+ color: #b4bccc;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: #fff;
+ border-color: #e6ebf5;
+ -webkit-box-shadow: none;
+ box-shadow: none
+}
+
+.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner {
+ border-left: 1px solid #d8dce5;
+ border-radius: 4px 0 0 4px;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important
+}
+
+.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner {
+ border-radius: 0 4px 4px 0
+}
+
+.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner {
+ padding: 10px 20px;
+ font-size: 14px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round {
+ padding: 10px 20px
+}
+
+.custom-theme .el-checkbox-button--small .el-checkbox-button__inner {
+ padding: 9px 15px;
+ font-size: 12px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round {
+ padding: 9px 15px
+}
+
+.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner {
+ padding: 7px 15px;
+ font-size: 12px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round {
+ padding: 7px 15px
+}
+
+.custom-theme .el-checkbox-group {
+ font-size: 0
+}
+
+.custom-theme .el-tag {
+ background-color: rgba(38, 39, 41, .1);
+ display: inline-block;
+ padding: 0 10px;
+ height: 32px;
+ line-height: 30px;
+ font-size: 12px;
+ color: #262729;
+ border-radius: 4px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid rgba(38, 39, 41, .2);
+ white-space: nowrap
+}
+
+.custom-theme .el-tag .el-icon-close {
+ border-radius: 50%;
+ text-align: center;
+ position: relative;
+ cursor: pointer;
+ font-size: 12px;
+ height: 18px;
+ width: 18px;
+ line-height: 18px;
+ vertical-align: middle;
+ top: -1px;
+ right: -5px;
+ color: #262729
+}
+
+.custom-theme .el-tag .el-icon-close::before {
+ display: block
+}
+
+.custom-theme .el-tag .el-icon-close:hover {
+ background-color: #262729;
+ color: #fff
+}
+
+.custom-theme .el-tag--info {
+ background-color: rgba(10, 118, 164, .1);
+ border-color: rgba(10, 118, 164, .2);
+ color: #0a76a4
+}
+
+.custom-theme .el-tag--info.is-hit {
+ border-color: #0a76a4
+}
+
+.custom-theme .el-tag--info .el-tag__close {
+ color: #0a76a4
+}
+
+.custom-theme .el-tag--info .el-tag__close:hover {
+ background-color: #0a76a4;
+ color: #fff
+}
+
+.custom-theme .el-tag--success {
+ background-color: rgba(64, 145, 103, .1);
+ border-color: rgba(64, 145, 103, .2);
+ color: #409167
+}
+
+.custom-theme .el-tag--success.is-hit {
+ border-color: #409167
+}
+
+.custom-theme .el-tag--success .el-tag__close {
+ color: #409167
+}
+
+.custom-theme .el-tag--success .el-tag__close:hover {
+ background-color: #409167;
+ color: #fff
+}
+
+.custom-theme .el-tag--warning {
+ background-color: rgba(157, 164, 8, .1);
+ border-color: rgba(157, 164, 8, .2);
+ color: #9da408
+}
+
+.custom-theme .el-tag--warning.is-hit {
+ border-color: #9da408
+}
+
+.custom-theme .el-tag--warning .el-tag__close {
+ color: #9da408
+}
+
+.custom-theme .el-tag--warning .el-tag__close:hover {
+ background-color: #9da408;
+ color: #fff
+}
+
+.custom-theme .el-tag--danger {
+ background-color: rgba(179, 69, 14, .1);
+ border-color: rgba(179, 69, 14, .2);
+ color: #b3450e
+}
+
+.custom-theme .el-tag--danger.is-hit {
+ border-color: #b3450e
+}
+
+.custom-theme .el-tag--danger .el-tag__close {
+ color: #b3450e
+}
+
+.custom-theme .el-tag--danger .el-tag__close:hover {
+ background-color: #b3450e;
+ color: #fff
+}
+
+.custom-theme .el-tag--medium {
+ height: 28px;
+ line-height: 26px
+}
+
+.custom-theme .el-tag--medium .el-icon-close {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-tag--small {
+ height: 24px;
+ padding: 0 8px;
+ line-height: 22px
+}
+
+.custom-theme .el-tag--small .el-icon-close {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-tag--mini {
+ height: 20px;
+ padding: 0 5px;
+ line-height: 19px
+}
+
+.custom-theme .el-tag--mini .el-icon-close {
+ margin-left: -3px;
+ -webkit-transform: scale(.7);
+ transform: scale(.7)
+}
+
+.custom-theme .el-table-column--selection .cell {
+ padding-left: 14px;
+ padding-right: 14px
+}
+
+.custom-theme .el-table-filter {
+ border: solid 1px #e6ebf5;
+ border-radius: 2px;
+ background-color: #fff;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 2px 0
+}
+
+.custom-theme .el-table-filter__list {
+ padding: 5px 0;
+ margin: 0;
+ list-style: none;
+ min-width: 100px
+}
+
+.custom-theme .el-table-filter__list-item {
+ line-height: 36px;
+ padding: 0 10px;
+ cursor: pointer;
+ font-size: 14px
+}
+
+.custom-theme .el-table-filter__list-item:hover {
+ background-color: #e9e9ea;
+ color: #515254
+}
+
+.custom-theme .el-table-filter__list-item.is-active {
+ background-color: #262729;
+ color: #fff
+}
+
+.custom-theme .el-table-filter__content {
+ min-width: 100px
+}
+
+.custom-theme .el-table-filter__bottom {
+ border-top: 1px solid #e6ebf5;
+ padding: 8px
+}
+
+.custom-theme .el-table-filter__bottom button {
+ background: 0 0;
+ border: none;
+ color: #5a5e66;
+ cursor: pointer;
+ font-size: 13px;
+ padding: 0 3px
+}
+
+.custom-theme .el-table-filter__bottom button:hover {
+ color: #262729
+}
+
+.custom-theme .el-table-filter__bottom button:focus {
+ outline: 0
+}
+
+.custom-theme .el-table-filter__bottom button.is-disabled {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-table-filter__checkbox-group {
+ padding: 10px
+}
+
+.custom-theme .el-table-filter__checkbox-group label.el-checkbox {
+ display: block;
+ margin-bottom: 8px;
+ margin-left: 5px
+}
+
+.custom-theme .el-table-filter__checkbox-group .el-checkbox:last-child {
+ margin-bottom: 0
+}
+
+.custom-theme .el-date-table {
+ font-size: 12px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none
+}
+
+.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover div {
+ background-color: #edf2fc
+}
+
+.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover td.available:hover {
+ color: #5a5e66
+}
+
+.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover td:first-child div {
+ margin-left: 5px;
+ border-top-left-radius: 15px;
+ border-bottom-left-radius: 15px
+}
+
+.custom-theme .el-date-table.is-week-mode .el-date-table__row:hover td:last-child div {
+ margin-right: 5px;
+ border-top-right-radius: 15px;
+ border-bottom-right-radius: 15px
+}
+
+.custom-theme .el-date-table.is-week-mode .el-date-table__row.current div {
+ background-color: #edf2fc
+}
+
+.custom-theme .el-date-table td {
+ width: 32px;
+ height: 30px;
+ padding: 4px 0;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ cursor: pointer;
+ position: relative
+}
+
+.custom-theme .el-date-table td div {
+ height: 30px;
+ padding: 3px 0;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-date-table td span {
+ width: 24px;
+ height: 24px;
+ display: block;
+ margin: 0 auto;
+ line-height: 24px;
+ position: absolute;
+ left: 50%;
+ -webkit-transform: translateX(-50%);
+ transform: translateX(-50%);
+ border-radius: 50%
+}
+
+.custom-theme .el-date-table td.next-month, .custom-theme .el-date-table td.prev-month {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-table td.today {
+ position: relative
+}
+
+.custom-theme .el-date-table td.today span {
+ color: #262729
+}
+
+.custom-theme .el-date-table td.today.end-date span, .custom-theme .el-date-table td.today.start-date span {
+ color: #fff
+}
+
+.custom-theme .el-date-table td.available:hover {
+ color: #262729
+}
+
+.custom-theme .el-date-table td.in-range div {
+ background-color: #edf2fc
+}
+
+.custom-theme .el-date-table td.in-range div:hover {
+ background-color: #edf2fc
+}
+
+.custom-theme .el-date-table td.current:not(.disabled) span {
+ color: #fff;
+ background-color: #262729
+}
+
+.custom-theme .el-date-table td.end-date div, .custom-theme .el-date-table td.start-date div {
+ color: #fff
+}
+
+.custom-theme .el-date-table td.end-date span, .custom-theme .el-date-table td.start-date span {
+ background-color: #262729
+}
+
+.custom-theme .el-date-table td.start-date div {
+ margin-left: 5px;
+ border-top-left-radius: 15px;
+ border-bottom-left-radius: 15px
+}
+
+.custom-theme .el-date-table td.end-date div {
+ margin-right: 5px;
+ border-top-right-radius: 15px;
+ border-bottom-right-radius: 15px
+}
+
+.custom-theme .el-date-table td.disabled div {
+ background-color: #f5f7fa;
+ opacity: 1;
+ cursor: not-allowed;
+ color: #b4bccc
+}
+
+.custom-theme .el-date-table td.week {
+ font-size: 80%;
+ color: #5a5e66
+}
+
+.custom-theme .el-date-table th {
+ padding: 5px;
+ color: #5a5e66;
+ font-weight: 400;
+ border-bottom: solid 1px #e6ebf5
+}
+
+.custom-theme .el-month-table {
+ font-size: 12px;
+ margin: -1px;
+ border-collapse: collapse
+}
+
+.custom-theme .el-month-table td {
+ text-align: center;
+ padding: 20px 3px;
+ cursor: pointer
+}
+
+.custom-theme .el-month-table td.disabled .cell {
+ background-color: #f5f7fa;
+ cursor: not-allowed;
+ color: #b4bccc
+}
+
+.custom-theme .el-month-table td.disabled .cell:hover {
+ color: #b4bccc
+}
+
+.custom-theme .el-month-table td .cell {
+ width: 48px;
+ height: 32px;
+ display: block;
+ line-height: 32px;
+ color: #5a5e66;
+ margin: 0 auto
+}
+
+.custom-theme .el-month-table td .cell:hover {
+ color: #262729
+}
+
+.custom-theme .el-month-table td.current:not(.disabled) .cell {
+ color: #262729
+}
+
+.custom-theme .el-year-table {
+ font-size: 12px;
+ margin: -1px;
+ border-collapse: collapse
+}
+
+.custom-theme .el-year-table .el-icon {
+ color: #2d2f33
+}
+
+.custom-theme .el-year-table td {
+ text-align: center;
+ padding: 20px 3px;
+ cursor: pointer
+}
+
+.custom-theme .el-year-table td.disabled .cell {
+ background-color: #f5f7fa;
+ cursor: not-allowed;
+ color: #b4bccc
+}
+
+.custom-theme .el-year-table td.disabled .cell:hover {
+ color: #b4bccc
+}
+
+.custom-theme .el-year-table td .cell {
+ width: 48px;
+ height: 32px;
+ display: block;
+ line-height: 32px;
+ color: #5a5e66;
+ margin: 0 auto
+}
+
+.custom-theme .el-year-table td .cell:hover {
+ color: #262729
+}
+
+.custom-theme .el-year-table td.current:not(.disabled) .cell {
+ color: #262729
+}
+
+.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper {
+ width: 33.3%
+}
+
+.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper:nth-child(2) {
+ margin-left: 1%
+}
+
+.custom-theme .el-time-spinner__wrapper {
+ max-height: 190px;
+ overflow: auto;
+ display: inline-block;
+ width: 50%;
+ vertical-align: top;
+ position: relative
+}
+
+.custom-theme .el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) {
+ padding-bottom: 15px
+}
+
+.custom-theme .el-time-spinner__wrapper.is-arrow {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ overflow: hidden
+}
+
+.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__list {
+ -webkit-transform: translateY(-32px);
+ transform: translateY(-32px)
+}
+
+.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active) {
+ background: #fff;
+ cursor: default
+}
+
+.custom-theme .el-time-spinner__arrow {
+ font-size: 12px;
+ color: #878d99;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ z-index: 1;
+ text-align: center;
+ height: 30px;
+ line-height: 30px;
+ cursor: pointer
+}
+
+.custom-theme .el-time-spinner__arrow:hover {
+ color: #262729
+}
+
+.custom-theme .el-time-spinner__arrow.el-icon-arrow-up {
+ top: 10px
+}
+
+.custom-theme .el-time-spinner__arrow.el-icon-arrow-down {
+ bottom: 10px
+}
+
+.custom-theme .el-time-spinner__input.el-input {
+ width: 70%
+}
+
+.custom-theme .el-time-spinner__input.el-input .el-input__inner {
+ padding: 0;
+ text-align: center
+}
+
+.custom-theme .el-time-spinner__list {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center
+}
+
+.custom-theme .el-time-spinner__list::after, .custom-theme .el-time-spinner__list::before {
+ content: '';
+ display: block;
+ width: 100%;
+ height: 80px
+}
+
+.custom-theme .el-time-spinner__item {
+ height: 32px;
+ line-height: 32px;
+ font-size: 12px;
+ color: #5a5e66
+}
+
+.custom-theme .el-time-spinner__item:hover:not(.disabled):not(.active) {
+ background: #f5f7fa;
+ cursor: pointer
+}
+
+.custom-theme .el-time-spinner__item.active:not(.disabled) {
+ color: #2d2f33;
+ font-weight: 700
+}
+
+.custom-theme .el-time-spinner__item.disabled {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .fade-in-linear-enter-active, .custom-theme .fade-in-linear-leave-active {
+ -webkit-transition: opacity .2s linear;
+ transition: opacity .2s linear
+}
+
+.custom-theme .fade-in-linear-enter, .custom-theme .fade-in-linear-leave, .custom-theme .fade-in-linear-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-fade-in-linear-enter-active, .custom-theme .el-fade-in-linear-leave-active {
+ -webkit-transition: opacity .2s linear;
+ transition: opacity .2s linear
+}
+
+.custom-theme .el-fade-in-linear-enter, .custom-theme .el-fade-in-linear-leave, .custom-theme .el-fade-in-linear-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-fade-in-enter-active, .custom-theme .el-fade-in-leave-active {
+ -webkit-transition: all .3s cubic-bezier(.55, 0, .1, 1);
+ transition: all .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-fade-in-enter, .custom-theme .el-fade-in-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-zoom-in-center-enter-active, .custom-theme .el-zoom-in-center-leave-active {
+ -webkit-transition: all .3s cubic-bezier(.55, 0, .1, 1);
+ transition: all .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-zoom-in-center-enter, .custom-theme .el-zoom-in-center-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleX(0);
+ transform: scaleX(0)
+}
+
+.custom-theme .el-zoom-in-top-enter-active, .custom-theme .el-zoom-in-top-leave-active {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: center top;
+ transform-origin: center top
+}
+
+.custom-theme .el-zoom-in-top-enter, .custom-theme .el-zoom-in-top-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0)
+}
+
+.custom-theme .el-zoom-in-bottom-enter-active, .custom-theme .el-zoom-in-bottom-leave-active {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom
+}
+
+.custom-theme .el-zoom-in-bottom-enter, .custom-theme .el-zoom-in-bottom-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0)
+}
+
+.custom-theme .el-zoom-in-left-enter-active, .custom-theme .el-zoom-in-left-leave-active {
+ opacity: 1;
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: top left;
+ transform-origin: top left
+}
+
+.custom-theme .el-zoom-in-left-enter, .custom-theme .el-zoom-in-left-leave-active {
+ opacity: 0;
+ -webkit-transform: scale(.45, .45);
+ transform: scale(.45, .45)
+}
+
+.custom-theme .collapse-transition {
+ -webkit-transition: .3s height ease-in-out, .3s padding-top ease-in-out, .3s padding-bottom ease-in-out;
+ transition: .3s height ease-in-out, .3s padding-top ease-in-out, .3s padding-bottom ease-in-out
+}
+
+.custom-theme .horizontal-collapse-transition {
+ -webkit-transition: .3s width ease-in-out, .3s padding-left ease-in-out, .3s padding-right ease-in-out;
+ transition: .3s width ease-in-out, .3s padding-left ease-in-out, .3s padding-right ease-in-out
+}
+
+.custom-theme .el-list-enter-active, .custom-theme .el-list-leave-active {
+ -webkit-transition: all 1s;
+ transition: all 1s
+}
+
+.custom-theme .el-list-enter, .custom-theme .el-list-leave-active {
+ opacity: 0;
+ -webkit-transform: translateY(-30px);
+ transform: translateY(-30px)
+}
+
+.custom-theme .el-opacity-transition {
+ -webkit-transition: opacity .3s cubic-bezier(.55, 0, .1, 1);
+ transition: opacity .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-date-editor {
+ position: relative;
+ display: inline-block;
+ text-align: left
+}
+
+.custom-theme .el-date-editor.el-input, .custom-theme .el-date-editor.el-input__inner {
+ width: 220px
+}
+
+.custom-theme .el-date-editor--daterange.el-input, .custom-theme .el-date-editor--daterange.el-input__inner, .custom-theme .el-date-editor--timerange.el-input, .custom-theme .el-date-editor--timerange.el-input__inner {
+ width: 350px
+}
+
+.custom-theme .el-date-editor--datetimerange.el-input, .custom-theme .el-date-editor--datetimerange.el-input__inner {
+ width: 400px
+}
+
+.custom-theme .el-date-editor .el-range__icon {
+ font-size: 14px;
+ margin-left: -5px;
+ color: #b4bccc;
+ float: left;
+ line-height: 32px
+}
+
+.custom-theme .el-date-editor .el-range-input {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ border: none;
+ outline: 0;
+ display: inline-block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ width: 39%;
+ text-align: center;
+ font-size: 14px;
+ color: #5a5e66
+}
+
+.custom-theme .el-date-editor .el-range-input::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-input:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-input::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-input::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-separator {
+ display: inline-block;
+ height: 100%;
+ padding: 0 5px;
+ margin: 0;
+ text-align: center;
+ line-height: 32px;
+ font-size: 14px;
+ width: 5%;
+ color: #2d2f33
+}
+
+.custom-theme .el-date-editor .el-range__close-icon {
+ font-size: 14px;
+ color: #b4bccc;
+ width: 25px;
+ display: inline-block;
+ float: right;
+ line-height: 32px
+}
+
+.custom-theme .el-range-editor.el-input__inner {
+ padding: 3px 10px
+}
+
+.custom-theme .el-range-editor.is-active {
+ border-color: #262729
+}
+
+.custom-theme .el-range-editor.is-active:hover {
+ border-color: #262729
+}
+
+.custom-theme .el-range-editor--medium.el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-range-editor--medium .el-range-separator {
+ line-height: 28px;
+ font-size: 14px
+}
+
+.custom-theme .el-range-editor--medium .el-range-input {
+ font-size: 14px
+}
+
+.custom-theme .el-range-editor--medium .el-range__close-icon, .custom-theme .el-range-editor--medium .el-range__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-range-editor--small.el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-range-editor--small .el-range-separator {
+ line-height: 24px;
+ font-size: 13px
+}
+
+.custom-theme .el-range-editor--small .el-range-input {
+ font-size: 13px
+}
+
+.custom-theme .el-range-editor--small .el-range__close-icon, .custom-theme .el-range-editor--small .el-range__icon {
+ line-height: 24px
+}
+
+.custom-theme .el-range-editor--mini.el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-range-editor--mini .el-range-separator {
+ line-height: 20px;
+ font-size: 12px
+}
+
+.custom-theme .el-range-editor--mini .el-range-input {
+ font-size: 12px
+}
+
+.custom-theme .el-range-editor--mini .el-range__close-icon, .custom-theme .el-range-editor--mini .el-range__icon {
+ line-height: 20px
+}
+
+.custom-theme .el-range-editor.is-disabled {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-range-editor.is-disabled:focus, .custom-theme .el-range-editor.is-disabled:hover {
+ border-color: #dfe4ed
+}
+
+.custom-theme .el-range-editor.is-disabled input {
+ background-color: #f5f7fa;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-range-editor.is-disabled input::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled input:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled input::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled input::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled .el-range-separator {
+ color: #b4bccc
+}
+
+.custom-theme .el-picker-panel {
+ color: #5a5e66;
+ border: 1px solid #dfe4ed;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ background: #fff;
+ border-radius: 4px;
+ line-height: 30px;
+ margin: 5px 0
+}
+
+.custom-theme .el-picker-panel__body-wrapper::after, .custom-theme .el-picker-panel__body::after {
+ content: "";
+ display: table;
+ clear: both
+}
+
+.custom-theme .el-picker-panel__content {
+ position: relative;
+ margin: 15px
+}
+
+.custom-theme .el-picker-panel__footer {
+ border-top: 1px solid #e4e4e4;
+ padding: 4px;
+ text-align: right;
+ background-color: #fff;
+ position: relative;
+ font-size: 0
+}
+
+.custom-theme .el-picker-panel__shortcut {
+ display: block;
+ width: 100%;
+ border: 0;
+ background-color: transparent;
+ line-height: 28px;
+ font-size: 14px;
+ color: #5a5e66;
+ padding-left: 12px;
+ text-align: left;
+ outline: 0;
+ cursor: pointer
+}
+
+.custom-theme .el-picker-panel__shortcut:hover {
+ color: #262729
+}
+
+.custom-theme .el-picker-panel__shortcut.active {
+ background-color: #e6f1fe;
+ color: #262729
+}
+
+.custom-theme .el-picker-panel__btn {
+ border: 1px solid #dcdcdc;
+ color: #333;
+ line-height: 24px;
+ border-radius: 2px;
+ padding: 0 20px;
+ cursor: pointer;
+ background-color: transparent;
+ outline: 0;
+ font-size: 12px
+}
+
+.custom-theme .el-picker-panel__btn[disabled] {
+ color: #ccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-picker-panel__icon-btn {
+ font-size: 12px;
+ color: #2d2f33;
+ border: 0;
+ background: 0 0;
+ cursor: pointer;
+ outline: 0;
+ margin-top: 8px
+}
+
+.custom-theme .el-picker-panel__icon-btn:hover {
+ color: #262729
+}
+
+.custom-theme .el-picker-panel__icon-btn.is-disabled {
+ color: #bbb
+}
+
+.custom-theme .el-picker-panel__icon-btn.is-disabled:hover {
+ cursor: not-allowed
+}
+
+.custom-theme .el-picker-panel__link-btn {
+ vertical-align: middle
+}
+
+.custom-theme .el-picker-panel .popper__arrow {
+ -webkit-transform: translateX(-400%);
+ transform: translateX(-400%)
+}
+
+.custom-theme .el-picker-panel [slot=sidebar], .custom-theme .el-picker-panel__sidebar {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 110px;
+ border-right: 1px solid #e4e4e4;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding-top: 6px;
+ background-color: #fff;
+ overflow: auto
+}
+
+.custom-theme .el-picker-panel [slot=sidebar] + .el-picker-panel__body, .custom-theme .el-picker-panel__sidebar + .el-picker-panel__body {
+ margin-left: 110px
+}
+
+.custom-theme .el-date-picker {
+ width: 322px
+}
+
+.custom-theme .el-date-picker.has-sidebar.has-time {
+ width: 434px
+}
+
+.custom-theme .el-date-picker.has-sidebar {
+ width: 438px
+}
+
+.custom-theme .el-date-picker.has-time .el-picker-panel__body-wrapper {
+ position: relative
+}
+
+.custom-theme .el-date-picker .el-picker-panel__content {
+ width: 292px
+}
+
+.custom-theme .el-date-picker table {
+ table-layout: fixed;
+ width: 100%
+}
+
+.custom-theme .el-date-picker__editor-wrap {
+ position: relative;
+ display: table-cell;
+ padding: 0 5px
+}
+
+.custom-theme .el-date-picker__time-header {
+ position: relative;
+ border-bottom: 1px solid #e4e4e4;
+ font-size: 12px;
+ padding: 8px 5px 5px 5px;
+ display: table;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-date-picker__header {
+ margin: 12px;
+ text-align: center
+}
+
+.custom-theme .el-date-picker__header--bordered {
+ margin-bottom: 0;
+ padding-bottom: 12px;
+ border-bottom: solid 1px #e6ebf5
+}
+
+.custom-theme .el-date-picker__header--bordered + .el-picker-panel__content {
+ margin-top: 0
+}
+
+.custom-theme .el-date-picker__header-label {
+ font-size: 16px;
+ font-weight: 500;
+ padding: 0 5px;
+ line-height: 22px;
+ text-align: center;
+ cursor: pointer;
+ color: #5a5e66
+}
+
+.custom-theme .el-date-picker__header-label:hover {
+ color: #262729
+}
+
+.custom-theme .el-date-picker__header-label.active {
+ color: #262729
+}
+
+.custom-theme .el-date-picker__prev-btn {
+ float: left
+}
+
+.custom-theme .el-date-picker__next-btn {
+ float: right
+}
+
+.custom-theme .el-date-picker__time-wrap {
+ padding: 10px;
+ text-align: center
+}
+
+.custom-theme .el-date-picker__time-label {
+ float: left;
+ cursor: pointer;
+ line-height: 30px;
+ margin-left: 10px
+}
+
+.custom-theme .el-date-range-picker {
+ width: 646px
+}
+
+.custom-theme .el-date-range-picker.has-sidebar {
+ width: 756px
+}
+
+.custom-theme .el-date-range-picker table {
+ table-layout: fixed;
+ width: 100%
+}
+
+.custom-theme .el-date-range-picker .el-picker-panel__body {
+ min-width: 513px
+}
+
+.custom-theme .el-date-range-picker .el-picker-panel__content {
+ margin: 0
+}
+
+.custom-theme .el-date-range-picker__header {
+ position: relative;
+ text-align: center;
+ height: 28px
+}
+
+.custom-theme .el-date-range-picker__header [class*=arrow-left] {
+ float: left
+}
+
+.custom-theme .el-date-range-picker__header [class*=arrow-right] {
+ float: right
+}
+
+.custom-theme .el-date-range-picker__header div {
+ font-size: 16px;
+ font-weight: 500;
+ margin-right: 50px
+}
+
+.custom-theme .el-date-range-picker__content {
+ float: left;
+ width: 50%;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 0;
+ padding: 16px
+}
+
+.custom-theme .el-date-range-picker__content.is-left {
+ border-right: 1px solid #e4e4e4
+}
+
+.custom-theme .el-date-range-picker__content.is-right .el-date-range-picker__header div {
+ margin-left: 50px;
+ margin-right: 50px
+}
+
+.custom-theme .el-date-range-picker__editors-wrap {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: table-cell
+}
+
+.custom-theme .el-date-range-picker__editors-wrap.is-right {
+ text-align: right
+}
+
+.custom-theme .el-date-range-picker__time-header {
+ position: relative;
+ border-bottom: 1px solid #e4e4e4;
+ font-size: 12px;
+ padding: 8px 5px 5px 5px;
+ display: table;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-date-range-picker__time-header > .el-icon-arrow-right {
+ font-size: 20px;
+ vertical-align: middle;
+ display: table-cell;
+ color: #2d2f33
+}
+
+.custom-theme .el-date-range-picker__time-picker-wrap {
+ position: relative;
+ display: table-cell;
+ padding: 0 5px
+}
+
+.custom-theme .el-date-range-picker__time-picker-wrap .el-picker-panel {
+ position: absolute;
+ top: 13px;
+ right: 0;
+ z-index: 1;
+ background: #fff
+}
+
+.custom-theme .el-time-range-picker {
+ width: 354px;
+ overflow: visible
+}
+
+.custom-theme .el-time-range-picker__content {
+ position: relative;
+ text-align: center;
+ padding: 10px
+}
+
+.custom-theme .el-time-range-picker__cell {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 0;
+ padding: 4px 7px 7px;
+ width: 50%;
+ display: inline-block
+}
+
+.custom-theme .el-time-range-picker__header {
+ margin-bottom: 5px;
+ text-align: center;
+ font-size: 14px
+}
+
+.custom-theme .el-time-range-picker__body {
+ border-radius: 2px;
+ border: 1px solid #dfe4ed
+}
+
+.custom-theme .el-time-panel {
+ margin: 5px 0;
+ border: solid 1px #dfe4ed;
+ background-color: #fff;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ border-radius: 2px;
+ position: absolute;
+ width: 180px;
+ left: 0;
+ z-index: 1000;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none
+}
+
+.custom-theme .el-time-panel__content {
+ font-size: 0;
+ position: relative;
+ overflow: hidden
+}
+
+.custom-theme .el-time-panel__content::after, .custom-theme .el-time-panel__content::before {
+ content: "";
+ top: 50%;
+ position: absolute;
+ margin-top: -15px;
+ height: 32px;
+ z-index: -1;
+ left: 0;
+ right: 0;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding-top: 6px;
+ text-align: left;
+ border-top: 1px solid #dfe4ed;
+ border-bottom: 1px solid #dfe4ed
+}
+
+.custom-theme .el-time-panel__content::after {
+ left: 50%;
+ margin-left: 12%;
+ margin-right: 12%
+}
+
+.custom-theme .el-time-panel__content::before {
+ padding-left: 50%;
+ margin-right: 12%;
+ margin-left: 12%
+}
+
+.custom-theme .el-time-panel__content.has-seconds::after {
+ left: calc(100% / 3 * 2)
+}
+
+.custom-theme .el-time-panel__content.has-seconds::before {
+ padding-left: calc(100% / 3)
+}
+
+.custom-theme .el-time-panel__footer {
+ border-top: 1px solid #e4e4e4;
+ padding: 4px;
+ height: 36px;
+ line-height: 25px;
+ text-align: right;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-time-panel__btn {
+ border: none;
+ line-height: 28px;
+ padding: 0 5px;
+ margin: 0 5px;
+ cursor: pointer;
+ background-color: transparent;
+ outline: 0;
+ font-size: 12px;
+ color: #2d2f33
+}
+
+.custom-theme .el-time-panel__btn.confirm {
+ font-weight: 800;
+ color: #262729
+}
+
+.custom-theme .el-time-panel .popper__arrow {
+ -webkit-transform: translateX(-400%);
+ transform: translateX(-400%)
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-scrollbar {
+ overflow: hidden;
+ position: relative
+}
+
+.custom-theme .el-scrollbar:active > .el-scrollbar__bar, .custom-theme .el-scrollbar:focus > .el-scrollbar__bar, .custom-theme .el-scrollbar:hover > .el-scrollbar__bar {
+ opacity: 1;
+ -webkit-transition: opacity 340ms ease-out;
+ transition: opacity 340ms ease-out
+}
+
+.custom-theme .el-scrollbar__wrap {
+ overflow: scroll;
+ height: 100%
+}
+
+.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar {
+ width: 0;
+ height: 0
+}
+
+.custom-theme .el-scrollbar__thumb {
+ position: relative;
+ display: block;
+ width: 0;
+ height: 0;
+ cursor: pointer;
+ border-radius: inherit;
+ background-color: rgba(135, 141, 153, .3);
+ -webkit-transition: .3s background-color;
+ transition: .3s background-color
+}
+
+.custom-theme .el-scrollbar__thumb:hover {
+ background-color: rgba(135, 141, 153, .5)
+}
+
+.custom-theme .el-scrollbar__bar {
+ position: absolute;
+ right: 2px;
+ bottom: 2px;
+ z-index: 1;
+ border-radius: 4px;
+ opacity: 0;
+ -webkit-transition: opacity 120ms ease-out;
+ transition: opacity 120ms ease-out
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical {
+ width: 6px;
+ top: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical > div {
+ width: 100%
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal {
+ height: 6px;
+ left: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal > div {
+ height: 100%
+}
+
+.custom-theme .el-popper .popper__arrow, .custom-theme .el-popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-popper .popper__arrow {
+ border-width: 6px;
+ -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03));
+ filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03))
+}
+
+.custom-theme .el-popper .popper__arrow::after {
+ content: " ";
+ border-width: 6px
+}
+
+.custom-theme .el-popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-color: #e6ebf5;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -6px;
+ border-top-color: #fff;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-width: 0;
+ border-bottom-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -6px;
+ border-top-width: 0;
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow {
+ top: 50%;
+ left: -6px;
+ margin-bottom: 3px;
+ border-right-color: #e6ebf5;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow::after {
+ bottom: -6px;
+ left: 1px;
+ border-right-color: #fff;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow {
+ top: 50%;
+ right: -6px;
+ margin-bottom: 3px;
+ border-right-width: 0;
+ border-left-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -6px;
+ margin-left: -6px;
+ border-right-width: 0;
+ border-left-color: #fff
+}
+
+.custom-theme .fade-in-linear-enter-active, .custom-theme .fade-in-linear-leave-active {
+ -webkit-transition: opacity .2s linear;
+ transition: opacity .2s linear
+}
+
+.custom-theme .fade-in-linear-enter, .custom-theme .fade-in-linear-leave, .custom-theme .fade-in-linear-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-fade-in-linear-enter-active, .custom-theme .el-fade-in-linear-leave-active {
+ -webkit-transition: opacity .2s linear;
+ transition: opacity .2s linear
+}
+
+.custom-theme .el-fade-in-linear-enter, .custom-theme .el-fade-in-linear-leave, .custom-theme .el-fade-in-linear-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-fade-in-enter-active, .custom-theme .el-fade-in-leave-active {
+ -webkit-transition: all .3s cubic-bezier(.55, 0, .1, 1);
+ transition: all .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-fade-in-enter, .custom-theme .el-fade-in-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-zoom-in-center-enter-active, .custom-theme .el-zoom-in-center-leave-active {
+ -webkit-transition: all .3s cubic-bezier(.55, 0, .1, 1);
+ transition: all .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-zoom-in-center-enter, .custom-theme .el-zoom-in-center-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleX(0);
+ transform: scaleX(0)
+}
+
+.custom-theme .el-zoom-in-top-enter-active, .custom-theme .el-zoom-in-top-leave-active {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: center top;
+ transform-origin: center top
+}
+
+.custom-theme .el-zoom-in-top-enter, .custom-theme .el-zoom-in-top-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0)
+}
+
+.custom-theme .el-zoom-in-bottom-enter-active, .custom-theme .el-zoom-in-bottom-leave-active {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom
+}
+
+.custom-theme .el-zoom-in-bottom-enter, .custom-theme .el-zoom-in-bottom-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0)
+}
+
+.custom-theme .el-zoom-in-left-enter-active, .custom-theme .el-zoom-in-left-leave-active {
+ opacity: 1;
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: top left;
+ transform-origin: top left
+}
+
+.custom-theme .el-zoom-in-left-enter, .custom-theme .el-zoom-in-left-leave-active {
+ opacity: 0;
+ -webkit-transform: scale(.45, .45);
+ transform: scale(.45, .45)
+}
+
+.custom-theme .collapse-transition {
+ -webkit-transition: .3s height ease-in-out, .3s padding-top ease-in-out, .3s padding-bottom ease-in-out;
+ transition: .3s height ease-in-out, .3s padding-top ease-in-out, .3s padding-bottom ease-in-out
+}
+
+.custom-theme .horizontal-collapse-transition {
+ -webkit-transition: .3s width ease-in-out, .3s padding-left ease-in-out, .3s padding-right ease-in-out;
+ transition: .3s width ease-in-out, .3s padding-left ease-in-out, .3s padding-right ease-in-out
+}
+
+.custom-theme .el-list-enter-active, .custom-theme .el-list-leave-active {
+ -webkit-transition: all 1s;
+ transition: all 1s
+}
+
+.custom-theme .el-list-enter, .custom-theme .el-list-leave-active {
+ opacity: 0;
+ -webkit-transform: translateY(-30px);
+ transform: translateY(-30px)
+}
+
+.custom-theme .el-opacity-transition {
+ -webkit-transition: opacity .3s cubic-bezier(.55, 0, .1, 1);
+ transition: opacity .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-date-editor {
+ position: relative;
+ display: inline-block;
+ text-align: left
+}
+
+.custom-theme .el-date-editor.el-input, .custom-theme .el-date-editor.el-input__inner {
+ width: 220px
+}
+
+.custom-theme .el-date-editor--daterange.el-input, .custom-theme .el-date-editor--daterange.el-input__inner, .custom-theme .el-date-editor--timerange.el-input, .custom-theme .el-date-editor--timerange.el-input__inner {
+ width: 350px
+}
+
+.custom-theme .el-date-editor--datetimerange.el-input, .custom-theme .el-date-editor--datetimerange.el-input__inner {
+ width: 400px
+}
+
+.custom-theme .el-date-editor .el-range__icon {
+ font-size: 14px;
+ margin-left: -5px;
+ color: #b4bccc;
+ float: left;
+ line-height: 32px
+}
+
+.custom-theme .el-date-editor .el-range-input {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ border: none;
+ outline: 0;
+ display: inline-block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ width: 39%;
+ text-align: center;
+ font-size: 14px;
+ color: #5a5e66
+}
+
+.custom-theme .el-date-editor .el-range-input::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-input:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-input::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-input::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-separator {
+ display: inline-block;
+ height: 100%;
+ padding: 0 5px;
+ margin: 0;
+ text-align: center;
+ line-height: 32px;
+ font-size: 14px;
+ width: 5%;
+ color: #2d2f33
+}
+
+.custom-theme .el-date-editor .el-range__close-icon {
+ font-size: 14px;
+ color: #b4bccc;
+ width: 25px;
+ display: inline-block;
+ float: right;
+ line-height: 32px
+}
+
+.custom-theme .el-range-editor.el-input__inner {
+ padding: 3px 10px
+}
+
+.custom-theme .el-range-editor.is-active {
+ border-color: #262729
+}
+
+.custom-theme .el-range-editor.is-active:hover {
+ border-color: #262729
+}
+
+.custom-theme .el-range-editor--medium.el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-range-editor--medium .el-range-separator {
+ line-height: 28px;
+ font-size: 14px
+}
+
+.custom-theme .el-range-editor--medium .el-range-input {
+ font-size: 14px
+}
+
+.custom-theme .el-range-editor--medium .el-range__close-icon, .custom-theme .el-range-editor--medium .el-range__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-range-editor--small.el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-range-editor--small .el-range-separator {
+ line-height: 24px;
+ font-size: 13px
+}
+
+.custom-theme .el-range-editor--small .el-range-input {
+ font-size: 13px
+}
+
+.custom-theme .el-range-editor--small .el-range__close-icon, .custom-theme .el-range-editor--small .el-range__icon {
+ line-height: 24px
+}
+
+.custom-theme .el-range-editor--mini.el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-range-editor--mini .el-range-separator {
+ line-height: 20px;
+ font-size: 12px
+}
+
+.custom-theme .el-range-editor--mini .el-range-input {
+ font-size: 12px
+}
+
+.custom-theme .el-range-editor--mini .el-range__close-icon, .custom-theme .el-range-editor--mini .el-range__icon {
+ line-height: 20px
+}
+
+.custom-theme .el-range-editor.is-disabled {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-range-editor.is-disabled:focus, .custom-theme .el-range-editor.is-disabled:hover {
+ border-color: #dfe4ed
+}
+
+.custom-theme .el-range-editor.is-disabled input {
+ background-color: #f5f7fa;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-range-editor.is-disabled input::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled input:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled input::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled input::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled .el-range-separator {
+ color: #b4bccc
+}
+
+.custom-theme .el-picker-panel {
+ color: #5a5e66;
+ border: 1px solid #dfe4ed;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ background: #fff;
+ border-radius: 4px;
+ line-height: 30px;
+ margin: 5px 0
+}
+
+.custom-theme .el-picker-panel__body-wrapper::after, .custom-theme .el-picker-panel__body::after {
+ content: "";
+ display: table;
+ clear: both
+}
+
+.custom-theme .el-picker-panel__content {
+ position: relative;
+ margin: 15px
+}
+
+.custom-theme .el-picker-panel__footer {
+ border-top: 1px solid #e4e4e4;
+ padding: 4px;
+ text-align: right;
+ background-color: #fff;
+ position: relative;
+ font-size: 0
+}
+
+.custom-theme .el-picker-panel__shortcut {
+ display: block;
+ width: 100%;
+ border: 0;
+ background-color: transparent;
+ line-height: 28px;
+ font-size: 14px;
+ color: #5a5e66;
+ padding-left: 12px;
+ text-align: left;
+ outline: 0;
+ cursor: pointer
+}
+
+.custom-theme .el-picker-panel__shortcut:hover {
+ color: #262729
+}
+
+.custom-theme .el-picker-panel__shortcut.active {
+ background-color: #e6f1fe;
+ color: #262729
+}
+
+.custom-theme .el-picker-panel__btn {
+ border: 1px solid #dcdcdc;
+ color: #333;
+ line-height: 24px;
+ border-radius: 2px;
+ padding: 0 20px;
+ cursor: pointer;
+ background-color: transparent;
+ outline: 0;
+ font-size: 12px
+}
+
+.custom-theme .el-picker-panel__btn[disabled] {
+ color: #ccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-picker-panel__icon-btn {
+ font-size: 12px;
+ color: #2d2f33;
+ border: 0;
+ background: 0 0;
+ cursor: pointer;
+ outline: 0;
+ margin-top: 8px
+}
+
+.custom-theme .el-picker-panel__icon-btn:hover {
+ color: #262729
+}
+
+.custom-theme .el-picker-panel__icon-btn.is-disabled {
+ color: #bbb
+}
+
+.custom-theme .el-picker-panel__icon-btn.is-disabled:hover {
+ cursor: not-allowed
+}
+
+.custom-theme .el-picker-panel__link-btn {
+ vertical-align: middle
+}
+
+.custom-theme .el-picker-panel .popper__arrow {
+ -webkit-transform: translateX(-400%);
+ transform: translateX(-400%)
+}
+
+.custom-theme .el-picker-panel [slot=sidebar], .custom-theme .el-picker-panel__sidebar {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 110px;
+ border-right: 1px solid #e4e4e4;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding-top: 6px;
+ background-color: #fff;
+ overflow: auto
+}
+
+.custom-theme .el-picker-panel [slot=sidebar] + .el-picker-panel__body, .custom-theme .el-picker-panel__sidebar + .el-picker-panel__body {
+ margin-left: 110px
+}
+
+.custom-theme .el-date-picker {
+ width: 322px
+}
+
+.custom-theme .el-date-picker.has-sidebar.has-time {
+ width: 434px
+}
+
+.custom-theme .el-date-picker.has-sidebar {
+ width: 438px
+}
+
+.custom-theme .el-date-picker.has-time .el-picker-panel__body-wrapper {
+ position: relative
+}
+
+.custom-theme .el-date-picker .el-picker-panel__content {
+ width: 292px
+}
+
+.custom-theme .el-date-picker table {
+ table-layout: fixed;
+ width: 100%
+}
+
+.custom-theme .el-date-picker__editor-wrap {
+ position: relative;
+ display: table-cell;
+ padding: 0 5px
+}
+
+.custom-theme .el-date-picker__time-header {
+ position: relative;
+ border-bottom: 1px solid #e4e4e4;
+ font-size: 12px;
+ padding: 8px 5px 5px 5px;
+ display: table;
+ width: 100%;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-date-picker__header {
+ margin: 12px;
+ text-align: center
+}
+
+.custom-theme .el-date-picker__header--bordered {
+ margin-bottom: 0;
+ padding-bottom: 12px;
+ border-bottom: solid 1px #e6ebf5
+}
+
+.custom-theme .el-date-picker__header--bordered + .el-picker-panel__content {
+ margin-top: 0
+}
+
+.custom-theme .el-date-picker__header-label {
+ font-size: 16px;
+ font-weight: 500;
+ padding: 0 5px;
+ line-height: 22px;
+ text-align: center;
+ cursor: pointer;
+ color: #5a5e66
+}
+
+.custom-theme .el-date-picker__header-label:hover {
+ color: #262729
+}
+
+.custom-theme .el-date-picker__header-label.active {
+ color: #262729
+}
+
+.custom-theme .el-date-picker__prev-btn {
+ float: left
+}
+
+.custom-theme .el-date-picker__next-btn {
+ float: right
+}
+
+.custom-theme .el-date-picker__time-wrap {
+ padding: 10px;
+ text-align: center
+}
+
+.custom-theme .el-date-picker__time-label {
+ float: left;
+ cursor: pointer;
+ line-height: 30px;
+ margin-left: 10px
+}
+
+.custom-theme .el-scrollbar {
+ overflow: hidden;
+ position: relative
+}
+
+.custom-theme .el-scrollbar:active > .el-scrollbar__bar, .custom-theme .el-scrollbar:focus > .el-scrollbar__bar, .custom-theme .el-scrollbar:hover > .el-scrollbar__bar {
+ opacity: 1;
+ -webkit-transition: opacity 340ms ease-out;
+ transition: opacity 340ms ease-out
+}
+
+.custom-theme .el-scrollbar__wrap {
+ overflow: scroll;
+ height: 100%
+}
+
+.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar {
+ width: 0;
+ height: 0
+}
+
+.custom-theme .el-scrollbar__thumb {
+ position: relative;
+ display: block;
+ width: 0;
+ height: 0;
+ cursor: pointer;
+ border-radius: inherit;
+ background-color: rgba(135, 141, 153, .3);
+ -webkit-transition: .3s background-color;
+ transition: .3s background-color
+}
+
+.custom-theme .el-scrollbar__thumb:hover {
+ background-color: rgba(135, 141, 153, .5)
+}
+
+.custom-theme .el-scrollbar__bar {
+ position: absolute;
+ right: 2px;
+ bottom: 2px;
+ z-index: 1;
+ border-radius: 4px;
+ opacity: 0;
+ -webkit-transition: opacity 120ms ease-out;
+ transition: opacity 120ms ease-out
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical {
+ width: 6px;
+ top: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical > div {
+ width: 100%
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal {
+ height: 6px;
+ left: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal > div {
+ height: 100%
+}
+
+.custom-theme .el-popper .popper__arrow, .custom-theme .el-popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-popper .popper__arrow {
+ border-width: 6px;
+ -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03));
+ filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03))
+}
+
+.custom-theme .el-popper .popper__arrow::after {
+ content: " ";
+ border-width: 6px
+}
+
+.custom-theme .el-popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-color: #e6ebf5;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -6px;
+ border-top-color: #fff;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-width: 0;
+ border-bottom-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -6px;
+ border-top-width: 0;
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow {
+ top: 50%;
+ left: -6px;
+ margin-bottom: 3px;
+ border-right-color: #e6ebf5;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow::after {
+ bottom: -6px;
+ left: 1px;
+ border-right-color: #fff;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow {
+ top: 50%;
+ right: -6px;
+ margin-bottom: 3px;
+ border-right-width: 0;
+ border-left-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -6px;
+ margin-left: -6px;
+ border-right-width: 0;
+ border-left-color: #fff
+}
+
+.custom-theme .time-select {
+ margin: 5px 0;
+ min-width: 0
+}
+
+.custom-theme .time-select .el-picker-panel__content {
+ max-height: 200px;
+ margin: 0
+}
+
+.custom-theme .time-select-item {
+ padding: 8px 10px;
+ font-size: 14px;
+ line-height: 20px
+}
+
+.custom-theme .time-select-item.selected:not(.disabled) {
+ color: #262729;
+ font-weight: 700
+}
+
+.custom-theme .time-select-item.disabled {
+ color: #dfe4ed;
+ cursor: not-allowed
+}
+
+.custom-theme .time-select-item:hover {
+ background-color: #f5f7fa;
+ font-weight: 700;
+ cursor: pointer
+}
+
+.custom-theme .fade-in-linear-enter-active, .custom-theme .fade-in-linear-leave-active {
+ -webkit-transition: opacity .2s linear;
+ transition: opacity .2s linear
+}
+
+.custom-theme .fade-in-linear-enter, .custom-theme .fade-in-linear-leave, .custom-theme .fade-in-linear-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-fade-in-linear-enter-active, .custom-theme .el-fade-in-linear-leave-active {
+ -webkit-transition: opacity .2s linear;
+ transition: opacity .2s linear
+}
+
+.custom-theme .el-fade-in-linear-enter, .custom-theme .el-fade-in-linear-leave, .custom-theme .el-fade-in-linear-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-fade-in-enter-active, .custom-theme .el-fade-in-leave-active {
+ -webkit-transition: all .3s cubic-bezier(.55, 0, .1, 1);
+ transition: all .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-fade-in-enter, .custom-theme .el-fade-in-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-zoom-in-center-enter-active, .custom-theme .el-zoom-in-center-leave-active {
+ -webkit-transition: all .3s cubic-bezier(.55, 0, .1, 1);
+ transition: all .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-zoom-in-center-enter, .custom-theme .el-zoom-in-center-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleX(0);
+ transform: scaleX(0)
+}
+
+.custom-theme .el-zoom-in-top-enter-active, .custom-theme .el-zoom-in-top-leave-active {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: center top;
+ transform-origin: center top
+}
+
+.custom-theme .el-zoom-in-top-enter, .custom-theme .el-zoom-in-top-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0)
+}
+
+.custom-theme .el-zoom-in-bottom-enter-active, .custom-theme .el-zoom-in-bottom-leave-active {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom
+}
+
+.custom-theme .el-zoom-in-bottom-enter, .custom-theme .el-zoom-in-bottom-leave-active {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0)
+}
+
+.custom-theme .el-zoom-in-left-enter-active, .custom-theme .el-zoom-in-left-leave-active {
+ opacity: 1;
+ -webkit-transform: scale(1, 1);
+ transform: scale(1, 1);
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ -webkit-transform-origin: top left;
+ transform-origin: top left
+}
+
+.custom-theme .el-zoom-in-left-enter, .custom-theme .el-zoom-in-left-leave-active {
+ opacity: 0;
+ -webkit-transform: scale(.45, .45);
+ transform: scale(.45, .45)
+}
+
+.custom-theme .collapse-transition {
+ -webkit-transition: .3s height ease-in-out, .3s padding-top ease-in-out, .3s padding-bottom ease-in-out;
+ transition: .3s height ease-in-out, .3s padding-top ease-in-out, .3s padding-bottom ease-in-out
+}
+
+.custom-theme .horizontal-collapse-transition {
+ -webkit-transition: .3s width ease-in-out, .3s padding-left ease-in-out, .3s padding-right ease-in-out;
+ transition: .3s width ease-in-out, .3s padding-left ease-in-out, .3s padding-right ease-in-out
+}
+
+.custom-theme .el-list-enter-active, .custom-theme .el-list-leave-active {
+ -webkit-transition: all 1s;
+ transition: all 1s
+}
+
+.custom-theme .el-list-enter, .custom-theme .el-list-leave-active {
+ opacity: 0;
+ -webkit-transform: translateY(-30px);
+ transform: translateY(-30px)
+}
+
+.custom-theme .el-opacity-transition {
+ -webkit-transition: opacity .3s cubic-bezier(.55, 0, .1, 1);
+ transition: opacity .3s cubic-bezier(.55, 0, .1, 1)
+}
+
+.custom-theme .el-date-editor {
+ position: relative;
+ display: inline-block;
+ text-align: left
+}
+
+.custom-theme .el-date-editor.el-input, .custom-theme .el-date-editor.el-input__inner {
+ width: 220px
+}
+
+.custom-theme .el-date-editor--daterange.el-input, .custom-theme .el-date-editor--daterange.el-input__inner, .custom-theme .el-date-editor--timerange.el-input, .custom-theme .el-date-editor--timerange.el-input__inner {
+ width: 350px
+}
+
+.custom-theme .el-date-editor--datetimerange.el-input, .custom-theme .el-date-editor--datetimerange.el-input__inner {
+ width: 400px
+}
+
+.custom-theme .el-date-editor .el-range__icon {
+ font-size: 14px;
+ margin-left: -5px;
+ color: #b4bccc;
+ float: left;
+ line-height: 32px
+}
+
+.custom-theme .el-date-editor .el-range-input {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+ border: none;
+ outline: 0;
+ display: inline-block;
+ height: 100%;
+ margin: 0;
+ padding: 0;
+ width: 39%;
+ text-align: center;
+ font-size: 14px;
+ color: #5a5e66
+}
+
+.custom-theme .el-date-editor .el-range-input::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-input:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-input::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-input::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-date-editor .el-range-separator {
+ display: inline-block;
+ height: 100%;
+ padding: 0 5px;
+ margin: 0;
+ text-align: center;
+ line-height: 32px;
+ font-size: 14px;
+ width: 5%;
+ color: #2d2f33
+}
+
+.custom-theme .el-date-editor .el-range__close-icon {
+ font-size: 14px;
+ color: #b4bccc;
+ width: 25px;
+ display: inline-block;
+ float: right;
+ line-height: 32px
+}
+
+.custom-theme .el-range-editor.el-input__inner {
+ padding: 3px 10px
+}
+
+.custom-theme .el-range-editor.is-active {
+ border-color: #262729
+}
+
+.custom-theme .el-range-editor.is-active:hover {
+ border-color: #262729
+}
+
+.custom-theme .el-range-editor--medium.el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-range-editor--medium .el-range-separator {
+ line-height: 28px;
+ font-size: 14px
+}
+
+.custom-theme .el-range-editor--medium .el-range-input {
+ font-size: 14px
+}
+
+.custom-theme .el-range-editor--medium .el-range__close-icon, .custom-theme .el-range-editor--medium .el-range__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-range-editor--small.el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-range-editor--small .el-range-separator {
+ line-height: 24px;
+ font-size: 13px
+}
+
+.custom-theme .el-range-editor--small .el-range-input {
+ font-size: 13px
+}
+
+.custom-theme .el-range-editor--small .el-range__close-icon, .custom-theme .el-range-editor--small .el-range__icon {
+ line-height: 24px
+}
+
+.custom-theme .el-range-editor--mini.el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-range-editor--mini .el-range-separator {
+ line-height: 20px;
+ font-size: 12px
+}
+
+.custom-theme .el-range-editor--mini .el-range-input {
+ font-size: 12px
+}
+
+.custom-theme .el-range-editor--mini .el-range__close-icon, .custom-theme .el-range-editor--mini .el-range__icon {
+ line-height: 20px
+}
+
+.custom-theme .el-range-editor.is-disabled {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-range-editor.is-disabled:focus, .custom-theme .el-range-editor.is-disabled:hover {
+ border-color: #dfe4ed
+}
+
+.custom-theme .el-range-editor.is-disabled input {
+ background-color: #f5f7fa;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-range-editor.is-disabled input::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled input:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled input::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled input::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-range-editor.is-disabled .el-range-separator {
+ color: #b4bccc
+}
+
+.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper {
+ width: 33.3%
+}
+
+.custom-theme .el-time-spinner.has-seconds .el-time-spinner__wrapper:nth-child(2) {
+ margin-left: 1%
+}
+
+.custom-theme .el-time-spinner__wrapper {
+ max-height: 190px;
+ overflow: auto;
+ display: inline-block;
+ width: 50%;
+ vertical-align: top;
+ position: relative
+}
+
+.custom-theme .el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) {
+ padding-bottom: 15px
+}
+
+.custom-theme .el-time-spinner__wrapper.is-arrow {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ text-align: center;
+ overflow: hidden
+}
+
+.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__list {
+ -webkit-transform: translateY(-32px);
+ transform: translateY(-32px)
+}
+
+.custom-theme .el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active) {
+ background: #fff;
+ cursor: default
+}
+
+.custom-theme .el-time-spinner__arrow {
+ font-size: 12px;
+ color: #878d99;
+ position: absolute;
+ left: 0;
+ width: 100%;
+ z-index: 1;
+ text-align: center;
+ height: 30px;
+ line-height: 30px;
+ cursor: pointer
+}
+
+.custom-theme .el-time-spinner__arrow:hover {
+ color: #262729
+}
+
+.custom-theme .el-time-spinner__arrow.el-icon-arrow-up {
+ top: 10px
+}
+
+.custom-theme .el-time-spinner__arrow.el-icon-arrow-down {
+ bottom: 10px
+}
+
+.custom-theme .el-time-spinner__input.el-input {
+ width: 70%
+}
+
+.custom-theme .el-time-spinner__input.el-input .el-input__inner {
+ padding: 0;
+ text-align: center
+}
+
+.custom-theme .el-time-spinner__list {
+ padding: 0;
+ margin: 0;
+ list-style: none;
+ text-align: center
+}
+
+.custom-theme .el-time-spinner__list::after, .custom-theme .el-time-spinner__list::before {
+ content: '';
+ display: block;
+ width: 100%;
+ height: 80px
+}
+
+.custom-theme .el-time-spinner__item {
+ height: 32px;
+ line-height: 32px;
+ font-size: 12px;
+ color: #5a5e66
+}
+
+.custom-theme .el-time-spinner__item:hover:not(.disabled):not(.active) {
+ background: #f5f7fa;
+ cursor: pointer
+}
+
+.custom-theme .el-time-spinner__item.active:not(.disabled) {
+ color: #2d2f33;
+ font-weight: 700
+}
+
+.custom-theme .el-time-spinner__item.disabled {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-time-panel {
+ margin: 5px 0;
+ border: solid 1px #dfe4ed;
+ background-color: #fff;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ border-radius: 2px;
+ position: absolute;
+ width: 180px;
+ left: 0;
+ z-index: 1000;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none
+}
+
+.custom-theme .el-time-panel__content {
+ font-size: 0;
+ position: relative;
+ overflow: hidden
+}
+
+.custom-theme .el-time-panel__content::after, .custom-theme .el-time-panel__content::before {
+ content: "";
+ top: 50%;
+ position: absolute;
+ margin-top: -15px;
+ height: 32px;
+ z-index: -1;
+ left: 0;
+ right: 0;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding-top: 6px;
+ text-align: left;
+ border-top: 1px solid #dfe4ed;
+ border-bottom: 1px solid #dfe4ed
+}
+
+.custom-theme .el-time-panel__content::after {
+ left: 50%;
+ margin-left: 12%;
+ margin-right: 12%
+}
+
+.custom-theme .el-time-panel__content::before {
+ padding-left: 50%;
+ margin-right: 12%;
+ margin-left: 12%
+}
+
+.custom-theme .el-time-panel__content.has-seconds::after {
+ left: calc(100% / 3 * 2)
+}
+
+.custom-theme .el-time-panel__content.has-seconds::before {
+ padding-left: calc(100% / 3)
+}
+
+.custom-theme .el-time-panel__footer {
+ border-top: 1px solid #e4e4e4;
+ padding: 4px;
+ height: 36px;
+ line-height: 25px;
+ text-align: right;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-time-panel__btn {
+ border: none;
+ line-height: 28px;
+ padding: 0 5px;
+ margin: 0 5px;
+ cursor: pointer;
+ background-color: transparent;
+ outline: 0;
+ font-size: 12px;
+ color: #2d2f33
+}
+
+.custom-theme .el-time-panel__btn.confirm {
+ font-weight: 800;
+ color: #262729
+}
+
+.custom-theme .el-time-panel .popper__arrow {
+ -webkit-transform: translateX(-400%);
+ transform: translateX(-400%)
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-scrollbar {
+ overflow: hidden;
+ position: relative
+}
+
+.custom-theme .el-scrollbar:active > .el-scrollbar__bar, .custom-theme .el-scrollbar:focus > .el-scrollbar__bar, .custom-theme .el-scrollbar:hover > .el-scrollbar__bar {
+ opacity: 1;
+ -webkit-transition: opacity 340ms ease-out;
+ transition: opacity 340ms ease-out
+}
+
+.custom-theme .el-scrollbar__wrap {
+ overflow: scroll;
+ height: 100%
+}
+
+.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar {
+ width: 0;
+ height: 0
+}
+
+.custom-theme .el-scrollbar__thumb {
+ position: relative;
+ display: block;
+ width: 0;
+ height: 0;
+ cursor: pointer;
+ border-radius: inherit;
+ background-color: rgba(135, 141, 153, .3);
+ -webkit-transition: .3s background-color;
+ transition: .3s background-color
+}
+
+.custom-theme .el-scrollbar__thumb:hover {
+ background-color: rgba(135, 141, 153, .5)
+}
+
+.custom-theme .el-scrollbar__bar {
+ position: absolute;
+ right: 2px;
+ bottom: 2px;
+ z-index: 1;
+ border-radius: 4px;
+ opacity: 0;
+ -webkit-transition: opacity 120ms ease-out;
+ transition: opacity 120ms ease-out
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical {
+ width: 6px;
+ top: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical > div {
+ width: 100%
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal {
+ height: 6px;
+ left: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal > div {
+ height: 100%
+}
+
+.custom-theme .el-popper .popper__arrow, .custom-theme .el-popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-popper .popper__arrow {
+ border-width: 6px;
+ -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03));
+ filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03))
+}
+
+.custom-theme .el-popper .popper__arrow::after {
+ content: " ";
+ border-width: 6px
+}
+
+.custom-theme .el-popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-color: #e6ebf5;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -6px;
+ border-top-color: #fff;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-width: 0;
+ border-bottom-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -6px;
+ border-top-width: 0;
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow {
+ top: 50%;
+ left: -6px;
+ margin-bottom: 3px;
+ border-right-color: #e6ebf5;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow::after {
+ bottom: -6px;
+ left: 1px;
+ border-right-color: #fff;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow {
+ top: 50%;
+ right: -6px;
+ margin-bottom: 3px;
+ border-right-width: 0;
+ border-left-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -6px;
+ margin-left: -6px;
+ border-right-width: 0;
+ border-left-color: #fff
+}
+
+.custom-theme .el-popper .popper__arrow, .custom-theme .el-popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-popper .popper__arrow {
+ border-width: 6px;
+ -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03));
+ filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03))
+}
+
+.custom-theme .el-popper .popper__arrow::after {
+ content: " ";
+ border-width: 6px
+}
+
+.custom-theme .el-popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-color: #e6ebf5;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -6px;
+ border-top-color: #fff;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-width: 0;
+ border-bottom-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -6px;
+ border-top-width: 0;
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow {
+ top: 50%;
+ left: -6px;
+ margin-bottom: 3px;
+ border-right-color: #e6ebf5;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow::after {
+ bottom: -6px;
+ left: 1px;
+ border-right-color: #fff;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow {
+ top: 50%;
+ right: -6px;
+ margin-bottom: 3px;
+ border-right-width: 0;
+ border-left-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -6px;
+ margin-left: -6px;
+ border-right-width: 0;
+ border-left-color: #fff
+}
+
+.custom-theme .el-popover {
+ position: absolute;
+ background: #fff;
+ min-width: 150px;
+ border-radius: 4px;
+ border: 1px solid #e6ebf5;
+ padding: 12px;
+ z-index: 2000;
+ color: #5a5e66;
+ line-height: 1.4;
+ text-align: justify;
+ word-break: break-all;
+ font-size: 14px;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1)
+}
+
+.custom-theme .el-popover--plain {
+ padding: 18px 20px
+}
+
+.custom-theme .el-popover__title {
+ color: #2d2f33;
+ font-size: 16px;
+ line-height: 1;
+ margin-bottom: 12px
+}
+
+.custom-theme .el-tooltip__popper {
+ position: absolute;
+ border-radius: 4px;
+ padding: 10px;
+ z-index: 2000;
+ font-size: 12px;
+ line-height: 1.2
+}
+
+.custom-theme .el-tooltip__popper .popper__arrow, .custom-theme .el-tooltip__popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-tooltip__popper .popper__arrow {
+ border-width: 6px
+}
+
+.custom-theme .el-tooltip__popper .popper__arrow::after {
+ content: " ";
+ border-width: 5px
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ border-top-color: #2d2f33;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -5px;
+ border-top-color: #2d2f33;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ border-top-width: 0;
+ border-bottom-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -5px;
+ border-top-width: 0;
+ border-bottom-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow {
+ left: -6px;
+ border-right-color: #2d2f33;
+ border-left-width: 0
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow::after {
+ bottom: -5px;
+ left: 1px;
+ border-right-color: #2d2f33;
+ border-left-width: 0
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow {
+ right: -6px;
+ border-right-width: 0;
+ border-left-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -5px;
+ margin-left: -5px;
+ border-right-width: 0;
+ border-left-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-dark {
+ background: #2d2f33;
+ color: #fff
+}
+
+.custom-theme .el-tooltip__popper.is-light {
+ background: #fff;
+ border: 1px solid #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow {
+ border-top-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after {
+ border-top-color: #fff
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow {
+ border-bottom-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after {
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow {
+ border-left-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after {
+ border-left-color: #fff
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow {
+ border-right-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after {
+ border-right-color: #fff
+}
+
+.custom-theme .v-modal-enter {
+ -webkit-animation: v-modal-in .2s ease;
+ animation: v-modal-in .2s ease
+}
+
+.custom-theme .v-modal-leave {
+ -webkit-animation: v-modal-out .2s ease forwards;
+ animation: v-modal-out .2s ease forwards
+}
+
+@keyframes v-modal-in {
+ 0% {
+ opacity: 0
+ }
+}
+
+@keyframes v-modal-out {
+ 100% {
+ opacity: 0
+ }
+}
+
+.custom-theme .v-modal {
+ position: fixed;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ opacity: .5;
+ background: #000
+}
+
+.custom-theme .el-button {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+ background: #fff;
+ border: 1px solid #d8dce5;
+ border-color: #d8dce5;
+ color: #5a5e66;
+ -webkit-appearance: none;
+ text-align: center;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ -webkit-transition: .1s;
+ transition: .1s;
+ font-weight: 500;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ padding: 12px 20px;
+ font-size: 14px;
+ border-radius: 4px
+}
+
+.custom-theme .el-button + .el-button {
+ margin-left: 10px
+}
+
+.custom-theme .el-button.is-round {
+ padding: 12px 20px
+}
+
+.custom-theme .el-button:focus, .custom-theme .el-button:hover {
+ color: #262729;
+ border-color: #bebebf;
+ background-color: #e9e9ea
+}
+
+.custom-theme .el-button:active {
+ color: #222325;
+ border-color: #222325;
+ outline: 0
+}
+
+.custom-theme .el-button::-moz-focus-inner {
+ border: 0
+}
+
+.custom-theme .el-button [class*=el-icon-] + span {
+ margin-left: 5px
+}
+
+.custom-theme .el-button.is-plain:focus, .custom-theme .el-button.is-plain:hover {
+ background: #fff;
+ border-color: #262729;
+ color: #262729
+}
+
+.custom-theme .el-button.is-plain:active {
+ background: #fff;
+ border-color: #222325;
+ color: #222325;
+ outline: 0
+}
+
+.custom-theme .el-button.is-active {
+ color: #222325;
+ border-color: #222325
+}
+
+.custom-theme .el-button.is-disabled, .custom-theme .el-button.is-disabled:focus, .custom-theme .el-button.is-disabled:hover {
+ color: #b4bccc;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: #fff;
+ border-color: #e6ebf5
+}
+
+.custom-theme .el-button.is-disabled.el-button--text {
+ background-color: transparent
+}
+
+.custom-theme .el-button.is-disabled.is-plain, .custom-theme .el-button.is-disabled.is-plain:focus, .custom-theme .el-button.is-disabled.is-plain:hover {
+ background-color: #fff;
+ border-color: #e6ebf5;
+ color: #b4bccc
+}
+
+.custom-theme .el-button.is-loading {
+ position: relative;
+ pointer-events: none
+}
+
+.custom-theme .el-button.is-loading:before {
+ pointer-events: none;
+ content: '';
+ position: absolute;
+ left: -1px;
+ top: -1px;
+ right: -1px;
+ bottom: -1px;
+ border-radius: inherit;
+ background-color: rgba(255, 255, 255, .35)
+}
+
+.custom-theme .el-button.is-round {
+ border-radius: 20px;
+ padding: 12px 23px
+}
+
+.custom-theme .el-button--primary {
+ color: #fff;
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-button--primary:focus, .custom-theme .el-button--primary:hover {
+ background: #515254;
+ border-color: #515254;
+ color: #fff
+}
+
+.custom-theme .el-button--primary:active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--primary.is-active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff
+}
+
+.custom-theme .el-button--primary.is-disabled, .custom-theme .el-button--primary.is-disabled:active, .custom-theme .el-button--primary.is-disabled:focus, .custom-theme .el-button--primary.is-disabled:hover {
+ color: #fff;
+ background-color: #939394;
+ border-color: #939394
+}
+
+.custom-theme .el-button--primary.is-plain {
+ color: #262729;
+ background: #e9e9ea;
+ border-color: #a8a9a9
+}
+
+.custom-theme .el-button--primary.is-plain:focus, .custom-theme .el-button--primary.is-plain:hover {
+ background: #262729;
+ border-color: #262729;
+ color: #fff
+}
+
+.custom-theme .el-button--primary.is-plain:active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--primary.is-plain.is-disabled, .custom-theme .el-button--primary.is-plain.is-disabled:active, .custom-theme .el-button--primary.is-plain.is-disabled:focus, .custom-theme .el-button--primary.is-plain.is-disabled:hover {
+ color: #7d7d7f;
+ background-color: #e9e9ea;
+ border-color: #d4d4d4
+}
+
+.custom-theme .el-button--success {
+ color: #fff;
+ background-color: #409167;
+ border-color: #409167
+}
+
+.custom-theme .el-button--success:focus, .custom-theme .el-button--success:hover {
+ background: #66a785;
+ border-color: #66a785;
+ color: #fff
+}
+
+.custom-theme .el-button--success:active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--success.is-active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff
+}
+
+.custom-theme .el-button--success.is-disabled, .custom-theme .el-button--success.is-disabled:active, .custom-theme .el-button--success.is-disabled:focus, .custom-theme .el-button--success.is-disabled:hover {
+ color: #fff;
+ background-color: #a0c8b3;
+ border-color: #a0c8b3
+}
+
+.custom-theme .el-button--success.is-plain {
+ color: #409167;
+ background: #ecf4f0;
+ border-color: #b3d3c2
+}
+
+.custom-theme .el-button--success.is-plain:focus, .custom-theme .el-button--success.is-plain:hover {
+ background: #409167;
+ border-color: #409167;
+ color: #fff
+}
+
+.custom-theme .el-button--success.is-plain:active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--success.is-plain.is-disabled, .custom-theme .el-button--success.is-plain.is-disabled:active, .custom-theme .el-button--success.is-plain.is-disabled:focus, .custom-theme .el-button--success.is-plain.is-disabled:hover {
+ color: #8cbda4;
+ background-color: #ecf4f0;
+ border-color: #d9e9e1
+}
+
+.custom-theme .el-button--warning {
+ color: #fff;
+ background-color: #9da408;
+ border-color: #9da408
+}
+
+.custom-theme .el-button--warning:focus, .custom-theme .el-button--warning:hover {
+ background: #b1b639;
+ border-color: #b1b639;
+ color: #fff
+}
+
+.custom-theme .el-button--warning:active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--warning.is-active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff
+}
+
+.custom-theme .el-button--warning.is-disabled, .custom-theme .el-button--warning.is-disabled:active, .custom-theme .el-button--warning.is-disabled:focus, .custom-theme .el-button--warning.is-disabled:hover {
+ color: #fff;
+ background-color: #ced284;
+ border-color: #ced284
+}
+
+.custom-theme .el-button--warning.is-plain {
+ color: #9da408;
+ background: #f5f6e6;
+ border-color: #d8db9c
+}
+
+.custom-theme .el-button--warning.is-plain:focus, .custom-theme .el-button--warning.is-plain:hover {
+ background: #9da408;
+ border-color: #9da408;
+ color: #fff
+}
+
+.custom-theme .el-button--warning.is-plain:active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--warning.is-plain.is-disabled, .custom-theme .el-button--warning.is-plain.is-disabled:active, .custom-theme .el-button--warning.is-plain.is-disabled:focus, .custom-theme .el-button--warning.is-plain.is-disabled:hover {
+ color: #c4c86b;
+ background-color: #f5f6e6;
+ border-color: #ebedce
+}
+
+.custom-theme .el-button--danger {
+ color: #fff;
+ background-color: #b3450e;
+ border-color: #b3450e
+}
+
+.custom-theme .el-button--danger:focus, .custom-theme .el-button--danger:hover {
+ background: #c26a3e;
+ border-color: #c26a3e;
+ color: #fff
+}
+
+.custom-theme .el-button--danger:active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--danger.is-active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff
+}
+
+.custom-theme .el-button--danger.is-disabled, .custom-theme .el-button--danger.is-disabled:active, .custom-theme .el-button--danger.is-disabled:focus, .custom-theme .el-button--danger.is-disabled:hover {
+ color: #fff;
+ background-color: #d9a287;
+ border-color: #d9a287
+}
+
+.custom-theme .el-button--danger.is-plain {
+ color: #b3450e;
+ background: #f7ece7;
+ border-color: #e1b59f
+}
+
+.custom-theme .el-button--danger.is-plain:focus, .custom-theme .el-button--danger.is-plain:hover {
+ background: #b3450e;
+ border-color: #b3450e;
+ color: #fff
+}
+
+.custom-theme .el-button--danger.is-plain:active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--danger.is-plain.is-disabled, .custom-theme .el-button--danger.is-plain.is-disabled:active, .custom-theme .el-button--danger.is-plain.is-disabled:focus, .custom-theme .el-button--danger.is-plain.is-disabled:hover {
+ color: #d18f6e;
+ background-color: #f7ece7;
+ border-color: #f0dacf
+}
+
+.custom-theme .el-button--info {
+ color: #fff;
+ background-color: #0a76a4;
+ border-color: #0a76a4
+}
+
+.custom-theme .el-button--info:focus, .custom-theme .el-button--info:hover {
+ background: #3b91b6;
+ border-color: #3b91b6;
+ color: #fff
+}
+
+.custom-theme .el-button--info:active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--info.is-active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff
+}
+
+.custom-theme .el-button--info.is-disabled, .custom-theme .el-button--info.is-disabled:active, .custom-theme .el-button--info.is-disabled:focus, .custom-theme .el-button--info.is-disabled:hover {
+ color: #fff;
+ background-color: #85bbd2;
+ border-color: #85bbd2
+}
+
+.custom-theme .el-button--info.is-plain {
+ color: #0a76a4;
+ background: #e7f1f6;
+ border-color: #9dc8db
+}
+
+.custom-theme .el-button--info.is-plain:focus, .custom-theme .el-button--info.is-plain:hover {
+ background: #0a76a4;
+ border-color: #0a76a4;
+ color: #fff
+}
+
+.custom-theme .el-button--info.is-plain:active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--info.is-plain.is-disabled, .custom-theme .el-button--info.is-plain.is-disabled:active, .custom-theme .el-button--info.is-plain.is-disabled:focus, .custom-theme .el-button--info.is-plain.is-disabled:hover {
+ color: #6cadc8;
+ background-color: #e7f1f6;
+ border-color: #cee4ed
+}
+
+.custom-theme .el-button--medium {
+ padding: 10px 20px;
+ font-size: 14px;
+ border-radius: 4px
+}
+
+.custom-theme .el-button--medium.is-round {
+ padding: 10px 20px
+}
+
+.custom-theme .el-button--small {
+ padding: 9px 15px;
+ font-size: 12px;
+ border-radius: 3px
+}
+
+.custom-theme .el-button--small.is-round {
+ padding: 9px 15px
+}
+
+.custom-theme .el-button--mini {
+ padding: 7px 15px;
+ font-size: 12px;
+ border-radius: 3px
+}
+
+.custom-theme .el-button--mini.is-round {
+ padding: 7px 15px
+}
+
+.custom-theme .el-button--text {
+ border: none;
+ color: #262729;
+ background: 0 0;
+ padding-left: 0;
+ padding-right: 0
+}
+
+.custom-theme .el-button--text:focus, .custom-theme .el-button--text:hover {
+ color: #515254;
+ border-color: transparent;
+ background-color: transparent
+}
+
+.custom-theme .el-button--text:active {
+ color: #222325;
+ border-color: transparent;
+ background-color: transparent
+}
+
+.custom-theme .el-button-group {
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-button-group::after, .custom-theme .el-button-group::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-button-group::after {
+ clear: both
+}
+
+.custom-theme .el-button-group .el-button {
+ float: left;
+ position: relative
+}
+
+.custom-theme .el-button-group .el-button + .el-button {
+ margin-left: 0
+}
+
+.custom-theme .el-button-group .el-button:first-child {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:last-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child) {
+ border-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:not(:last-child) {
+ margin-right: -1px
+}
+
+.custom-theme .el-button-group .el-button:active, .custom-theme .el-button-group .el-button:focus, .custom-theme .el-button-group .el-button:hover {
+ z-index: 1
+}
+
+.custom-theme .el-button-group .el-button.is-active {
+ z-index: 1
+}
+
+.custom-theme .el-button-group .el-button--primary:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--primary:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-message-box {
+ display: inline-block;
+ width: 420px;
+ padding-bottom: 10px;
+ vertical-align: middle;
+ background-color: #fff;
+ border-radius: 4px;
+ border: 1px solid #e6ebf5;
+ font-size: 18px;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ text-align: left;
+ overflow: hidden;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden
+}
+
+.custom-theme .el-message-box__wrapper {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ text-align: center
+}
+
+.custom-theme .el-message-box__wrapper::after {
+ content: "";
+ display: inline-block;
+ height: 100%;
+ width: 0;
+ vertical-align: middle
+}
+
+.custom-theme .el-message-box__header {
+ position: relative;
+ padding: 15px;
+ padding-bottom: 10px
+}
+
+.custom-theme .el-message-box__title {
+ padding-left: 0;
+ margin-bottom: 0;
+ font-size: 18px;
+ line-height: 1;
+ color: #2d2f33
+}
+
+.custom-theme .el-message-box__headerbtn {
+ position: absolute;
+ top: 15px;
+ right: 15px;
+ padding: 0;
+ border: none;
+ outline: 0;
+ background: 0 0;
+ font-size: 16px;
+ cursor: pointer
+}
+
+.custom-theme .el-message-box__headerbtn .el-message-box__close {
+ color: #0a76a4
+}
+
+.custom-theme .el-message-box__headerbtn:focus .el-message-box__close, .custom-theme .el-message-box__headerbtn:hover .el-message-box__close {
+ color: #262729
+}
+
+.custom-theme .el-message-box__content {
+ position: relative;
+ padding: 10px 15px;
+ color: #5a5e66;
+ font-size: 14px
+}
+
+.custom-theme .el-message-box__input {
+ padding-top: 15px
+}
+
+.custom-theme .el-message-box__input input.invalid {
+ border-color: #b3450e
+}
+
+.custom-theme .el-message-box__input input.invalid:focus {
+ border-color: #b3450e
+}
+
+.custom-theme .el-message-box__status {
+ position: absolute;
+ top: 50%;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+ font-size: 24px !important
+}
+
+.custom-theme .el-message-box__status::before {
+ padding-left: 1px
+}
+
+.custom-theme .el-message-box__status + .el-message-box__message {
+ padding-left: 36px;
+ padding-right: 12px
+}
+
+.custom-theme .el-message-box__status.el-icon-success {
+ color: #409167
+}
+
+.custom-theme .el-message-box__status.el-icon-info {
+ color: #0a76a4
+}
+
+.custom-theme .el-message-box__status.el-icon-warning {
+ color: #9da408
+}
+
+.custom-theme .el-message-box__status.el-icon-error {
+ color: #b3450e
+}
+
+.custom-theme .el-message-box__message {
+ margin: 0
+}
+
+.custom-theme .el-message-box__message p {
+ margin: 0;
+ line-height: 24px
+}
+
+.custom-theme .el-message-box__errormsg {
+ color: #b3450e;
+ font-size: 12px;
+ min-height: 18px;
+ margin-top: 2px
+}
+
+.custom-theme .el-message-box__btns {
+ padding: 5px 15px 0;
+ text-align: right
+}
+
+.custom-theme .el-message-box__btns button:nth-child(2) {
+ margin-left: 10px
+}
+
+.custom-theme .el-message-box__btns-reverse {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: reverse;
+ -ms-flex-direction: row-reverse;
+ flex-direction: row-reverse
+}
+
+.custom-theme .el-message-box--center {
+ padding-bottom: 30px
+}
+
+.custom-theme .el-message-box--center .el-message-box__header {
+ padding-top: 30px
+}
+
+.custom-theme .el-message-box--center .el-message-box__title {
+ position: relative;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center
+}
+
+.custom-theme .el-message-box--center .el-message-box__status {
+ position: relative;
+ top: auto;
+ padding-right: 5px;
+ text-align: center;
+ -webkit-transform: translateY(-1px);
+ transform: translateY(-1px)
+}
+
+.custom-theme .el-message-box--center .el-message-box__message {
+ margin-left: 0
+}
+
+.custom-theme .el-message-box--center .el-message-box__btns, .custom-theme .el-message-box--center .el-message-box__content {
+ text-align: center
+}
+
+.custom-theme .el-message-box--center .el-message-box__content {
+ padding-left: 27px;
+ padding-right: 27px
+}
+
+.custom-theme .msgbox-fade-enter-active {
+ -webkit-animation: msgbox-fade-in .3s;
+ animation: msgbox-fade-in .3s
+}
+
+.custom-theme .msgbox-fade-leave-active {
+ -webkit-animation: msgbox-fade-out .3s;
+ animation: msgbox-fade-out .3s
+}
+
+@-webkit-keyframes msgbox-fade-in {
+ 0% {
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ opacity: 0
+ }
+ 100% {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+}
+
+@keyframes msgbox-fade-in {
+ 0% {
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ opacity: 0
+ }
+ 100% {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+}
+
+@-webkit-keyframes msgbox-fade-out {
+ 0% {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+ 100% {
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ opacity: 0
+ }
+}
+
+@keyframes msgbox-fade-out {
+ 0% {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ opacity: 1
+ }
+ 100% {
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ opacity: 0
+ }
+}
+
+.custom-theme .el-breadcrumb {
+ font-size: 14px;
+ line-height: 1
+}
+
+.custom-theme .el-breadcrumb::after, .custom-theme .el-breadcrumb::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-breadcrumb::after {
+ clear: both
+}
+
+.custom-theme .el-breadcrumb__separator {
+ margin: 0 9px;
+ font-weight: 700;
+ color: #b4bccc
+}
+
+.custom-theme .el-breadcrumb__separator[class*=icon] {
+ margin: 0 6px;
+ font-weight: 400
+}
+
+.custom-theme .el-breadcrumb__item {
+ float: left
+}
+
+.custom-theme .el-breadcrumb__inner, .custom-theme .el-breadcrumb__inner a {
+ font-weight: 700;
+ -webkit-transition: color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: color .2s cubic-bezier(.645, .045, .355, 1);
+ color: #2d2f33
+}
+
+.custom-theme .el-breadcrumb__inner a:hover, .custom-theme .el-breadcrumb__inner:hover {
+ color: #262729;
+ cursor: pointer
+}
+
+.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner, .custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner a, .custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover, .custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__inner:hover {
+ font-weight: 400;
+ color: #5a5e66;
+ cursor: text
+}
+
+.custom-theme .el-breadcrumb__item:last-child .el-breadcrumb__separator {
+ display: none
+}
+
+.custom-theme .el-form--label-left .el-form-item__label {
+ text-align: left
+}
+
+.custom-theme .el-form--label-top .el-form-item__label {
+ float: none;
+ display: inline-block;
+ text-align: left;
+ padding: 0 0 10px 0
+}
+
+.custom-theme .el-form--inline .el-form-item {
+ display: inline-block;
+ margin-right: 10px;
+ vertical-align: top
+}
+
+.custom-theme .el-form--inline .el-form-item__label {
+ float: none;
+ display: inline-block
+}
+
+.custom-theme .el-form--inline .el-form-item__content {
+ display: inline-block;
+ vertical-align: top
+}
+
+.custom-theme .el-form--inline.el-form--label-top .el-form-item__content {
+ display: block
+}
+
+.custom-theme .el-form-item {
+ margin-bottom: 22px
+}
+
+.custom-theme .el-form-item::after, .custom-theme .el-form-item::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-form-item::after {
+ clear: both
+}
+
+.custom-theme .el-form-item .el-form-item {
+ margin-bottom: 0
+}
+
+.custom-theme .el-form-item .el-input__validateIcon {
+ display: none
+}
+
+.custom-theme .el-form-item--medium .el-form-item__label {
+ line-height: 36px
+}
+
+.custom-theme .el-form-item--medium .el-form-item__content {
+ line-height: 36px
+}
+
+.custom-theme .el-form-item--small .el-form-item__label {
+ line-height: 32px
+}
+
+.custom-theme .el-form-item--small .el-form-item__content {
+ line-height: 32px
+}
+
+.custom-theme .el-form-item--small.el-form-item {
+ margin-bottom: 18px
+}
+
+.custom-theme .el-form-item--small .el-form-item__error {
+ padding-top: 2px
+}
+
+.custom-theme .el-form-item--mini .el-form-item__label {
+ line-height: 28px
+}
+
+.custom-theme .el-form-item--mini .el-form-item__content {
+ line-height: 28px
+}
+
+.custom-theme .el-form-item--mini.el-form-item {
+ margin-bottom: 18px
+}
+
+.custom-theme .el-form-item--mini .el-form-item__error {
+ padding-top: 1px
+}
+
+.custom-theme .el-form-item__label {
+ text-align: right;
+ vertical-align: middle;
+ float: left;
+ font-size: 14px;
+ color: #5a5e66;
+ line-height: 40px;
+ padding: 0 12px 0 0;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-form-item__content {
+ line-height: 40px;
+ position: relative;
+ font-size: 14px
+}
+
+.custom-theme .el-form-item__content::after, .custom-theme .el-form-item__content::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-form-item__content::after {
+ clear: both
+}
+
+.custom-theme .el-form-item__error {
+ color: #b3450e;
+ font-size: 12px;
+ line-height: 1;
+ padding-top: 4px;
+ position: absolute;
+ top: 100%;
+ left: 0
+}
+
+.custom-theme .el-form-item__error--inline {
+ position: relative;
+ top: auto;
+ left: auto;
+ display: inline-block;
+ margin-left: 10px
+}
+
+.custom-theme .el-form-item.is-required .el-form-item__label:before {
+ content: '*';
+ color: #b3450e;
+ margin-right: 4px
+}
+
+.custom-theme .el-form-item.is-error .el-input__inner, .custom-theme .el-form-item.is-error .el-input__inner:focus, .custom-theme .el-form-item.is-error .el-textarea__inner, .custom-theme .el-form-item.is-error .el-textarea__inner:focus {
+ border-color: #b3450e
+}
+
+.custom-theme .el-form-item.is-error .el-input-group__append .el-input__inner, .custom-theme .el-form-item.is-error .el-input-group__prepend .el-input__inner {
+ border-color: transparent
+}
+
+.custom-theme .el-form-item.is-error .el-input__validateIcon {
+ color: #b3450e
+}
+
+.custom-theme .el-form-item.is-success .el-input__inner, .custom-theme .el-form-item.is-success .el-input__inner:focus, .custom-theme .el-form-item.is-success .el-textarea__inner, .custom-theme .el-form-item.is-success .el-textarea__inner:focus {
+ border-color: #409167
+}
+
+.custom-theme .el-form-item.is-success .el-input-group__append .el-input__inner, .custom-theme .el-form-item.is-success .el-input-group__prepend .el-input__inner {
+ border-color: transparent
+}
+
+.custom-theme .el-form-item.is-success .el-input__validateIcon {
+ color: #409167
+}
+
+.custom-theme .el-form-item--feedback .el-input__validateIcon {
+ display: inline-block
+}
+
+.custom-theme .el-tabs__header {
+ padding: 0;
+ position: relative;
+ margin: 0 0 15px
+}
+
+.custom-theme .el-tabs__active-bar {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ height: 2px;
+ background-color: #262729;
+ z-index: 1;
+ -webkit-transition: -webkit-transform .3s cubic-bezier(.645, .045, .355, 1);
+ transition: -webkit-transform .3s cubic-bezier(.645, .045, .355, 1);
+ transition: transform .3s cubic-bezier(.645, .045, .355, 1);
+ transition: transform .3s cubic-bezier(.645, .045, .355, 1), -webkit-transform .3s cubic-bezier(.645, .045, .355, 1);
+ list-style: none
+}
+
+.custom-theme .el-tabs__new-tab {
+ float: right;
+ border: 1px solid #d3dce6;
+ height: 18px;
+ width: 18px;
+ line-height: 18px;
+ margin: 12px 0 9px 10px;
+ border-radius: 3px;
+ text-align: center;
+ font-size: 12px;
+ color: #d3dce6;
+ cursor: pointer;
+ -webkit-transition: all .15s;
+ transition: all .15s
+}
+
+.custom-theme .el-tabs__new-tab .el-icon-plus {
+ -webkit-transform: scale(.8, .8);
+ transform: scale(.8, .8)
+}
+
+.custom-theme .el-tabs__new-tab:hover {
+ color: #262729
+}
+
+.custom-theme .el-tabs__nav-wrap {
+ overflow: hidden;
+ margin-bottom: -1px;
+ position: relative
+}
+
+.custom-theme .el-tabs__nav-wrap::after {
+ content: "";
+ position: absolute;
+ left: 0;
+ bottom: 0;
+ width: 100%;
+ height: 2px;
+ background-color: #dfe4ed;
+ z-index: 1
+}
+
+.custom-theme .el-tabs__nav-wrap.is-scrollable {
+ padding: 0 20px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-tabs__nav-scroll {
+ overflow: hidden
+}
+
+.custom-theme .el-tabs__nav-next, .custom-theme .el-tabs__nav-prev {
+ position: absolute;
+ cursor: pointer;
+ line-height: 44px;
+ font-size: 12px;
+ color: #878d99
+}
+
+.custom-theme .el-tabs__nav-next {
+ right: 0
+}
+
+.custom-theme .el-tabs__nav-prev {
+ left: 0
+}
+
+.custom-theme .el-tabs__nav {
+ white-space: nowrap;
+ position: relative;
+ -webkit-transition: -webkit-transform .3s;
+ transition: -webkit-transform .3s;
+ transition: transform .3s;
+ transition: transform .3s, -webkit-transform .3s;
+ float: left;
+ z-index: 2
+}
+
+.custom-theme .el-tabs__item {
+ padding: 0 20px;
+ height: 40px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ line-height: 40px;
+ display: inline-block;
+ list-style: none;
+ font-size: 14px;
+ font-weight: 500;
+ color: #2d2f33;
+ position: relative
+}
+
+.custom-theme .el-tabs__item:focus, .custom-theme .el-tabs__item:focus:active {
+ outline: 0
+}
+
+.custom-theme .el-tabs__item .el-icon-close {
+ border-radius: 50%;
+ text-align: center;
+ -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ margin-left: 5px
+}
+
+.custom-theme .el-tabs__item .el-icon-close:before {
+ -webkit-transform: scale(.9);
+ transform: scale(.9);
+ display: inline-block
+}
+
+.custom-theme .el-tabs__item .el-icon-close:hover {
+ background-color: #b4bccc;
+ color: #fff
+}
+
+.custom-theme .el-tabs__item.is-active {
+ color: #262729
+}
+
+.custom-theme .el-tabs__item:hover {
+ color: #262729;
+ cursor: pointer
+}
+
+.custom-theme .el-tabs__item.is-disabled {
+ color: #b4bccc;
+ cursor: default
+}
+
+.custom-theme .el-tabs__content {
+ overflow: hidden;
+ position: relative
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header {
+ border-bottom: 1px solid #dfe4ed
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__nav-wrap::after {
+ content: none
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__nav {
+ border: 1px solid #dfe4ed;
+ border-bottom: none;
+ border-radius: 4px 4px 0 0
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__active-bar {
+ display: none
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__item .el-icon-close {
+ position: relative;
+ font-size: 12px;
+ width: 0;
+ height: 14px;
+ vertical-align: middle;
+ line-height: 15px;
+ overflow: hidden;
+ top: -1px;
+ right: -2px;
+ -webkit-transform-origin: 100% 50%;
+ transform-origin: 100% 50%
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__item {
+ border-bottom: 1px solid transparent;
+ border-left: 1px solid #dfe4ed;
+ -webkit-transition: color .3s cubic-bezier(.645, .045, .355, 1), padding .3s cubic-bezier(.645, .045, .355, 1);
+ transition: color .3s cubic-bezier(.645, .045, .355, 1), padding .3s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__item:first-child {
+ border-left: none
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__item.is-closable:hover {
+ padding-left: 13px;
+ padding-right: 13px
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close {
+ width: 14px
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__item.is-active {
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__item.is-active.is-closable {
+ padding-left: 20px;
+ padding-right: 20px
+}
+
+.custom-theme .el-tabs--card > .el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close {
+ width: 14px
+}
+
+.custom-theme .el-tabs--border-card {
+ background: #fff;
+ border: 1px solid #d8dce5;
+ -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .12), 0 0 6px 0 rgba(0, 0, 0, .04);
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, .12), 0 0 6px 0 rgba(0, 0, 0, .04)
+}
+
+.custom-theme .el-tabs--border-card > .el-tabs__content {
+ padding: 15px
+}
+
+.custom-theme .el-tabs--border-card > .el-tabs__header {
+ background-color: #f5f7fa;
+ border-bottom: 1px solid #dfe4ed;
+ margin: 0
+}
+
+.custom-theme .el-tabs--border-card > .el-tabs__header .el-tabs__nav-wrap::after {
+ content: none
+}
+
+.custom-theme .el-tabs--border-card > .el-tabs__header .el-tabs__item {
+ -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ border: 1px solid transparent;
+ margin: -1px -1px 0;
+ color: #878d99
+}
+
+.custom-theme .el-tabs--border-card > .el-tabs__header .el-tabs__item.is-active {
+ color: #262729;
+ background-color: #fff;
+ border-right-color: #d8dce5;
+ border-left-color: #d8dce5
+}
+
+.custom-theme .el-tabs--border-card > .el-tabs__header .el-tabs__item:hover {
+ color: #262729
+}
+
+.custom-theme .el-tabs--bottom:not(.el-tabs--border-card):not(.el-tabs--card) .el-tabs__item:nth-child(2), .custom-theme .el-tabs--top:not(.el-tabs--border-card):not(.el-tabs--card) .el-tabs__item:nth-child(2) {
+ padding-left: 0
+}
+
+.custom-theme .el-tabs--bottom .el-tabs__header {
+ margin-bottom: 0;
+ margin-top: 10px
+}
+
+.custom-theme .el-tabs--bottom.el-tabs--border-card .el-tabs__header {
+ border-bottom: 0;
+ border-top: 1px solid #d8dce5
+}
+
+.custom-theme .el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap {
+ margin-top: -1px;
+ margin-bottom: 0
+}
+
+.custom-theme .el-tabs--bottom.el-tabs--border-card .el-tabs__item {
+ border: 1px solid transparent;
+ margin: 0 -1px -1px -1px
+}
+
+.custom-theme .el-tabs--left, .custom-theme .el-tabs--right {
+ overflow: hidden
+}
+
+.custom-theme .el-tabs--left .el-tabs__header, .custom-theme .el-tabs--left .el-tabs__nav-scroll, .custom-theme .el-tabs--left .el-tabs__nav-wrap, .custom-theme .el-tabs--right .el-tabs__header, .custom-theme .el-tabs--right .el-tabs__nav-scroll, .custom-theme .el-tabs--right .el-tabs__nav-wrap {
+ height: 100%
+}
+
+.custom-theme .el-tabs--left .el-tabs__active-bar, .custom-theme .el-tabs--right .el-tabs__active-bar {
+ top: 0;
+ bottom: auto;
+ width: 2px;
+ height: auto
+}
+
+.custom-theme .el-tabs--left .el-tabs__nav-wrap, .custom-theme .el-tabs--right .el-tabs__nav-wrap {
+ margin-bottom: 0
+}
+
+.custom-theme .el-tabs--left .el-tabs__nav-wrap.is-scrollable, .custom-theme .el-tabs--right .el-tabs__nav-wrap.is-scrollable {
+ padding: 30px 0
+}
+
+.custom-theme .el-tabs--left .el-tabs__nav-wrap::after, .custom-theme .el-tabs--right .el-tabs__nav-wrap::after {
+ height: 100%;
+ width: 2px;
+ bottom: auto;
+ top: 0
+}
+
+.custom-theme .el-tabs--left .el-tabs__nav, .custom-theme .el-tabs--right .el-tabs__nav {
+ float: none
+}
+
+.custom-theme .el-tabs--left .el-tabs__item, .custom-theme .el-tabs--right .el-tabs__item {
+ display: block
+}
+
+.custom-theme .el-tabs--left .el-tabs__nav-next, .custom-theme .el-tabs--left .el-tabs__nav-prev, .custom-theme .el-tabs--right .el-tabs__nav-next, .custom-theme .el-tabs--right .el-tabs__nav-prev {
+ height: 30px;
+ line-height: 30px;
+ width: 100%;
+ text-align: center;
+ cursor: pointer
+}
+
+.custom-theme .el-tabs--left .el-tabs__nav-next i, .custom-theme .el-tabs--left .el-tabs__nav-prev i, .custom-theme .el-tabs--right .el-tabs__nav-next i, .custom-theme .el-tabs--right .el-tabs__nav-prev i {
+ -webkit-transform: rotateZ(90deg);
+ transform: rotateZ(90deg)
+}
+
+.custom-theme .el-tabs--left .el-tabs__nav-prev, .custom-theme .el-tabs--right .el-tabs__nav-prev {
+ left: auto;
+ top: 0
+}
+
+.custom-theme .el-tabs--left .el-tabs__nav-next, .custom-theme .el-tabs--right .el-tabs__nav-next {
+ right: auto;
+ bottom: 0
+}
+
+.custom-theme .el-tabs--left .el-tabs__header {
+ float: left;
+ margin-bottom: 0;
+ margin-right: 10px
+}
+
+.custom-theme .el-tabs--left .el-tabs__nav-wrap {
+ margin-right: -1px
+}
+
+.custom-theme .el-tabs--left .el-tabs__nav-wrap::after {
+ left: auto;
+ right: 0
+}
+
+.custom-theme .el-tabs--left .el-tabs__active-bar {
+ right: 0;
+ left: auto
+}
+
+.custom-theme .el-tabs--left .el-tabs__item {
+ text-align: right
+}
+
+.custom-theme .el-tabs--left.el-tabs--card .el-tabs__active-bar {
+ display: none
+}
+
+.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item {
+ border-left: none;
+ border-right: 1px solid #dfe4ed;
+ border-bottom: none;
+ border-top: 1px solid #dfe4ed
+}
+
+.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item:first-child {
+ border-right: 1px solid #dfe4ed;
+ border-top: none
+}
+
+.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item.is-active {
+ border: 1px solid #dfe4ed;
+ border-right-color: #fff;
+ border-left: none;
+ border-bottom: none
+}
+
+.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item.is-active:first-child {
+ border-top: none
+}
+
+.custom-theme .el-tabs--left.el-tabs--card .el-tabs__item.is-active:last-child {
+ border-bottom: none
+}
+
+.custom-theme .el-tabs--left.el-tabs--card .el-tabs__nav {
+ border-radius: 4px 0 0 4px;
+ border-bottom: 1px solid #dfe4ed;
+ border-right: none
+}
+
+.custom-theme .el-tabs--left.el-tabs--card .el-tabs__new-tab {
+ float: none
+}
+
+.custom-theme .el-tabs--left.el-tabs--border-card .el-tabs__header {
+ border-right: 1px solid #dfe4ed
+}
+
+.custom-theme .el-tabs--left.el-tabs--border-card .el-tabs__item {
+ border: 1px solid transparent;
+ margin: -1px 0 -1px -1px
+}
+
+.custom-theme .el-tabs--left.el-tabs--border-card .el-tabs__item.is-active {
+ border-color: transparent;
+ border-top-color: #d1dbe5;
+ border-bottom-color: #d1dbe5
+}
+
+.custom-theme .el-tabs--right .el-tabs__header {
+ float: right;
+ margin-bottom: 0;
+ margin-left: 10px
+}
+
+.custom-theme .el-tabs--right .el-tabs__nav-wrap {
+ margin-left: -1px
+}
+
+.custom-theme .el-tabs--right .el-tabs__nav-wrap::after {
+ left: 0;
+ right: auto
+}
+
+.custom-theme .el-tabs--right .el-tabs__active-bar {
+ left: 0
+}
+
+.custom-theme .el-tabs--right.el-tabs--card .el-tabs__active-bar {
+ display: none
+}
+
+.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item {
+ border-bottom: none;
+ border-top: 1px solid #dfe4ed
+}
+
+.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item:first-child {
+ border-left: 1px solid #dfe4ed;
+ border-top: none
+}
+
+.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item.is-active {
+ border: 1px solid #dfe4ed;
+ border-left-color: #fff;
+ border-right: none;
+ border-bottom: none
+}
+
+.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item.is-active:first-child {
+ border-top: none
+}
+
+.custom-theme .el-tabs--right.el-tabs--card .el-tabs__item.is-active:last-child {
+ border-bottom: none
+}
+
+.custom-theme .el-tabs--right.el-tabs--card .el-tabs__nav {
+ border-radius: 0 4px 4px 0;
+ border-bottom: 1px solid #dfe4ed;
+ border-left: none
+}
+
+.custom-theme .el-tabs--right.el-tabs--border-card .el-tabs__header {
+ border-left: 1px solid #dfe4ed
+}
+
+.custom-theme .el-tabs--right.el-tabs--border-card .el-tabs__item {
+ border: 1px solid transparent;
+ margin: -1px -1px -1px 0
+}
+
+.custom-theme .el-tabs--right.el-tabs--border-card .el-tabs__item.is-active {
+ border-color: transparent;
+ border-top-color: #d1dbe5;
+ border-bottom-color: #d1dbe5
+}
+
+.custom-theme .slideInLeft-transition, .custom-theme .slideInRight-transition {
+ display: inline-block
+}
+
+.custom-theme .slideInRight-enter {
+ -webkit-animation: slideInRight-enter .3s;
+ animation: slideInRight-enter .3s
+}
+
+.custom-theme .slideInRight-leave {
+ position: absolute;
+ left: 0;
+ right: 0;
+ -webkit-animation: slideInRight-leave .3s;
+ animation: slideInRight-leave .3s
+}
+
+.custom-theme .slideInLeft-enter {
+ -webkit-animation: slideInLeft-enter .3s;
+ animation: slideInLeft-enter .3s
+}
+
+.custom-theme .slideInLeft-leave {
+ position: absolute;
+ left: 0;
+ right: 0;
+ -webkit-animation: slideInLeft-leave .3s;
+ animation: slideInLeft-leave .3s
+}
+
+@-webkit-keyframes slideInRight-enter {
+ 0% {
+ opacity: 0;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%)
+ }
+ to {
+ opacity: 1;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0)
+ }
+}
+
+@keyframes slideInRight-enter {
+ 0% {
+ opacity: 0;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%)
+ }
+ to {
+ opacity: 1;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0)
+ }
+}
+
+@-webkit-keyframes slideInRight-leave {
+ 0% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1
+ }
+ 100% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+ opacity: 0
+ }
+}
+
+@keyframes slideInRight-leave {
+ 0% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1
+ }
+ 100% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%);
+ opacity: 0
+ }
+}
+
+@-webkit-keyframes slideInLeft-enter {
+ 0% {
+ opacity: 0;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%)
+ }
+ to {
+ opacity: 1;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0)
+ }
+}
+
+@keyframes slideInLeft-enter {
+ 0% {
+ opacity: 0;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%)
+ }
+ to {
+ opacity: 1;
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0)
+ }
+}
+
+@-webkit-keyframes slideInLeft-leave {
+ 0% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1
+ }
+ 100% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%);
+ opacity: 0
+ }
+}
+
+@keyframes slideInLeft-leave {
+ 0% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(0);
+ transform: translateX(0);
+ opacity: 1
+ }
+ 100% {
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0;
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%);
+ opacity: 0
+ }
+}
+
+.custom-theme .el-tag {
+ background-color: rgba(38, 39, 41, .1);
+ display: inline-block;
+ padding: 0 10px;
+ height: 32px;
+ line-height: 30px;
+ font-size: 12px;
+ color: #262729;
+ border-radius: 4px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid rgba(38, 39, 41, .2);
+ white-space: nowrap
+}
+
+.custom-theme .el-tag .el-icon-close {
+ border-radius: 50%;
+ text-align: center;
+ position: relative;
+ cursor: pointer;
+ font-size: 12px;
+ height: 18px;
+ width: 18px;
+ line-height: 18px;
+ vertical-align: middle;
+ top: -1px;
+ right: -5px;
+ color: #262729
+}
+
+.custom-theme .el-tag .el-icon-close::before {
+ display: block
+}
+
+.custom-theme .el-tag .el-icon-close:hover {
+ background-color: #262729;
+ color: #fff
+}
+
+.custom-theme .el-tag--info {
+ background-color: rgba(10, 118, 164, .1);
+ border-color: rgba(10, 118, 164, .2);
+ color: #0a76a4
+}
+
+.custom-theme .el-tag--info.is-hit {
+ border-color: #0a76a4
+}
+
+.custom-theme .el-tag--info .el-tag__close {
+ color: #0a76a4
+}
+
+.custom-theme .el-tag--info .el-tag__close:hover {
+ background-color: #0a76a4;
+ color: #fff
+}
+
+.custom-theme .el-tag--success {
+ background-color: rgba(64, 145, 103, .1);
+ border-color: rgba(64, 145, 103, .2);
+ color: #409167
+}
+
+.custom-theme .el-tag--success.is-hit {
+ border-color: #409167
+}
+
+.custom-theme .el-tag--success .el-tag__close {
+ color: #409167
+}
+
+.custom-theme .el-tag--success .el-tag__close:hover {
+ background-color: #409167;
+ color: #fff
+}
+
+.custom-theme .el-tag--warning {
+ background-color: rgba(157, 164, 8, .1);
+ border-color: rgba(157, 164, 8, .2);
+ color: #9da408
+}
+
+.custom-theme .el-tag--warning.is-hit {
+ border-color: #9da408
+}
+
+.custom-theme .el-tag--warning .el-tag__close {
+ color: #9da408
+}
+
+.custom-theme .el-tag--warning .el-tag__close:hover {
+ background-color: #9da408;
+ color: #fff
+}
+
+.custom-theme .el-tag--danger {
+ background-color: rgba(179, 69, 14, .1);
+ border-color: rgba(179, 69, 14, .2);
+ color: #b3450e
+}
+
+.custom-theme .el-tag--danger.is-hit {
+ border-color: #b3450e
+}
+
+.custom-theme .el-tag--danger .el-tag__close {
+ color: #b3450e
+}
+
+.custom-theme .el-tag--danger .el-tag__close:hover {
+ background-color: #b3450e;
+ color: #fff
+}
+
+.custom-theme .el-tag--medium {
+ height: 28px;
+ line-height: 26px
+}
+
+.custom-theme .el-tag--medium .el-icon-close {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-tag--small {
+ height: 24px;
+ padding: 0 8px;
+ line-height: 22px
+}
+
+.custom-theme .el-tag--small .el-icon-close {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-tag--mini {
+ height: 20px;
+ padding: 0 5px;
+ line-height: 19px
+}
+
+.custom-theme .el-tag--mini .el-icon-close {
+ margin-left: -3px;
+ -webkit-transform: scale(.7);
+ transform: scale(.7)
+}
+
+.custom-theme .el-tree {
+ cursor: default;
+ background: #fff;
+ color: #5a5e66
+}
+
+.custom-theme .el-tree__empty-block {
+ position: relative;
+ min-height: 60px;
+ text-align: center;
+ width: 100%;
+ height: 100%
+}
+
+.custom-theme .el-tree__empty-text {
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ color: #623615
+}
+
+.custom-theme .el-tree-node {
+ white-space: nowrap
+}
+
+.custom-theme .el-tree-node__content {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ height: 26px;
+ cursor: pointer
+}
+
+.custom-theme .el-tree-node__content > .el-tree-node__expand-icon {
+ padding: 6px
+}
+
+.custom-theme .el-tree-node__content > .el-checkbox {
+ margin-right: 8px
+}
+
+.custom-theme .el-tree-node__content:hover {
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-tree-node__expand-icon {
+ cursor: pointer;
+ color: #b4bccc;
+ font-size: 12px;
+ -webkit-transform: rotate(0);
+ transform: rotate(0);
+ -webkit-transition: -webkit-transform .3s ease-in-out;
+ transition: -webkit-transform .3s ease-in-out;
+ transition: transform .3s ease-in-out;
+ transition: transform .3s ease-in-out, -webkit-transform .3s ease-in-out
+}
+
+.custom-theme .el-tree-node__expand-icon.expanded {
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg)
+}
+
+.custom-theme .el-tree-node__expand-icon.is-leaf {
+ color: transparent;
+ cursor: default
+}
+
+.custom-theme .el-tree-node__label {
+ font-size: 14px
+}
+
+.custom-theme .el-tree-node__loading-icon {
+ margin-right: 8px;
+ font-size: 14px;
+ color: #b4bccc
+}
+
+.custom-theme .el-tree-node > .el-tree-node__children {
+ overflow: hidden;
+ background-color: transparent
+}
+
+.custom-theme .el-tree-node.is-expanded > .el-tree-node__children {
+ display: block
+}
+
+.custom-theme .el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {
+ background-color: #eee
+}
+
+.custom-theme .el-alert {
+ width: 100%;
+ padding: 8px 16px;
+ margin: 0;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border-radius: 4px;
+ position: relative;
+ background-color: #fff;
+ overflow: hidden;
+ opacity: 1;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-transition: opacity .2s;
+ transition: opacity .2s
+}
+
+.custom-theme .el-alert.is-center {
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center
+}
+
+.custom-theme .el-alert--success {
+ background-color: #ecf4f0;
+ color: #409167
+}
+
+.custom-theme .el-alert--success .el-alert__description {
+ color: #409167
+}
+
+.custom-theme .el-alert--info {
+ background-color: #e7f1f6;
+ color: #0a76a4
+}
+
+.custom-theme .el-alert--info .el-alert__description {
+ color: #0a76a4
+}
+
+.custom-theme .el-alert--warning {
+ background-color: #f5f6e6;
+ color: #9da408
+}
+
+.custom-theme .el-alert--warning .el-alert__description {
+ color: #9da408
+}
+
+.custom-theme .el-alert--error {
+ background-color: #f7ece7;
+ color: #b3450e
+}
+
+.custom-theme .el-alert--error .el-alert__description {
+ color: #b3450e
+}
+
+.custom-theme .el-alert__content {
+ display: table-cell;
+ padding: 0 8px
+}
+
+.custom-theme .el-alert__icon {
+ font-size: 16px;
+ width: 16px
+}
+
+.custom-theme .el-alert__icon.is-big {
+ font-size: 28px;
+ width: 28px
+}
+
+.custom-theme .el-alert__title {
+ font-size: 13px;
+ line-height: 18px
+}
+
+.custom-theme .el-alert__title.is-bold {
+ font-weight: 700
+}
+
+.custom-theme .el-alert .el-alert__description {
+ font-size: 12px;
+ margin: 5px 0 0 0
+}
+
+.custom-theme .el-alert__closebtn {
+ font-size: 12px;
+ color: #b4bccc;
+ opacity: 1;
+ position: absolute;
+ top: 12px;
+ right: 15px;
+ cursor: pointer
+}
+
+.custom-theme .el-alert__closebtn.is-customed {
+ font-style: normal;
+ font-size: 13px;
+ top: 9px
+}
+
+.custom-theme .el-alert-fade-enter, .custom-theme .el-alert-fade-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-notification {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ width: 330px;
+ padding: 14px 26px 14px 13px;
+ border-radius: 8px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #e6ebf5;
+ position: fixed;
+ background-color: #fff;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ -webkit-transition: opacity .3s, left .3s, right .3s, top .4s, bottom .3s, -webkit-transform .3s;
+ transition: opacity .3s, left .3s, right .3s, top .4s, bottom .3s, -webkit-transform .3s;
+ transition: opacity .3s, transform .3s, left .3s, right .3s, top .4s, bottom .3s;
+ transition: opacity .3s, transform .3s, left .3s, right .3s, top .4s, bottom .3s, -webkit-transform .3s;
+ overflow: hidden
+}
+
+.custom-theme .el-notification.right {
+ right: 16px
+}
+
+.custom-theme .el-notification.left {
+ left: 16px
+}
+
+.custom-theme .el-notification__group {
+ margin-left: 13px
+}
+
+.custom-theme .el-notification__title {
+ font-weight: 700;
+ font-size: 16px;
+ color: #2d2f33;
+ margin: 0
+}
+
+.custom-theme .el-notification__content {
+ font-size: 14px;
+ line-height: 21px;
+ margin: 6px 0 0 0;
+ color: #5a5e66;
+ text-align: justify
+}
+
+.custom-theme .el-notification__content p {
+ margin: 0
+}
+
+.custom-theme .el-notification__icon {
+ height: 24px;
+ width: 24px;
+ font-size: 24px;
+ -webkit-transform: translateY(4px);
+ transform: translateY(4px)
+}
+
+.custom-theme .el-notification__closeBtn {
+ position: absolute;
+ top: 15px;
+ right: 15px;
+ cursor: pointer;
+ color: #878d99;
+ font-size: 16px
+}
+
+.custom-theme .el-notification__closeBtn:hover {
+ color: #5a5e66
+}
+
+.custom-theme .el-notification .el-icon-success {
+ color: #409167
+}
+
+.custom-theme .el-notification .el-icon-error {
+ color: #b3450e
+}
+
+.custom-theme .el-notification .el-icon-info {
+ color: #0a76a4
+}
+
+.custom-theme .el-notification .el-icon-warning {
+ color: #9da408
+}
+
+.custom-theme .el-notification-fade-enter.right {
+ right: 0;
+ -webkit-transform: translateX(100%);
+ transform: translateX(100%)
+}
+
+.custom-theme .el-notification-fade-enter.left {
+ left: 0;
+ -webkit-transform: translateX(-100%);
+ transform: translateX(-100%)
+}
+
+.custom-theme .el-notification-fade-leave-active {
+ opacity: 0
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input-number {
+ position: relative;
+ display: inline-block;
+ width: 180px;
+ line-height: 38px
+}
+
+.custom-theme .el-input-number .el-input {
+ display: block
+}
+
+.custom-theme .el-input-number .el-input__inner {
+ -webkit-appearance: none;
+ padding-left: 50px;
+ padding-right: 50px;
+ text-align: center
+}
+
+.custom-theme .el-input-number__decrease, .custom-theme .el-input-number__increase {
+ position: absolute;
+ z-index: 1;
+ top: 1px;
+ width: 40px;
+ height: auto;
+ text-align: center;
+ background: #f5f7fa;
+ color: #5a5e66;
+ cursor: pointer;
+ font-size: 13px
+}
+
+.custom-theme .el-input-number__decrease:hover, .custom-theme .el-input-number__increase:hover {
+ color: #262729
+}
+
+.custom-theme .el-input-number__decrease:hover:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled), .custom-theme .el-input-number__increase:hover:not(.is-disabled) ~ .el-input .el-input__inner:not(.is-disabled) {
+ border-color: #262729
+}
+
+.custom-theme .el-input-number__decrease.is-disabled, .custom-theme .el-input-number__increase.is-disabled {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input-number__increase {
+ right: 1px;
+ border-radius: 0 4px 4px 0;
+ border-left: 1px solid #d8dce5
+}
+
+.custom-theme .el-input-number__decrease {
+ left: 1px;
+ border-radius: 4px 0 0 4px;
+ border-right: 1px solid #d8dce5
+}
+
+.custom-theme .el-input-number.is-disabled .el-input-number__decrease, .custom-theme .el-input-number.is-disabled .el-input-number__increase {
+ border-color: #dfe4ed;
+ color: #dfe4ed
+}
+
+.custom-theme .el-input-number.is-disabled .el-input-number__decrease:hover, .custom-theme .el-input-number.is-disabled .el-input-number__increase:hover {
+ color: #dfe4ed;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input-number--medium {
+ width: 200px;
+ line-height: 34px
+}
+
+.custom-theme .el-input-number--medium .el-input-number__decrease, .custom-theme .el-input-number--medium .el-input-number__increase {
+ width: 36px;
+ font-size: 14px
+}
+
+.custom-theme .el-input-number--medium .el-input__inner {
+ padding-left: 43px;
+ padding-right: 43px
+}
+
+.custom-theme .el-input-number--small {
+ width: 130px;
+ line-height: 30px
+}
+
+.custom-theme .el-input-number--small .el-input-number__decrease, .custom-theme .el-input-number--small .el-input-number__increase {
+ width: 32px;
+ font-size: 13px
+}
+
+.custom-theme .el-input-number--small .el-input-number__decrease [class*=el-icon], .custom-theme .el-input-number--small .el-input-number__increase [class*=el-icon] {
+ -webkit-transform: scale(.9);
+ transform: scale(.9)
+}
+
+.custom-theme .el-input-number--small .el-input__inner {
+ padding-left: 39px;
+ padding-right: 39px
+}
+
+.custom-theme .el-input-number--mini {
+ width: 130px;
+ line-height: 26px
+}
+
+.custom-theme .el-input-number--mini .el-input-number__decrease, .custom-theme .el-input-number--mini .el-input-number__increase {
+ width: 28px;
+ font-size: 12px
+}
+
+.custom-theme .el-input-number--mini .el-input-number__decrease [class*=el-icon], .custom-theme .el-input-number--mini .el-input-number__increase [class*=el-icon] {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-input-number--mini .el-input__inner {
+ padding-left: 35px;
+ padding-right: 35px
+}
+
+.custom-theme .el-input-number.is-without-controls .el-input__inner {
+ padding-left: 15px;
+ padding-right: 15px
+}
+
+.custom-theme .el-input-number.is-controls-right .el-input__inner {
+ padding-left: 15px;
+ padding-right: 50px
+}
+
+.custom-theme .el-input-number.is-controls-right .el-input-number__decrease, .custom-theme .el-input-number.is-controls-right .el-input-number__increase {
+ height: auto;
+ line-height: 19px
+}
+
+.custom-theme .el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon], .custom-theme .el-input-number.is-controls-right .el-input-number__increase [class*=el-icon] {
+ -webkit-transform: scale(.8);
+ transform: scale(.8)
+}
+
+.custom-theme .el-input-number.is-controls-right .el-input-number__increase {
+ border-radius: 0 4px 0 0;
+ border-bottom: 1px solid #d8dce5
+}
+
+.custom-theme .el-input-number.is-controls-right .el-input-number__decrease {
+ right: 1px;
+ bottom: 1px;
+ top: auto;
+ left: auto;
+ border-right: none;
+ border-left: 1px solid #d8dce5;
+ border-radius: 0 0 4px 0
+}
+
+.custom-theme .el-input-number.is-controls-right[class*=medium] [class*=decrease], .custom-theme .el-input-number.is-controls-right[class*=medium] [class*=increase] {
+ line-height: 17px
+}
+
+.custom-theme .el-input-number.is-controls-right[class*=small] [class*=decrease], .custom-theme .el-input-number.is-controls-right[class*=small] [class*=increase] {
+ line-height: 15px
+}
+
+.custom-theme .el-input-number.is-controls-right[class*=mini] [class*=decrease], .custom-theme .el-input-number.is-controls-right[class*=mini] [class*=increase] {
+ line-height: 13px
+}
+
+.custom-theme .el-tooltip__popper {
+ position: absolute;
+ border-radius: 4px;
+ padding: 10px;
+ z-index: 2000;
+ font-size: 12px;
+ line-height: 1.2
+}
+
+.custom-theme .el-tooltip__popper .popper__arrow, .custom-theme .el-tooltip__popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-tooltip__popper .popper__arrow {
+ border-width: 6px
+}
+
+.custom-theme .el-tooltip__popper .popper__arrow::after {
+ content: " ";
+ border-width: 5px
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ border-top-color: #2d2f33;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -5px;
+ border-top-color: #2d2f33;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ border-top-width: 0;
+ border-bottom-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -5px;
+ border-top-width: 0;
+ border-bottom-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow {
+ left: -6px;
+ border-right-color: #2d2f33;
+ border-left-width: 0
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=right] .popper__arrow::after {
+ bottom: -5px;
+ left: 1px;
+ border-right-color: #2d2f33;
+ border-left-width: 0
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow {
+ right: -6px;
+ border-right-width: 0;
+ border-left-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -5px;
+ margin-left: -5px;
+ border-right-width: 0;
+ border-left-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-dark {
+ background: #2d2f33;
+ color: #fff
+}
+
+.custom-theme .el-tooltip__popper.is-light {
+ background: #fff;
+ border: 1px solid #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow {
+ border-top-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after {
+ border-top-color: #fff
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow {
+ border-bottom-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after {
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow {
+ border-left-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after {
+ border-left-color: #fff
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow {
+ border-right-color: #2d2f33
+}
+
+.custom-theme .el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after {
+ border-right-color: #fff
+}
+
+.custom-theme .el-slider::after, .custom-theme .el-slider::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-slider::after {
+ clear: both
+}
+
+.custom-theme .el-slider__runway {
+ width: 100%;
+ height: 6px;
+ margin: 16px 0;
+ background-color: #dfe4ed;
+ border-radius: 3px;
+ position: relative;
+ cursor: pointer;
+ vertical-align: middle
+}
+
+.custom-theme .el-slider__runway.show-input {
+ margin-right: 160px;
+ width: auto
+}
+
+.custom-theme .el-slider__runway.disabled {
+ cursor: default
+}
+
+.custom-theme .el-slider__runway.disabled .el-slider__bar {
+ background-color: #b4bccc
+}
+
+.custom-theme .el-slider__runway.disabled .el-slider__button {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-slider__runway.disabled .el-slider__button-wrapper.hover, .custom-theme .el-slider__runway.disabled .el-slider__button-wrapper:hover {
+ cursor: not-allowed
+}
+
+.custom-theme .el-slider__runway.disabled .el-slider__button-wrapper.dragging {
+ cursor: not-allowed
+}
+
+.custom-theme .el-slider__runway.disabled .el-slider__button.dragging, .custom-theme .el-slider__runway.disabled .el-slider__button.hover, .custom-theme .el-slider__runway.disabled .el-slider__button:hover {
+ -webkit-transform: scale(1);
+ transform: scale(1)
+}
+
+.custom-theme .el-slider__runway.disabled .el-slider__button.hover, .custom-theme .el-slider__runway.disabled .el-slider__button:hover {
+ cursor: not-allowed
+}
+
+.custom-theme .el-slider__runway.disabled .el-slider__button.dragging {
+ cursor: not-allowed
+}
+
+.custom-theme .el-slider__input {
+ float: right;
+ margin-top: 3px
+}
+
+.custom-theme .el-slider__bar {
+ height: 6px;
+ background-color: #262729;
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+ position: absolute
+}
+
+.custom-theme .el-slider__button-wrapper {
+ height: 36px;
+ width: 36px;
+ position: absolute;
+ z-index: 1001;
+ top: -15px;
+ -webkit-transform: translateX(-50%);
+ transform: translateX(-50%);
+ background-color: transparent;
+ text-align: center;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none
+}
+
+.custom-theme .el-slider__button-wrapper::after {
+ display: inline-block;
+ content: "";
+ height: 100%;
+ vertical-align: middle
+}
+
+.custom-theme .el-slider__button-wrapper .el-tooltip {
+ vertical-align: middle;
+ display: inline-block
+}
+
+.custom-theme .el-slider__button-wrapper.hover, .custom-theme .el-slider__button-wrapper:hover {
+ cursor: -webkit-grab;
+ cursor: grab
+}
+
+.custom-theme .el-slider__button-wrapper.dragging {
+ cursor: -webkit-grabbing;
+ cursor: grabbing
+}
+
+.custom-theme .el-slider__button {
+ width: 16px;
+ height: 16px;
+ border: solid 2px #262729;
+ background-color: #fff;
+ border-radius: 50%;
+ -webkit-transition: .2s;
+ transition: .2s;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none
+}
+
+.custom-theme .el-slider__button.dragging, .custom-theme .el-slider__button.hover, .custom-theme .el-slider__button:hover {
+ -webkit-transform: scale(1.2);
+ transform: scale(1.2)
+}
+
+.custom-theme .el-slider__button.hover, .custom-theme .el-slider__button:hover {
+ cursor: -webkit-grab;
+ cursor: grab
+}
+
+.custom-theme .el-slider__button.dragging {
+ cursor: -webkit-grabbing;
+ cursor: grabbing
+}
+
+.custom-theme .el-slider__stop {
+ position: absolute;
+ height: 6px;
+ width: 6px;
+ border-radius: 100%;
+ background-color: #fff;
+ -webkit-transform: translateX(-50%);
+ transform: translateX(-50%)
+}
+
+.custom-theme .el-slider.is-vertical {
+ position: relative
+}
+
+.custom-theme .el-slider.is-vertical .el-slider__runway {
+ width: 4px;
+ height: 100%;
+ margin: 0 16px
+}
+
+.custom-theme .el-slider.is-vertical .el-slider__bar {
+ width: 4px;
+ height: auto;
+ border-radius: 0 0 3px 3px
+}
+
+.custom-theme .el-slider.is-vertical .el-slider__button-wrapper {
+ top: auto;
+ left: -15px;
+ -webkit-transform: translateY(50%);
+ transform: translateY(50%)
+}
+
+.custom-theme .el-slider.is-vertical .el-slider__stop {
+ -webkit-transform: translateY(50%);
+ transform: translateY(50%)
+}
+
+.custom-theme .el-slider.is-vertical.el-slider--with-input {
+ padding-bottom: 58px
+}
+
+.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input {
+ overflow: visible;
+ float: none;
+ position: absolute;
+ bottom: 22px;
+ width: 36px;
+ margin-top: 15px
+}
+
+.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner {
+ text-align: center;
+ padding-left: 5px;
+ padding-right: 5px
+}
+
+.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease, .custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase {
+ top: 32px;
+ margin-top: -1px;
+ border: 1px solid #d8dce5;
+ line-height: 20px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease {
+ width: 18px;
+ right: 18px;
+ border-bottom-left-radius: 4px
+}
+
+.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase {
+ width: 19px;
+ border-bottom-right-radius: 4px
+}
+
+.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase ~ .el-input .el-input__inner {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease, .custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease, .custom-theme .el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase {
+ border-color: #262729
+}
+
+.custom-theme .el-loading-parent--relative {
+ position: relative !important
+}
+
+.custom-theme .el-loading-parent--hidden {
+ overflow: hidden !important
+}
+
+.custom-theme .el-loading-mask {
+ position: absolute;
+ z-index: 10000;
+ background-color: rgba(255, 255, 255, .9);
+ margin: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ -webkit-transition: opacity .3s;
+ transition: opacity .3s
+}
+
+.custom-theme .el-loading-mask.is-fullscreen {
+ position: fixed
+}
+
+.custom-theme .el-loading-mask.is-fullscreen .el-loading-spinner {
+ margin-top: -25px
+}
+
+.custom-theme .el-loading-mask.is-fullscreen .el-loading-spinner .circular {
+ height: 50px;
+ width: 50px
+}
+
+.custom-theme .el-loading-spinner {
+ top: 50%;
+ margin-top: -21px;
+ width: 100%;
+ text-align: center;
+ position: absolute
+}
+
+.custom-theme .el-loading-spinner .el-loading-text {
+ color: #262729;
+ margin: 3px 0;
+ font-size: 14px
+}
+
+.custom-theme .el-loading-spinner .circular {
+ height: 42px;
+ width: 42px;
+ -webkit-animation: loading-rotate 2s linear infinite;
+ animation: loading-rotate 2s linear infinite
+}
+
+.custom-theme .el-loading-spinner .path {
+ -webkit-animation: loading-dash 1.5s ease-in-out infinite;
+ animation: loading-dash 1.5s ease-in-out infinite;
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: 0;
+ stroke-width: 2;
+ stroke: #262729;
+ stroke-linecap: round
+}
+
+.custom-theme .el-loading-spinner i {
+ color: #262729
+}
+
+.custom-theme .el-loading-fade-enter, .custom-theme .el-loading-fade-leave-active {
+ opacity: 0
+}
+
+@-webkit-keyframes loading-rotate {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg)
+ }
+}
+
+@keyframes loading-rotate {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg)
+ }
+}
+
+@-webkit-keyframes loading-dash {
+ 0% {
+ stroke-dasharray: 1, 200;
+ stroke-dashoffset: 0
+ }
+ 50% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -40px
+ }
+ 100% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -120px
+ }
+}
+
+@keyframes loading-dash {
+ 0% {
+ stroke-dasharray: 1, 200;
+ stroke-dashoffset: 0
+ }
+ 50% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -40px
+ }
+ 100% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -120px
+ }
+}
+
+.custom-theme .el-row {
+ position: relative;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-row::after, .custom-theme .el-row::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-row::after {
+ clear: both
+}
+
+.custom-theme .el-row--flex {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex
+}
+
+.custom-theme .el-row--flex:after, .custom-theme .el-row--flex:before {
+ display: none
+}
+
+.custom-theme .el-row--flex.is-justify-center {
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center
+}
+
+.custom-theme .el-row--flex.is-justify-end {
+ -webkit-box-pack: end;
+ -ms-flex-pack: end;
+ justify-content: flex-end
+}
+
+.custom-theme .el-row--flex.is-justify-space-between {
+ -webkit-box-pack: justify;
+ -ms-flex-pack: justify;
+ justify-content: space-between
+}
+
+.custom-theme .el-row--flex.is-justify-space-around {
+ -ms-flex-pack: distribute;
+ justify-content: space-around
+}
+
+.custom-theme .el-row--flex.is-align-middle {
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center
+}
+
+.custom-theme .el-row--flex.is-align-bottom {
+ -webkit-box-align: end;
+ -ms-flex-align: end;
+ align-items: flex-end
+}
+
+.custom-theme [class*=el-col-] {
+ float: left;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-col-0 {
+ display: none
+}
+
+.custom-theme .el-col-1 {
+ width: 4.16667%
+}
+
+.custom-theme .el-col-offset-1 {
+ margin-left: 4.16667%
+}
+
+.custom-theme .el-col-pull-1 {
+ position: relative;
+ right: 4.16667%
+}
+
+.custom-theme .el-col-push-1 {
+ position: relative;
+ left: 4.16667%
+}
+
+.custom-theme .el-col-2 {
+ width: 8.33333%
+}
+
+.custom-theme .el-col-offset-2 {
+ margin-left: 8.33333%
+}
+
+.custom-theme .el-col-pull-2 {
+ position: relative;
+ right: 8.33333%
+}
+
+.custom-theme .el-col-push-2 {
+ position: relative;
+ left: 8.33333%
+}
+
+.custom-theme .el-col-3 {
+ width: 12.5%
+}
+
+.custom-theme .el-col-offset-3 {
+ margin-left: 12.5%
+}
+
+.custom-theme .el-col-pull-3 {
+ position: relative;
+ right: 12.5%
+}
+
+.custom-theme .el-col-push-3 {
+ position: relative;
+ left: 12.5%
+}
+
+.custom-theme .el-col-4 {
+ width: 16.66667%
+}
+
+.custom-theme .el-col-offset-4 {
+ margin-left: 16.66667%
+}
+
+.custom-theme .el-col-pull-4 {
+ position: relative;
+ right: 16.66667%
+}
+
+.custom-theme .el-col-push-4 {
+ position: relative;
+ left: 16.66667%
+}
+
+.custom-theme .el-col-5 {
+ width: 20.83333%
+}
+
+.custom-theme .el-col-offset-5 {
+ margin-left: 20.83333%
+}
+
+.custom-theme .el-col-pull-5 {
+ position: relative;
+ right: 20.83333%
+}
+
+.custom-theme .el-col-push-5 {
+ position: relative;
+ left: 20.83333%
+}
+
+.custom-theme .el-col-6 {
+ width: 25%
+}
+
+.custom-theme .el-col-offset-6 {
+ margin-left: 25%
+}
+
+.custom-theme .el-col-pull-6 {
+ position: relative;
+ right: 25%
+}
+
+.custom-theme .el-col-push-6 {
+ position: relative;
+ left: 25%
+}
+
+.custom-theme .el-col-7 {
+ width: 29.16667%
+}
+
+.custom-theme .el-col-offset-7 {
+ margin-left: 29.16667%
+}
+
+.custom-theme .el-col-pull-7 {
+ position: relative;
+ right: 29.16667%
+}
+
+.custom-theme .el-col-push-7 {
+ position: relative;
+ left: 29.16667%
+}
+
+.custom-theme .el-col-8 {
+ width: 33.33333%
+}
+
+.custom-theme .el-col-offset-8 {
+ margin-left: 33.33333%
+}
+
+.custom-theme .el-col-pull-8 {
+ position: relative;
+ right: 33.33333%
+}
+
+.custom-theme .el-col-push-8 {
+ position: relative;
+ left: 33.33333%
+}
+
+.custom-theme .el-col-9 {
+ width: 37.5%
+}
+
+.custom-theme .el-col-offset-9 {
+ margin-left: 37.5%
+}
+
+.custom-theme .el-col-pull-9 {
+ position: relative;
+ right: 37.5%
+}
+
+.custom-theme .el-col-push-9 {
+ position: relative;
+ left: 37.5%
+}
+
+.custom-theme .el-col-10 {
+ width: 41.66667%
+}
+
+.custom-theme .el-col-offset-10 {
+ margin-left: 41.66667%
+}
+
+.custom-theme .el-col-pull-10 {
+ position: relative;
+ right: 41.66667%
+}
+
+.custom-theme .el-col-push-10 {
+ position: relative;
+ left: 41.66667%
+}
+
+.custom-theme .el-col-11 {
+ width: 45.83333%
+}
+
+.custom-theme .el-col-offset-11 {
+ margin-left: 45.83333%
+}
+
+.custom-theme .el-col-pull-11 {
+ position: relative;
+ right: 45.83333%
+}
+
+.custom-theme .el-col-push-11 {
+ position: relative;
+ left: 45.83333%
+}
+
+.custom-theme .el-col-12 {
+ width: 50%
+}
+
+.custom-theme .el-col-offset-12 {
+ margin-left: 50%
+}
+
+.custom-theme .el-col-pull-12 {
+ position: relative;
+ right: 50%
+}
+
+.custom-theme .el-col-push-12 {
+ position: relative;
+ left: 50%
+}
+
+.custom-theme .el-col-13 {
+ width: 54.16667%
+}
+
+.custom-theme .el-col-offset-13 {
+ margin-left: 54.16667%
+}
+
+.custom-theme .el-col-pull-13 {
+ position: relative;
+ right: 54.16667%
+}
+
+.custom-theme .el-col-push-13 {
+ position: relative;
+ left: 54.16667%
+}
+
+.custom-theme .el-col-14 {
+ width: 58.33333%
+}
+
+.custom-theme .el-col-offset-14 {
+ margin-left: 58.33333%
+}
+
+.custom-theme .el-col-pull-14 {
+ position: relative;
+ right: 58.33333%
+}
+
+.custom-theme .el-col-push-14 {
+ position: relative;
+ left: 58.33333%
+}
+
+.custom-theme .el-col-15 {
+ width: 62.5%
+}
+
+.custom-theme .el-col-offset-15 {
+ margin-left: 62.5%
+}
+
+.custom-theme .el-col-pull-15 {
+ position: relative;
+ right: 62.5%
+}
+
+.custom-theme .el-col-push-15 {
+ position: relative;
+ left: 62.5%
+}
+
+.custom-theme .el-col-16 {
+ width: 66.66667%
+}
+
+.custom-theme .el-col-offset-16 {
+ margin-left: 66.66667%
+}
+
+.custom-theme .el-col-pull-16 {
+ position: relative;
+ right: 66.66667%
+}
+
+.custom-theme .el-col-push-16 {
+ position: relative;
+ left: 66.66667%
+}
+
+.custom-theme .el-col-17 {
+ width: 70.83333%
+}
+
+.custom-theme .el-col-offset-17 {
+ margin-left: 70.83333%
+}
+
+.custom-theme .el-col-pull-17 {
+ position: relative;
+ right: 70.83333%
+}
+
+.custom-theme .el-col-push-17 {
+ position: relative;
+ left: 70.83333%
+}
+
+.custom-theme .el-col-18 {
+ width: 75%
+}
+
+.custom-theme .el-col-offset-18 {
+ margin-left: 75%
+}
+
+.custom-theme .el-col-pull-18 {
+ position: relative;
+ right: 75%
+}
+
+.custom-theme .el-col-push-18 {
+ position: relative;
+ left: 75%
+}
+
+.custom-theme .el-col-19 {
+ width: 79.16667%
+}
+
+.custom-theme .el-col-offset-19 {
+ margin-left: 79.16667%
+}
+
+.custom-theme .el-col-pull-19 {
+ position: relative;
+ right: 79.16667%
+}
+
+.custom-theme .el-col-push-19 {
+ position: relative;
+ left: 79.16667%
+}
+
+.custom-theme .el-col-20 {
+ width: 83.33333%
+}
+
+.custom-theme .el-col-offset-20 {
+ margin-left: 83.33333%
+}
+
+.custom-theme .el-col-pull-20 {
+ position: relative;
+ right: 83.33333%
+}
+
+.custom-theme .el-col-push-20 {
+ position: relative;
+ left: 83.33333%
+}
+
+.custom-theme .el-col-21 {
+ width: 87.5%
+}
+
+.custom-theme .el-col-offset-21 {
+ margin-left: 87.5%
+}
+
+.custom-theme .el-col-pull-21 {
+ position: relative;
+ right: 87.5%
+}
+
+.custom-theme .el-col-push-21 {
+ position: relative;
+ left: 87.5%
+}
+
+.custom-theme .el-col-22 {
+ width: 91.66667%
+}
+
+.custom-theme .el-col-offset-22 {
+ margin-left: 91.66667%
+}
+
+.custom-theme .el-col-pull-22 {
+ position: relative;
+ right: 91.66667%
+}
+
+.custom-theme .el-col-push-22 {
+ position: relative;
+ left: 91.66667%
+}
+
+.custom-theme .el-col-23 {
+ width: 95.83333%
+}
+
+.custom-theme .el-col-offset-23 {
+ margin-left: 95.83333%
+}
+
+.custom-theme .el-col-pull-23 {
+ position: relative;
+ right: 95.83333%
+}
+
+.custom-theme .el-col-push-23 {
+ position: relative;
+ left: 95.83333%
+}
+
+.custom-theme .el-col-24 {
+ width: 100%
+}
+
+.custom-theme .el-col-offset-24 {
+ margin-left: 100%
+}
+
+.custom-theme .el-col-pull-24 {
+ position: relative;
+ right: 100%
+}
+
+.custom-theme .el-col-push-24 {
+ position: relative;
+ left: 100%
+}
+
+@media only screen and (max-width: 768px) {
+ .custom-theme .el-col-xs-0 {
+ display: none
+ }
+
+ .custom-theme .el-col-xs-1 {
+ width: 4.16667%
+ }
+
+ .custom-theme .el-col-xs-offset-1 {
+ margin-left: 4.16667%
+ }
+
+ .custom-theme .el-col-xs-pull-1 {
+ position: relative;
+ right: 4.16667%
+ }
+
+ .custom-theme .el-col-xs-push-1 {
+ position: relative;
+ left: 4.16667%
+ }
+
+ .custom-theme .el-col-xs-2 {
+ width: 8.33333%
+ }
+
+ .custom-theme .el-col-xs-offset-2 {
+ margin-left: 8.33333%
+ }
+
+ .custom-theme .el-col-xs-pull-2 {
+ position: relative;
+ right: 8.33333%
+ }
+
+ .custom-theme .el-col-xs-push-2 {
+ position: relative;
+ left: 8.33333%
+ }
+
+ .custom-theme .el-col-xs-3 {
+ width: 12.5%
+ }
+
+ .custom-theme .el-col-xs-offset-3 {
+ margin-left: 12.5%
+ }
+
+ .custom-theme .el-col-xs-pull-3 {
+ position: relative;
+ right: 12.5%
+ }
+
+ .custom-theme .el-col-xs-push-3 {
+ position: relative;
+ left: 12.5%
+ }
+
+ .custom-theme .el-col-xs-4 {
+ width: 16.66667%
+ }
+
+ .custom-theme .el-col-xs-offset-4 {
+ margin-left: 16.66667%
+ }
+
+ .custom-theme .el-col-xs-pull-4 {
+ position: relative;
+ right: 16.66667%
+ }
+
+ .custom-theme .el-col-xs-push-4 {
+ position: relative;
+ left: 16.66667%
+ }
+
+ .custom-theme .el-col-xs-5 {
+ width: 20.83333%
+ }
+
+ .custom-theme .el-col-xs-offset-5 {
+ margin-left: 20.83333%
+ }
+
+ .custom-theme .el-col-xs-pull-5 {
+ position: relative;
+ right: 20.83333%
+ }
+
+ .custom-theme .el-col-xs-push-5 {
+ position: relative;
+ left: 20.83333%
+ }
+
+ .custom-theme .el-col-xs-6 {
+ width: 25%
+ }
+
+ .custom-theme .el-col-xs-offset-6 {
+ margin-left: 25%
+ }
+
+ .custom-theme .el-col-xs-pull-6 {
+ position: relative;
+ right: 25%
+ }
+
+ .custom-theme .el-col-xs-push-6 {
+ position: relative;
+ left: 25%
+ }
+
+ .custom-theme .el-col-xs-7 {
+ width: 29.16667%
+ }
+
+ .custom-theme .el-col-xs-offset-7 {
+ margin-left: 29.16667%
+ }
+
+ .custom-theme .el-col-xs-pull-7 {
+ position: relative;
+ right: 29.16667%
+ }
+
+ .custom-theme .el-col-xs-push-7 {
+ position: relative;
+ left: 29.16667%
+ }
+
+ .custom-theme .el-col-xs-8 {
+ width: 33.33333%
+ }
+
+ .custom-theme .el-col-xs-offset-8 {
+ margin-left: 33.33333%
+ }
+
+ .custom-theme .el-col-xs-pull-8 {
+ position: relative;
+ right: 33.33333%
+ }
+
+ .custom-theme .el-col-xs-push-8 {
+ position: relative;
+ left: 33.33333%
+ }
+
+ .custom-theme .el-col-xs-9 {
+ width: 37.5%
+ }
+
+ .custom-theme .el-col-xs-offset-9 {
+ margin-left: 37.5%
+ }
+
+ .custom-theme .el-col-xs-pull-9 {
+ position: relative;
+ right: 37.5%
+ }
+
+ .custom-theme .el-col-xs-push-9 {
+ position: relative;
+ left: 37.5%
+ }
+
+ .custom-theme .el-col-xs-10 {
+ width: 41.66667%
+ }
+
+ .custom-theme .el-col-xs-offset-10 {
+ margin-left: 41.66667%
+ }
+
+ .custom-theme .el-col-xs-pull-10 {
+ position: relative;
+ right: 41.66667%
+ }
+
+ .custom-theme .el-col-xs-push-10 {
+ position: relative;
+ left: 41.66667%
+ }
+
+ .custom-theme .el-col-xs-11 {
+ width: 45.83333%
+ }
+
+ .custom-theme .el-col-xs-offset-11 {
+ margin-left: 45.83333%
+ }
+
+ .custom-theme .el-col-xs-pull-11 {
+ position: relative;
+ right: 45.83333%
+ }
+
+ .custom-theme .el-col-xs-push-11 {
+ position: relative;
+ left: 45.83333%
+ }
+
+ .custom-theme .el-col-xs-12 {
+ width: 50%
+ }
+
+ .custom-theme .el-col-xs-offset-12 {
+ margin-left: 50%
+ }
+
+ .custom-theme .el-col-xs-pull-12 {
+ position: relative;
+ right: 50%
+ }
+
+ .custom-theme .el-col-xs-push-12 {
+ position: relative;
+ left: 50%
+ }
+
+ .custom-theme .el-col-xs-13 {
+ width: 54.16667%
+ }
+
+ .custom-theme .el-col-xs-offset-13 {
+ margin-left: 54.16667%
+ }
+
+ .custom-theme .el-col-xs-pull-13 {
+ position: relative;
+ right: 54.16667%
+ }
+
+ .custom-theme .el-col-xs-push-13 {
+ position: relative;
+ left: 54.16667%
+ }
+
+ .custom-theme .el-col-xs-14 {
+ width: 58.33333%
+ }
+
+ .custom-theme .el-col-xs-offset-14 {
+ margin-left: 58.33333%
+ }
+
+ .custom-theme .el-col-xs-pull-14 {
+ position: relative;
+ right: 58.33333%
+ }
+
+ .custom-theme .el-col-xs-push-14 {
+ position: relative;
+ left: 58.33333%
+ }
+
+ .custom-theme .el-col-xs-15 {
+ width: 62.5%
+ }
+
+ .custom-theme .el-col-xs-offset-15 {
+ margin-left: 62.5%
+ }
+
+ .custom-theme .el-col-xs-pull-15 {
+ position: relative;
+ right: 62.5%
+ }
+
+ .custom-theme .el-col-xs-push-15 {
+ position: relative;
+ left: 62.5%
+ }
+
+ .custom-theme .el-col-xs-16 {
+ width: 66.66667%
+ }
+
+ .custom-theme .el-col-xs-offset-16 {
+ margin-left: 66.66667%
+ }
+
+ .custom-theme .el-col-xs-pull-16 {
+ position: relative;
+ right: 66.66667%
+ }
+
+ .custom-theme .el-col-xs-push-16 {
+ position: relative;
+ left: 66.66667%
+ }
+
+ .custom-theme .el-col-xs-17 {
+ width: 70.83333%
+ }
+
+ .custom-theme .el-col-xs-offset-17 {
+ margin-left: 70.83333%
+ }
+
+ .custom-theme .el-col-xs-pull-17 {
+ position: relative;
+ right: 70.83333%
+ }
+
+ .custom-theme .el-col-xs-push-17 {
+ position: relative;
+ left: 70.83333%
+ }
+
+ .custom-theme .el-col-xs-18 {
+ width: 75%
+ }
+
+ .custom-theme .el-col-xs-offset-18 {
+ margin-left: 75%
+ }
+
+ .custom-theme .el-col-xs-pull-18 {
+ position: relative;
+ right: 75%
+ }
+
+ .custom-theme .el-col-xs-push-18 {
+ position: relative;
+ left: 75%
+ }
+
+ .custom-theme .el-col-xs-19 {
+ width: 79.16667%
+ }
+
+ .custom-theme .el-col-xs-offset-19 {
+ margin-left: 79.16667%
+ }
+
+ .custom-theme .el-col-xs-pull-19 {
+ position: relative;
+ right: 79.16667%
+ }
+
+ .custom-theme .el-col-xs-push-19 {
+ position: relative;
+ left: 79.16667%
+ }
+
+ .custom-theme .el-col-xs-20 {
+ width: 83.33333%
+ }
+
+ .custom-theme .el-col-xs-offset-20 {
+ margin-left: 83.33333%
+ }
+
+ .custom-theme .el-col-xs-pull-20 {
+ position: relative;
+ right: 83.33333%
+ }
+
+ .custom-theme .el-col-xs-push-20 {
+ position: relative;
+ left: 83.33333%
+ }
+
+ .custom-theme .el-col-xs-21 {
+ width: 87.5%
+ }
+
+ .custom-theme .el-col-xs-offset-21 {
+ margin-left: 87.5%
+ }
+
+ .custom-theme .el-col-xs-pull-21 {
+ position: relative;
+ right: 87.5%
+ }
+
+ .custom-theme .el-col-xs-push-21 {
+ position: relative;
+ left: 87.5%
+ }
+
+ .custom-theme .el-col-xs-22 {
+ width: 91.66667%
+ }
+
+ .custom-theme .el-col-xs-offset-22 {
+ margin-left: 91.66667%
+ }
+
+ .custom-theme .el-col-xs-pull-22 {
+ position: relative;
+ right: 91.66667%
+ }
+
+ .custom-theme .el-col-xs-push-22 {
+ position: relative;
+ left: 91.66667%
+ }
+
+ .custom-theme .el-col-xs-23 {
+ width: 95.83333%
+ }
+
+ .custom-theme .el-col-xs-offset-23 {
+ margin-left: 95.83333%
+ }
+
+ .custom-theme .el-col-xs-pull-23 {
+ position: relative;
+ right: 95.83333%
+ }
+
+ .custom-theme .el-col-xs-push-23 {
+ position: relative;
+ left: 95.83333%
+ }
+
+ .custom-theme .el-col-xs-24 {
+ width: 100%
+ }
+
+ .custom-theme .el-col-xs-offset-24 {
+ margin-left: 100%
+ }
+
+ .custom-theme .el-col-xs-pull-24 {
+ position: relative;
+ right: 100%
+ }
+
+ .custom-theme .el-col-xs-push-24 {
+ position: relative;
+ left: 100%
+ }
+}
+
+@media only screen and (min-width: 768px) {
+ .custom-theme .el-col-sm-0 {
+ display: none
+ }
+
+ .custom-theme .el-col-sm-1 {
+ width: 4.16667%
+ }
+
+ .custom-theme .el-col-sm-offset-1 {
+ margin-left: 4.16667%
+ }
+
+ .custom-theme .el-col-sm-pull-1 {
+ position: relative;
+ right: 4.16667%
+ }
+
+ .custom-theme .el-col-sm-push-1 {
+ position: relative;
+ left: 4.16667%
+ }
+
+ .custom-theme .el-col-sm-2 {
+ width: 8.33333%
+ }
+
+ .custom-theme .el-col-sm-offset-2 {
+ margin-left: 8.33333%
+ }
+
+ .custom-theme .el-col-sm-pull-2 {
+ position: relative;
+ right: 8.33333%
+ }
+
+ .custom-theme .el-col-sm-push-2 {
+ position: relative;
+ left: 8.33333%
+ }
+
+ .custom-theme .el-col-sm-3 {
+ width: 12.5%
+ }
+
+ .custom-theme .el-col-sm-offset-3 {
+ margin-left: 12.5%
+ }
+
+ .custom-theme .el-col-sm-pull-3 {
+ position: relative;
+ right: 12.5%
+ }
+
+ .custom-theme .el-col-sm-push-3 {
+ position: relative;
+ left: 12.5%
+ }
+
+ .custom-theme .el-col-sm-4 {
+ width: 16.66667%
+ }
+
+ .custom-theme .el-col-sm-offset-4 {
+ margin-left: 16.66667%
+ }
+
+ .custom-theme .el-col-sm-pull-4 {
+ position: relative;
+ right: 16.66667%
+ }
+
+ .custom-theme .el-col-sm-push-4 {
+ position: relative;
+ left: 16.66667%
+ }
+
+ .custom-theme .el-col-sm-5 {
+ width: 20.83333%
+ }
+
+ .custom-theme .el-col-sm-offset-5 {
+ margin-left: 20.83333%
+ }
+
+ .custom-theme .el-col-sm-pull-5 {
+ position: relative;
+ right: 20.83333%
+ }
+
+ .custom-theme .el-col-sm-push-5 {
+ position: relative;
+ left: 20.83333%
+ }
+
+ .custom-theme .el-col-sm-6 {
+ width: 25%
+ }
+
+ .custom-theme .el-col-sm-offset-6 {
+ margin-left: 25%
+ }
+
+ .custom-theme .el-col-sm-pull-6 {
+ position: relative;
+ right: 25%
+ }
+
+ .custom-theme .el-col-sm-push-6 {
+ position: relative;
+ left: 25%
+ }
+
+ .custom-theme .el-col-sm-7 {
+ width: 29.16667%
+ }
+
+ .custom-theme .el-col-sm-offset-7 {
+ margin-left: 29.16667%
+ }
+
+ .custom-theme .el-col-sm-pull-7 {
+ position: relative;
+ right: 29.16667%
+ }
+
+ .custom-theme .el-col-sm-push-7 {
+ position: relative;
+ left: 29.16667%
+ }
+
+ .custom-theme .el-col-sm-8 {
+ width: 33.33333%
+ }
+
+ .custom-theme .el-col-sm-offset-8 {
+ margin-left: 33.33333%
+ }
+
+ .custom-theme .el-col-sm-pull-8 {
+ position: relative;
+ right: 33.33333%
+ }
+
+ .custom-theme .el-col-sm-push-8 {
+ position: relative;
+ left: 33.33333%
+ }
+
+ .custom-theme .el-col-sm-9 {
+ width: 37.5%
+ }
+
+ .custom-theme .el-col-sm-offset-9 {
+ margin-left: 37.5%
+ }
+
+ .custom-theme .el-col-sm-pull-9 {
+ position: relative;
+ right: 37.5%
+ }
+
+ .custom-theme .el-col-sm-push-9 {
+ position: relative;
+ left: 37.5%
+ }
+
+ .custom-theme .el-col-sm-10 {
+ width: 41.66667%
+ }
+
+ .custom-theme .el-col-sm-offset-10 {
+ margin-left: 41.66667%
+ }
+
+ .custom-theme .el-col-sm-pull-10 {
+ position: relative;
+ right: 41.66667%
+ }
+
+ .custom-theme .el-col-sm-push-10 {
+ position: relative;
+ left: 41.66667%
+ }
+
+ .custom-theme .el-col-sm-11 {
+ width: 45.83333%
+ }
+
+ .custom-theme .el-col-sm-offset-11 {
+ margin-left: 45.83333%
+ }
+
+ .custom-theme .el-col-sm-pull-11 {
+ position: relative;
+ right: 45.83333%
+ }
+
+ .custom-theme .el-col-sm-push-11 {
+ position: relative;
+ left: 45.83333%
+ }
+
+ .custom-theme .el-col-sm-12 {
+ width: 50%
+ }
+
+ .custom-theme .el-col-sm-offset-12 {
+ margin-left: 50%
+ }
+
+ .custom-theme .el-col-sm-pull-12 {
+ position: relative;
+ right: 50%
+ }
+
+ .custom-theme .el-col-sm-push-12 {
+ position: relative;
+ left: 50%
+ }
+
+ .custom-theme .el-col-sm-13 {
+ width: 54.16667%
+ }
+
+ .custom-theme .el-col-sm-offset-13 {
+ margin-left: 54.16667%
+ }
+
+ .custom-theme .el-col-sm-pull-13 {
+ position: relative;
+ right: 54.16667%
+ }
+
+ .custom-theme .el-col-sm-push-13 {
+ position: relative;
+ left: 54.16667%
+ }
+
+ .custom-theme .el-col-sm-14 {
+ width: 58.33333%
+ }
+
+ .custom-theme .el-col-sm-offset-14 {
+ margin-left: 58.33333%
+ }
+
+ .custom-theme .el-col-sm-pull-14 {
+ position: relative;
+ right: 58.33333%
+ }
+
+ .custom-theme .el-col-sm-push-14 {
+ position: relative;
+ left: 58.33333%
+ }
+
+ .custom-theme .el-col-sm-15 {
+ width: 62.5%
+ }
+
+ .custom-theme .el-col-sm-offset-15 {
+ margin-left: 62.5%
+ }
+
+ .custom-theme .el-col-sm-pull-15 {
+ position: relative;
+ right: 62.5%
+ }
+
+ .custom-theme .el-col-sm-push-15 {
+ position: relative;
+ left: 62.5%
+ }
+
+ .custom-theme .el-col-sm-16 {
+ width: 66.66667%
+ }
+
+ .custom-theme .el-col-sm-offset-16 {
+ margin-left: 66.66667%
+ }
+
+ .custom-theme .el-col-sm-pull-16 {
+ position: relative;
+ right: 66.66667%
+ }
+
+ .custom-theme .el-col-sm-push-16 {
+ position: relative;
+ left: 66.66667%
+ }
+
+ .custom-theme .el-col-sm-17 {
+ width: 70.83333%
+ }
+
+ .custom-theme .el-col-sm-offset-17 {
+ margin-left: 70.83333%
+ }
+
+ .custom-theme .el-col-sm-pull-17 {
+ position: relative;
+ right: 70.83333%
+ }
+
+ .custom-theme .el-col-sm-push-17 {
+ position: relative;
+ left: 70.83333%
+ }
+
+ .custom-theme .el-col-sm-18 {
+ width: 75%
+ }
+
+ .custom-theme .el-col-sm-offset-18 {
+ margin-left: 75%
+ }
+
+ .custom-theme .el-col-sm-pull-18 {
+ position: relative;
+ right: 75%
+ }
+
+ .custom-theme .el-col-sm-push-18 {
+ position: relative;
+ left: 75%
+ }
+
+ .custom-theme .el-col-sm-19 {
+ width: 79.16667%
+ }
+
+ .custom-theme .el-col-sm-offset-19 {
+ margin-left: 79.16667%
+ }
+
+ .custom-theme .el-col-sm-pull-19 {
+ position: relative;
+ right: 79.16667%
+ }
+
+ .custom-theme .el-col-sm-push-19 {
+ position: relative;
+ left: 79.16667%
+ }
+
+ .custom-theme .el-col-sm-20 {
+ width: 83.33333%
+ }
+
+ .custom-theme .el-col-sm-offset-20 {
+ margin-left: 83.33333%
+ }
+
+ .custom-theme .el-col-sm-pull-20 {
+ position: relative;
+ right: 83.33333%
+ }
+
+ .custom-theme .el-col-sm-push-20 {
+ position: relative;
+ left: 83.33333%
+ }
+
+ .custom-theme .el-col-sm-21 {
+ width: 87.5%
+ }
+
+ .custom-theme .el-col-sm-offset-21 {
+ margin-left: 87.5%
+ }
+
+ .custom-theme .el-col-sm-pull-21 {
+ position: relative;
+ right: 87.5%
+ }
+
+ .custom-theme .el-col-sm-push-21 {
+ position: relative;
+ left: 87.5%
+ }
+
+ .custom-theme .el-col-sm-22 {
+ width: 91.66667%
+ }
+
+ .custom-theme .el-col-sm-offset-22 {
+ margin-left: 91.66667%
+ }
+
+ .custom-theme .el-col-sm-pull-22 {
+ position: relative;
+ right: 91.66667%
+ }
+
+ .custom-theme .el-col-sm-push-22 {
+ position: relative;
+ left: 91.66667%
+ }
+
+ .custom-theme .el-col-sm-23 {
+ width: 95.83333%
+ }
+
+ .custom-theme .el-col-sm-offset-23 {
+ margin-left: 95.83333%
+ }
+
+ .custom-theme .el-col-sm-pull-23 {
+ position: relative;
+ right: 95.83333%
+ }
+
+ .custom-theme .el-col-sm-push-23 {
+ position: relative;
+ left: 95.83333%
+ }
+
+ .custom-theme .el-col-sm-24 {
+ width: 100%
+ }
+
+ .custom-theme .el-col-sm-offset-24 {
+ margin-left: 100%
+ }
+
+ .custom-theme .el-col-sm-pull-24 {
+ position: relative;
+ right: 100%
+ }
+
+ .custom-theme .el-col-sm-push-24 {
+ position: relative;
+ left: 100%
+ }
+}
+
+@media only screen and (min-width: 992px) {
+ .custom-theme .el-col-md-0 {
+ display: none
+ }
+
+ .custom-theme .el-col-md-1 {
+ width: 4.16667%
+ }
+
+ .custom-theme .el-col-md-offset-1 {
+ margin-left: 4.16667%
+ }
+
+ .custom-theme .el-col-md-pull-1 {
+ position: relative;
+ right: 4.16667%
+ }
+
+ .custom-theme .el-col-md-push-1 {
+ position: relative;
+ left: 4.16667%
+ }
+
+ .custom-theme .el-col-md-2 {
+ width: 8.33333%
+ }
+
+ .custom-theme .el-col-md-offset-2 {
+ margin-left: 8.33333%
+ }
+
+ .custom-theme .el-col-md-pull-2 {
+ position: relative;
+ right: 8.33333%
+ }
+
+ .custom-theme .el-col-md-push-2 {
+ position: relative;
+ left: 8.33333%
+ }
+
+ .custom-theme .el-col-md-3 {
+ width: 12.5%
+ }
+
+ .custom-theme .el-col-md-offset-3 {
+ margin-left: 12.5%
+ }
+
+ .custom-theme .el-col-md-pull-3 {
+ position: relative;
+ right: 12.5%
+ }
+
+ .custom-theme .el-col-md-push-3 {
+ position: relative;
+ left: 12.5%
+ }
+
+ .custom-theme .el-col-md-4 {
+ width: 16.66667%
+ }
+
+ .custom-theme .el-col-md-offset-4 {
+ margin-left: 16.66667%
+ }
+
+ .custom-theme .el-col-md-pull-4 {
+ position: relative;
+ right: 16.66667%
+ }
+
+ .custom-theme .el-col-md-push-4 {
+ position: relative;
+ left: 16.66667%
+ }
+
+ .custom-theme .el-col-md-5 {
+ width: 20.83333%
+ }
+
+ .custom-theme .el-col-md-offset-5 {
+ margin-left: 20.83333%
+ }
+
+ .custom-theme .el-col-md-pull-5 {
+ position: relative;
+ right: 20.83333%
+ }
+
+ .custom-theme .el-col-md-push-5 {
+ position: relative;
+ left: 20.83333%
+ }
+
+ .custom-theme .el-col-md-6 {
+ width: 25%
+ }
+
+ .custom-theme .el-col-md-offset-6 {
+ margin-left: 25%
+ }
+
+ .custom-theme .el-col-md-pull-6 {
+ position: relative;
+ right: 25%
+ }
+
+ .custom-theme .el-col-md-push-6 {
+ position: relative;
+ left: 25%
+ }
+
+ .custom-theme .el-col-md-7 {
+ width: 29.16667%
+ }
+
+ .custom-theme .el-col-md-offset-7 {
+ margin-left: 29.16667%
+ }
+
+ .custom-theme .el-col-md-pull-7 {
+ position: relative;
+ right: 29.16667%
+ }
+
+ .custom-theme .el-col-md-push-7 {
+ position: relative;
+ left: 29.16667%
+ }
+
+ .custom-theme .el-col-md-8 {
+ width: 33.33333%
+ }
+
+ .custom-theme .el-col-md-offset-8 {
+ margin-left: 33.33333%
+ }
+
+ .custom-theme .el-col-md-pull-8 {
+ position: relative;
+ right: 33.33333%
+ }
+
+ .custom-theme .el-col-md-push-8 {
+ position: relative;
+ left: 33.33333%
+ }
+
+ .custom-theme .el-col-md-9 {
+ width: 37.5%
+ }
+
+ .custom-theme .el-col-md-offset-9 {
+ margin-left: 37.5%
+ }
+
+ .custom-theme .el-col-md-pull-9 {
+ position: relative;
+ right: 37.5%
+ }
+
+ .custom-theme .el-col-md-push-9 {
+ position: relative;
+ left: 37.5%
+ }
+
+ .custom-theme .el-col-md-10 {
+ width: 41.66667%
+ }
+
+ .custom-theme .el-col-md-offset-10 {
+ margin-left: 41.66667%
+ }
+
+ .custom-theme .el-col-md-pull-10 {
+ position: relative;
+ right: 41.66667%
+ }
+
+ .custom-theme .el-col-md-push-10 {
+ position: relative;
+ left: 41.66667%
+ }
+
+ .custom-theme .el-col-md-11 {
+ width: 45.83333%
+ }
+
+ .custom-theme .el-col-md-offset-11 {
+ margin-left: 45.83333%
+ }
+
+ .custom-theme .el-col-md-pull-11 {
+ position: relative;
+ right: 45.83333%
+ }
+
+ .custom-theme .el-col-md-push-11 {
+ position: relative;
+ left: 45.83333%
+ }
+
+ .custom-theme .el-col-md-12 {
+ width: 50%
+ }
+
+ .custom-theme .el-col-md-offset-12 {
+ margin-left: 50%
+ }
+
+ .custom-theme .el-col-md-pull-12 {
+ position: relative;
+ right: 50%
+ }
+
+ .custom-theme .el-col-md-push-12 {
+ position: relative;
+ left: 50%
+ }
+
+ .custom-theme .el-col-md-13 {
+ width: 54.16667%
+ }
+
+ .custom-theme .el-col-md-offset-13 {
+ margin-left: 54.16667%
+ }
+
+ .custom-theme .el-col-md-pull-13 {
+ position: relative;
+ right: 54.16667%
+ }
+
+ .custom-theme .el-col-md-push-13 {
+ position: relative;
+ left: 54.16667%
+ }
+
+ .custom-theme .el-col-md-14 {
+ width: 58.33333%
+ }
+
+ .custom-theme .el-col-md-offset-14 {
+ margin-left: 58.33333%
+ }
+
+ .custom-theme .el-col-md-pull-14 {
+ position: relative;
+ right: 58.33333%
+ }
+
+ .custom-theme .el-col-md-push-14 {
+ position: relative;
+ left: 58.33333%
+ }
+
+ .custom-theme .el-col-md-15 {
+ width: 62.5%
+ }
+
+ .custom-theme .el-col-md-offset-15 {
+ margin-left: 62.5%
+ }
+
+ .custom-theme .el-col-md-pull-15 {
+ position: relative;
+ right: 62.5%
+ }
+
+ .custom-theme .el-col-md-push-15 {
+ position: relative;
+ left: 62.5%
+ }
+
+ .custom-theme .el-col-md-16 {
+ width: 66.66667%
+ }
+
+ .custom-theme .el-col-md-offset-16 {
+ margin-left: 66.66667%
+ }
+
+ .custom-theme .el-col-md-pull-16 {
+ position: relative;
+ right: 66.66667%
+ }
+
+ .custom-theme .el-col-md-push-16 {
+ position: relative;
+ left: 66.66667%
+ }
+
+ .custom-theme .el-col-md-17 {
+ width: 70.83333%
+ }
+
+ .custom-theme .el-col-md-offset-17 {
+ margin-left: 70.83333%
+ }
+
+ .custom-theme .el-col-md-pull-17 {
+ position: relative;
+ right: 70.83333%
+ }
+
+ .custom-theme .el-col-md-push-17 {
+ position: relative;
+ left: 70.83333%
+ }
+
+ .custom-theme .el-col-md-18 {
+ width: 75%
+ }
+
+ .custom-theme .el-col-md-offset-18 {
+ margin-left: 75%
+ }
+
+ .custom-theme .el-col-md-pull-18 {
+ position: relative;
+ right: 75%
+ }
+
+ .custom-theme .el-col-md-push-18 {
+ position: relative;
+ left: 75%
+ }
+
+ .custom-theme .el-col-md-19 {
+ width: 79.16667%
+ }
+
+ .custom-theme .el-col-md-offset-19 {
+ margin-left: 79.16667%
+ }
+
+ .custom-theme .el-col-md-pull-19 {
+ position: relative;
+ right: 79.16667%
+ }
+
+ .custom-theme .el-col-md-push-19 {
+ position: relative;
+ left: 79.16667%
+ }
+
+ .custom-theme .el-col-md-20 {
+ width: 83.33333%
+ }
+
+ .custom-theme .el-col-md-offset-20 {
+ margin-left: 83.33333%
+ }
+
+ .custom-theme .el-col-md-pull-20 {
+ position: relative;
+ right: 83.33333%
+ }
+
+ .custom-theme .el-col-md-push-20 {
+ position: relative;
+ left: 83.33333%
+ }
+
+ .custom-theme .el-col-md-21 {
+ width: 87.5%
+ }
+
+ .custom-theme .el-col-md-offset-21 {
+ margin-left: 87.5%
+ }
+
+ .custom-theme .el-col-md-pull-21 {
+ position: relative;
+ right: 87.5%
+ }
+
+ .custom-theme .el-col-md-push-21 {
+ position: relative;
+ left: 87.5%
+ }
+
+ .custom-theme .el-col-md-22 {
+ width: 91.66667%
+ }
+
+ .custom-theme .el-col-md-offset-22 {
+ margin-left: 91.66667%
+ }
+
+ .custom-theme .el-col-md-pull-22 {
+ position: relative;
+ right: 91.66667%
+ }
+
+ .custom-theme .el-col-md-push-22 {
+ position: relative;
+ left: 91.66667%
+ }
+
+ .custom-theme .el-col-md-23 {
+ width: 95.83333%
+ }
+
+ .custom-theme .el-col-md-offset-23 {
+ margin-left: 95.83333%
+ }
+
+ .custom-theme .el-col-md-pull-23 {
+ position: relative;
+ right: 95.83333%
+ }
+
+ .custom-theme .el-col-md-push-23 {
+ position: relative;
+ left: 95.83333%
+ }
+
+ .custom-theme .el-col-md-24 {
+ width: 100%
+ }
+
+ .custom-theme .el-col-md-offset-24 {
+ margin-left: 100%
+ }
+
+ .custom-theme .el-col-md-pull-24 {
+ position: relative;
+ right: 100%
+ }
+
+ .custom-theme .el-col-md-push-24 {
+ position: relative;
+ left: 100%
+ }
+}
+
+@media only screen and (min-width: 1200px) {
+ .custom-theme .el-col-lg-0 {
+ display: none
+ }
+
+ .custom-theme .el-col-lg-1 {
+ width: 4.16667%
+ }
+
+ .custom-theme .el-col-lg-offset-1 {
+ margin-left: 4.16667%
+ }
+
+ .custom-theme .el-col-lg-pull-1 {
+ position: relative;
+ right: 4.16667%
+ }
+
+ .custom-theme .el-col-lg-push-1 {
+ position: relative;
+ left: 4.16667%
+ }
+
+ .custom-theme .el-col-lg-2 {
+ width: 8.33333%
+ }
+
+ .custom-theme .el-col-lg-offset-2 {
+ margin-left: 8.33333%
+ }
+
+ .custom-theme .el-col-lg-pull-2 {
+ position: relative;
+ right: 8.33333%
+ }
+
+ .custom-theme .el-col-lg-push-2 {
+ position: relative;
+ left: 8.33333%
+ }
+
+ .custom-theme .el-col-lg-3 {
+ width: 12.5%
+ }
+
+ .custom-theme .el-col-lg-offset-3 {
+ margin-left: 12.5%
+ }
+
+ .custom-theme .el-col-lg-pull-3 {
+ position: relative;
+ right: 12.5%
+ }
+
+ .custom-theme .el-col-lg-push-3 {
+ position: relative;
+ left: 12.5%
+ }
+
+ .custom-theme .el-col-lg-4 {
+ width: 16.66667%
+ }
+
+ .custom-theme .el-col-lg-offset-4 {
+ margin-left: 16.66667%
+ }
+
+ .custom-theme .el-col-lg-pull-4 {
+ position: relative;
+ right: 16.66667%
+ }
+
+ .custom-theme .el-col-lg-push-4 {
+ position: relative;
+ left: 16.66667%
+ }
+
+ .custom-theme .el-col-lg-5 {
+ width: 20.83333%
+ }
+
+ .custom-theme .el-col-lg-offset-5 {
+ margin-left: 20.83333%
+ }
+
+ .custom-theme .el-col-lg-pull-5 {
+ position: relative;
+ right: 20.83333%
+ }
+
+ .custom-theme .el-col-lg-push-5 {
+ position: relative;
+ left: 20.83333%
+ }
+
+ .custom-theme .el-col-lg-6 {
+ width: 25%
+ }
+
+ .custom-theme .el-col-lg-offset-6 {
+ margin-left: 25%
+ }
+
+ .custom-theme .el-col-lg-pull-6 {
+ position: relative;
+ right: 25%
+ }
+
+ .custom-theme .el-col-lg-push-6 {
+ position: relative;
+ left: 25%
+ }
+
+ .custom-theme .el-col-lg-7 {
+ width: 29.16667%
+ }
+
+ .custom-theme .el-col-lg-offset-7 {
+ margin-left: 29.16667%
+ }
+
+ .custom-theme .el-col-lg-pull-7 {
+ position: relative;
+ right: 29.16667%
+ }
+
+ .custom-theme .el-col-lg-push-7 {
+ position: relative;
+ left: 29.16667%
+ }
+
+ .custom-theme .el-col-lg-8 {
+ width: 33.33333%
+ }
+
+ .custom-theme .el-col-lg-offset-8 {
+ margin-left: 33.33333%
+ }
+
+ .custom-theme .el-col-lg-pull-8 {
+ position: relative;
+ right: 33.33333%
+ }
+
+ .custom-theme .el-col-lg-push-8 {
+ position: relative;
+ left: 33.33333%
+ }
+
+ .custom-theme .el-col-lg-9 {
+ width: 37.5%
+ }
+
+ .custom-theme .el-col-lg-offset-9 {
+ margin-left: 37.5%
+ }
+
+ .custom-theme .el-col-lg-pull-9 {
+ position: relative;
+ right: 37.5%
+ }
+
+ .custom-theme .el-col-lg-push-9 {
+ position: relative;
+ left: 37.5%
+ }
+
+ .custom-theme .el-col-lg-10 {
+ width: 41.66667%
+ }
+
+ .custom-theme .el-col-lg-offset-10 {
+ margin-left: 41.66667%
+ }
+
+ .custom-theme .el-col-lg-pull-10 {
+ position: relative;
+ right: 41.66667%
+ }
+
+ .custom-theme .el-col-lg-push-10 {
+ position: relative;
+ left: 41.66667%
+ }
+
+ .custom-theme .el-col-lg-11 {
+ width: 45.83333%
+ }
+
+ .custom-theme .el-col-lg-offset-11 {
+ margin-left: 45.83333%
+ }
+
+ .custom-theme .el-col-lg-pull-11 {
+ position: relative;
+ right: 45.83333%
+ }
+
+ .custom-theme .el-col-lg-push-11 {
+ position: relative;
+ left: 45.83333%
+ }
+
+ .custom-theme .el-col-lg-12 {
+ width: 50%
+ }
+
+ .custom-theme .el-col-lg-offset-12 {
+ margin-left: 50%
+ }
+
+ .custom-theme .el-col-lg-pull-12 {
+ position: relative;
+ right: 50%
+ }
+
+ .custom-theme .el-col-lg-push-12 {
+ position: relative;
+ left: 50%
+ }
+
+ .custom-theme .el-col-lg-13 {
+ width: 54.16667%
+ }
+
+ .custom-theme .el-col-lg-offset-13 {
+ margin-left: 54.16667%
+ }
+
+ .custom-theme .el-col-lg-pull-13 {
+ position: relative;
+ right: 54.16667%
+ }
+
+ .custom-theme .el-col-lg-push-13 {
+ position: relative;
+ left: 54.16667%
+ }
+
+ .custom-theme .el-col-lg-14 {
+ width: 58.33333%
+ }
+
+ .custom-theme .el-col-lg-offset-14 {
+ margin-left: 58.33333%
+ }
+
+ .custom-theme .el-col-lg-pull-14 {
+ position: relative;
+ right: 58.33333%
+ }
+
+ .custom-theme .el-col-lg-push-14 {
+ position: relative;
+ left: 58.33333%
+ }
+
+ .custom-theme .el-col-lg-15 {
+ width: 62.5%
+ }
+
+ .custom-theme .el-col-lg-offset-15 {
+ margin-left: 62.5%
+ }
+
+ .custom-theme .el-col-lg-pull-15 {
+ position: relative;
+ right: 62.5%
+ }
+
+ .custom-theme .el-col-lg-push-15 {
+ position: relative;
+ left: 62.5%
+ }
+
+ .custom-theme .el-col-lg-16 {
+ width: 66.66667%
+ }
+
+ .custom-theme .el-col-lg-offset-16 {
+ margin-left: 66.66667%
+ }
+
+ .custom-theme .el-col-lg-pull-16 {
+ position: relative;
+ right: 66.66667%
+ }
+
+ .custom-theme .el-col-lg-push-16 {
+ position: relative;
+ left: 66.66667%
+ }
+
+ .custom-theme .el-col-lg-17 {
+ width: 70.83333%
+ }
+
+ .custom-theme .el-col-lg-offset-17 {
+ margin-left: 70.83333%
+ }
+
+ .custom-theme .el-col-lg-pull-17 {
+ position: relative;
+ right: 70.83333%
+ }
+
+ .custom-theme .el-col-lg-push-17 {
+ position: relative;
+ left: 70.83333%
+ }
+
+ .custom-theme .el-col-lg-18 {
+ width: 75%
+ }
+
+ .custom-theme .el-col-lg-offset-18 {
+ margin-left: 75%
+ }
+
+ .custom-theme .el-col-lg-pull-18 {
+ position: relative;
+ right: 75%
+ }
+
+ .custom-theme .el-col-lg-push-18 {
+ position: relative;
+ left: 75%
+ }
+
+ .custom-theme .el-col-lg-19 {
+ width: 79.16667%
+ }
+
+ .custom-theme .el-col-lg-offset-19 {
+ margin-left: 79.16667%
+ }
+
+ .custom-theme .el-col-lg-pull-19 {
+ position: relative;
+ right: 79.16667%
+ }
+
+ .custom-theme .el-col-lg-push-19 {
+ position: relative;
+ left: 79.16667%
+ }
+
+ .custom-theme .el-col-lg-20 {
+ width: 83.33333%
+ }
+
+ .custom-theme .el-col-lg-offset-20 {
+ margin-left: 83.33333%
+ }
+
+ .custom-theme .el-col-lg-pull-20 {
+ position: relative;
+ right: 83.33333%
+ }
+
+ .custom-theme .el-col-lg-push-20 {
+ position: relative;
+ left: 83.33333%
+ }
+
+ .custom-theme .el-col-lg-21 {
+ width: 87.5%
+ }
+
+ .custom-theme .el-col-lg-offset-21 {
+ margin-left: 87.5%
+ }
+
+ .custom-theme .el-col-lg-pull-21 {
+ position: relative;
+ right: 87.5%
+ }
+
+ .custom-theme .el-col-lg-push-21 {
+ position: relative;
+ left: 87.5%
+ }
+
+ .custom-theme .el-col-lg-22 {
+ width: 91.66667%
+ }
+
+ .custom-theme .el-col-lg-offset-22 {
+ margin-left: 91.66667%
+ }
+
+ .custom-theme .el-col-lg-pull-22 {
+ position: relative;
+ right: 91.66667%
+ }
+
+ .custom-theme .el-col-lg-push-22 {
+ position: relative;
+ left: 91.66667%
+ }
+
+ .custom-theme .el-col-lg-23 {
+ width: 95.83333%
+ }
+
+ .custom-theme .el-col-lg-offset-23 {
+ margin-left: 95.83333%
+ }
+
+ .custom-theme .el-col-lg-pull-23 {
+ position: relative;
+ right: 95.83333%
+ }
+
+ .custom-theme .el-col-lg-push-23 {
+ position: relative;
+ left: 95.83333%
+ }
+
+ .custom-theme .el-col-lg-24 {
+ width: 100%
+ }
+
+ .custom-theme .el-col-lg-offset-24 {
+ margin-left: 100%
+ }
+
+ .custom-theme .el-col-lg-pull-24 {
+ position: relative;
+ right: 100%
+ }
+
+ .custom-theme .el-col-lg-push-24 {
+ position: relative;
+ left: 100%
+ }
+}
+
+@media only screen and (min-width: 1920px) {
+ .custom-theme .el-col-xl-0 {
+ display: none
+ }
+
+ .custom-theme .el-col-xl-1 {
+ width: 4.16667%
+ }
+
+ .custom-theme .el-col-xl-offset-1 {
+ margin-left: 4.16667%
+ }
+
+ .custom-theme .el-col-xl-pull-1 {
+ position: relative;
+ right: 4.16667%
+ }
+
+ .custom-theme .el-col-xl-push-1 {
+ position: relative;
+ left: 4.16667%
+ }
+
+ .custom-theme .el-col-xl-2 {
+ width: 8.33333%
+ }
+
+ .custom-theme .el-col-xl-offset-2 {
+ margin-left: 8.33333%
+ }
+
+ .custom-theme .el-col-xl-pull-2 {
+ position: relative;
+ right: 8.33333%
+ }
+
+ .custom-theme .el-col-xl-push-2 {
+ position: relative;
+ left: 8.33333%
+ }
+
+ .custom-theme .el-col-xl-3 {
+ width: 12.5%
+ }
+
+ .custom-theme .el-col-xl-offset-3 {
+ margin-left: 12.5%
+ }
+
+ .custom-theme .el-col-xl-pull-3 {
+ position: relative;
+ right: 12.5%
+ }
+
+ .custom-theme .el-col-xl-push-3 {
+ position: relative;
+ left: 12.5%
+ }
+
+ .custom-theme .el-col-xl-4 {
+ width: 16.66667%
+ }
+
+ .custom-theme .el-col-xl-offset-4 {
+ margin-left: 16.66667%
+ }
+
+ .custom-theme .el-col-xl-pull-4 {
+ position: relative;
+ right: 16.66667%
+ }
+
+ .custom-theme .el-col-xl-push-4 {
+ position: relative;
+ left: 16.66667%
+ }
+
+ .custom-theme .el-col-xl-5 {
+ width: 20.83333%
+ }
+
+ .custom-theme .el-col-xl-offset-5 {
+ margin-left: 20.83333%
+ }
+
+ .custom-theme .el-col-xl-pull-5 {
+ position: relative;
+ right: 20.83333%
+ }
+
+ .custom-theme .el-col-xl-push-5 {
+ position: relative;
+ left: 20.83333%
+ }
+
+ .custom-theme .el-col-xl-6 {
+ width: 25%
+ }
+
+ .custom-theme .el-col-xl-offset-6 {
+ margin-left: 25%
+ }
+
+ .custom-theme .el-col-xl-pull-6 {
+ position: relative;
+ right: 25%
+ }
+
+ .custom-theme .el-col-xl-push-6 {
+ position: relative;
+ left: 25%
+ }
+
+ .custom-theme .el-col-xl-7 {
+ width: 29.16667%
+ }
+
+ .custom-theme .el-col-xl-offset-7 {
+ margin-left: 29.16667%
+ }
+
+ .custom-theme .el-col-xl-pull-7 {
+ position: relative;
+ right: 29.16667%
+ }
+
+ .custom-theme .el-col-xl-push-7 {
+ position: relative;
+ left: 29.16667%
+ }
+
+ .custom-theme .el-col-xl-8 {
+ width: 33.33333%
+ }
+
+ .custom-theme .el-col-xl-offset-8 {
+ margin-left: 33.33333%
+ }
+
+ .custom-theme .el-col-xl-pull-8 {
+ position: relative;
+ right: 33.33333%
+ }
+
+ .custom-theme .el-col-xl-push-8 {
+ position: relative;
+ left: 33.33333%
+ }
+
+ .custom-theme .el-col-xl-9 {
+ width: 37.5%
+ }
+
+ .custom-theme .el-col-xl-offset-9 {
+ margin-left: 37.5%
+ }
+
+ .custom-theme .el-col-xl-pull-9 {
+ position: relative;
+ right: 37.5%
+ }
+
+ .custom-theme .el-col-xl-push-9 {
+ position: relative;
+ left: 37.5%
+ }
+
+ .custom-theme .el-col-xl-10 {
+ width: 41.66667%
+ }
+
+ .custom-theme .el-col-xl-offset-10 {
+ margin-left: 41.66667%
+ }
+
+ .custom-theme .el-col-xl-pull-10 {
+ position: relative;
+ right: 41.66667%
+ }
+
+ .custom-theme .el-col-xl-push-10 {
+ position: relative;
+ left: 41.66667%
+ }
+
+ .custom-theme .el-col-xl-11 {
+ width: 45.83333%
+ }
+
+ .custom-theme .el-col-xl-offset-11 {
+ margin-left: 45.83333%
+ }
+
+ .custom-theme .el-col-xl-pull-11 {
+ position: relative;
+ right: 45.83333%
+ }
+
+ .custom-theme .el-col-xl-push-11 {
+ position: relative;
+ left: 45.83333%
+ }
+
+ .custom-theme .el-col-xl-12 {
+ width: 50%
+ }
+
+ .custom-theme .el-col-xl-offset-12 {
+ margin-left: 50%
+ }
+
+ .custom-theme .el-col-xl-pull-12 {
+ position: relative;
+ right: 50%
+ }
+
+ .custom-theme .el-col-xl-push-12 {
+ position: relative;
+ left: 50%
+ }
+
+ .custom-theme .el-col-xl-13 {
+ width: 54.16667%
+ }
+
+ .custom-theme .el-col-xl-offset-13 {
+ margin-left: 54.16667%
+ }
+
+ .custom-theme .el-col-xl-pull-13 {
+ position: relative;
+ right: 54.16667%
+ }
+
+ .custom-theme .el-col-xl-push-13 {
+ position: relative;
+ left: 54.16667%
+ }
+
+ .custom-theme .el-col-xl-14 {
+ width: 58.33333%
+ }
+
+ .custom-theme .el-col-xl-offset-14 {
+ margin-left: 58.33333%
+ }
+
+ .custom-theme .el-col-xl-pull-14 {
+ position: relative;
+ right: 58.33333%
+ }
+
+ .custom-theme .el-col-xl-push-14 {
+ position: relative;
+ left: 58.33333%
+ }
+
+ .custom-theme .el-col-xl-15 {
+ width: 62.5%
+ }
+
+ .custom-theme .el-col-xl-offset-15 {
+ margin-left: 62.5%
+ }
+
+ .custom-theme .el-col-xl-pull-15 {
+ position: relative;
+ right: 62.5%
+ }
+
+ .custom-theme .el-col-xl-push-15 {
+ position: relative;
+ left: 62.5%
+ }
+
+ .custom-theme .el-col-xl-16 {
+ width: 66.66667%
+ }
+
+ .custom-theme .el-col-xl-offset-16 {
+ margin-left: 66.66667%
+ }
+
+ .custom-theme .el-col-xl-pull-16 {
+ position: relative;
+ right: 66.66667%
+ }
+
+ .custom-theme .el-col-xl-push-16 {
+ position: relative;
+ left: 66.66667%
+ }
+
+ .custom-theme .el-col-xl-17 {
+ width: 70.83333%
+ }
+
+ .custom-theme .el-col-xl-offset-17 {
+ margin-left: 70.83333%
+ }
+
+ .custom-theme .el-col-xl-pull-17 {
+ position: relative;
+ right: 70.83333%
+ }
+
+ .custom-theme .el-col-xl-push-17 {
+ position: relative;
+ left: 70.83333%
+ }
+
+ .custom-theme .el-col-xl-18 {
+ width: 75%
+ }
+
+ .custom-theme .el-col-xl-offset-18 {
+ margin-left: 75%
+ }
+
+ .custom-theme .el-col-xl-pull-18 {
+ position: relative;
+ right: 75%
+ }
+
+ .custom-theme .el-col-xl-push-18 {
+ position: relative;
+ left: 75%
+ }
+
+ .custom-theme .el-col-xl-19 {
+ width: 79.16667%
+ }
+
+ .custom-theme .el-col-xl-offset-19 {
+ margin-left: 79.16667%
+ }
+
+ .custom-theme .el-col-xl-pull-19 {
+ position: relative;
+ right: 79.16667%
+ }
+
+ .custom-theme .el-col-xl-push-19 {
+ position: relative;
+ left: 79.16667%
+ }
+
+ .custom-theme .el-col-xl-20 {
+ width: 83.33333%
+ }
+
+ .custom-theme .el-col-xl-offset-20 {
+ margin-left: 83.33333%
+ }
+
+ .custom-theme .el-col-xl-pull-20 {
+ position: relative;
+ right: 83.33333%
+ }
+
+ .custom-theme .el-col-xl-push-20 {
+ position: relative;
+ left: 83.33333%
+ }
+
+ .custom-theme .el-col-xl-21 {
+ width: 87.5%
+ }
+
+ .custom-theme .el-col-xl-offset-21 {
+ margin-left: 87.5%
+ }
+
+ .custom-theme .el-col-xl-pull-21 {
+ position: relative;
+ right: 87.5%
+ }
+
+ .custom-theme .el-col-xl-push-21 {
+ position: relative;
+ left: 87.5%
+ }
+
+ .custom-theme .el-col-xl-22 {
+ width: 91.66667%
+ }
+
+ .custom-theme .el-col-xl-offset-22 {
+ margin-left: 91.66667%
+ }
+
+ .custom-theme .el-col-xl-pull-22 {
+ position: relative;
+ right: 91.66667%
+ }
+
+ .custom-theme .el-col-xl-push-22 {
+ position: relative;
+ left: 91.66667%
+ }
+
+ .custom-theme .el-col-xl-23 {
+ width: 95.83333%
+ }
+
+ .custom-theme .el-col-xl-offset-23 {
+ margin-left: 95.83333%
+ }
+
+ .custom-theme .el-col-xl-pull-23 {
+ position: relative;
+ right: 95.83333%
+ }
+
+ .custom-theme .el-col-xl-push-23 {
+ position: relative;
+ left: 95.83333%
+ }
+
+ .custom-theme .el-col-xl-24 {
+ width: 100%
+ }
+
+ .custom-theme .el-col-xl-offset-24 {
+ margin-left: 100%
+ }
+
+ .custom-theme .el-col-xl-pull-24 {
+ position: relative;
+ right: 100%
+ }
+
+ .custom-theme .el-col-xl-push-24 {
+ position: relative;
+ left: 100%
+ }
+}
+
+.custom-theme .el-progress {
+ position: relative;
+ line-height: 1
+}
+
+.custom-theme .el-progress__text {
+ font-size: 14px;
+ color: #5a5e66;
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 10px;
+ line-height: 1
+}
+
+.custom-theme .el-progress__text i {
+ vertical-align: middle;
+ display: block
+}
+
+.custom-theme .el-progress--circle {
+ display: inline-block
+}
+
+.custom-theme .el-progress--circle .el-progress__text {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ width: 100%;
+ text-align: center;
+ margin: 0;
+ -webkit-transform: translate(0, -50%);
+ transform: translate(0, -50%)
+}
+
+.custom-theme .el-progress--circle .el-progress__text i {
+ vertical-align: middle;
+ display: inline-block
+}
+
+.custom-theme .el-progress--without-text .el-progress__text {
+ display: none
+}
+
+.custom-theme .el-progress--without-text .el-progress-bar {
+ padding-right: 0;
+ margin-right: 0;
+ display: block
+}
+
+.custom-theme .el-progress--text-inside .el-progress-bar {
+ padding-right: 0;
+ margin-right: 0
+}
+
+.custom-theme .el-progress.is-success .el-progress-bar__inner {
+ background-color: #409167
+}
+
+.custom-theme .el-progress.is-success .el-progress__text {
+ color: #409167
+}
+
+.custom-theme .el-progress.is-exception .el-progress-bar__inner {
+ background-color: #b3450e
+}
+
+.custom-theme .el-progress.is-exception .el-progress__text {
+ color: #b3450e
+}
+
+.custom-theme .el-progress-bar {
+ padding-right: 50px;
+ display: inline-block;
+ vertical-align: middle;
+ width: 100%;
+ margin-right: -55px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-progress-bar__outer {
+ height: 6px;
+ border-radius: 100px;
+ background-color: #e6ebf5;
+ overflow: hidden;
+ position: relative;
+ vertical-align: middle
+}
+
+.custom-theme .el-progress-bar__inner {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 100%;
+ background-color: #262729;
+ text-align: right;
+ border-radius: 100px;
+ line-height: 1;
+ white-space: nowrap
+}
+
+.custom-theme .el-progress-bar__inner::after {
+ display: inline-block;
+ content: "";
+ height: 100%;
+ vertical-align: middle
+}
+
+.custom-theme .el-progress-bar__innerText {
+ display: inline-block;
+ vertical-align: middle;
+ color: #fff;
+ font-size: 12px;
+ margin: 0 5px
+}
+
+@-webkit-keyframes progress {
+ 0% {
+ background-position: 0 0
+ }
+ 100% {
+ background-position: 32px 0
+ }
+}
+
+@keyframes progress {
+ 0% {
+ background-position: 0 0
+ }
+ 100% {
+ background-position: 32px 0
+ }
+}
+
+.custom-theme .el-upload {
+ display: inline-block;
+ text-align: center;
+ cursor: pointer
+}
+
+.custom-theme .el-upload__input {
+ display: none
+}
+
+.custom-theme .el-upload__tip {
+ font-size: 12px;
+ color: #5a5e66;
+ margin-top: 7px
+}
+
+.custom-theme .el-upload iframe {
+ position: absolute;
+ z-index: -1;
+ top: 0;
+ left: 0;
+ opacity: 0
+}
+
+.custom-theme .el-upload--picture-card {
+ background-color: #fbfdff;
+ border: 1px dashed #c0ccda;
+ border-radius: 6px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 148px;
+ height: 148px;
+ cursor: pointer;
+ line-height: 146px;
+ vertical-align: top
+}
+
+.custom-theme .el-upload--picture-card i {
+ font-size: 28px;
+ color: #8c939d
+}
+
+.custom-theme .el-upload--picture-card:hover {
+ border-color: #262729;
+ color: #262729
+}
+
+.custom-theme .el-upload-dragger {
+ background-color: #fff;
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 360px;
+ height: 180px;
+ text-align: center;
+ cursor: pointer;
+ position: relative;
+ overflow: hidden
+}
+
+.custom-theme .el-upload-dragger .el-icon-upload {
+ font-size: 67px;
+ color: #b4bccc;
+ margin: 40px 0 16px;
+ line-height: 50px
+}
+
+.custom-theme .el-upload-dragger + .el-upload__tip {
+ text-align: center
+}
+
+.custom-theme .el-upload-dragger ~ .el-upload__files {
+ border-top: 1px solid #d8dce5;
+ margin-top: 7px;
+ padding-top: 5px
+}
+
+.custom-theme .el-upload-dragger .el-upload__text {
+ color: #5a5e66;
+ font-size: 14px;
+ text-align: center
+}
+
+.custom-theme .el-upload-dragger .el-upload__text em {
+ color: #262729;
+ font-style: normal
+}
+
+.custom-theme .el-upload-dragger:hover {
+ border-color: #262729
+}
+
+.custom-theme .el-upload-dragger.is-dragover {
+ background-color: rgba(32, 159, 255, .06);
+ border: 2px dashed #262729
+}
+
+.custom-theme .el-upload-list {
+ margin: 0;
+ padding: 0;
+ list-style: none
+}
+
+.custom-theme .el-upload-list__item {
+ -webkit-transition: all .5s cubic-bezier(.55, 0, .1, 1);
+ transition: all .5s cubic-bezier(.55, 0, .1, 1);
+ font-size: 14px;
+ color: #5a5e66;
+ line-height: 1.8;
+ margin-top: 5px;
+ position: relative;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border-radius: 4px;
+ width: 100%
+}
+
+.custom-theme .el-upload-list__item .el-progress {
+ position: absolute;
+ top: 20px;
+ width: 100%
+}
+
+.custom-theme .el-upload-list__item .el-progress__text {
+ position: absolute;
+ right: 0;
+ top: -13px
+}
+
+.custom-theme .el-upload-list__item .el-progress-bar {
+ margin-right: 0;
+ padding-right: 0
+}
+
+.custom-theme .el-upload-list__item:first-child {
+ margin-top: 10px
+}
+
+.custom-theme .el-upload-list__item .el-icon-upload-success {
+ color: #409167
+}
+
+.custom-theme .el-upload-list__item .el-icon-close {
+ display: none;
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ cursor: pointer;
+ opacity: .75;
+ color: #5a5e66
+}
+
+.custom-theme .el-upload-list__item .el-icon-close:hover {
+ opacity: 1
+}
+
+.custom-theme .el-upload-list__item .el-icon-close-tip {
+ display: none;
+ position: absolute;
+ top: 5px;
+ right: 0;
+ cursor: pointer;
+ opacity: 1;
+ color: #262729;
+ -webkit-transform: translate(15%, 0);
+ transform: translate(15%, 0)
+}
+
+.custom-theme .el-upload-list__item:hover {
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-upload-list__item:hover .el-icon-close {
+ display: inline-block
+}
+
+.custom-theme .el-upload-list__item:hover .el-progress__text {
+ display: none
+}
+
+.custom-theme .el-upload-list__item.is-success .el-upload-list__item-status-label {
+ display: block
+}
+
+.custom-theme .el-upload-list__item.is-success .el-upload-list__item-name:focus, .custom-theme .el-upload-list__item.is-success .el-upload-list__item-name:hover {
+ color: #262729;
+ cursor: pointer
+}
+
+.custom-theme .el-upload-list__item.is-success:focus .el-icon-close-tip {
+ display: inline-block
+}
+
+.custom-theme .el-upload-list__item.is-success:active, .custom-theme .el-upload-list__item.is-success:focus:not(.focusing) {
+ outline-width: 0
+}
+
+.custom-theme .el-upload-list__item.is-success:active .el-icon-close-tip, .custom-theme .el-upload-list__item.is-success:focus:not(.focusing) .el-icon-close-tip {
+ display: none
+}
+
+.custom-theme .el-upload-list__item.is-success:focus .el-upload-list__item-status-label, .custom-theme .el-upload-list__item.is-success:hover .el-upload-list__item-status-label {
+ display: none
+}
+
+.custom-theme .el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label {
+ display: block
+}
+
+.custom-theme .el-upload-list__item-name {
+ color: #5a5e66;
+ display: block;
+ margin-right: 40px;
+ overflow: hidden;
+ padding-left: 4px;
+ text-overflow: ellipsis;
+ -webkit-transition: color .3s;
+ transition: color .3s;
+ white-space: nowrap
+}
+
+.custom-theme .el-upload-list__item-name [class^=el-icon] {
+ height: 100%;
+ margin-right: 7px;
+ color: #878d99;
+ line-height: inherit
+}
+
+.custom-theme .el-upload-list__item-status-label {
+ position: absolute;
+ right: 5px;
+ top: 0;
+ line-height: inherit;
+ display: none
+}
+
+.custom-theme .el-upload-list__item-delete {
+ position: absolute;
+ right: 10px;
+ top: 0;
+ font-size: 12px;
+ color: #5a5e66;
+ display: none
+}
+
+.custom-theme .el-upload-list__item-delete:hover {
+ color: #262729
+}
+
+.custom-theme .el-upload-list--picture-card {
+ margin: 0;
+ display: inline;
+ vertical-align: top
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item {
+ overflow: hidden;
+ background-color: #fff;
+ border: 1px solid #c0ccda;
+ border-radius: 6px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 148px;
+ height: 148px;
+ margin: 0 8px 8px 0;
+ display: inline-block
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item .el-icon-check, .custom-theme .el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check {
+ color: #fff
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item .el-icon-close {
+ display: none
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label {
+ display: none
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text {
+ display: block
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-name {
+ display: none
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-thumbnail {
+ width: 100%;
+ height: 100%
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-status-label {
+ position: absolute;
+ right: -15px;
+ top: -6px;
+ width: 40px;
+ height: 24px;
+ background: #13ce66;
+ text-align: center;
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+ -webkit-box-shadow: 0 0 1pc 1px rgba(0, 0, 0, .2);
+ box-shadow: 0 0 1pc 1px rgba(0, 0, 0, .2)
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-status-label i {
+ font-size: 12px;
+ margin-top: 11px;
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg)
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ left: 0;
+ top: 0;
+ cursor: default;
+ text-align: center;
+ color: #fff;
+ opacity: 0;
+ font-size: 20px;
+ background-color: rgba(0, 0, 0, .5);
+ -webkit-transition: opacity .3s;
+ transition: opacity .3s
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions::after {
+ display: inline-block;
+ content: "";
+ height: 100%;
+ vertical-align: middle
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions span {
+ display: none;
+ cursor: pointer
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions span + span {
+ margin-left: 15px
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete {
+ position: static;
+ font-size: inherit;
+ color: inherit
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions:hover {
+ opacity: 1
+}
+
+.custom-theme .el-upload-list--picture-card .el-upload-list__item-actions:hover span {
+ display: inline-block
+}
+
+.custom-theme .el-upload-list--picture-card .el-progress {
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translate(-50%, -50%);
+ transform: translate(-50%, -50%);
+ bottom: auto;
+ width: 126px
+}
+
+.custom-theme .el-upload-list--picture-card .el-progress .el-progress__text {
+ top: 50%
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item {
+ overflow: hidden;
+ background-color: #fff;
+ border: 1px solid #c0ccda;
+ border-radius: 6px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin-top: 10px;
+ padding: 10px 10px 10px 90px;
+ height: 92px
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item .el-icon-check, .custom-theme .el-upload-list--picture .el-upload-list__item .el-icon-circle-check {
+ color: #fff
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label {
+ background: 0 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ top: -2px;
+ right: -12px
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item:hover .el-progress__text {
+ display: block
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name {
+ line-height: 70px;
+ margin-top: 0
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i {
+ display: none
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item-thumbnail {
+ vertical-align: middle;
+ display: inline-block;
+ width: 70px;
+ height: 70px;
+ float: left;
+ position: relative;
+ z-index: 1;
+ margin-left: -80px
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item-name {
+ display: block;
+ margin-top: 20px
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item-name i {
+ font-size: 70px;
+ line-height: 1;
+ position: absolute;
+ left: 9px;
+ top: 10px
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item-status-label {
+ position: absolute;
+ right: -17px;
+ top: -7px;
+ width: 46px;
+ height: 26px;
+ background: #13ce66;
+ text-align: center;
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+ -webkit-box-shadow: 0 1px 1px #ccc;
+ box-shadow: 0 1px 1px #ccc
+}
+
+.custom-theme .el-upload-list--picture .el-upload-list__item-status-label i {
+ font-size: 12px;
+ margin-top: 12px;
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg)
+}
+
+.custom-theme .el-upload-list--picture .el-progress {
+ position: relative;
+ top: -7px
+}
+
+.custom-theme .el-upload-cover {
+ position: absolute;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ z-index: 10;
+ cursor: default
+}
+
+.custom-theme .el-upload-cover::after {
+ display: inline-block;
+ content: "";
+ height: 100%;
+ vertical-align: middle
+}
+
+.custom-theme .el-upload-cover img {
+ display: block;
+ width: 100%;
+ height: 100%
+}
+
+.custom-theme .el-upload-cover__label {
+ position: absolute;
+ right: -15px;
+ top: -6px;
+ width: 40px;
+ height: 24px;
+ background: #13ce66;
+ text-align: center;
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+ -webkit-box-shadow: 0 0 1pc 1px rgba(0, 0, 0, .2);
+ box-shadow: 0 0 1pc 1px rgba(0, 0, 0, .2)
+}
+
+.custom-theme .el-upload-cover__label i {
+ font-size: 12px;
+ margin-top: 11px;
+ -webkit-transform: rotate(-45deg);
+ transform: rotate(-45deg);
+ color: #fff
+}
+
+.custom-theme .el-upload-cover__progress {
+ display: inline-block;
+ vertical-align: middle;
+ position: static;
+ width: 243px
+}
+
+.custom-theme .el-upload-cover__progress + .el-upload__inner {
+ opacity: 0
+}
+
+.custom-theme .el-upload-cover__content {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%
+}
+
+.custom-theme .el-upload-cover__interact {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: rgba(0, 0, 0, .72);
+ text-align: center
+}
+
+.custom-theme .el-upload-cover__interact .btn {
+ display: inline-block;
+ color: #fff;
+ font-size: 14px;
+ cursor: pointer;
+ vertical-align: middle;
+ -webkit-transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ transition: transform .3s cubic-bezier(.23, 1, .32, 1) .1s, opacity .3s cubic-bezier(.23, 1, .32, 1) .1s, -webkit-transform .3s cubic-bezier(.23, 1, .32, 1) .1s;
+ margin-top: 60px
+}
+
+.custom-theme .el-upload-cover__interact .btn i {
+ margin-top: 0
+}
+
+.custom-theme .el-upload-cover__interact .btn span {
+ opacity: 0;
+ -webkit-transition: opacity .15s linear;
+ transition: opacity .15s linear
+}
+
+.custom-theme .el-upload-cover__interact .btn:not(:first-child) {
+ margin-left: 35px
+}
+
+.custom-theme .el-upload-cover__interact .btn:hover {
+ -webkit-transform: translateY(-13px);
+ transform: translateY(-13px)
+}
+
+.custom-theme .el-upload-cover__interact .btn:hover span {
+ opacity: 1
+}
+
+.custom-theme .el-upload-cover__interact .btn i {
+ color: #fff;
+ display: block;
+ font-size: 24px;
+ line-height: inherit;
+ margin: 0 auto 5px
+}
+
+.custom-theme .el-upload-cover__title {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ background-color: #fff;
+ height: 36px;
+ width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ font-weight: 400;
+ text-align: left;
+ padding: 0 10px;
+ margin: 0;
+ line-height: 36px;
+ font-size: 14px;
+ color: #2d2f33
+}
+
+.custom-theme .el-upload-cover + .el-upload__inner {
+ opacity: 0;
+ position: relative;
+ z-index: 1
+}
+
+.custom-theme .el-progress {
+ position: relative;
+ line-height: 1
+}
+
+.custom-theme .el-progress__text {
+ font-size: 14px;
+ color: #5a5e66;
+ display: inline-block;
+ vertical-align: middle;
+ margin-left: 10px;
+ line-height: 1
+}
+
+.custom-theme .el-progress__text i {
+ vertical-align: middle;
+ display: block
+}
+
+.custom-theme .el-progress--circle {
+ display: inline-block
+}
+
+.custom-theme .el-progress--circle .el-progress__text {
+ position: absolute;
+ top: 50%;
+ left: 0;
+ width: 100%;
+ text-align: center;
+ margin: 0;
+ -webkit-transform: translate(0, -50%);
+ transform: translate(0, -50%)
+}
+
+.custom-theme .el-progress--circle .el-progress__text i {
+ vertical-align: middle;
+ display: inline-block
+}
+
+.custom-theme .el-progress--without-text .el-progress__text {
+ display: none
+}
+
+.custom-theme .el-progress--without-text .el-progress-bar {
+ padding-right: 0;
+ margin-right: 0;
+ display: block
+}
+
+.custom-theme .el-progress--text-inside .el-progress-bar {
+ padding-right: 0;
+ margin-right: 0
+}
+
+.custom-theme .el-progress.is-success .el-progress-bar__inner {
+ background-color: #409167
+}
+
+.custom-theme .el-progress.is-success .el-progress__text {
+ color: #409167
+}
+
+.custom-theme .el-progress.is-exception .el-progress-bar__inner {
+ background-color: #b3450e
+}
+
+.custom-theme .el-progress.is-exception .el-progress__text {
+ color: #b3450e
+}
+
+.custom-theme .el-progress-bar {
+ padding-right: 50px;
+ display: inline-block;
+ vertical-align: middle;
+ width: 100%;
+ margin-right: -55px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-progress-bar__outer {
+ height: 6px;
+ border-radius: 100px;
+ background-color: #e6ebf5;
+ overflow: hidden;
+ position: relative;
+ vertical-align: middle
+}
+
+.custom-theme .el-progress-bar__inner {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 100%;
+ background-color: #262729;
+ text-align: right;
+ border-radius: 100px;
+ line-height: 1;
+ white-space: nowrap
+}
+
+.custom-theme .el-progress-bar__inner::after {
+ display: inline-block;
+ content: "";
+ height: 100%;
+ vertical-align: middle
+}
+
+.custom-theme .el-progress-bar__innerText {
+ display: inline-block;
+ vertical-align: middle;
+ color: #fff;
+ font-size: 12px;
+ margin: 0 5px
+}
+
+@keyframes progress {
+ 0% {
+ background-position: 0 0
+ }
+ 100% {
+ background-position: 32px 0
+ }
+}
+
+.custom-theme .el-time-spinner {
+ width: 100%;
+ white-space: nowrap
+}
+
+.custom-theme .el-spinner {
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-spinner-inner {
+ -webkit-animation: rotate 2s linear infinite;
+ animation: rotate 2s linear infinite;
+ width: 50px;
+ height: 50px
+}
+
+.custom-theme .el-spinner-inner .path {
+ stroke: #ececec;
+ stroke-linecap: round;
+ -webkit-animation: dash 1.5s ease-in-out infinite;
+ animation: dash 1.5s ease-in-out infinite
+}
+
+@-webkit-keyframes rotate {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg)
+ }
+}
+
+@keyframes rotate {
+ 100% {
+ -webkit-transform: rotate(360deg);
+ transform: rotate(360deg)
+ }
+}
+
+@-webkit-keyframes dash {
+ 0% {
+ stroke-dasharray: 1, 150;
+ stroke-dashoffset: 0
+ }
+ 50% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -35
+ }
+ 100% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -124
+ }
+}
+
+@keyframes dash {
+ 0% {
+ stroke-dasharray: 1, 150;
+ stroke-dashoffset: 0
+ }
+ 50% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -35
+ }
+ 100% {
+ stroke-dasharray: 90, 150;
+ stroke-dashoffset: -124
+ }
+}
+
+.custom-theme .el-message {
+ min-width: 380px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border-radius: 4px;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #e6ebf5;
+ position: fixed;
+ left: 50%;
+ top: 20px;
+ -webkit-transform: translateX(-50%);
+ transform: translateX(-50%);
+ background-color: #edf2fc;
+ -webkit-transition: opacity .3s, -webkit-transform .4s;
+ transition: opacity .3s, -webkit-transform .4s;
+ transition: opacity .3s, transform .4s;
+ transition: opacity .3s, transform .4s, -webkit-transform .4s;
+ overflow: hidden;
+ padding: 15px 15px 15px 20px;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center
+}
+
+.custom-theme .el-message.is-center {
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center
+}
+
+.custom-theme .el-message p {
+ margin: 0
+}
+
+.custom-theme .el-message--info .el-message__content {
+ color: #0a76a4
+}
+
+.custom-theme .el-message--success {
+ background-color: #ecf4f0;
+ border-color: #d9e9e1
+}
+
+.custom-theme .el-message--success .el-message__content {
+ color: #409167
+}
+
+.custom-theme .el-message--warning {
+ background-color: #f5f6e6;
+ border-color: #ebedce
+}
+
+.custom-theme .el-message--warning .el-message__content {
+ color: #9da408
+}
+
+.custom-theme .el-message--error {
+ background-color: #f7ece7;
+ border-color: #f0dacf
+}
+
+.custom-theme .el-message--error .el-message__content {
+ color: #b3450e
+}
+
+.custom-theme .el-message__icon {
+ margin-right: 10px
+}
+
+.custom-theme .el-message__content {
+ padding: 0;
+ font-size: 14px;
+ line-height: 1
+}
+
+.custom-theme .el-message__content:focus {
+ outline-width: 0
+}
+
+.custom-theme .el-message__closeBtn {
+ position: absolute;
+ top: 50%;
+ right: 15px;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+ cursor: pointer;
+ color: #b4bccc;
+ font-size: 16px
+}
+
+.custom-theme .el-message__closeBtn:focus {
+ outline-width: 0
+}
+
+.custom-theme .el-message__closeBtn:hover {
+ color: #878d99
+}
+
+.custom-theme .el-message .el-icon-success {
+ color: #409167
+}
+
+.custom-theme .el-message .el-icon-error {
+ color: #b3450e
+}
+
+.custom-theme .el-message .el-icon-info {
+ color: #0a76a4
+}
+
+.custom-theme .el-message .el-icon-warning {
+ color: #9da408
+}
+
+.custom-theme .el-message-fade-enter, .custom-theme .el-message-fade-leave-active {
+ opacity: 0;
+ -webkit-transform: translate(-50%, -100%);
+ transform: translate(-50%, -100%)
+}
+
+.custom-theme .el-badge {
+ position: relative;
+ vertical-align: middle;
+ display: inline-block
+}
+
+.custom-theme .el-badge__content {
+ background-color: #b3450e;
+ border-radius: 10px;
+ color: #fff;
+ display: inline-block;
+ font-size: 12px;
+ height: 18px;
+ line-height: 18px;
+ padding: 0 6px;
+ text-align: center;
+ white-space: nowrap;
+ border: 1px solid #fff
+}
+
+.custom-theme .el-badge__content.is-fixed {
+ position: absolute;
+ top: 0;
+ right: 10px;
+ -webkit-transform: translateY(-50%) translateX(100%);
+ transform: translateY(-50%) translateX(100%)
+}
+
+.custom-theme .el-badge__content.is-fixed.is-dot {
+ right: 5px
+}
+
+.custom-theme .el-badge__content.is-dot {
+ height: 8px;
+ width: 8px;
+ padding: 0;
+ right: 0;
+ border-radius: 50%
+}
+
+.custom-theme .el-card {
+ border-radius: 4px;
+ border: 1px solid #e6ebf5;
+ background-color: #fff;
+ overflow: hidden;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ color: #2d2f33
+}
+
+.custom-theme .el-card__header {
+ padding: 18px 20px;
+ border-bottom: 1px solid #e6ebf5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-card__body {
+ padding: 20px
+}
+
+.custom-theme .el-rate {
+ height: 20px;
+ line-height: 1
+}
+
+.custom-theme .el-rate:active, .custom-theme .el-rate:focus {
+ outline-width: 0
+}
+
+.custom-theme .el-rate__item {
+ display: inline-block;
+ position: relative;
+ font-size: 0;
+ vertical-align: middle
+}
+
+.custom-theme .el-rate__icon {
+ position: relative;
+ display: inline-block;
+ font-size: 18px;
+ margin-right: 6px;
+ color: #b4bccc;
+ -webkit-transition: .3s;
+ transition: .3s
+}
+
+.custom-theme .el-rate__icon.hover {
+ -webkit-transform: scale(1.15);
+ transform: scale(1.15)
+}
+
+.custom-theme .el-rate__icon .path2 {
+ position: absolute;
+ left: 0;
+ top: 0
+}
+
+.custom-theme .el-rate__decimal {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: inline-block;
+ overflow: hidden
+}
+
+.custom-theme .el-rate__text {
+ font-size: 14px;
+ vertical-align: middle
+}
+
+.custom-theme .el-steps {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex
+}
+
+.custom-theme .el-steps--simple {
+ padding: 13px 8%;
+ border-radius: 4px;
+ background: #f5f7fa
+}
+
+.custom-theme .el-steps--horizontal {
+ white-space: nowrap
+}
+
+.custom-theme .el-steps--vertical {
+ height: 100%;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-flow: column;
+ flex-flow: column
+}
+
+.custom-theme .el-step {
+ position: relative;
+ -ms-flex-negative: 1;
+ flex-shrink: 1
+}
+
+.custom-theme .el-step:last-of-type .el-step__line {
+ display: none
+}
+
+.custom-theme .el-step:last-of-type.is-flex {
+ -ms-flex-preferred-size: auto !important;
+ flex-basis: auto !important;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+ -webkit-box-flex: 0;
+ -ms-flex-positive: 0;
+ flex-grow: 0
+}
+
+.custom-theme .el-step:last-of-type .el-step__description, .custom-theme .el-step:last-of-type .el-step__main {
+ padding-right: 0
+}
+
+.custom-theme .el-step__head {
+ position: relative;
+ width: 100%
+}
+
+.custom-theme .el-step__head.is-process {
+ color: #2d2f33;
+ border-color: #2d2f33
+}
+
+.custom-theme .el-step__head.is-wait {
+ color: #b4bccc;
+ border-color: #b4bccc
+}
+
+.custom-theme .el-step__head.is-success {
+ color: #409167;
+ border-color: #409167
+}
+
+.custom-theme .el-step__head.is-error {
+ color: #b3450e;
+ border-color: #b3450e
+}
+
+.custom-theme .el-step__head.is-finish {
+ color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-step__icon {
+ position: relative;
+ z-index: 1;
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ width: 24px;
+ height: 24px;
+ font-size: 14px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ background: #fff;
+ -webkit-transition: .15s ease-out;
+ transition: .15s ease-out
+}
+
+.custom-theme .el-step__icon.is-text {
+ border-radius: 50%;
+ border: 2px solid;
+ border-color: inherit
+}
+
+.custom-theme .el-step__icon.is-icon {
+ width: 40px
+}
+
+.custom-theme .el-step__icon-inner {
+ display: inline-block;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ text-align: center;
+ font-weight: 700;
+ line-height: 1;
+ color: inherit
+}
+
+.custom-theme .el-step__icon-inner[class*=el-icon]:not(.is-status) {
+ font-size: 25px;
+ font-weight: 400
+}
+
+.custom-theme .el-step__icon-inner.is-status {
+ -webkit-transform: translateY(1px);
+ transform: translateY(1px)
+}
+
+.custom-theme .el-step__line {
+ position: absolute;
+ border-color: inherit;
+ background-color: #b4bccc
+}
+
+.custom-theme .el-step__line-inner {
+ display: block;
+ border-width: 1px;
+ border-style: solid;
+ border-color: inherit;
+ -webkit-transition: .15s ease-out;
+ transition: .15s ease-out;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 0;
+ height: 0
+}
+
+.custom-theme .el-step__main {
+ white-space: normal;
+ text-align: left
+}
+
+.custom-theme .el-step__title {
+ font-size: 16px;
+ line-height: 38px
+}
+
+.custom-theme .el-step__title.is-process {
+ font-weight: 700;
+ color: #2d2f33
+}
+
+.custom-theme .el-step__title.is-wait {
+ color: #b4bccc
+}
+
+.custom-theme .el-step__title.is-success {
+ color: #409167
+}
+
+.custom-theme .el-step__title.is-error {
+ color: #b3450e
+}
+
+.custom-theme .el-step__title.is-finish {
+ color: #262729
+}
+
+.custom-theme .el-step__description {
+ padding-right: 10%;
+ margin-top: -5px;
+ font-size: 12px;
+ line-height: 20px;
+ font-weight: 400
+}
+
+.custom-theme .el-step__description.is-process {
+ color: #2d2f33
+}
+
+.custom-theme .el-step__description.is-wait {
+ color: #b4bccc
+}
+
+.custom-theme .el-step__description.is-success {
+ color: #409167
+}
+
+.custom-theme .el-step__description.is-error {
+ color: #b3450e
+}
+
+.custom-theme .el-step__description.is-finish {
+ color: #262729
+}
+
+.custom-theme .el-step.is-horizontal {
+ display: inline-block
+}
+
+.custom-theme .el-step.is-horizontal .el-step__line {
+ height: 2px;
+ top: 11px;
+ left: 0;
+ right: 0
+}
+
+.custom-theme .el-step.is-vertical {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex
+}
+
+.custom-theme .el-step.is-vertical .el-step__head {
+ -webkit-box-flex: 0;
+ -ms-flex-positive: 0;
+ flex-grow: 0;
+ width: 24px
+}
+
+.custom-theme .el-step.is-vertical .el-step__main {
+ padding-left: 10px;
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1
+}
+
+.custom-theme .el-step.is-vertical .el-step__title {
+ line-height: 24px;
+ padding-bottom: 8px
+}
+
+.custom-theme .el-step.is-vertical .el-step__line {
+ width: 2px;
+ top: 0;
+ bottom: 0;
+ left: 11px
+}
+
+.custom-theme .el-step.is-vertical .el-step__icon.is-icon {
+ width: 24px
+}
+
+.custom-theme .el-step.is-center .el-step__head {
+ text-align: center
+}
+
+.custom-theme .el-step.is-center .el-step__main {
+ text-align: center
+}
+
+.custom-theme .el-step.is-center .el-step__description {
+ padding-left: 20%;
+ padding-right: 20%
+}
+
+.custom-theme .el-step.is-center .el-step__line {
+ left: 50%;
+ right: -50%
+}
+
+.custom-theme .el-step.is-simple {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center
+}
+
+.custom-theme .el-step.is-simple .el-step__head {
+ width: auto;
+ font-size: 0;
+ padding-right: 10px
+}
+
+.custom-theme .el-step.is-simple .el-step__icon {
+ background: 0 0;
+ width: 16px;
+ height: 16px;
+ font-size: 12px
+}
+
+.custom-theme .el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status) {
+ font-size: 18px
+}
+
+.custom-theme .el-step.is-simple .el-step__icon-inner.is-status {
+ -webkit-transform: scale(.8) translateY(1px);
+ transform: scale(.8) translateY(1px)
+}
+
+.custom-theme .el-step.is-simple .el-step__main {
+ position: relative;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1
+}
+
+.custom-theme .el-step.is-simple .el-step__title {
+ font-size: 16px;
+ line-height: 20px
+}
+
+.custom-theme .el-step.is-simple:not(:last-of-type) .el-step__title {
+ max-width: 50%;
+ word-break: break-all
+}
+
+.custom-theme .el-step.is-simple .el-step__arrow {
+ -webkit-box-flex: 1;
+ -ms-flex-positive: 1;
+ flex-grow: 1;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center
+}
+
+.custom-theme .el-step.is-simple .el-step__arrow::after, .custom-theme .el-step.is-simple .el-step__arrow::before {
+ content: '';
+ display: inline-block;
+ position: absolute;
+ height: 15px;
+ width: 1px;
+ background: #b4bccc
+}
+
+.custom-theme .el-step.is-simple .el-step__arrow::before {
+ -webkit-transform: rotate(-45deg) translateY(-4px);
+ transform: rotate(-45deg) translateY(-4px);
+ -webkit-transform-origin: 0 0;
+ transform-origin: 0 0
+}
+
+.custom-theme .el-step.is-simple .el-step__arrow::after {
+ -webkit-transform: rotate(45deg) translateY(4px);
+ transform: rotate(45deg) translateY(4px);
+ -webkit-transform-origin: 100% 100%;
+ transform-origin: 100% 100%
+}
+
+.custom-theme .el-step.is-simple:last-of-type .el-step__arrow {
+ display: none
+}
+
+.custom-theme .el-carousel {
+ overflow-x: hidden;
+ position: relative
+}
+
+.custom-theme .el-carousel__container {
+ position: relative;
+ height: 300px
+}
+
+.custom-theme .el-carousel__arrow {
+ border: none;
+ outline: 0;
+ padding: 0;
+ margin: 0;
+ height: 36px;
+ width: 36px;
+ cursor: pointer;
+ -webkit-transition: .3s;
+ transition: .3s;
+ border-radius: 50%;
+ background-color: rgba(31, 45, 61, .11);
+ color: #fff;
+ position: absolute;
+ top: 50%;
+ z-index: 10;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+ text-align: center;
+ font-size: 12px
+}
+
+.custom-theme .el-carousel__arrow--left {
+ left: 16px
+}
+
+.custom-theme .el-carousel__arrow--right {
+ right: 16px
+}
+
+.custom-theme .el-carousel__arrow:hover {
+ background-color: rgba(31, 45, 61, .23)
+}
+
+.custom-theme .el-carousel__arrow i {
+ cursor: pointer
+}
+
+.custom-theme .el-carousel__indicators {
+ position: absolute;
+ list-style: none;
+ bottom: 0;
+ left: 50%;
+ -webkit-transform: translateX(-50%);
+ transform: translateX(-50%);
+ margin: 0;
+ padding: 0;
+ z-index: 2
+}
+
+.custom-theme .el-carousel__indicators--outside {
+ bottom: 26px;
+ text-align: center;
+ position: static;
+ -webkit-transform: none;
+ transform: none
+}
+
+.custom-theme .el-carousel__indicators--outside .el-carousel__indicator:hover button {
+ opacity: .64
+}
+
+.custom-theme .el-carousel__indicators--outside button {
+ background-color: #b4bccc;
+ opacity: .24
+}
+
+.custom-theme .el-carousel__indicators--labels {
+ left: 0;
+ right: 0;
+ -webkit-transform: none;
+ transform: none;
+ text-align: center
+}
+
+.custom-theme .el-carousel__indicators--labels .el-carousel__button {
+ height: auto;
+ width: auto;
+ padding: 2px 18px;
+ font-size: 12px
+}
+
+.custom-theme .el-carousel__indicators--labels .el-carousel__indicator {
+ padding: 6px 4px
+}
+
+.custom-theme .el-carousel__indicator {
+ display: inline-block;
+ background-color: transparent;
+ padding: 12px 4px;
+ cursor: pointer
+}
+
+.custom-theme .el-carousel__indicator:hover button {
+ opacity: .72
+}
+
+.custom-theme .el-carousel__indicator.is-active button {
+ opacity: 1
+}
+
+.custom-theme .el-carousel__button {
+ display: block;
+ opacity: .48;
+ width: 30px;
+ height: 2px;
+ background-color: #fff;
+ border: none;
+ outline: 0;
+ padding: 0;
+ margin: 0;
+ cursor: pointer;
+ -webkit-transition: .3s;
+ transition: .3s
+}
+
+.custom-theme .carousel-arrow-left-enter, .custom-theme .carousel-arrow-left-leave-active {
+ -webkit-transform: translateY(-50%) translateX(-10px);
+ transform: translateY(-50%) translateX(-10px);
+ opacity: 0
+}
+
+.custom-theme .carousel-arrow-right-enter, .custom-theme .carousel-arrow-right-leave-active {
+ -webkit-transform: translateY(-50%) translateX(10px);
+ transform: translateY(-50%) translateX(10px);
+ opacity: 0
+}
+
+.custom-theme .el-scrollbar {
+ overflow: hidden;
+ position: relative
+}
+
+.custom-theme .el-scrollbar:active > .el-scrollbar__bar, .custom-theme .el-scrollbar:focus > .el-scrollbar__bar, .custom-theme .el-scrollbar:hover > .el-scrollbar__bar {
+ opacity: 1;
+ -webkit-transition: opacity 340ms ease-out;
+ transition: opacity 340ms ease-out
+}
+
+.custom-theme .el-scrollbar__wrap {
+ overflow: scroll;
+ height: 100%
+}
+
+.custom-theme .el-scrollbar__wrap--hidden-default::-webkit-scrollbar {
+ width: 0;
+ height: 0
+}
+
+.custom-theme .el-scrollbar__thumb {
+ position: relative;
+ display: block;
+ width: 0;
+ height: 0;
+ cursor: pointer;
+ border-radius: inherit;
+ background-color: rgba(135, 141, 153, .3);
+ -webkit-transition: .3s background-color;
+ transition: .3s background-color
+}
+
+.custom-theme .el-scrollbar__thumb:hover {
+ background-color: rgba(135, 141, 153, .5)
+}
+
+.custom-theme .el-scrollbar__bar {
+ position: absolute;
+ right: 2px;
+ bottom: 2px;
+ z-index: 1;
+ border-radius: 4px;
+ opacity: 0;
+ -webkit-transition: opacity 120ms ease-out;
+ transition: opacity 120ms ease-out
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical {
+ width: 6px;
+ top: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-vertical > div {
+ width: 100%
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal {
+ height: 6px;
+ left: 2px
+}
+
+.custom-theme .el-scrollbar__bar.is-horizontal > div {
+ height: 100%
+}
+
+.custom-theme .el-carousel__item {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ display: inline-block;
+ overflow: hidden;
+ z-index: 0
+}
+
+.custom-theme .el-carousel__item.is-active {
+ z-index: 2
+}
+
+.custom-theme .el-carousel__item.is-animating {
+ -webkit-transition: -webkit-transform .4s ease-in-out;
+ transition: -webkit-transform .4s ease-in-out;
+ transition: transform .4s ease-in-out;
+ transition: transform .4s ease-in-out, -webkit-transform .4s ease-in-out
+}
+
+.custom-theme .el-carousel__item--card {
+ width: 50%;
+ -webkit-transition: -webkit-transform .4s ease-in-out;
+ transition: -webkit-transform .4s ease-in-out;
+ transition: transform .4s ease-in-out;
+ transition: transform .4s ease-in-out, -webkit-transform .4s ease-in-out
+}
+
+.custom-theme .el-carousel__item--card.is-in-stage {
+ cursor: pointer;
+ z-index: 1
+}
+
+.custom-theme .el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask, .custom-theme .el-carousel__item--card.is-in-stage:hover .el-carousel__mask {
+ opacity: .12
+}
+
+.custom-theme .el-carousel__item--card.is-active {
+ z-index: 2
+}
+
+.custom-theme .el-carousel__mask {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ background-color: #fff;
+ opacity: .24;
+ -webkit-transition: .2s;
+ transition: .2s
+}
+
+.custom-theme .el-collapse {
+ border-top: 1px solid #e6ebf5;
+ border-bottom: 1px solid #e6ebf5
+}
+
+.custom-theme .el-collapse-item__header {
+ height: 48px;
+ line-height: 48px;
+ background-color: #fff;
+ color: #2d2f33;
+ cursor: pointer;
+ border-bottom: 1px solid #e6ebf5;
+ font-size: 13px;
+ font-weight: 500;
+ -webkit-transition: border-bottom-color .3s;
+ transition: border-bottom-color .3s
+}
+
+.custom-theme .el-collapse-item__header:active, .custom-theme .el-collapse-item__header:focus:not(.focusing) {
+ outline-width: 0
+}
+
+.custom-theme .el-collapse-item__arrow {
+ margin-right: 8px;
+ -webkit-transition: -webkit-transform .3s;
+ transition: -webkit-transform .3s;
+ transition: transform .3s;
+ transition: transform .3s, -webkit-transform .3s;
+ float: right;
+ line-height: 48px;
+ font-weight: 300
+}
+
+.custom-theme .el-collapse-item__wrap {
+ will-change: height;
+ background-color: #fff;
+ overflow: hidden;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border-bottom: 1px solid #e6ebf5
+}
+
+.custom-theme .el-collapse-item__content {
+ padding-bottom: 25px;
+ font-size: 13px;
+ color: #2d2f33;
+ line-height: 1.769230769230769
+}
+
+.custom-theme .el-collapse-item.is-active .el-collapse-item__header {
+ border-bottom-color: transparent
+}
+
+.custom-theme .el-collapse-item.is-active .el-collapse-item__header .el-collapse-item__arrow {
+ -webkit-transform: rotate(90deg);
+ transform: rotate(90deg)
+}
+
+.custom-theme .el-collapse-item:last-child {
+ margin-bottom: -1px
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-popper .popper__arrow, .custom-theme .el-popper .popper__arrow::after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid
+}
+
+.custom-theme .el-popper .popper__arrow {
+ border-width: 6px;
+ -webkit-filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03));
+ filter: drop-shadow(0 2px 12px rgba(0, 0, 0, .03))
+}
+
+.custom-theme .el-popper .popper__arrow::after {
+ content: " ";
+ border-width: 6px
+}
+
+.custom-theme .el-popper[x-placement^=top] {
+ margin-bottom: 12px
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow {
+ bottom: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-color: #e6ebf5;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=top] .popper__arrow::after {
+ bottom: 1px;
+ margin-left: -6px;
+ border-top-color: #fff;
+ border-bottom-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=bottom] {
+ margin-top: 12px
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow {
+ top: -6px;
+ left: 50%;
+ margin-right: 3px;
+ border-top-width: 0;
+ border-bottom-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=bottom] .popper__arrow::after {
+ top: 1px;
+ margin-left: -6px;
+ border-top-width: 0;
+ border-bottom-color: #fff
+}
+
+.custom-theme .el-popper[x-placement^=right] {
+ margin-left: 12px
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow {
+ top: 50%;
+ left: -6px;
+ margin-bottom: 3px;
+ border-right-color: #e6ebf5;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=right] .popper__arrow::after {
+ bottom: -6px;
+ left: 1px;
+ border-right-color: #fff;
+ border-left-width: 0
+}
+
+.custom-theme .el-popper[x-placement^=left] {
+ margin-right: 12px
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow {
+ top: 50%;
+ right: -6px;
+ margin-bottom: 3px;
+ border-right-width: 0;
+ border-left-color: #e6ebf5
+}
+
+.custom-theme .el-popper[x-placement^=left] .popper__arrow::after {
+ right: 1px;
+ bottom: -6px;
+ margin-left: -6px;
+ border-right-width: 0;
+ border-left-color: #fff
+}
+
+.custom-theme .el-cascader {
+ display: inline-block;
+ position: relative;
+ font-size: 14px;
+ line-height: 40px
+}
+
+.custom-theme .el-cascader .el-input, .custom-theme .el-cascader .el-input__inner {
+ cursor: pointer
+}
+
+.custom-theme .el-cascader .el-input__icon {
+ -webkit-transition: none;
+ transition: none
+}
+
+.custom-theme .el-cascader .el-icon-arrow-down {
+ -webkit-transition: -webkit-transform .3s;
+ transition: -webkit-transform .3s;
+ transition: transform .3s;
+ transition: transform .3s, -webkit-transform .3s;
+ font-size: 14px
+}
+
+.custom-theme .el-cascader .el-icon-arrow-down.is-reverse {
+ -webkit-transform: rotateZ(180deg);
+ transform: rotateZ(180deg)
+}
+
+.custom-theme .el-cascader .el-icon-circle-close {
+ z-index: 2;
+ -webkit-transition: color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-cascader .el-icon-circle-close:hover {
+ color: #878d99
+}
+
+.custom-theme .el-cascader__clearIcon {
+ z-index: 2;
+ position: relative
+}
+
+.custom-theme .el-cascader__label {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 100%;
+ padding: 0 25px 0 15px;
+ color: #5a5e66;
+ width: 100%;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer;
+ text-align: left;
+ font-size: inherit
+}
+
+.custom-theme .el-cascader__label span {
+ color: #000
+}
+
+.custom-theme .el-cascader--medium {
+ font-size: 14px;
+ line-height: 36px
+}
+
+.custom-theme .el-cascader--small {
+ font-size: 13px;
+ line-height: 32px
+}
+
+.custom-theme .el-cascader--mini {
+ font-size: 12px;
+ line-height: 28px
+}
+
+.custom-theme .el-cascader.is-disabled .el-cascader__label {
+ z-index: 2;
+ color: #b4bccc
+}
+
+.custom-theme .el-cascader-menus {
+ white-space: nowrap;
+ background: #fff;
+ position: absolute;
+ margin: 5px 0;
+ z-index: 2;
+ border: solid 1px #dfe4ed;
+ border-radius: 2px;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1)
+}
+
+.custom-theme .el-cascader-menus .popper__arrow {
+ -webkit-transform: translateX(-400%);
+ transform: translateX(-400%)
+}
+
+.custom-theme .el-cascader-menu {
+ display: inline-block;
+ vertical-align: top;
+ height: 204px;
+ overflow: auto;
+ border-right: solid 1px #dfe4ed;
+ background-color: #fff;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ margin: 0;
+ padding: 6px 0;
+ min-width: 160px
+}
+
+.custom-theme .el-cascader-menu:last-child {
+ border-right: 0
+}
+
+.custom-theme .el-cascader-menu__item {
+ font-size: 14px;
+ padding: 8px 20px;
+ position: relative;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: #5a5e66;
+ height: 34px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ cursor: pointer
+}
+
+.custom-theme .el-cascader-menu__item--extensible:after {
+ font-family: element-icons;
+ content: "\e604";
+ font-size: 14px;
+ color: #bfcbd9;
+ position: absolute;
+ right: 15px
+}
+
+.custom-theme .el-cascader-menu__item.is-disabled {
+ color: #b4bccc;
+ background-color: #fff;
+ cursor: not-allowed
+}
+
+.custom-theme .el-cascader-menu__item.is-disabled:hover {
+ background-color: #fff
+}
+
+.custom-theme .el-cascader-menu__item.is-active {
+ color: #262729
+}
+
+.custom-theme .el-cascader-menu__item:hover {
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-cascader-menu__item.selected {
+ color: #fff;
+ background-color: #f5f7fa
+}
+
+.custom-theme .el-cascader-menu__item__keyword {
+ font-weight: 700
+}
+
+.custom-theme .el-cascader-menu--flexible {
+ height: auto;
+ max-height: 180px;
+ overflow: auto
+}
+
+.custom-theme .el-cascader-menu--flexible .el-cascader-menu__item {
+ overflow: visible
+}
+
+.custom-theme .el-color-hue-slider {
+ position: relative;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 280px;
+ height: 12px;
+ background-color: red;
+ padding: 0 2px
+}
+
+.custom-theme .el-color-hue-slider__bar {
+ position: relative;
+ background: -webkit-gradient(linear, left top, right top, from(red), color-stop(17%, #ff0), color-stop(33%, #0f0), color-stop(50%, #0ff), color-stop(67%, #00f), color-stop(83%, #f0f), to(red));
+ background: linear-gradient(to right, red 0, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red 100%);
+ height: 100%
+}
+
+.custom-theme .el-color-hue-slider__thumb {
+ position: absolute;
+ cursor: pointer;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ left: 0;
+ top: 0;
+ width: 4px;
+ height: 100%;
+ border-radius: 1px;
+ background: #fff;
+ border: 1px solid #f0f0f0;
+ -webkit-box-shadow: 0 0 2px rgba(0, 0, 0, .6);
+ box-shadow: 0 0 2px rgba(0, 0, 0, .6);
+ z-index: 1
+}
+
+.custom-theme .el-color-hue-slider.is-vertical {
+ width: 12px;
+ height: 180px;
+ padding: 2px 0
+}
+
+.custom-theme .el-color-hue-slider.is-vertical .el-color-hue-slider__bar {
+ background: -webkit-gradient(linear, left top, left bottom, from(red), color-stop(17%, #ff0), color-stop(33%, #0f0), color-stop(50%, #0ff), color-stop(67%, #00f), color-stop(83%, #f0f), to(red));
+ background: linear-gradient(to bottom, red 0, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, red 100%)
+}
+
+.custom-theme .el-color-hue-slider.is-vertical .el-color-hue-slider__thumb {
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 4px
+}
+
+.custom-theme .el-color-svpanel {
+ position: relative;
+ width: 280px;
+ height: 180px
+}
+
+.custom-theme .el-color-svpanel__black, .custom-theme .el-color-svpanel__white {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0
+}
+
+.custom-theme .el-color-svpanel__white {
+ background: -webkit-gradient(linear, left top, right top, from(#fff), to(rgba(255, 255, 255, 0)));
+ background: linear-gradient(to right, #fff, rgba(255, 255, 255, 0))
+}
+
+.custom-theme .el-color-svpanel__black {
+ background: -webkit-gradient(linear, left bottom, left top, from(#000), to(transparent));
+ background: linear-gradient(to top, #000, transparent)
+}
+
+.custom-theme .el-color-svpanel__cursor {
+ position: absolute
+}
+
+.custom-theme .el-color-svpanel__cursor > div {
+ cursor: head;
+ width: 4px;
+ height: 4px;
+ -webkit-box-shadow: 0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0, 0, 0, .3), 0 0 1px 2px rgba(0, 0, 0, .4);
+ box-shadow: 0 0 0 1.5px #fff, inset 0 0 1px 1px rgba(0, 0, 0, .3), 0 0 1px 2px rgba(0, 0, 0, .4);
+ border-radius: 50%;
+ -webkit-transform: translate(-2px, -2px);
+ transform: translate(-2px, -2px)
+}
+
+.custom-theme .el-color-alpha-slider {
+ position: relative;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 280px;
+ height: 12px;
+ background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)
+}
+
+.custom-theme .el-color-alpha-slider__bar {
+ position: relative;
+ background: -webkit-gradient(linear, left top, right top, from(rgba(255, 255, 255, 0)), to(white));
+ background: linear-gradient(to right, rgba(255, 255, 255, 0) 0, #fff 100%);
+ height: 100%
+}
+
+.custom-theme .el-color-alpha-slider__thumb {
+ position: absolute;
+ cursor: pointer;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ left: 0;
+ top: 0;
+ width: 4px;
+ height: 100%;
+ border-radius: 1px;
+ background: #fff;
+ border: 1px solid #f0f0f0;
+ -webkit-box-shadow: 0 0 2px rgba(0, 0, 0, .6);
+ box-shadow: 0 0 2px rgba(0, 0, 0, .6);
+ z-index: 1
+}
+
+.custom-theme .el-color-alpha-slider.is-vertical {
+ width: 20px;
+ height: 180px
+}
+
+.custom-theme .el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar {
+ background: -webkit-gradient(linear, left top, left bottom, from(rgba(255, 255, 255, 0)), to(white));
+ background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0, #fff 100%)
+}
+
+.custom-theme .el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb {
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 4px
+}
+
+.custom-theme .el-color-dropdown {
+ width: 300px
+}
+
+.custom-theme .el-color-dropdown__main-wrapper {
+ margin-bottom: 6px
+}
+
+.custom-theme .el-color-dropdown__main-wrapper::after {
+ content: "";
+ display: table;
+ clear: both
+}
+
+.custom-theme .el-color-dropdown__btns {
+ margin-top: 6px;
+ text-align: right
+}
+
+.custom-theme .el-color-dropdown__value {
+ float: left;
+ line-height: 26px;
+ font-size: 12px;
+ color: #000;
+ width: 160px
+}
+
+.custom-theme .el-color-dropdown__btn {
+ border: 1px solid #dcdcdc;
+ color: #333;
+ line-height: 24px;
+ border-radius: 2px;
+ padding: 0 20px;
+ cursor: pointer;
+ background-color: transparent;
+ outline: 0;
+ font-size: 12px
+}
+
+.custom-theme .el-color-dropdown__btn[disabled] {
+ color: #ccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-color-dropdown__btn:hover {
+ color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-color-dropdown__link-btn {
+ cursor: pointer;
+ color: #262729;
+ text-decoration: none;
+ padding: 15px;
+ font-size: 12px
+}
+
+.custom-theme .el-color-dropdown__link-btn:hover {
+ color: tint(#262729, 20%)
+}
+
+.custom-theme .el-color-picker {
+ display: inline-block;
+ position: relative;
+ line-height: normal;
+ height: 40px
+}
+
+.custom-theme .el-color-picker.is-disabled .el-color-picker__trigger {
+ cursor: not-allowed
+}
+
+.custom-theme .el-color-picker--medium {
+ height: 36px
+}
+
+.custom-theme .el-color-picker--medium .el-color-picker__trigger {
+ height: 36px;
+ width: 36px
+}
+
+.custom-theme .el-color-picker--medium .el-color-picker__mask {
+ height: 34px;
+ width: 34px
+}
+
+.custom-theme .el-color-picker--small {
+ height: 32px
+}
+
+.custom-theme .el-color-picker--small .el-color-picker__trigger {
+ height: 32px;
+ width: 32px
+}
+
+.custom-theme .el-color-picker--small .el-color-picker__mask {
+ height: 30px;
+ width: 30px
+}
+
+.custom-theme .el-color-picker--small .el-color-picker__empty, .custom-theme .el-color-picker--small .el-color-picker__icon {
+ -webkit-transform: translate3d(-50%, -50%, 0) scale(.8);
+ transform: translate3d(-50%, -50%, 0) scale(.8)
+}
+
+.custom-theme .el-color-picker--mini {
+ height: 28px
+}
+
+.custom-theme .el-color-picker--mini .el-color-picker__trigger {
+ height: 28px;
+ width: 28px
+}
+
+.custom-theme .el-color-picker--mini .el-color-picker__mask {
+ height: 26px;
+ width: 26px
+}
+
+.custom-theme .el-color-picker--mini .el-color-picker__empty, .custom-theme .el-color-picker--mini .el-color-picker__icon {
+ -webkit-transform: translate3d(-50%, -50%, 0) scale(.8);
+ transform: translate3d(-50%, -50%, 0) scale(.8)
+}
+
+.custom-theme .el-color-picker__mask {
+ height: 38px;
+ width: 38px;
+ border-radius: 4px;
+ position: absolute;
+ top: 1px;
+ left: 1px;
+ z-index: 1;
+ cursor: not-allowed;
+ background-color: rgba(255, 255, 255, .7)
+}
+
+.custom-theme .el-color-picker__trigger {
+ display: inline-block;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ height: 40px;
+ width: 40px;
+ padding: 4px;
+ border: 1px solid #e6e6e6;
+ border-radius: 4px;
+ font-size: 0;
+ position: relative;
+ cursor: pointer
+}
+
+.custom-theme .el-color-picker__color {
+ position: relative;
+ display: block;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border: 1px solid #999;
+ border-radius: 2px;
+ width: 100%;
+ height: 100%;
+ text-align: center
+}
+
+.custom-theme .el-color-picker__color.is-alpha {
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)
+}
+
+.custom-theme .el-color-picker__color-inner {
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0
+}
+
+.custom-theme .el-color-picker__empty {
+ font-size: 12px;
+ color: #999;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translate3d(-50%, -50%, 0);
+ transform: translate3d(-50%, -50%, 0)
+}
+
+.custom-theme .el-color-picker__icon {
+ display: inline-block;
+ position: absolute;
+ width: 100%;
+ top: 50%;
+ left: 50%;
+ -webkit-transform: translate3d(-50%, -50%, 0);
+ transform: translate3d(-50%, -50%, 0);
+ color: #fff;
+ text-align: center;
+ font-size: 12px
+}
+
+.custom-theme .el-color-picker__panel {
+ position: absolute;
+ z-index: 10;
+ padding: 6px;
+ background-color: #fff;
+ border: 1px solid #e6ebf5;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1)
+}
+
+.custom-theme .el-input {
+ position: relative;
+ font-size: 14px;
+ display: inline-block;
+ width: 100%
+}
+
+.custom-theme .el-input::-webkit-scrollbar {
+ z-index: 11;
+ width: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar:horizontal {
+ height: 6px
+}
+
+.custom-theme .el-input::-webkit-scrollbar-thumb {
+ border-radius: 5px;
+ width: 6px;
+ background: #b4bccc
+}
+
+.custom-theme .el-input::-webkit-scrollbar-corner {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track {
+ background: #fff
+}
+
+.custom-theme .el-input::-webkit-scrollbar-track-piece {
+ background: #fff;
+ width: 6px
+}
+
+.custom-theme .el-input__inner {
+ -webkit-appearance: none;
+ background-color: #fff;
+ background-image: none;
+ border-radius: 4px;
+ border: 1px solid #d8dce5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #5a5e66;
+ display: inline-block;
+ font-size: inherit;
+ height: 40px;
+ line-height: 1;
+ outline: 0;
+ padding: 0 15px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ width: 100%
+}
+
+.custom-theme .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-input__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input__suffix {
+ position: absolute;
+ height: 100%;
+ right: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ pointer-events: none
+}
+
+.custom-theme .el-input__suffix-inner {
+ pointer-events: all
+}
+
+.custom-theme .el-input__prefix {
+ position: absolute;
+ height: 100%;
+ left: 5px;
+ top: 0;
+ text-align: center;
+ color: #b4bccc;
+ -webkit-transition: all .3s;
+ transition: all .3s
+}
+
+.custom-theme .el-input__icon {
+ height: 100%;
+ width: 25px;
+ text-align: center;
+ -webkit-transition: all .3s;
+ transition: all .3s;
+ line-height: 40px
+}
+
+.custom-theme .el-input__icon:after {
+ content: '';
+ height: 100%;
+ width: 0;
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-input__validateIcon {
+ pointer-events: none
+}
+
+.custom-theme .el-input.is-active .el-input__inner {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-input.is-disabled .el-input__icon {
+ cursor: not-allowed
+}
+
+.custom-theme .el-input--suffix .el-input__inner {
+ padding-right: 30px
+}
+
+.custom-theme .el-input--prefix .el-input__inner {
+ padding-left: 30px
+}
+
+.custom-theme .el-input--medium {
+ font-size: 14px
+}
+
+.custom-theme .el-input--medium .el-input__inner {
+ height: 36px
+}
+
+.custom-theme .el-input--medium .el-input__icon {
+ line-height: 36px
+}
+
+.custom-theme .el-input--small {
+ font-size: 13px
+}
+
+.custom-theme .el-input--small .el-input__inner {
+ height: 32px
+}
+
+.custom-theme .el-input--small .el-input__icon {
+ line-height: 32px
+}
+
+.custom-theme .el-input--mini {
+ font-size: 12px
+}
+
+.custom-theme .el-input--mini .el-input__inner {
+ height: 28px
+}
+
+.custom-theme .el-input--mini .el-input__icon {
+ line-height: 28px
+}
+
+.custom-theme .el-input-group {
+ line-height: normal;
+ display: inline-table;
+ width: 100%;
+ border-collapse: separate
+}
+
+.custom-theme .el-input-group > .el-input__inner {
+ vertical-align: middle;
+ display: table-cell
+}
+
+.custom-theme .el-input-group__append, .custom-theme .el-input-group__prepend {
+ background-color: #f5f7fa;
+ color: #0a76a4;
+ vertical-align: middle;
+ display: table-cell;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ padding: 0 20px;
+ width: 1px;
+ white-space: nowrap
+}
+
+.custom-theme .el-input-group__append:focus, .custom-theme .el-input-group__prepend:focus {
+ outline: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-select, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-select {
+ display: inline-block;
+ margin: -20px
+}
+
+.custom-theme .el-input-group__append button.el-button, .custom-theme .el-input-group__append div.el-select .el-input__inner, .custom-theme .el-input-group__append div.el-select:hover .el-input__inner, .custom-theme .el-input-group__prepend button.el-button, .custom-theme .el-input-group__prepend div.el-select .el-input__inner, .custom-theme .el-input-group__prepend div.el-select:hover .el-input__inner {
+ border-color: transparent;
+ background-color: transparent;
+ color: inherit;
+ border-top: 0;
+ border-bottom: 0
+}
+
+.custom-theme .el-input-group__append .el-button, .custom-theme .el-input-group__append .el-input, .custom-theme .el-input-group__prepend .el-button, .custom-theme .el-input-group__prepend .el-input {
+ font-size: inherit
+}
+
+.custom-theme .el-input-group__prepend {
+ border-right: 0;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-input-group__append {
+ border-left: 0;
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--prepend .el-input__inner {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-input-group--append .el-input__inner {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-textarea {
+ display: inline-block;
+ width: 100%;
+ vertical-align: bottom
+}
+
+.custom-theme .el-textarea__inner {
+ display: block;
+ resize: vertical;
+ padding: 5px 15px;
+ line-height: 1.5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 100%;
+ font-size: 14px;
+ color: #5a5e66;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #d8dce5;
+ border-radius: 4px;
+ -webkit-transition: border-color .2s cubic-bezier(.645, .045, .355, 1);
+ transition: border-color .2s cubic-bezier(.645, .045, .355, 1)
+}
+
+.custom-theme .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:hover {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-textarea__inner:focus {
+ outline: 0;
+ border-color: #262729
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner {
+ background-color: #f5f7fa;
+ border-color: #dfe4ed;
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-textarea.is-disabled .el-textarea__inner::placeholder {
+ color: #b4bccc
+}
+
+.custom-theme .el-button {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+ background: #fff;
+ border: 1px solid #d8dce5;
+ border-color: #d8dce5;
+ color: #5a5e66;
+ -webkit-appearance: none;
+ text-align: center;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ -webkit-transition: .1s;
+ transition: .1s;
+ font-weight: 500;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ padding: 12px 20px;
+ font-size: 14px;
+ border-radius: 4px
+}
+
+.custom-theme .el-button + .el-button {
+ margin-left: 10px
+}
+
+.custom-theme .el-button.is-round {
+ padding: 12px 20px
+}
+
+.custom-theme .el-button:focus, .custom-theme .el-button:hover {
+ color: #262729;
+ border-color: #bebebf;
+ background-color: #e9e9ea
+}
+
+.custom-theme .el-button:active {
+ color: #222325;
+ border-color: #222325;
+ outline: 0
+}
+
+.custom-theme .el-button::-moz-focus-inner {
+ border: 0
+}
+
+.custom-theme .el-button [class*=el-icon-] + span {
+ margin-left: 5px
+}
+
+.custom-theme .el-button.is-plain:focus, .custom-theme .el-button.is-plain:hover {
+ background: #fff;
+ border-color: #262729;
+ color: #262729
+}
+
+.custom-theme .el-button.is-plain:active {
+ background: #fff;
+ border-color: #222325;
+ color: #222325;
+ outline: 0
+}
+
+.custom-theme .el-button.is-active {
+ color: #222325;
+ border-color: #222325
+}
+
+.custom-theme .el-button.is-disabled, .custom-theme .el-button.is-disabled:focus, .custom-theme .el-button.is-disabled:hover {
+ color: #b4bccc;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: #fff;
+ border-color: #e6ebf5
+}
+
+.custom-theme .el-button.is-disabled.el-button--text {
+ background-color: transparent
+}
+
+.custom-theme .el-button.is-disabled.is-plain, .custom-theme .el-button.is-disabled.is-plain:focus, .custom-theme .el-button.is-disabled.is-plain:hover {
+ background-color: #fff;
+ border-color: #e6ebf5;
+ color: #b4bccc
+}
+
+.custom-theme .el-button.is-loading {
+ position: relative;
+ pointer-events: none
+}
+
+.custom-theme .el-button.is-loading:before {
+ pointer-events: none;
+ content: '';
+ position: absolute;
+ left: -1px;
+ top: -1px;
+ right: -1px;
+ bottom: -1px;
+ border-radius: inherit;
+ background-color: rgba(255, 255, 255, .35)
+}
+
+.custom-theme .el-button.is-round {
+ border-radius: 20px;
+ padding: 12px 23px
+}
+
+.custom-theme .el-button--primary {
+ color: #fff;
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-button--primary:focus, .custom-theme .el-button--primary:hover {
+ background: #515254;
+ border-color: #515254;
+ color: #fff
+}
+
+.custom-theme .el-button--primary:active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--primary.is-active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff
+}
+
+.custom-theme .el-button--primary.is-disabled, .custom-theme .el-button--primary.is-disabled:active, .custom-theme .el-button--primary.is-disabled:focus, .custom-theme .el-button--primary.is-disabled:hover {
+ color: #fff;
+ background-color: #939394;
+ border-color: #939394
+}
+
+.custom-theme .el-button--primary.is-plain {
+ color: #262729;
+ background: #e9e9ea;
+ border-color: #a8a9a9
+}
+
+.custom-theme .el-button--primary.is-plain:focus, .custom-theme .el-button--primary.is-plain:hover {
+ background: #262729;
+ border-color: #262729;
+ color: #fff
+}
+
+.custom-theme .el-button--primary.is-plain:active {
+ background: #222325;
+ border-color: #222325;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--primary.is-plain.is-disabled, .custom-theme .el-button--primary.is-plain.is-disabled:active, .custom-theme .el-button--primary.is-plain.is-disabled:focus, .custom-theme .el-button--primary.is-plain.is-disabled:hover {
+ color: #7d7d7f;
+ background-color: #e9e9ea;
+ border-color: #d4d4d4
+}
+
+.custom-theme .el-button--success {
+ color: #fff;
+ background-color: #409167;
+ border-color: #409167
+}
+
+.custom-theme .el-button--success:focus, .custom-theme .el-button--success:hover {
+ background: #66a785;
+ border-color: #66a785;
+ color: #fff
+}
+
+.custom-theme .el-button--success:active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--success.is-active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff
+}
+
+.custom-theme .el-button--success.is-disabled, .custom-theme .el-button--success.is-disabled:active, .custom-theme .el-button--success.is-disabled:focus, .custom-theme .el-button--success.is-disabled:hover {
+ color: #fff;
+ background-color: #a0c8b3;
+ border-color: #a0c8b3
+}
+
+.custom-theme .el-button--success.is-plain {
+ color: #409167;
+ background: #ecf4f0;
+ border-color: #b3d3c2
+}
+
+.custom-theme .el-button--success.is-plain:focus, .custom-theme .el-button--success.is-plain:hover {
+ background: #409167;
+ border-color: #409167;
+ color: #fff
+}
+
+.custom-theme .el-button--success.is-plain:active {
+ background: #3a835d;
+ border-color: #3a835d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--success.is-plain.is-disabled, .custom-theme .el-button--success.is-plain.is-disabled:active, .custom-theme .el-button--success.is-plain.is-disabled:focus, .custom-theme .el-button--success.is-plain.is-disabled:hover {
+ color: #8cbda4;
+ background-color: #ecf4f0;
+ border-color: #d9e9e1
+}
+
+.custom-theme .el-button--warning {
+ color: #fff;
+ background-color: #9da408;
+ border-color: #9da408
+}
+
+.custom-theme .el-button--warning:focus, .custom-theme .el-button--warning:hover {
+ background: #b1b639;
+ border-color: #b1b639;
+ color: #fff
+}
+
+.custom-theme .el-button--warning:active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--warning.is-active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff
+}
+
+.custom-theme .el-button--warning.is-disabled, .custom-theme .el-button--warning.is-disabled:active, .custom-theme .el-button--warning.is-disabled:focus, .custom-theme .el-button--warning.is-disabled:hover {
+ color: #fff;
+ background-color: #ced284;
+ border-color: #ced284
+}
+
+.custom-theme .el-button--warning.is-plain {
+ color: #9da408;
+ background: #f5f6e6;
+ border-color: #d8db9c
+}
+
+.custom-theme .el-button--warning.is-plain:focus, .custom-theme .el-button--warning.is-plain:hover {
+ background: #9da408;
+ border-color: #9da408;
+ color: #fff
+}
+
+.custom-theme .el-button--warning.is-plain:active {
+ background: #8d9407;
+ border-color: #8d9407;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--warning.is-plain.is-disabled, .custom-theme .el-button--warning.is-plain.is-disabled:active, .custom-theme .el-button--warning.is-plain.is-disabled:focus, .custom-theme .el-button--warning.is-plain.is-disabled:hover {
+ color: #c4c86b;
+ background-color: #f5f6e6;
+ border-color: #ebedce
+}
+
+.custom-theme .el-button--danger {
+ color: #fff;
+ background-color: #b3450e;
+ border-color: #b3450e
+}
+
+.custom-theme .el-button--danger:focus, .custom-theme .el-button--danger:hover {
+ background: #c26a3e;
+ border-color: #c26a3e;
+ color: #fff
+}
+
+.custom-theme .el-button--danger:active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--danger.is-active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff
+}
+
+.custom-theme .el-button--danger.is-disabled, .custom-theme .el-button--danger.is-disabled:active, .custom-theme .el-button--danger.is-disabled:focus, .custom-theme .el-button--danger.is-disabled:hover {
+ color: #fff;
+ background-color: #d9a287;
+ border-color: #d9a287
+}
+
+.custom-theme .el-button--danger.is-plain {
+ color: #b3450e;
+ background: #f7ece7;
+ border-color: #e1b59f
+}
+
+.custom-theme .el-button--danger.is-plain:focus, .custom-theme .el-button--danger.is-plain:hover {
+ background: #b3450e;
+ border-color: #b3450e;
+ color: #fff
+}
+
+.custom-theme .el-button--danger.is-plain:active {
+ background: #a13e0d;
+ border-color: #a13e0d;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--danger.is-plain.is-disabled, .custom-theme .el-button--danger.is-plain.is-disabled:active, .custom-theme .el-button--danger.is-plain.is-disabled:focus, .custom-theme .el-button--danger.is-plain.is-disabled:hover {
+ color: #d18f6e;
+ background-color: #f7ece7;
+ border-color: #f0dacf
+}
+
+.custom-theme .el-button--info {
+ color: #fff;
+ background-color: #0a76a4;
+ border-color: #0a76a4
+}
+
+.custom-theme .el-button--info:focus, .custom-theme .el-button--info:hover {
+ background: #3b91b6;
+ border-color: #3b91b6;
+ color: #fff
+}
+
+.custom-theme .el-button--info:active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--info.is-active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff
+}
+
+.custom-theme .el-button--info.is-disabled, .custom-theme .el-button--info.is-disabled:active, .custom-theme .el-button--info.is-disabled:focus, .custom-theme .el-button--info.is-disabled:hover {
+ color: #fff;
+ background-color: #85bbd2;
+ border-color: #85bbd2
+}
+
+.custom-theme .el-button--info.is-plain {
+ color: #0a76a4;
+ background: #e7f1f6;
+ border-color: #9dc8db
+}
+
+.custom-theme .el-button--info.is-plain:focus, .custom-theme .el-button--info.is-plain:hover {
+ background: #0a76a4;
+ border-color: #0a76a4;
+ color: #fff
+}
+
+.custom-theme .el-button--info.is-plain:active {
+ background: #096a94;
+ border-color: #096a94;
+ color: #fff;
+ outline: 0
+}
+
+.custom-theme .el-button--info.is-plain.is-disabled, .custom-theme .el-button--info.is-plain.is-disabled:active, .custom-theme .el-button--info.is-plain.is-disabled:focus, .custom-theme .el-button--info.is-plain.is-disabled:hover {
+ color: #6cadc8;
+ background-color: #e7f1f6;
+ border-color: #cee4ed
+}
+
+.custom-theme .el-button--medium {
+ padding: 10px 20px;
+ font-size: 14px;
+ border-radius: 4px
+}
+
+.custom-theme .el-button--medium.is-round {
+ padding: 10px 20px
+}
+
+.custom-theme .el-button--small {
+ padding: 9px 15px;
+ font-size: 12px;
+ border-radius: 3px
+}
+
+.custom-theme .el-button--small.is-round {
+ padding: 9px 15px
+}
+
+.custom-theme .el-button--mini {
+ padding: 7px 15px;
+ font-size: 12px;
+ border-radius: 3px
+}
+
+.custom-theme .el-button--mini.is-round {
+ padding: 7px 15px
+}
+
+.custom-theme .el-button--text {
+ border: none;
+ color: #262729;
+ background: 0 0;
+ padding-left: 0;
+ padding-right: 0
+}
+
+.custom-theme .el-button--text:focus, .custom-theme .el-button--text:hover {
+ color: #515254;
+ border-color: transparent;
+ background-color: transparent
+}
+
+.custom-theme .el-button--text:active {
+ color: #222325;
+ border-color: transparent;
+ background-color: transparent
+}
+
+.custom-theme .el-button-group {
+ display: inline-block;
+ vertical-align: middle
+}
+
+.custom-theme .el-button-group::after, .custom-theme .el-button-group::before {
+ display: table;
+ content: ""
+}
+
+.custom-theme .el-button-group::after {
+ clear: both
+}
+
+.custom-theme .el-button-group .el-button {
+ float: left;
+ position: relative
+}
+
+.custom-theme .el-button-group .el-button + .el-button {
+ margin-left: 0
+}
+
+.custom-theme .el-button-group .el-button:first-child {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:last-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:not(:first-child):not(:last-child) {
+ border-radius: 0
+}
+
+.custom-theme .el-button-group .el-button:not(:last-child) {
+ margin-right: -1px
+}
+
+.custom-theme .el-button-group .el-button:active, .custom-theme .el-button-group .el-button:focus, .custom-theme .el-button-group .el-button:hover {
+ z-index: 1
+}
+
+.custom-theme .el-button-group .el-button.is-active {
+ z-index: 1
+}
+
+.custom-theme .el-button-group .el-button--primary:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--primary:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--primary:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--success:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--warning:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--danger:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:first-child {
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:last-child {
+ border-left-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-button-group .el-button--info:not(:first-child):not(:last-child) {
+ border-left-color: rgba(255, 255, 255, .5);
+ border-right-color: rgba(255, 255, 255, .5)
+}
+
+.custom-theme .el-checkbox {
+ color: #5a5e66;
+ font-weight: 500;
+ font-size: 14px;
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ white-space: nowrap;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none
+}
+
+.custom-theme .el-checkbox.is-bordered {
+ padding: 9px 20px 9px 10px;
+ border-radius: 4px;
+ border: 1px solid #d8dce5
+}
+
+.custom-theme .el-checkbox.is-bordered.is-checked {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox.is-bordered.is-disabled {
+ border-color: #e6ebf5;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox.is-bordered + .el-checkbox.is-bordered {
+ margin-left: 10px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium {
+ padding: 7px 20px 7px 10px;
+ border-radius: 4px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label {
+ line-height: 17px;
+ font-size: 14px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner {
+ height: 14px;
+ width: 14px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small {
+ padding: 3px 15px 7px 10px;
+ border-radius: 3px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label {
+ line-height: 15px;
+ font-size: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner {
+ height: 12px;
+ width: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after {
+ height: 6px;
+ width: 2px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini {
+ padding: 1px 15px 5px 10px;
+ border-radius: 3px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label {
+ line-height: 12px;
+ font-size: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner {
+ height: 12px;
+ width: 12px
+}
+
+.custom-theme .el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after {
+ height: 6px;
+ width: 2px
+}
+
+.custom-theme .el-checkbox__input {
+ white-space: nowrap;
+ cursor: pointer;
+ outline: 0;
+ display: inline-block;
+ line-height: 1;
+ position: relative;
+ vertical-align: middle
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner::after {
+ cursor: not-allowed;
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled .el-checkbox__inner + .el-checkbox__label {
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after {
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner {
+ background-color: #edf2fc;
+ border-color: #d8dce5
+}
+
+.custom-theme .el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before {
+ background-color: #b4bccc;
+ border-color: #b4bccc
+}
+
+.custom-theme .el-checkbox__input.is-disabled + span.el-checkbox__label {
+ color: #b4bccc;
+ cursor: not-allowed
+}
+
+.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner {
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-checked .el-checkbox__inner::after {
+ -webkit-transform: rotate(45deg) scaleY(1);
+ transform: rotate(45deg) scaleY(1)
+}
+
+.custom-theme .el-checkbox__input.is-checked + .el-checkbox__label {
+ color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-focus .el-checkbox__inner {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner {
+ background-color: #262729;
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::before {
+ content: '';
+ position: absolute;
+ display: block;
+ background-color: #fff;
+ height: 2px;
+ -webkit-transform: scale(.5);
+ transform: scale(.5);
+ left: 0;
+ right: 0;
+ top: 5px
+}
+
+.custom-theme .el-checkbox__input.is-indeterminate .el-checkbox__inner::after {
+ display: none
+}
+
+.custom-theme .el-checkbox__inner {
+ display: inline-block;
+ position: relative;
+ border: 1px solid #d8dce5;
+ border-radius: 2px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ width: 14px;
+ height: 14px;
+ background-color: #fff;
+ z-index: 1;
+ -webkit-transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46);
+ transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46)
+}
+
+.custom-theme .el-checkbox__inner:hover {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox__inner::after {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+ content: "";
+ border: 1px solid #fff;
+ border-left: 0;
+ border-top: 0;
+ height: 7px;
+ left: 4px;
+ position: absolute;
+ top: 1px;
+ -webkit-transform: rotate(45deg) scaleY(0);
+ transform: rotate(45deg) scaleY(0);
+ width: 3px;
+ -webkit-transition: -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ transition: transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms, -webkit-transform .15s cubic-bezier(.71, -.46, .88, .6) 50ms;
+ -webkit-transform-origin: center;
+ transform-origin: center
+}
+
+.custom-theme .el-checkbox__original {
+ opacity: 0;
+ outline: 0;
+ position: absolute;
+ margin: 0;
+ width: 0;
+ height: 0;
+ left: -999px
+}
+
+.custom-theme .el-checkbox__label {
+ display: inline-block;
+ padding-left: 10px;
+ line-height: 19px;
+ font-size: 14px
+}
+
+.custom-theme .el-checkbox + .el-checkbox {
+ margin-left: 30px
+}
+
+.custom-theme .el-checkbox-button {
+ position: relative;
+ display: inline-block
+}
+
+.custom-theme .el-checkbox-button__inner {
+ display: inline-block;
+ line-height: 1;
+ font-weight: 500;
+ white-space: nowrap;
+ vertical-align: middle;
+ cursor: pointer;
+ background: #fff;
+ border: 1px solid #d8dce5;
+ border-left: 0;
+ color: #5a5e66;
+ -webkit-appearance: none;
+ text-align: center;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ position: relative;
+ -webkit-transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ transition: all .3s cubic-bezier(.645, .045, .355, 1);
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+ padding: 12px 20px;
+ font-size: 14px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button__inner.is-round {
+ padding: 12px 20px
+}
+
+.custom-theme .el-checkbox-button__inner:hover {
+ color: #262729
+}
+
+.custom-theme .el-checkbox-button__inner [class*=el-icon-] {
+ line-height: .9
+}
+
+.custom-theme .el-checkbox-button__inner [class*=el-icon-] + span {
+ margin-left: 5px
+}
+
+.custom-theme .el-checkbox-button__original {
+ opacity: 0;
+ outline: 0;
+ position: absolute;
+ margin: 0;
+ left: -999px
+}
+
+.custom-theme .el-checkbox-button.is-checked .el-checkbox-button__inner {
+ color: #fff;
+ background-color: #262729;
+ border-color: #262729;
+ -webkit-box-shadow: -1px 0 0 0 #7d7d7f;
+ box-shadow: -1px 0 0 0 #7d7d7f
+}
+
+.custom-theme .el-checkbox-button.is-disabled .el-checkbox-button__inner {
+ color: #b4bccc;
+ cursor: not-allowed;
+ background-image: none;
+ background-color: #fff;
+ border-color: #e6ebf5;
+ -webkit-box-shadow: none;
+ box-shadow: none
+}
+
+.custom-theme .el-checkbox-button:first-child .el-checkbox-button__inner {
+ border-left: 1px solid #d8dce5;
+ border-radius: 4px 0 0 4px;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important
+}
+
+.custom-theme .el-checkbox-button.is-focus .el-checkbox-button__inner {
+ border-color: #262729
+}
+
+.custom-theme .el-checkbox-button:last-child .el-checkbox-button__inner {
+ border-radius: 0 4px 4px 0
+}
+
+.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner {
+ padding: 10px 20px;
+ font-size: 14px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--medium .el-checkbox-button__inner.is-round {
+ padding: 10px 20px
+}
+
+.custom-theme .el-checkbox-button--small .el-checkbox-button__inner {
+ padding: 9px 15px;
+ font-size: 12px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--small .el-checkbox-button__inner.is-round {
+ padding: 9px 15px
+}
+
+.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner {
+ padding: 7px 15px;
+ font-size: 12px;
+ border-radius: 0
+}
+
+.custom-theme .el-checkbox-button--mini .el-checkbox-button__inner.is-round {
+ padding: 7px 15px
+}
+
+.custom-theme .el-checkbox-group {
+ font-size: 0
+}
+
+.custom-theme .el-transfer {
+ font-size: 14px
+}
+
+.custom-theme .el-transfer__buttons {
+ display: inline-block;
+ vertical-align: middle;
+ padding: 0 30px
+}
+
+.custom-theme .el-transfer__button {
+ display: block;
+ margin: 0 auto;
+ padding: 10px;
+ border-radius: 50%;
+ color: #fff;
+ background-color: #262729;
+ font-size: 0
+}
+
+.custom-theme .el-transfer__button.is-with-texts {
+ border-radius: 4px
+}
+
+.custom-theme .el-transfer__button.is-disabled {
+ border: 1px solid #d8dce5;
+ background-color: #f5f7fa;
+ color: #b4bccc
+}
+
+.custom-theme .el-transfer__button.is-disabled:hover {
+ border: 1px solid #d8dce5;
+ background-color: #f5f7fa;
+ color: #b4bccc
+}
+
+.custom-theme .el-transfer__button:first-child {
+ margin-bottom: 10px
+}
+
+.custom-theme .el-transfer__button:nth-child(2) {
+ margin: 0
+}
+
+.custom-theme .el-transfer__button i, .custom-theme .el-transfer__button span {
+ font-size: 14px
+}
+
+.custom-theme .el-transfer__button [class*=el-icon-] + span {
+ margin-left: 0
+}
+
+.custom-theme .el-transfer-panel {
+ border: 1px solid #e6ebf5;
+ border-radius: 4px;
+ overflow: hidden;
+ background: #fff;
+ display: inline-block;
+ vertical-align: middle;
+ width: 200px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ position: relative
+}
+
+.custom-theme .el-transfer-panel__body {
+ height: 246px
+}
+
+.custom-theme .el-transfer-panel__body.is-with-footer {
+ padding-bottom: 40px
+}
+
+.custom-theme .el-transfer-panel__list {
+ margin: 0;
+ padding: 6px 0;
+ list-style: none;
+ height: 246px;
+ overflow: auto;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-transfer-panel__list.is-filterable {
+ height: 194px;
+ padding-top: 0
+}
+
+.custom-theme .el-transfer-panel__item {
+ height: 30px;
+ line-height: 30px;
+ padding-left: 15px;
+ display: block
+}
+
+.custom-theme .el-transfer-panel__item + .el-transfer-panel__item {
+ margin-left: 0
+}
+
+.custom-theme .el-transfer-panel__item.el-checkbox {
+ color: #5a5e66
+}
+
+.custom-theme .el-transfer-panel__item:hover {
+ color: #262729
+}
+
+.custom-theme .el-transfer-panel__item.el-checkbox .el-checkbox__label {
+ width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ display: block;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding-left: 24px;
+ line-height: 30px
+}
+
+.custom-theme .el-transfer-panel__item .el-checkbox__input {
+ position: absolute;
+ top: 8px
+}
+
+.custom-theme .el-transfer-panel__filter {
+ text-align: center;
+ margin: 15px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ display: block;
+ width: auto
+}
+
+.custom-theme .el-transfer-panel__filter .el-input__inner {
+ height: 32px;
+ width: 100%;
+ font-size: 12px;
+ display: inline-block;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ border-radius: 16px;
+ padding-right: 10px;
+ padding-left: 30px
+}
+
+.custom-theme .el-transfer-panel__filter .el-input__icon {
+ margin-left: 5px
+}
+
+.custom-theme .el-transfer-panel__filter .el-icon-circle-close {
+ cursor: pointer
+}
+
+.custom-theme .el-transfer-panel .el-transfer-panel__header {
+ height: 40px;
+ line-height: 40px;
+ background: #f5f7fa;
+ margin: 0;
+ padding-left: 15px;
+ border-bottom: 1px solid #e6ebf5;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ color: #000
+}
+
+.custom-theme .el-transfer-panel .el-transfer-panel__header .el-checkbox {
+ display: block;
+ line-height: 40px
+}
+
+.custom-theme .el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label {
+ font-size: 16px;
+ color: #2d2f33;
+ font-weight: 400
+}
+
+.custom-theme .el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span {
+ position: absolute;
+ right: 15px;
+ color: #878d99;
+ font-size: 12px;
+ font-weight: 400
+}
+
+.custom-theme .el-transfer-panel .el-transfer-panel__footer {
+ height: 40px;
+ background: #fff;
+ margin: 0;
+ padding: 0;
+ border-top: 1px solid #e6ebf5;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ z-index: 1
+}
+
+.custom-theme .el-transfer-panel .el-transfer-panel__footer::after {
+ display: inline-block;
+ content: "";
+ height: 100%;
+ vertical-align: middle
+}
+
+.custom-theme .el-transfer-panel .el-transfer-panel__footer .el-checkbox {
+ padding-left: 20px;
+ color: #5a5e66
+}
+
+.custom-theme .el-transfer-panel .el-transfer-panel__empty {
+ margin: 0;
+ height: 30px;
+ line-height: 30px;
+ padding: 6px 15px 0;
+ color: #878d99
+}
+
+.custom-theme .el-transfer-panel .el-checkbox__label {
+ padding-left: 8px
+}
+
+.custom-theme .el-transfer-panel .el-checkbox__inner {
+ height: 14px;
+ width: 14px;
+ border-radius: 3px
+}
+
+.custom-theme .el-transfer-panel .el-checkbox__inner::after {
+ height: 6px;
+ width: 3px;
+ left: 4px
+}
+
+.custom-theme .el-container {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-container.is-vertical {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column
+}
+
+.custom-theme .el-header {
+ padding: 0 20px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-aside {
+ overflow: auto;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
+
+.custom-theme .el-main {
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+ overflow: auto;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+ padding: 20px
+}
+
+.custom-theme .el-footer {
+ padding: 0 20px;
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/BackToTop/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/BackToTop/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..36522f4a18d08216c8800b99532eaeba8c4695e5
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/BackToTop/index.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Breadcrumb/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Breadcrumb/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2d1265fb6091b93ffd93e8726369da09ba23ed68
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Breadcrumb/index.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+ {{ generateTitle(item.meta.title) }}
+
+ {{ generateTitle(item.meta.title) }}
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/Keyboard.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/Keyboard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e7d6382501041f51df419de7cd46002e9d39c91d
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/Keyboard.vue
@@ -0,0 +1,155 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/LineMarker.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/LineMarker.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8d97b545f852efb20de21dce5df78ada5fe2c4d9
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/LineMarker.vue
@@ -0,0 +1,227 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/MixChart.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/MixChart.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c8a24b0caad72796aefec37f22b9f6971ccd3428
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/MixChart.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Charts/mixins/resize.js b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/mixins/resize.js
new file mode 100644
index 0000000000000000000000000000000000000000..89fbed183877b68a50dc9df2f4c96a16ceb4c9bc
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Charts/mixins/resize.js
@@ -0,0 +1,56 @@
+import {debounce} from '@/utils'
+
+export default {
+ data() {
+ return {
+ $_sidebarElm: null,
+ $_resizeHandler: null
+ }
+ },
+ mounted() {
+ this.initListener()
+ },
+ activated() {
+ if (!this.$_resizeHandler) {
+ // avoid duplication init
+ this.initListener()
+ }
+
+ // when keep-alive chart activated, auto resize
+ this.resize()
+ },
+ beforeDestroy() {
+ this.destroyListener()
+ },
+ deactivated() {
+ this.destroyListener()
+ },
+ methods: {
+ // use $_ for mixins properties
+ // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+ $_sidebarResizeHandler(e) {
+ if (e.propertyName === 'width') {
+ this.$_resizeHandler()
+ }
+ },
+ initListener() {
+ this.$_resizeHandler = debounce(() => {
+ this.resize()
+ }, 100)
+ window.addEventListener('resize', this.$_resizeHandler)
+
+ this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
+ this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
+ },
+ destroyListener() {
+ window.removeEventListener('resize', this.$_resizeHandler)
+ this.$_resizeHandler = null
+
+ this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
+ },
+ resize() {
+ const {chart} = this
+ chart && chart.resize()
+ }
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/DndList/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/DndList/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..23ca006efb9dd2772ab382e3049fc309a30b8a1c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/DndList/index.vue
@@ -0,0 +1,166 @@
+
+
+
+
{{ list1Title }}
+
+
+
+ {{ element.id }}[{{ element.author }}] {{ element.title }}
+
+
+
+
+
+
+
+
+
+
+
{{ list2Title }}
+
+
+
+ {{ element.id }} [{{ element.author }}] {{ element.title }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/DragSelect/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/DragSelect/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..47f42474f1d2661414d974c79a8f1bc10733e6ce
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/DragSelect/index.vue
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Dropzone/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Dropzone/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..bad9eb90d4c701a3cd4ae094a75ba3c2e9cede07
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Dropzone/index.vue
@@ -0,0 +1,297 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/ErrorLog/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/ErrorLog/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9ad758d78c66f294abe7e0dde1aa1af10b1d6304
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/ErrorLog/index.vue
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+ Error Log
+ Clear All
+
+
+
+
+
+ Msg:
+
+ {{ row.err.message }}
+
+
+
+
+ Info:
+
+ {{ row.vm.$vnode.tag }} error in {{ row.info }}
+
+
+
+
+ Url:
+
+ {{ row.url }}
+
+
+
+
+
+
+ {{ row.err.stack }}
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/GithubCorner/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/GithubCorner/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..92f7aa03670addac7326854f0f671c2c0ce6c6c0
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/GithubCorner/index.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Hamburger/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Hamburger/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..368b002154ef7dfb2625e15a43d2ad264bfa040c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Hamburger/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/HeaderSearch/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/HeaderSearch/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5d61ba37ca14c3847b1047b6a6c6e52bbd558d71
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/HeaderSearch/index.vue
@@ -0,0 +1,208 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..65a4262bebfb38b99255c42fe2d6c8a3322e9e0b
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/index.vue
@@ -0,0 +1,1779 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ lang.hint }}
+ {{ lang.noSupported }}
+
+
+
+
+ {{ errorMsg }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ↺
+ ↻
+
+
+
+
+
+
+
{{ lang.preview }}
+
+
+
+
{{ lang.preview }}
+
+
+
+
+
+
+
+
+
+
{{ lang.loading }}
+
+
+
+
+
+ {{ errorMsg }}
+
+
+
+ {{ lang.success }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/data2blob.js b/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/data2blob.js
new file mode 100644
index 0000000000000000000000000000000000000000..9c47f8af5328686c427acf090c3e7eba96ec2765
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/data2blob.js
@@ -0,0 +1,19 @@
+/**
+ * database64文件格式转换为2进制
+ *
+ * @param {[String]} data dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了
+ * @param {[String]} mime [description]
+ * @return {[blob]} [description]
+ */
+export default function(data, mime) {
+ data = data.split(',')[1]
+ data = window.atob(data)
+ var ia = new Uint8Array(data.length)
+ for (var i = 0; i < data.length; i++) {
+ ia[i] = data.charCodeAt(i)
+ }
+ // canvas.toDataURL 返回的默认格式就是 image/png
+ return new Blob([ia], {
+ type: mime
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/effectRipple.js b/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/effectRipple.js
new file mode 100644
index 0000000000000000000000000000000000000000..46a01640a1e9eed6d2d81c87d9bf96b858c77271
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/effectRipple.js
@@ -0,0 +1,39 @@
+/**
+ * 点击波纹效果
+ *
+ * @param {[event]} e [description]
+ * @param {[Object]} arg_opts [description]
+ * @return {[bollean]} [description]
+ */
+export default function(e, arg_opts) {
+ var opts = Object.assign({
+ ele: e.target, // 波纹作用元素
+ type: 'hit', // hit点击位置扩散center中心点扩展
+ bgc: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
+ }, arg_opts)
+ var target = opts.ele
+ if (target) {
+ var rect = target.getBoundingClientRect()
+ var ripple = target.querySelector('.e-ripple')
+ if (!ripple) {
+ ripple = document.createElement('span')
+ ripple.className = 'e-ripple'
+ ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'
+ target.appendChild(ripple)
+ } else {
+ ripple.className = 'e-ripple'
+ }
+ switch (opts.type) {
+ case 'center':
+ ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px'
+ ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px'
+ break
+ default:
+ ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.body.scrollTop) + 'px'
+ ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.body.scrollLeft) + 'px'
+ }
+ ripple.style.backgroundColor = opts.bgc
+ ripple.className = 'e-ripple z-active'
+ return false
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/language.js b/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/language.js
new file mode 100644
index 0000000000000000000000000000000000000000..727872d96f4c2d054a4bc47108a93e6b0d44b379
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/language.js
@@ -0,0 +1,232 @@
+export default {
+ zh: {
+ hint: '点击,或拖动图片至此处',
+ loading: '正在上传……',
+ noSupported: '浏览器不支持该功能,请使用IE10以上或其他现在浏览器!',
+ success: '上传成功',
+ fail: '图片上传失败',
+ preview: '头像预览',
+ btn: {
+ off: '取消',
+ close: '关闭',
+ back: '上一步',
+ save: '保存'
+ },
+ error: {
+ onlyImg: '仅限图片格式',
+ outOfSize: '单文件大小不能超过 ',
+ lowestPx: '图片最低像素为(宽*高):'
+ }
+ },
+ 'zh-tw': {
+ hint: '點擊,或拖動圖片至此處',
+ loading: '正在上傳……',
+ noSupported: '瀏覽器不支持該功能,請使用IE10以上或其他現代瀏覽器!',
+ success: '上傳成功',
+ fail: '圖片上傳失敗',
+ preview: '頭像預覽',
+ btn: {
+ off: '取消',
+ close: '關閉',
+ back: '上一步',
+ save: '保存'
+ },
+ error: {
+ onlyImg: '僅限圖片格式',
+ outOfSize: '單文件大小不能超過 ',
+ lowestPx: '圖片最低像素為(寬*高):'
+ }
+ },
+ en: {
+ hint: 'Click or drag the file here to upload',
+ loading: 'Uploading…',
+ noSupported: 'Browser is not supported, please use IE10+ or other browsers',
+ success: 'Upload success',
+ fail: 'Upload failed',
+ preview: 'Preview',
+ btn: {
+ off: 'Cancel',
+ close: 'Close',
+ back: 'Back',
+ save: 'Save'
+ },
+ error: {
+ onlyImg: 'Image only',
+ outOfSize: 'Image exceeds size limit: ',
+ lowestPx: 'Image\'s size is too low. Expected at least: '
+ }
+ },
+ ro: {
+ hint: 'Atinge sau trage fișierul aici',
+ loading: 'Se încarcă',
+ noSupported: 'Browser-ul tău nu suportă acest feature. Te rugăm încearcă cu alt browser.',
+ success: 'S-a încărcat cu succes',
+ fail: 'A apărut o problemă la încărcare',
+ preview: 'Previzualizează',
+
+ btn: {
+ off: 'Anulează',
+ close: 'Închide',
+ back: 'Înapoi',
+ save: 'Salvează'
+ },
+
+ error: {
+ onlyImg: 'Doar imagini',
+ outOfSize: 'Imaginea depășește limita de: ',
+ loewstPx: 'Imaginea este prea mică; Minim: '
+ }
+ },
+ ru: {
+ hint: 'Нажмите, или перетащите файл в это окно',
+ loading: 'Загружаю……',
+ noSupported: 'Ваш браузер не поддерживается, пожалуйста, используйте IE10 + или другие браузеры',
+ success: 'Загрузка выполнена успешно',
+ fail: 'Ошибка загрузки',
+ preview: 'Предпросмотр',
+ btn: {
+ off: 'Отменить',
+ close: 'Закрыть',
+ back: 'Назад',
+ save: 'Сохранить'
+ },
+ error: {
+ onlyImg: 'Только изображения',
+ outOfSize: 'Изображение превышает предельный размер: ',
+ lowestPx: 'Минимальный размер изображения: '
+ }
+ },
+ 'pt-br': {
+ hint: 'Clique ou arraste o arquivo aqui para carregar',
+ loading: 'Carregando…',
+ noSupported: 'Browser não suportado, use o IE10+ ou outro browser',
+ success: 'Sucesso ao carregar imagem',
+ fail: 'Falha ao carregar imagem',
+ preview: 'Pré-visualizar',
+ btn: {
+ off: 'Cancelar',
+ close: 'Fechar',
+ back: 'Voltar',
+ save: 'Salvar'
+ },
+ error: {
+ onlyImg: 'Apenas imagens',
+ outOfSize: 'A imagem excede o limite de tamanho: ',
+ lowestPx: 'O tamanho da imagem é muito pequeno. Tamanho mínimo: '
+ }
+ },
+ fr: {
+ hint: 'Cliquez ou glissez le fichier ici.',
+ loading: 'Téléchargement…',
+ noSupported: 'Votre navigateur n\'est pas supporté. Utilisez IE10 + ou un autre navigateur s\'il vous plaît.',
+ success: 'Téléchargement réussit',
+ fail: 'Téléchargement echoué',
+ preview: 'Aperçu',
+ btn: {
+ off: 'Annuler',
+ close: 'Fermer',
+ back: 'Retour',
+ save: 'Enregistrer'
+ },
+ error: {
+ onlyImg: 'Image uniquement',
+ outOfSize: 'L\'image sélectionnée dépasse la taille maximum: ',
+ lowestPx: 'L\'image sélectionnée est trop petite. Dimensions attendues: '
+ }
+ },
+ nl: {
+ hint: 'Klik hier of sleep een afbeelding in dit vlak',
+ loading: 'Uploaden…',
+ noSupported: 'Je browser wordt helaas niet ondersteund. Gebruik IE10+ of een andere browser.',
+ success: 'Upload succesvol',
+ fail: 'Upload mislukt',
+ preview: 'Voorbeeld',
+ btn: {
+ off: 'Annuleren',
+ close: 'Sluiten',
+ back: 'Terug',
+ save: 'Opslaan'
+ },
+ error: {
+ onlyImg: 'Alleen afbeeldingen',
+ outOfSize: 'De afbeelding is groter dan: ',
+ lowestPx: 'De afbeelding is te klein! Minimale afmetingen: '
+ }
+ },
+ tr: {
+ hint: 'Tıkla veya yüklemek istediğini buraya sürükle',
+ loading: 'Yükleniyor…',
+ noSupported: 'Tarayıcı desteklenmiyor, lütfen IE10+ veya farklı tarayıcı kullanın',
+ success: 'Yükleme başarılı',
+ fail: 'Yüklemede hata oluştu',
+ preview: 'Önizle',
+ btn: {
+ off: 'İptal',
+ close: 'Kapat',
+ back: 'Geri',
+ save: 'Kaydet'
+ },
+ error: {
+ onlyImg: 'Sadece resim',
+ outOfSize: 'Resim yükleme limitini aşıyor: ',
+ lowestPx: 'Resmin boyutu çok küçük. En az olması gereken: '
+ }
+ },
+ 'es-MX': {
+ hint: 'Selecciona o arrastra una imagen',
+ loading: 'Subiendo...',
+ noSupported: 'Tu navegador no es soportado, porfavor usa IE10+ u otros navegadores mas recientes',
+ success: 'Subido exitosamente',
+ fail: 'Sucedió un error',
+ preview: 'Vista previa',
+ btn: {
+ off: 'Cancelar',
+ close: 'Cerrar',
+ back: 'Atras',
+ save: 'Guardar'
+ },
+ error: {
+ onlyImg: 'Unicamente imagenes',
+ outOfSize: 'La imagen excede el tamaño maximo:',
+ lowestPx: 'La imagen es demasiado pequeño. Se espera por lo menos:'
+ }
+ },
+ de: {
+ hint: 'Klick hier oder zieh eine Datei hier rein zum Hochladen',
+ loading: 'Hochladen…',
+ noSupported: 'Browser wird nicht unterstützt, bitte verwende IE10+ oder andere Browser',
+ success: 'Upload erfolgreich',
+ fail: 'Upload fehlgeschlagen',
+ preview: 'Vorschau',
+ btn: {
+ off: 'Abbrechen',
+ close: 'Schließen',
+ back: 'Zurück',
+ save: 'Speichern'
+ },
+ error: {
+ onlyImg: 'Nur Bilder',
+ outOfSize: 'Das Bild ist zu groß: ',
+ lowestPx: 'Das Bild ist zu klein. Mindestens: '
+ }
+ },
+ ja: {
+ hint: 'クリック・ドラッグしてファイルをアップロード',
+ loading: 'アップロード中...',
+ noSupported: 'このブラウザは対応されていません。IE10+かその他の主要ブラウザをお使いください。',
+ success: 'アップロード成功',
+ fail: 'アップロード失敗',
+ preview: 'プレビュー',
+ btn: {
+ off: 'キャンセル',
+ close: '閉じる',
+ back: '戻る',
+ save: '保存'
+ },
+ error: {
+ onlyImg: '画像のみ',
+ outOfSize: '画像サイズが上限を超えています。上限: ',
+ lowestPx: '画像が小さすぎます。最小サイズ: '
+ }
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/mimes.js b/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/mimes.js
new file mode 100644
index 0000000000000000000000000000000000000000..e20c085ca318859ce609f0d2e53c0b47238ff092
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/ImageCropper/utils/mimes.js
@@ -0,0 +1,7 @@
+export default {
+ 'jpg': 'image/jpeg',
+ 'png': 'image/png',
+ 'gif': 'image/gif',
+ 'svg': 'image/svg+xml',
+ 'psd': 'image/photoshop'
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/JsonEditor/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/JsonEditor/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c05b090c3b45e78844a5316b79fb60df0e67ee51
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/JsonEditor/index.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Kanban/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Kanban/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..82f7dd7e05ba30410132789f879b1188586b788c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Kanban/index.vue
@@ -0,0 +1,99 @@
+
+
+
+ {{ headerText }}
+
+
+
+ {{ element.name }} {{ element.id }}
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/LangSelect/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/LangSelect/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..59a4674c8cec04318221853d37a1cd3205db85dc
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/LangSelect/index.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+ 中文
+
+
+ 英语|English
+
+
+ 西班牙语|Español
+
+
+ 日本語
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/MDinput/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/MDinput/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c59ea34a2d3c8d6a5539981714f6de9c8cb6b80c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/MDinput/index.vue
@@ -0,0 +1,360 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/default-options.js b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/default-options.js
new file mode 100644
index 0000000000000000000000000000000000000000..776ffc27528808bd2b3bc644a91568acdc8d1221
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/default-options.js
@@ -0,0 +1,31 @@
+// doc: https://nhnent.github.io/tui.editor/api/latest/ToastUIEditor.html#ToastUIEditor
+export default {
+ minHeight: '200px',
+ previewStyle: 'vertical',
+ useCommandShortcut: true,
+ useDefaultHTMLSanitizer: true,
+ usageStatistics: true,
+ hideModeSwitch: true,
+ toolbarItems: [
+ 'heading',
+ 'bold',
+ 'italic',
+ 'strike',
+ 'divider',
+ 'hr',
+ 'quote',
+ 'divider',
+ 'ul',
+ 'ol',
+ 'task',
+ 'indent',
+ 'outdent',
+ 'divider',
+ 'table',
+ 'image',
+ 'link',
+ 'divider',
+ 'code',
+ 'codeblock'
+ ]
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b76937c38dc9418e61ad86eb3d7f470f028bdbb5
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/MarkdownEditor/index.vue
@@ -0,0 +1,121 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Pagination/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Pagination/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c815e132ce2d5ccb63d4a9a9aed80841ec884633
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Pagination/index.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/PanThumb/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/PanThumb/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..16b18fa7773c483359ed0e3f9786690c79f36b7a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/PanThumb/index.vue
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/RightPanel/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/RightPanel/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..55e8c1e5c0a95c487dbe27b7851925e4e0ae1629
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/RightPanel/index.vue
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Screenfull/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Screenfull/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..260c90de51c1d9dab6586692c24905d31414524e
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Screenfull/index.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Share/DropdownMenu.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Share/DropdownMenu.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d194a517a8de97715c1ec641139fbaf7d3f7329c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Share/DropdownMenu.vue
@@ -0,0 +1,103 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/SizeSelect/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/SizeSelect/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e88065b49f0d1a17e202e14301df07127e94ced4
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/SizeSelect/index.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+ {{
+ item.label }}
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Sticky/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Sticky/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..97ce0e96b95899a9d511365c73391b4bed23200d
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Sticky/index.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/SvgIcon/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/SvgIcon/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b07ded2af39d367113e28f68ca581b74b2625718
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/SvgIcon/index.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/TextHoverEffect/Mallki.vue b/app/Modules/Admin/Resources/vue-element-admin/components/TextHoverEffect/Mallki.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f22af0986754a4af59015e9527b7196464b7c000
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/TextHoverEffect/Mallki.vue
@@ -0,0 +1,113 @@
+
+
+ {{ text }}
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/ThemePicker/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/ThemePicker/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b0df471ca48ccdbff699589ba864532eb9e819fc
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/ThemePicker/index.vue
@@ -0,0 +1,174 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/components/EditorImage.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/components/EditorImage.vue
new file mode 100644
index 0000000000000000000000000000000000000000..07d48e6cfda8c113904e4b382874fca190c9c5bb
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/components/EditorImage.vue
@@ -0,0 +1,111 @@
+
+
+
+ upload
+
+
+
+
+ Click upload
+
+
+
+ Cancel
+
+
+ Confirm
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/dynamicLoadScript.js b/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/dynamicLoadScript.js
new file mode 100644
index 0000000000000000000000000000000000000000..185f58dcedcdec86ac5b00e6a016c8479f5d73e2
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/dynamicLoadScript.js
@@ -0,0 +1,59 @@
+let callbacks = []
+
+function loadedTinymce() {
+ // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2144
+ // check is successfully downloaded script
+ return window.tinymce
+}
+
+const dynamicLoadScript = (src, callback) => {
+ const existingScript = document.getElementById(src)
+ const cb = callback || function() {}
+
+ if (!existingScript) {
+ const script = document.createElement('script')
+ script.src = src // src url for the third-party library being loaded.
+ script.id = src
+ document.body.appendChild(script)
+ callbacks.push(cb)
+ const onEnd = 'onload' in script ? stdOnEnd : ieOnEnd
+ onEnd(script)
+ }
+
+ if (existingScript && cb) {
+ if (loadedTinymce()) {
+ cb(null, existingScript)
+ } else {
+ callbacks.push(cb)
+ }
+ }
+
+ function stdOnEnd(script) {
+ script.onload = function() {
+ // this.onload = null here is necessary
+ // because even IE9 works not like others
+ this.onerror = this.onload = null
+ for (const cb of callbacks) {
+ cb(null, script)
+ }
+ callbacks = null
+ }
+ script.onerror = function() {
+ this.onerror = this.onload = null
+ cb(new Error('Failed to load ' + src), script)
+ }
+ }
+
+ function ieOnEnd(script) {
+ script.onreadystatechange = function() {
+ if (this.readyState !== 'complete' && this.readyState !== 'loaded') return
+ this.onreadystatechange = null
+ for (const cb of callbacks) {
+ cb(null, script) // there is no way to catch loading errors in IE8
+ }
+ callbacks = null
+ }
+ }
+}
+
+export default dynamicLoadScript
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..718ce73e757e7c8b1eb47a02f3a2451f0b017fe2
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/index.vue
@@ -0,0 +1,254 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/plugins.js b/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/plugins.js
new file mode 100644
index 0000000000000000000000000000000000000000..058d2aef744cdca31983512519441a578a21d45e
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/plugins.js
@@ -0,0 +1,7 @@
+// Any plugins you want to use has to be imported
+// Detail plugins list see https://www.tinymce.com/docs/plugins/
+// Custom builds see https://www.tinymce.com/download/custom-builds/
+
+const plugins = ['advlist anchor autolink autosave code codesample colorpicker colorpicker contextmenu directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textcolor textpattern visualblocks visualchars wordcount']
+
+export default plugins
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/toolbar.js b/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/toolbar.js
new file mode 100644
index 0000000000000000000000000000000000000000..4f8a5450aa6d23a45ca06220a3563b1f695eb8c8
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Tinymce/toolbar.js
@@ -0,0 +1,6 @@
+// Here is a list of the toolbar
+// Detail list see https://www.tinymce.com/docs/advanced/editor-control-identifiers/#toolbarcontrols
+
+const toolbar = ['searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote undo redo removeformat subscript superscript code codesample', 'hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen']
+
+export default toolbar
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Upload/SingleImage.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Upload/SingleImage.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d16bbf37ae20fa0679875f10a1450a1a43cc5506
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Upload/SingleImage.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+ 将文件拖到此处,或点击上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Upload/SingleImage2.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Upload/SingleImage2.vue
new file mode 100644
index 0000000000000000000000000000000000000000..07637a9e2e9dcbc05ef1f9a7a4d6eeb1155e72a5
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Upload/SingleImage2.vue
@@ -0,0 +1,130 @@
+
+
+
+
+
+ Drag或点击上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Upload/SingleImage3.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Upload/SingleImage3.vue
new file mode 100644
index 0000000000000000000000000000000000000000..6300da4bd44752186c53f5ff448a3206a35ebcba
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Upload/SingleImage3.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+ 将文件拖到此处,或点击上传
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/UploadExcel/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/UploadExcel/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9e8ba8b6420a776f895f57481b3cfbd735772a24
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/UploadExcel/index.vue
@@ -0,0 +1,138 @@
+
+
+
+
+ Drop excel file here or
+
+ Browse
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/index.vue b/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c9c339d17a498751abb010a883bc406f5c5fea94
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/index.vue
@@ -0,0 +1,1643 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ lang.hint }}
+ {{ lang.noSupported }}
+
+
+
+ {{ errorMsg }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ↻
+
+
+
+
+
+
+
{{ lang.preview }}
+
+
+
+
{{ lang.preview }}
+
+
+
+
+
+
+
+
+
+
{{ lang.loading }}
+
+
+
+
+ {{ errorMsg }}
+
+
+ {{ lang.success }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/data2blob.js b/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/data2blob.js
new file mode 100644
index 0000000000000000000000000000000000000000..9c47f8af5328686c427acf090c3e7eba96ec2765
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/data2blob.js
@@ -0,0 +1,19 @@
+/**
+ * database64文件格式转换为2进制
+ *
+ * @param {[String]} data dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了
+ * @param {[String]} mime [description]
+ * @return {[blob]} [description]
+ */
+export default function(data, mime) {
+ data = data.split(',')[1]
+ data = window.atob(data)
+ var ia = new Uint8Array(data.length)
+ for (var i = 0; i < data.length; i++) {
+ ia[i] = data.charCodeAt(i)
+ }
+ // canvas.toDataURL 返回的默认格式就是 image/png
+ return new Blob([ia], {
+ type: mime
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/effectRipple.js b/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/effectRipple.js
new file mode 100644
index 0000000000000000000000000000000000000000..46a01640a1e9eed6d2d81c87d9bf96b858c77271
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/effectRipple.js
@@ -0,0 +1,39 @@
+/**
+ * 点击波纹效果
+ *
+ * @param {[event]} e [description]
+ * @param {[Object]} arg_opts [description]
+ * @return {[bollean]} [description]
+ */
+export default function(e, arg_opts) {
+ var opts = Object.assign({
+ ele: e.target, // 波纹作用元素
+ type: 'hit', // hit点击位置扩散center中心点扩展
+ bgc: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
+ }, arg_opts)
+ var target = opts.ele
+ if (target) {
+ var rect = target.getBoundingClientRect()
+ var ripple = target.querySelector('.e-ripple')
+ if (!ripple) {
+ ripple = document.createElement('span')
+ ripple.className = 'e-ripple'
+ ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'
+ target.appendChild(ripple)
+ } else {
+ ripple.className = 'e-ripple'
+ }
+ switch (opts.type) {
+ case 'center':
+ ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px'
+ ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px'
+ break
+ default:
+ ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.body.scrollTop) + 'px'
+ ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.body.scrollLeft) + 'px'
+ }
+ ripple.style.backgroundColor = opts.bgc
+ ripple.className = 'e-ripple z-active'
+ return false
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/language.js b/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/language.js
new file mode 100644
index 0000000000000000000000000000000000000000..727872d96f4c2d054a4bc47108a93e6b0d44b379
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/language.js
@@ -0,0 +1,232 @@
+export default {
+ zh: {
+ hint: '点击,或拖动图片至此处',
+ loading: '正在上传……',
+ noSupported: '浏览器不支持该功能,请使用IE10以上或其他现在浏览器!',
+ success: '上传成功',
+ fail: '图片上传失败',
+ preview: '头像预览',
+ btn: {
+ off: '取消',
+ close: '关闭',
+ back: '上一步',
+ save: '保存'
+ },
+ error: {
+ onlyImg: '仅限图片格式',
+ outOfSize: '单文件大小不能超过 ',
+ lowestPx: '图片最低像素为(宽*高):'
+ }
+ },
+ 'zh-tw': {
+ hint: '點擊,或拖動圖片至此處',
+ loading: '正在上傳……',
+ noSupported: '瀏覽器不支持該功能,請使用IE10以上或其他現代瀏覽器!',
+ success: '上傳成功',
+ fail: '圖片上傳失敗',
+ preview: '頭像預覽',
+ btn: {
+ off: '取消',
+ close: '關閉',
+ back: '上一步',
+ save: '保存'
+ },
+ error: {
+ onlyImg: '僅限圖片格式',
+ outOfSize: '單文件大小不能超過 ',
+ lowestPx: '圖片最低像素為(寬*高):'
+ }
+ },
+ en: {
+ hint: 'Click or drag the file here to upload',
+ loading: 'Uploading…',
+ noSupported: 'Browser is not supported, please use IE10+ or other browsers',
+ success: 'Upload success',
+ fail: 'Upload failed',
+ preview: 'Preview',
+ btn: {
+ off: 'Cancel',
+ close: 'Close',
+ back: 'Back',
+ save: 'Save'
+ },
+ error: {
+ onlyImg: 'Image only',
+ outOfSize: 'Image exceeds size limit: ',
+ lowestPx: 'Image\'s size is too low. Expected at least: '
+ }
+ },
+ ro: {
+ hint: 'Atinge sau trage fișierul aici',
+ loading: 'Se încarcă',
+ noSupported: 'Browser-ul tău nu suportă acest feature. Te rugăm încearcă cu alt browser.',
+ success: 'S-a încărcat cu succes',
+ fail: 'A apărut o problemă la încărcare',
+ preview: 'Previzualizează',
+
+ btn: {
+ off: 'Anulează',
+ close: 'Închide',
+ back: 'Înapoi',
+ save: 'Salvează'
+ },
+
+ error: {
+ onlyImg: 'Doar imagini',
+ outOfSize: 'Imaginea depășește limita de: ',
+ loewstPx: 'Imaginea este prea mică; Minim: '
+ }
+ },
+ ru: {
+ hint: 'Нажмите, или перетащите файл в это окно',
+ loading: 'Загружаю……',
+ noSupported: 'Ваш браузер не поддерживается, пожалуйста, используйте IE10 + или другие браузеры',
+ success: 'Загрузка выполнена успешно',
+ fail: 'Ошибка загрузки',
+ preview: 'Предпросмотр',
+ btn: {
+ off: 'Отменить',
+ close: 'Закрыть',
+ back: 'Назад',
+ save: 'Сохранить'
+ },
+ error: {
+ onlyImg: 'Только изображения',
+ outOfSize: 'Изображение превышает предельный размер: ',
+ lowestPx: 'Минимальный размер изображения: '
+ }
+ },
+ 'pt-br': {
+ hint: 'Clique ou arraste o arquivo aqui para carregar',
+ loading: 'Carregando…',
+ noSupported: 'Browser não suportado, use o IE10+ ou outro browser',
+ success: 'Sucesso ao carregar imagem',
+ fail: 'Falha ao carregar imagem',
+ preview: 'Pré-visualizar',
+ btn: {
+ off: 'Cancelar',
+ close: 'Fechar',
+ back: 'Voltar',
+ save: 'Salvar'
+ },
+ error: {
+ onlyImg: 'Apenas imagens',
+ outOfSize: 'A imagem excede o limite de tamanho: ',
+ lowestPx: 'O tamanho da imagem é muito pequeno. Tamanho mínimo: '
+ }
+ },
+ fr: {
+ hint: 'Cliquez ou glissez le fichier ici.',
+ loading: 'Téléchargement…',
+ noSupported: 'Votre navigateur n\'est pas supporté. Utilisez IE10 + ou un autre navigateur s\'il vous plaît.',
+ success: 'Téléchargement réussit',
+ fail: 'Téléchargement echoué',
+ preview: 'Aperçu',
+ btn: {
+ off: 'Annuler',
+ close: 'Fermer',
+ back: 'Retour',
+ save: 'Enregistrer'
+ },
+ error: {
+ onlyImg: 'Image uniquement',
+ outOfSize: 'L\'image sélectionnée dépasse la taille maximum: ',
+ lowestPx: 'L\'image sélectionnée est trop petite. Dimensions attendues: '
+ }
+ },
+ nl: {
+ hint: 'Klik hier of sleep een afbeelding in dit vlak',
+ loading: 'Uploaden…',
+ noSupported: 'Je browser wordt helaas niet ondersteund. Gebruik IE10+ of een andere browser.',
+ success: 'Upload succesvol',
+ fail: 'Upload mislukt',
+ preview: 'Voorbeeld',
+ btn: {
+ off: 'Annuleren',
+ close: 'Sluiten',
+ back: 'Terug',
+ save: 'Opslaan'
+ },
+ error: {
+ onlyImg: 'Alleen afbeeldingen',
+ outOfSize: 'De afbeelding is groter dan: ',
+ lowestPx: 'De afbeelding is te klein! Minimale afmetingen: '
+ }
+ },
+ tr: {
+ hint: 'Tıkla veya yüklemek istediğini buraya sürükle',
+ loading: 'Yükleniyor…',
+ noSupported: 'Tarayıcı desteklenmiyor, lütfen IE10+ veya farklı tarayıcı kullanın',
+ success: 'Yükleme başarılı',
+ fail: 'Yüklemede hata oluştu',
+ preview: 'Önizle',
+ btn: {
+ off: 'İptal',
+ close: 'Kapat',
+ back: 'Geri',
+ save: 'Kaydet'
+ },
+ error: {
+ onlyImg: 'Sadece resim',
+ outOfSize: 'Resim yükleme limitini aşıyor: ',
+ lowestPx: 'Resmin boyutu çok küçük. En az olması gereken: '
+ }
+ },
+ 'es-MX': {
+ hint: 'Selecciona o arrastra una imagen',
+ loading: 'Subiendo...',
+ noSupported: 'Tu navegador no es soportado, porfavor usa IE10+ u otros navegadores mas recientes',
+ success: 'Subido exitosamente',
+ fail: 'Sucedió un error',
+ preview: 'Vista previa',
+ btn: {
+ off: 'Cancelar',
+ close: 'Cerrar',
+ back: 'Atras',
+ save: 'Guardar'
+ },
+ error: {
+ onlyImg: 'Unicamente imagenes',
+ outOfSize: 'La imagen excede el tamaño maximo:',
+ lowestPx: 'La imagen es demasiado pequeño. Se espera por lo menos:'
+ }
+ },
+ de: {
+ hint: 'Klick hier oder zieh eine Datei hier rein zum Hochladen',
+ loading: 'Hochladen…',
+ noSupported: 'Browser wird nicht unterstützt, bitte verwende IE10+ oder andere Browser',
+ success: 'Upload erfolgreich',
+ fail: 'Upload fehlgeschlagen',
+ preview: 'Vorschau',
+ btn: {
+ off: 'Abbrechen',
+ close: 'Schließen',
+ back: 'Zurück',
+ save: 'Speichern'
+ },
+ error: {
+ onlyImg: 'Nur Bilder',
+ outOfSize: 'Das Bild ist zu groß: ',
+ lowestPx: 'Das Bild ist zu klein. Mindestens: '
+ }
+ },
+ ja: {
+ hint: 'クリック・ドラッグしてファイルをアップロード',
+ loading: 'アップロード中...',
+ noSupported: 'このブラウザは対応されていません。IE10+かその他の主要ブラウザをお使いください。',
+ success: 'アップロード成功',
+ fail: 'アップロード失敗',
+ preview: 'プレビュー',
+ btn: {
+ off: 'キャンセル',
+ close: '閉じる',
+ back: '戻る',
+ save: '保存'
+ },
+ error: {
+ onlyImg: '画像のみ',
+ outOfSize: '画像サイズが上限を超えています。上限: ',
+ lowestPx: '画像が小さすぎます。最小サイズ: '
+ }
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/mimes.js b/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/mimes.js
new file mode 100644
index 0000000000000000000000000000000000000000..e20c085ca318859ce609f0d2e53c0b47238ff092
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/components/Uploads/image/utils/mimes.js
@@ -0,0 +1,7 @@
+export default {
+ 'jpg': 'image/jpeg',
+ 'png': 'image/png',
+ 'gif': 'image/gif',
+ 'svg': 'image/svg+xml',
+ 'psd': 'image/photoshop'
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/clipboard/clipboard.js b/app/Modules/Admin/Resources/vue-element-admin/directive/clipboard/clipboard.js
new file mode 100644
index 0000000000000000000000000000000000000000..514aad20d408f0344ac77bbfcf8e2e56fc249476
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/clipboard/clipboard.js
@@ -0,0 +1,49 @@
+// Inspired by https://github.com/Inndy/vue-clipboard2
+const Clipboard = require('clipboard')
+if (!Clipboard) {
+ throw new Error('you should npm install `clipboard` --save at first ')
+}
+
+export default {
+ bind(el, binding) {
+ if (binding.arg === 'success') {
+ el._v_clipboard_success = binding.value
+ } else if (binding.arg === 'error') {
+ el._v_clipboard_error = binding.value
+ } else {
+ const clipboard = new Clipboard(el, {
+ text() { return binding.value },
+ action() { return binding.arg === 'cut' ? 'cut' : 'copy' }
+ })
+ clipboard.on('success', e => {
+ const callback = el._v_clipboard_success
+ callback && callback(e) // eslint-disable-line
+ })
+ clipboard.on('error', e => {
+ const callback = el._v_clipboard_error
+ callback && callback(e) // eslint-disable-line
+ })
+ el._v_clipboard = clipboard
+ }
+ },
+ update(el, binding) {
+ if (binding.arg === 'success') {
+ el._v_clipboard_success = binding.value
+ } else if (binding.arg === 'error') {
+ el._v_clipboard_error = binding.value
+ } else {
+ el._v_clipboard.text = function() { return binding.value }
+ el._v_clipboard.action = function() { return binding.arg === 'cut' ? 'cut' : 'copy' }
+ }
+ },
+ unbind(el, binding) {
+ if (binding.arg === 'success') {
+ delete el._v_clipboard_success
+ } else if (binding.arg === 'error') {
+ delete el._v_clipboard_error
+ } else {
+ el._v_clipboard.destroy()
+ delete el._v_clipboard
+ }
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/clipboard/index.js b/app/Modules/Admin/Resources/vue-element-admin/directive/clipboard/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..02c98163f40b9dc1603717026d9b03639546c81e
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/clipboard/index.js
@@ -0,0 +1,13 @@
+import Clipboard from './clipboard'
+
+const install = function(Vue) {
+ Vue.directive('Clipboard', Clipboard)
+}
+
+if (window.Vue) {
+ window.clipboard = Clipboard
+ Vue.use(install); // eslint-disable-line
+}
+
+Clipboard.install = install
+export default Clipboard
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/el-drag-dialog/drag.js b/app/Modules/Admin/Resources/vue-element-admin/directive/el-drag-dialog/drag.js
new file mode 100644
index 0000000000000000000000000000000000000000..299e9854400aa55f20e1cca8f9f862c6b249be8a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/el-drag-dialog/drag.js
@@ -0,0 +1,77 @@
+export default {
+ bind(el, binding, vnode) {
+ const dialogHeaderEl = el.querySelector('.el-dialog__header')
+ const dragDom = el.querySelector('.el-dialog')
+ dialogHeaderEl.style.cssText += ';cursor:move;'
+ dragDom.style.cssText += ';top:0px;'
+
+ // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
+ const getStyle = (function() {
+ if (window.document.currentStyle) {
+ return (dom, attr) => dom.currentStyle[attr]
+ } else {
+ return (dom, attr) => getComputedStyle(dom, false)[attr]
+ }
+ })()
+
+ dialogHeaderEl.onmousedown = (e) => {
+ // 鼠标按下,计算当前元素距离可视区的距离
+ const disX = e.clientX - dialogHeaderEl.offsetLeft
+ const disY = e.clientY - dialogHeaderEl.offsetTop
+
+ const dragDomWidth = dragDom.offsetWidth
+ const dragDomHeight = dragDom.offsetHeight
+
+ const screenWidth = document.body.clientWidth
+ const screenHeight = document.body.clientHeight
+
+ const minDragDomLeft = dragDom.offsetLeft
+ const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth
+
+ const minDragDomTop = dragDom.offsetTop
+ const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight
+
+ // 获取到的值带px 正则匹配替换
+ let styL = getStyle(dragDom, 'left')
+ let styT = getStyle(dragDom, 'top')
+
+ if (styL.includes('%')) {
+ styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100)
+ styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100)
+ } else {
+ styL = +styL.replace(/\px/g, '')
+ styT = +styT.replace(/\px/g, '')
+ }
+
+ document.onmousemove = function(e) {
+ // 通过事件委托,计算移动的距离
+ let left = e.clientX - disX
+ let top = e.clientY - disY
+
+ // 边界处理
+ if (-(left) > minDragDomLeft) {
+ left = -minDragDomLeft
+ } else if (left > maxDragDomLeft) {
+ left = maxDragDomLeft
+ }
+
+ if (-(top) > minDragDomTop) {
+ top = -minDragDomTop
+ } else if (top > maxDragDomTop) {
+ top = maxDragDomTop
+ }
+
+ // 移动当前元素
+ dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
+
+ // emit onDrag event
+ vnode.child.$emit('dragDialog')
+ }
+
+ document.onmouseup = function(e) {
+ document.onmousemove = null
+ document.onmouseup = null
+ }
+ }
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/el-drag-dialog/index.js b/app/Modules/Admin/Resources/vue-element-admin/directive/el-drag-dialog/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..29facbfb3e9584bf0cca58619ffd77da963deb82
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/el-drag-dialog/index.js
@@ -0,0 +1,13 @@
+import drag from './drag'
+
+const install = function(Vue) {
+ Vue.directive('el-drag-dialog', drag)
+}
+
+if (window.Vue) {
+ window['el-drag-dialog'] = drag
+ Vue.use(install); // eslint-disable-line
+}
+
+drag.install = install
+export default drag
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/el-table/adaptive.js b/app/Modules/Admin/Resources/vue-element-admin/directive/el-table/adaptive.js
new file mode 100644
index 0000000000000000000000000000000000000000..d229e9fd9b421e333370367502a49d597e601b47
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/el-table/adaptive.js
@@ -0,0 +1,41 @@
+import { addResizeListener, removeResizeListener } from 'element-ui/src/utils/resize-event'
+
+/**
+ * How to use
+ * ...
+ * el-table height is must be set
+ * bottomOffset: 30(default) // The height of the table from the bottom of the page.
+ */
+
+const doResize = (el, binding, vnode) => {
+ const { componentInstance: $table } = vnode
+
+ const { value } = binding
+
+ if (!$table.height) {
+ throw new Error(`el-$table must set the height. Such as height='100px'`)
+ }
+ const bottomOffset = (value && value.bottomOffset) || 30
+
+ if (!$table) return
+
+ const height = window.innerHeight - el.getBoundingClientRect().top - bottomOffset
+ $table.layout.setHeight(height)
+ $table.doLayout()
+}
+
+export default {
+ bind(el, binding, vnode) {
+ el.resizeListener = () => {
+ doResize(el, binding, vnode)
+ }
+ // parameter 1 is must be "Element" type
+ addResizeListener(window.document.body, el.resizeListener)
+ },
+ inserted(el, binding, vnode) {
+ doResize(el, binding, vnode)
+ },
+ unbind(el) {
+ removeResizeListener(window.document.body, el.resizeListener)
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/el-table/index.js b/app/Modules/Admin/Resources/vue-element-admin/directive/el-table/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..d3d45150cec3f588d756028057da1213f28eb1d2
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/el-table/index.js
@@ -0,0 +1,13 @@
+import adaptive from './adaptive'
+
+const install = function(Vue) {
+ Vue.directive('el-height-adaptive-table', adaptive)
+}
+
+if (window.Vue) {
+ window['el-height-adaptive-table'] = adaptive
+ Vue.use(install); // eslint-disable-line
+}
+
+adaptive.install = install
+export default adaptive
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/permission/index.js b/app/Modules/Admin/Resources/vue-element-admin/directive/permission/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5dadd36ad275c37bd278d4f37fa177e2d7c266a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/permission/index.js
@@ -0,0 +1,13 @@
+import permission from './permission'
+
+const install = function(Vue) {
+ Vue.directive('permission', permission)
+}
+
+if (window.Vue) {
+ window['permission'] = permission
+ Vue.use(install); // eslint-disable-line
+}
+
+permission.install = install
+export default permission
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/permission/permission.js b/app/Modules/Admin/Resources/vue-element-admin/directive/permission/permission.js
new file mode 100644
index 0000000000000000000000000000000000000000..49d1f889680e85d3f02d8783ff72d609fe07fa8a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/permission/permission.js
@@ -0,0 +1,31 @@
+import store from '@/store'
+
+function checkPermission(el, binding) {
+ const { value } = binding
+ const roles = store.getters && store.getters.roles
+
+ if (value && value instanceof Array) {
+ if (value.length > 0) {
+ const permissionRoles = value
+
+ const hasPermission = roles.some(role => {
+ return permissionRoles.includes(role)
+ })
+
+ if (!hasPermission) {
+ el.parentNode && el.parentNode.removeChild(el)
+ }
+ }
+ } else {
+ throw new Error(`need roles! Like v-permission="['admin','editor']"`)
+ }
+}
+
+export default {
+ inserted(el, binding) {
+ checkPermission(el, binding)
+ },
+ update(el, binding) {
+ checkPermission(el, binding)
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/sticky.js b/app/Modules/Admin/Resources/vue-element-admin/directive/sticky.js
new file mode 100644
index 0000000000000000000000000000000000000000..bc2346607e026e792004ddc3eb6c2a2735ef0d7e
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/sticky.js
@@ -0,0 +1,91 @@
+const vueSticky = {}
+let listenAction
+vueSticky.install = Vue => {
+ Vue.directive('sticky', {
+ inserted(el, binding) {
+ const params = binding.value || {}
+ const stickyTop = params.stickyTop || 0
+ const zIndex = params.zIndex || 1000
+ const elStyle = el.style
+
+ elStyle.position = '-webkit-sticky'
+ elStyle.position = 'sticky'
+ // if the browser support css sticky(Currently Safari, Firefox and Chrome Canary)
+ // if (~elStyle.position.indexOf('sticky')) {
+ // elStyle.top = `${stickyTop}px`;
+ // elStyle.zIndex = zIndex;
+ // return
+ // }
+ const elHeight = el.getBoundingClientRect().height
+ const elWidth = el.getBoundingClientRect().width
+ elStyle.cssText = `top: ${stickyTop}px; z-index: ${zIndex}`
+
+ const parentElm = el.parentNode || document.documentElement
+ const placeholder = document.createElement('div')
+ placeholder.style.display = 'none'
+ placeholder.style.width = `${elWidth}px`
+ placeholder.style.height = `${elHeight}px`
+ parentElm.insertBefore(placeholder, el)
+
+ let active = false
+
+ const getScroll = (target, top) => {
+ const prop = top ? 'pageYOffset' : 'pageXOffset'
+ const method = top ? 'scrollTop' : 'scrollLeft'
+ let ret = target[prop]
+ if (typeof ret !== 'number') {
+ ret = window.document.documentElement[method]
+ }
+ return ret
+ }
+
+ const sticky = () => {
+ if (active) {
+ return
+ }
+ if (!elStyle.height) {
+ elStyle.height = `${el.offsetHeight}px`
+ }
+
+ elStyle.position = 'fixed'
+ elStyle.width = `${elWidth}px`
+ placeholder.style.display = 'inline-block'
+ active = true
+ }
+
+ const reset = () => {
+ if (!active) {
+ return
+ }
+
+ elStyle.position = ''
+ placeholder.style.display = 'none'
+ active = false
+ }
+
+ const check = () => {
+ const scrollTop = getScroll(window, true)
+ const offsetTop = el.getBoundingClientRect().top
+ if (offsetTop < stickyTop) {
+ sticky()
+ } else {
+ if (scrollTop < elHeight + stickyTop) {
+ reset()
+ }
+ }
+ }
+ listenAction = () => {
+ check()
+ }
+
+ window.addEventListener('scroll', listenAction)
+ },
+
+ unbind() {
+ window.removeEventListener('scroll', listenAction)
+ }
+ })
+}
+
+export default vueSticky
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/waves/index.js b/app/Modules/Admin/Resources/vue-element-admin/directive/waves/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..65f9b3084c2a1f02c1a91f4814fa95b82106ae8d
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/waves/index.js
@@ -0,0 +1,13 @@
+import waves from './waves'
+
+const install = function(Vue) {
+ Vue.directive('waves', waves)
+}
+
+if (window.Vue) {
+ window.waves = waves
+ Vue.use(install); // eslint-disable-line
+}
+
+waves.install = install
+export default waves
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/waves/waves.css b/app/Modules/Admin/Resources/vue-element-admin/directive/waves/waves.css
new file mode 100644
index 0000000000000000000000000000000000000000..af7a7efd9f1a0d239a34906c4a49eb2200df55c2
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/waves/waves.css
@@ -0,0 +1,26 @@
+.waves-ripple {
+ position: absolute;
+ border-radius: 100%;
+ background-color: rgba(0, 0, 0, 0.15);
+ background-clip: padding-box;
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-transform: scale(0);
+ -ms-transform: scale(0);
+ transform: scale(0);
+ opacity: 1;
+}
+
+.waves-ripple.z-active {
+ opacity: 0;
+ -webkit-transform: scale(2);
+ -ms-transform: scale(2);
+ transform: scale(2);
+ -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
+ transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
+ transition: opacity 1.2s ease-out, transform 0.6s ease-out;
+ transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out;
+}
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/directive/waves/waves.js b/app/Modules/Admin/Resources/vue-element-admin/directive/waves/waves.js
new file mode 100644
index 0000000000000000000000000000000000000000..ec2ff439f77d4815eda95f2259830c7bb057099b
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/directive/waves/waves.js
@@ -0,0 +1,72 @@
+import './waves.css'
+
+const context = '@@wavesContext'
+
+function handleClick(el, binding) {
+ function handle(e) {
+ const customOpts = Object.assign({}, binding.value)
+ const opts = Object.assign({
+ ele: el, // 波纹作用元素
+ type: 'hit', // hit 点击位置扩散 center中心点扩展
+ color: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
+ },
+ customOpts
+ )
+ const target = opts.ele
+ if (target) {
+ target.style.position = 'relative'
+ target.style.overflow = 'hidden'
+ const rect = target.getBoundingClientRect()
+ let ripple = target.querySelector('.waves-ripple')
+ if (!ripple) {
+ ripple = document.createElement('span')
+ ripple.className = 'waves-ripple'
+ ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'
+ target.appendChild(ripple)
+ } else {
+ ripple.className = 'waves-ripple'
+ }
+ switch (opts.type) {
+ case 'center':
+ ripple.style.top = rect.height / 2 - ripple.offsetHeight / 2 + 'px'
+ ripple.style.left = rect.width / 2 - ripple.offsetWidth / 2 + 'px'
+ break
+ default:
+ ripple.style.top =
+ (e.pageY - rect.top - ripple.offsetHeight / 2 - document.documentElement.scrollTop ||
+ document.body.scrollTop) + 'px'
+ ripple.style.left =
+ (e.pageX - rect.left - ripple.offsetWidth / 2 - document.documentElement.scrollLeft ||
+ document.body.scrollLeft) + 'px'
+ }
+ ripple.style.backgroundColor = opts.color
+ ripple.className = 'waves-ripple z-active'
+ return false
+ }
+ }
+
+ if (!el[context]) {
+ el[context] = {
+ removeHandle: handle
+ }
+ } else {
+ el[context].removeHandle = handle
+ }
+
+ return handle
+}
+
+export default {
+ bind(el, binding) {
+ el.addEventListener('click', handleClick(el, binding), false)
+ },
+ update(el, binding) {
+ el.removeEventListener('click', el[context].removeHandle, false)
+ el.addEventListener('click', handleClick(el, binding), false)
+ },
+ unbind(el) {
+ el.removeEventListener('click', el[context].removeHandle, false)
+ el[context] = null
+ delete el[context]
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/filters/index.js b/app/Modules/Admin/Resources/vue-element-admin/filters/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..98222339daf144ba52b587a931d463c915799512
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/filters/index.js
@@ -0,0 +1,68 @@
+// import parseTime, formatTime and set to filter
+export { parseTime, formatTime } from '@/utils'
+
+/**
+ * Show plural label if time is plural number
+ * @param {number} time
+ * @param {string} label
+ * @return {string}
+ */
+function pluralize(time, label) {
+ if (time === 1) {
+ return time + label
+ }
+ return time + label + 's'
+}
+
+/**
+ * @param {number} time
+ */
+export function timeAgo(time) {
+ const between = Date.now() / 1000 - Number(time)
+ if (between < 3600) {
+ return pluralize(~~(between / 60), ' minute')
+ } else if (between < 86400) {
+ return pluralize(~~(between / 3600), ' hour')
+ } else {
+ return pluralize(~~(between / 86400), ' day')
+ }
+}
+
+/**
+ * Number formatting
+ * like 10000 => 10k
+ * @param {number} num
+ * @param {number} digits
+ */
+export function numberFormatter(num, digits) {
+ const si = [
+ { value: 1E18, symbol: 'E' },
+ { value: 1E15, symbol: 'P' },
+ { value: 1E12, symbol: 'T' },
+ { value: 1E9, symbol: 'G' },
+ { value: 1E6, symbol: 'M' },
+ { value: 1E3, symbol: 'k' }
+ ]
+ for (let i = 0; i < si.length; i++) {
+ if (num >= si[i].value) {
+ return (num / si[i].value).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, '$1') + si[i].symbol
+ }
+ }
+ return num.toString()
+}
+
+/**
+ * 10000 => "10,000"
+ * @param {number} num
+ */
+export function toThousandFilter(num) {
+ return (+num || 0).toString().replace(/^-?\d+/g, m => m.replace(/(?=(?!\b)(\d{3})+$)/g, ','))
+}
+
+/**
+ * Upper case first char
+ * @param {String} string
+ */
+export function uppercaseFirst(string) {
+ return string.charAt(0).toUpperCase() + string.slice(1)
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/index.js b/app/Modules/Admin/Resources/vue-element-admin/icons/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..2c6b309c96cc2e43761a691860858f232f6d5d1a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/index.js
@@ -0,0 +1,9 @@
+import Vue from 'vue'
+import SvgIcon from '@/components/SvgIcon'// svg component
+
+// register globally
+Vue.component('svg-icon', SvgIcon)
+
+const req = require.context('./svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys().map(requireContext)
+requireAll(req)
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/404.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/404.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6df50190aab43bd3a727b580fe2699ba36a4712c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/404.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/admin.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/admin.svg
new file mode 100644
index 0000000000000000000000000000000000000000..66b718bb60446ff15c3a2c0285f81d6b648bd226
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/admin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/bug.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/bug.svg
new file mode 100644
index 0000000000000000000000000000000000000000..05a150dc3905ef7516e1b57b32bc49510c0f8763
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/bug.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/chart.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/chart.svg
new file mode 100644
index 0000000000000000000000000000000000000000..27728fb0baae52c4430ef9d0332d1f0bbedaa564
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/chart.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/clipboard.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/clipboard.svg
new file mode 100644
index 0000000000000000000000000000000000000000..90923ff6282ec6aa403936bbe44b68e134cb9bcf
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/clipboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/comment.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/comment.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0443bc36db6a9f749913b7c54a898816592cb0e0
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/comment.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/component.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/component.svg
new file mode 100644
index 0000000000000000000000000000000000000000..207ada34f2143df86fc79f5b207ed2140311c54b
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/component.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/create-user.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/create-user.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e3335669d51b515f2348003ed96c2204e0a716b7
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/create-user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/dashboard.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/dashboard.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5317d37029218281b4da78eccf40ce9e94941301
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/dashboard.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/documentation.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/documentation.svg
new file mode 100644
index 0000000000000000000000000000000000000000..704312289e6ad2f65a3ace229e73fb5c7f3e94e9
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/documentation.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/dollar.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/dollar.svg
new file mode 100644
index 0000000000000000000000000000000000000000..33f56f7167170fa93e100396461aa655da841c50
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/dollar.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/drag.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/drag.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4185d3cee36930abb40838829058537388cc6dc6
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/drag.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/edit.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/edit.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d26101f29893ee07c575d62caf1d0d684e76b3bc
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/edit.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/education.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/education.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6b38510f07528ad2a723720fdd96f4dae93a4c42
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/education.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/email.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/email.svg
new file mode 100644
index 0000000000000000000000000000000000000000..74d25e21a6f98b90b34b2b8d2ce2dd90b38eb000
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/email.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/example.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/example.svg
new file mode 100644
index 0000000000000000000000000000000000000000..46f42b5323d11686c44b573729db0df115343d5c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/example.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/excel.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/excel.svg
new file mode 100644
index 0000000000000000000000000000000000000000..74d97b802f8bf84caf4c623e77f890f74516d50f
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/excel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/exit-fullscreen.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/exit-fullscreen.svg
new file mode 100644
index 0000000000000000000000000000000000000000..485c128b6133188ae755c275a1c667634e4129b6
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/exit-fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/eye-open.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/eye-open.svg
new file mode 100644
index 0000000000000000000000000000000000000000..88dcc98e6c80d145e3807f00a6e5ed91ce5371e4
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/eye-open.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/eye.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/eye.svg
new file mode 100644
index 0000000000000000000000000000000000000000..16ed2d872d1cadeb36fc9101cbf77397fbf4fd70
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/eye.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/form.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/form.svg
new file mode 100644
index 0000000000000000000000000000000000000000..dcbaa185a845cdf01a7fdfb849c224ce9c4af011
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/form.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/fullscreen.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/fullscreen.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0e86b6fa803dbe964cae74f4432622d435b007bf
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/fullscreen.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/guide 2.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/guide 2.svg
new file mode 100644
index 0000000000000000000000000000000000000000..d053bd73000b95c9c3242ab79396082625abebfc
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/guide 2.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/guide.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/guide.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b2710017933e9088e002873cde651bac54cea449
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/guide.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/icon.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/icon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..82be8eeedb3d3cc9161f4a4094ac20d2f91e3970
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/international.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/international.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e9b56eee2c59774f0431186b9af2ba7593bffcc0
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/international.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/language.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/language.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0082b577ab28523f353fa71c00cb338446b2bb9c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/language.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/layout.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/layout.svg
new file mode 100644
index 0000000000000000000000000000000000000000..fcc966d4d573c792a05a1019726f2300f595d788
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/layout.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/like.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/like.svg
new file mode 100644
index 0000000000000000000000000000000000000000..cf172a4572ade04da9a77f9ac598aa3b0c493cd0
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/like.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/link.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/link.svg
new file mode 100644
index 0000000000000000000000000000000000000000..48197ba4da7b4314a16a19a698fe96c1b2a7ad0b
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/list.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/list.svg
new file mode 100644
index 0000000000000000000000000000000000000000..20259eddb7c0cf77efe9cb1c561d2df8961094f5
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/list.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/lock.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/lock.svg
new file mode 100644
index 0000000000000000000000000000000000000000..74fee543dd1d9bc0ceb3310cc87bf65e268bf364
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/lock.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/message.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/message.svg
new file mode 100644
index 0000000000000000000000000000000000000000..14ca81728a3de16e103a858b4ce31f8e0f550bce
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/message.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/money.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/money.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c1580de10e1f1c504f7bfcaba4f41b24d816d8f2
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/money.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/nested.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/nested.svg
new file mode 100644
index 0000000000000000000000000000000000000000..06713a86c6a3db0cd5eeb26cf81ffb27b538e9a1
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/nested.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/password.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/password.svg
new file mode 100644
index 0000000000000000000000000000000000000000..e291d85df22083536bb2e40fd18120ef6d6b141d
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/password.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/pdf.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/pdf.svg
new file mode 100644
index 0000000000000000000000000000000000000000..957aa0cc3597c1277ded6367716067c9874552e0
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/pdf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/people.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/people.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2bd54aeb728197066e987e8d8d98364f50ed5be6
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/people.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/peoples.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/peoples.svg
new file mode 100644
index 0000000000000000000000000000000000000000..aab852e52a33a5823fcdd5302111b45f4a4e13a7
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/peoples.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/qq.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/qq.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ee13d4ec2e54dbbe64009db689c502b05629721a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/qq.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/role.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/role.svg
new file mode 100644
index 0000000000000000000000000000000000000000..3a6d5296d021edb38f71daef50f5b1f90c1c6458
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/role.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/search.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/search.svg
new file mode 100644
index 0000000000000000000000000000000000000000..84233ddaa98a45d407cacdc869d9b7634f72d390
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/shopping.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/shopping.svg
new file mode 100644
index 0000000000000000000000000000000000000000..87513e7c5fdd4260e48f7ead3501e0b9f9798c2a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/shopping.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/size.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/size.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ddb25b8d58c52f1f0323483b1cbfd7a113512e0d
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/skill.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/skill.svg
new file mode 100644
index 0000000000000000000000000000000000000000..db1f4e9127783b89b752fbc09206744f42220d84
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/skill.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/star.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/star.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6cf86e66add37b5562fc4793dd9a218163f485b4
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/star.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/tab.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/tab.svg
new file mode 100644
index 0000000000000000000000000000000000000000..b4b48e48085bb21b18da5386a6d4692a70301977
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/tab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/table.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/table.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0e3dc9dea5a0ff92d617cdfee4f10ef600a02433
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/theme.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/theme.svg
new file mode 100644
index 0000000000000000000000000000000000000000..5982a2f784052994f07138239eae96d8024531e9
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/theme.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/tree-table.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/tree-table.svg
new file mode 100644
index 0000000000000000000000000000000000000000..8aafdb829ebbe289f352a533d9764c4f9395e533
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/tree-table.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/tree.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/tree.svg
new file mode 100644
index 0000000000000000000000000000000000000000..dd4b7dd22fe06076831935066592caec48e323b0
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/tree.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/user.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/user.svg
new file mode 100644
index 0000000000000000000000000000000000000000..0ba0716a62a92f7cb2f2e6f3c745ace2be6b3b31
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/user.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/wechat.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/wechat.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c586e5511722843f9c741d7530db146dfab864a4
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/wechat.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svg/zip.svg b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/zip.svg
new file mode 100644
index 0000000000000000000000000000000000000000..f806fc4825739224caf820e6edf54e808961b1a6
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svg/zip.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Resources/vue-element-admin/icons/svgo.yml b/app/Modules/Admin/Resources/vue-element-admin/icons/svgo.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d11906aec26dd14372dd1b298f72270c38cce1b7
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/icons/svgo.yml
@@ -0,0 +1,22 @@
+# replace default config
+
+# multipass: true
+# full: true
+
+plugins:
+
+ # - name
+ #
+ # or:
+ # - name: false
+ # - name: true
+ #
+ # or:
+ # - name:
+ # param1: 1
+ # param2: 2
+
+- removeAttrs:
+ attrs:
+ - 'fill'
+ - 'fill-rule'
diff --git a/app/Modules/Admin/Resources/vue-element-admin/lang/en.js b/app/Modules/Admin/Resources/vue-element-admin/lang/en.js
new file mode 100644
index 0000000000000000000000000000000000000000..1273e0b2094df00357767a51952b3db03c04248b
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/lang/en.js
@@ -0,0 +1,199 @@
+// 英语
+export default {
+ admin: 'Admin',
+ banner: 'Banner',
+ article: 'Article',
+ friendlinks: 'Friendly link',
+ number: 'Number',
+ route: {
+ articleLabels: '文章标签',
+ articleLabelDetail: '标签详情',
+ systemSettings: 'System settings',
+ bannerManage: 'Banner Manage',
+ permissionManage: 'Permission Manage',
+ articleManage: 'Article Manage',
+ menuManage: 'Menu Manage',
+ roleManage: 'Role Manage',
+ adminManage: 'Admin Manage',
+ configManage: 'Config Manage',
+ friendlinks: 'Friend links',
+ versionManage: 'Version Manage',
+ logManage: 'Log Manage',
+ adminLoginLog: 'Admin Login Log',
+ adminOperationLog: 'Admin Operation Log',
+ articleLists: 'Article List',
+ articleCategory: 'Article Category',
+ dashboard: 'Dashboard',
+ documentation: 'Documentation',
+ guide: 'Guide',
+ permission: 'Permission',
+ pagePermission: 'Page Permission',
+ rolePermission: 'Role Permission',
+ directivePermission: 'Directive Permission',
+ icons: 'Icons',
+ components: 'Components',
+ tinymce: 'Tinymce',
+ markdown: 'Markdown',
+ jsonEditor: 'JSON Editor',
+ dndList: 'Dnd List',
+ splitPane: 'SplitPane',
+ avatarUpload: 'Avatar Upload',
+ dropzone: 'Dropzone',
+ sticky: 'Sticky',
+ countTo: 'Count To',
+ componentMixin: 'Mixin',
+ backToTop: 'Back To Top',
+ dragDialog: 'Drag Dialog',
+ dragSelect: 'Drag Select',
+ dragKanban: 'Drag Kanban',
+ charts: 'Charts',
+ keyboardChart: 'Keyboard Chart',
+ lineChart: 'Line Chart',
+ mixChart: 'Mix Chart',
+ example: 'Example',
+ nested: 'Nested Routes',
+ menu1: 'Menu 1',
+ 'menu1-1': 'Menu 1-1',
+ 'menu1-2': 'Menu 1-2',
+ 'menu1-2-1': 'Menu 1-2-1',
+ 'menu1-2-2': 'Menu 1-2-2',
+ 'menu1-3': 'Menu 1-3',
+ menu2: 'Menu 2',
+ Table: 'Table',
+ dynamicTable: 'Dynamic Table',
+ dragTable: 'Drag Table',
+ inlineEditTable: 'Inline Edit',
+ complexTable: 'Complex Table',
+ tab: 'Tab',
+ form: 'Form',
+ createArticle: 'Create Article',
+ editArticle: 'Edit Article',
+ articleList: 'Article List',
+ errorPages: 'Error Pages',
+ page401: '401',
+ page404: '404',
+ errorLog: 'Error Log',
+ excel: 'Excel',
+ exportExcel: 'Export Excel',
+ selectExcel: 'Export Selected',
+ mergeHeader: 'Merge Header',
+ uploadExcel: 'Upload Excel',
+ zip: 'Zip',
+ pdf: 'PDF',
+ exportZip: 'Export Zip',
+ theme: 'Theme',
+ clipboardDemo: 'Clipboard',
+ i18n: 'I18n',
+ externalLink: 'External Link',
+ profile: 'Profile'
+ },
+ navbar: {
+ dashboard: 'Dashboard',
+ github: 'Github',
+ logOut: 'Log Out',
+ profile: 'Profile',
+ theme: 'Theme',
+ size: 'Global Size'
+ },
+ login: {
+ title: 'Login Form',
+ logIn: 'Login',
+ username: 'Username',
+ password: 'Password',
+ any: 'any',
+ thirdparty: 'Or connect with',
+ thirdpartyTips: 'Can not be simulated on local, so please combine you own business simulation! ! !'
+ },
+ documentation: {
+ documentation: 'Documentation',
+ github: 'Github Repository'
+ },
+ permission: {
+ addRole: 'New Role',
+ editPermission: 'Edit',
+ roles: 'Your roles',
+ switchRoles: 'Switch roles',
+ tips: 'In some cases, using v-permission will have no effect. For example: Element-UI el-tab or el-table-column and other scenes that dynamically render dom. You can only do this with v-if.',
+ delete: 'Delete',
+ confirm: 'Confirm',
+ cancel: 'Cancel'
+ },
+ guide: {
+ description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ',
+ button: 'Show Guide'
+ },
+ components: {
+ documentation: 'Documentation',
+ tinymceTips: 'Rich text is a core feature of the management backend, but at the same time it is a place with lots of pits. In the process of selecting rich texts, I also took a lot of detours. The common rich texts on the market have been basically used, and I finally chose Tinymce. See the more detailed rich text comparison and introduction.',
+ dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/Dropzone.',
+ stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',
+ backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner',
+ backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally',
+ imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'
+ },
+ table: {
+ dynamicTips1: 'Fixed header, sorted by header order',
+ dynamicTips2: 'Not fixed header, sorted by click order',
+ dragTips1: 'The default order',
+ dragTips2: 'The after dragging order',
+ title: 'Title',
+ importance: 'Imp',
+ type: 'Type',
+ remark: 'Remark',
+ search: 'Search',
+ add: 'Add',
+ export: 'Export',
+ reviewer: 'reviewer',
+ id: 'ID',
+ date: 'Date',
+ author: 'Author',
+ readings: 'Readings',
+ status: 'Status',
+ actions: 'Actions',
+ edit: 'Edit',
+ publish: 'Publish',
+ draft: 'Draft',
+ delete: 'Delete',
+ cancel: 'Cancel',
+ confirm: 'Confirm',
+ batchDelete: 'Batch Delete',
+ },
+ example: {
+ warning: 'Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all pages directly. See details'
+ },
+ errorLog: {
+ tips: 'Please click the bug icon in the upper right corner',
+ description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',
+ documentation: 'Document introduction'
+ },
+ excel: {
+ export: 'Export',
+ selectedExport: 'Export Selected Items',
+ placeholder: 'Please enter the file name (default excel-list)'
+ },
+ zip: {
+ export: 'Export',
+ placeholder: 'Please enter the file name (default file)'
+ },
+ pdf: {
+ tips: 'Here we use window.print() to implement the feature of downloading PDF.'
+ },
+ theme: {
+ change: 'Change Theme',
+ documentation: 'Theme documentation',
+ tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.'
+ },
+ tagsView: {
+ refresh: 'Refresh',
+ close: 'Close',
+ closeOthers: 'Close Others',
+ closeAll: 'Close All'
+ },
+ settings: {
+ title: 'Page style setting',
+ theme: 'Theme Color',
+ tagsView: 'Open Tags-View',
+ fixedHeader: 'Fixed Header',
+ sidebarLogo: 'Sidebar Logo'
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/lang/es.js b/app/Modules/Admin/Resources/vue-element-admin/lang/es.js
new file mode 100644
index 0000000000000000000000000000000000000000..3532a333a147684f7575465e5dc4fabe57957e2a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/lang/es.js
@@ -0,0 +1,199 @@
+// 西班牙语
+export default {
+ admin: 'Administrador',
+ banner: 'Banner',
+ article: 'Artículo',
+ friendlinks: '友情链接',
+ number: 'Cantidad',
+ route: {
+ articleLabels: '文章标签',
+ articleLabelDetail: '标签详情',
+ systemSettings: 'Configuración del sistema',
+ bannerManage: 'Gestión de Banner',
+ permissionManage: 'Gestión de permisos',
+ articleManage: 'Gestión de artículos',
+ menuManage: 'Gestión de menús',
+ roleManage: 'Gestión de funciones',
+ adminManage: 'Administración de administradores',
+ configManage: 'Gestión de la configuración',
+ friendlinks: 'Enlaces',
+ versionManage: 'Gestión de versiones',
+ logManage: 'Gestión de registros',
+ adminLoginLog: 'Registro de inicio de sesión del Administrador',
+ adminOperationLog: 'Registro de operaciones del Administrador',
+ articleLists: 'Lista de artículos',
+ articleCategory: 'Clasificación de artículos',
+ dashboard: 'Panel de control',
+ documentation: 'Documentación',
+ guide: 'Guía',
+ permission: 'Permisos',
+ rolePermission: 'Permisos de rol',
+ pagePermission: 'Permisos de la página',
+ directivePermission: 'Permisos de la directiva',
+ icons: 'Iconos',
+ components: 'Componentes',
+ tinymce: 'Tinymce',
+ markdown: 'Markdown',
+ jsonEditor: 'Editor JSON',
+ dndList: 'Lista Dnd',
+ splitPane: 'Panel dividido',
+ avatarUpload: 'Subir avatar',
+ dropzone: 'Subir ficheros',
+ sticky: 'Sticky',
+ countTo: 'CountTo',
+ componentMixin: 'Mixin',
+ backToTop: 'Ir arriba',
+ dragDialog: 'Drag Dialog',
+ dragSelect: 'Drag Select',
+ dragKanban: 'Drag Kanban',
+ charts: 'Gráficos',
+ keyboardChart: 'Keyboard Chart',
+ lineChart: 'Gráfico de líneas',
+ mixChart: 'Mix Chart',
+ example: 'Ejemplo',
+ nested: 'Rutas anidadass',
+ menu1: 'Menu 1',
+ 'menu1-1': 'Menu 1-1',
+ 'menu1-2': 'Menu 1-2',
+ 'menu1-2-1': 'Menu 1-2-1',
+ 'menu1-2-2': 'Menu 1-2-2',
+ 'menu1-3': 'Menu 1-3',
+ menu2: 'Menu 2',
+ Table: 'Tabla',
+ dynamicTable: 'Tabla dinámica',
+ dragTable: 'Arrastrar tabla',
+ inlineEditTable: 'Editor',
+ complexTable: 'Complex Table',
+ tab: 'Pestaña',
+ form: 'Formulario',
+ createArticle: 'Crear artículo',
+ editArticle: 'Editar artículo',
+ articleList: 'Listado de artículos',
+ errorPages: 'Páginas de error',
+ page401: '401',
+ page404: '404',
+ errorLog: 'Registro de errores',
+ excel: 'Excel',
+ exportExcel: 'Exportar a Excel',
+ selectExcel: 'Export seleccionado',
+ mergeHeader: 'Merge Header',
+ uploadExcel: 'Subir Excel',
+ zip: 'Zip',
+ pdf: 'PDF',
+ exportZip: 'Exportar a Zip',
+ theme: 'Tema',
+ clipboardDemo: 'Clipboard',
+ i18n: 'I18n',
+ externalLink: 'Enlace externo',
+ profile: 'Profile'
+ },
+ navbar: {
+ logOut: 'Salir',
+ dashboard: 'Panel de control',
+ github: 'Github',
+ theme: 'Tema',
+ size: 'Tamaño global',
+ profile: 'Profile'
+ },
+ login: {
+ title: 'Formulario de acceso',
+ logIn: 'Acceso',
+ username: 'Usuario',
+ password: 'Contraseña',
+ any: 'nada',
+ thirdparty: 'Conectar con',
+ thirdpartyTips: 'No se puede simular en local, así que combine su propia simulación de negocios. ! !'
+ },
+ documentation: {
+ documentation: 'Documentación',
+ github: 'Repositorio Github'
+ },
+ permission: {
+ addRole: 'Nuevo rol',
+ editPermission: 'Permiso de edición',
+ roles: 'Tus permisos',
+ switchRoles: 'Cambiar permisos',
+ tips: 'In some cases it is not suitable to use v-permission, such as element Tab component or el-table-column and other asynchronous rendering dom cases which can only be achieved by manually setting the v-if.',
+ delete: 'Borrar',
+ confirm: 'Confirmar',
+ cancel: 'Cancelar'
+ },
+ guide: {
+ description: 'The guide page is useful for some people who entered the project for the first time. You can briefly introduce the features of the project. Demo is based on ',
+ button: 'Ver guía'
+ },
+ components: {
+ documentation: 'Documentación',
+ tinymceTips: 'Rich text editor is a core part of management system, but at the same time is a place with lots of problems. In the process of selecting rich texts, I also walked a lot of detours. The common rich text editors in the market are basically used, and the finally chose Tinymce. See documentation for more detailed rich text editor comparisons and introductions.',
+ dropzoneTips: 'Because my business has special needs, and has to upload images to qiniu, so instead of a third party, I chose encapsulate it by myself. It is very simple, you can see the detail code in @/components/Dropzone.',
+ stickyTips: 'when the page is scrolled to the preset position will be sticky on the top.',
+ backToTopTips1: 'When the page is scrolled to the specified position, the Back to Top button appears in the lower right corner',
+ backToTopTips2: 'You can customize the style of the button, show / hide, height of appearance, height of the return. If you need a text prompt, you can use element-ui el-tooltip elements externally',
+ imageUploadTips: 'Since I was using only the vue@1 version, and it is not compatible with mockjs at the moment, I modified it myself, and if you are going to use it, it is better to use official version.'
+ },
+ table: {
+ dynamicTips1: 'Fixed header, sorted by header order',
+ dynamicTips2: 'Not fixed header, sorted by click order',
+ dragTips1: 'Orden por defecto',
+ dragTips2: 'The after dragging order',
+ title: 'Título',
+ importance: 'Importancia',
+ type: 'Tipo',
+ remark: 'Remark',
+ search: 'Buscar',
+ add: 'Añadir',
+ export: 'Exportar',
+ reviewer: 'reviewer',
+ id: 'ID',
+ date: 'Fecha',
+ author: 'Autor',
+ readings: 'Lector',
+ status: 'Estado',
+ actions: 'Acciones',
+ edit: 'Editar',
+ publish: 'Publicar',
+ draft: 'Draft',
+ delete: 'Eliminar',
+ cancel: 'Cancelar',
+ confirm: 'Confirmar',
+ batchDelete: 'Eliminación por lotes',
+ },
+ example: {
+ warning: 'Creating and editing pages cannot be cached by keep-alive because keep-alive include does not currently support caching based on routes, so it is currently cached based on component name. If you want to achieve a similar caching effect, you can use a browser caching scheme such as localStorage. Or do not use keep-alive include to cache all pages directly. See details'
+ },
+ errorLog: {
+ tips: 'Please click the bug icon in the upper right corner',
+ description: 'Now the management system are basically the form of the spa, it enhances the user experience, but it also increases the possibility of page problems, a small negligence may lead to the entire page deadlock. Fortunately Vue provides a way to catch handling exceptions, where you can handle errors or report exceptions.',
+ documentation: 'Documento de introducción'
+ },
+ excel: {
+ export: 'Exportar',
+ selectedExport: 'Exportar seleccionados',
+ placeholder: 'Por favor escribe un nombre de fichero'
+ },
+ zip: {
+ export: 'Exportar',
+ placeholder: 'Por favor escribe un nombre de fichero'
+ },
+ pdf: {
+ tips: 'Here we use window.print() to implement the feature of downloading pdf.'
+ },
+ theme: {
+ change: 'Cambiar tema',
+ documentation: 'Documentación del tema',
+ tips: 'Tips: It is different from the theme-pick on the navbar is two different skinning methods, each with different application scenarios. Refer to the documentation for details.'
+ },
+ tagsView: {
+ refresh: 'Actualizar',
+ close: 'Cerrar',
+ closeOthers: 'Cerrar otros',
+ closeAll: 'Cerrar todos'
+ },
+ settings: {
+ title: 'Page style setting',
+ theme: 'Theme Color',
+ tagsView: 'Open Tags-View',
+ fixedHeader: 'Fixed Header',
+ sidebarLogo: 'Sidebar Logo'
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/lang/index.js b/app/Modules/Admin/Resources/vue-element-admin/lang/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..1799ae7fc9b5787cb2060d2d249b784ecd749449
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/lang/index.js
@@ -0,0 +1,55 @@
+import Vue from 'vue'
+import VueI18n from 'vue-i18n'
+import Cookies from 'js-cookie'
+import elementEnLocale from 'element-ui/lib/locale/lang/en' // element-ui lang
+import elementZhLocale from 'element-ui/lib/locale/lang/zh-CN'// element-ui lang
+import elementEsLocale from 'element-ui/lib/locale/lang/es'// element-ui lang
+import elementJaLocale from 'element-ui/lib/locale/lang/ja'// element-ui lang
+import enLocale from './en'
+import zhLocale from './zh'
+import esLocale from './es'
+import jaLocale from './ja'
+
+Vue.use(VueI18n)
+
+const messages = {
+ en: {
+ ...enLocale,
+ ...elementEnLocale
+ },
+ zh: {
+ ...zhLocale,
+ ...elementZhLocale
+ },
+ es: {
+ ...esLocale,
+ ...elementEsLocale
+ },
+ ja: {
+ ...jaLocale,
+ ...elementJaLocale
+ }
+}
+export function getLanguage() {
+ const chooseLanguage = Cookies.get('language')
+ if (chooseLanguage) return chooseLanguage
+
+ // if has not choose language
+ const language = (navigator.language || navigator.browserLanguage).toLowerCase()
+ const locales = Object.keys(messages)
+ for (const locale of locales) {
+ if (language.indexOf(locale) > -1) {
+ return locale
+ }
+ }
+ return 'en'
+}
+const i18n = new VueI18n({
+ // set locale
+ // options: en | zh | es
+ locale: getLanguage(),
+ // set locale messages
+ messages
+})
+
+export default i18n
diff --git a/app/Modules/Admin/Resources/vue-element-admin/lang/ja.js b/app/Modules/Admin/Resources/vue-element-admin/lang/ja.js
new file mode 100644
index 0000000000000000000000000000000000000000..7629bc632a60008fe59db88beaaebe3069722609
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/lang/ja.js
@@ -0,0 +1,199 @@
+// 日语
+export default {
+ admin: '管理者',
+ banner: 'Banner',
+ article: '文章',
+ friendlinks: '友情链接',
+ number: '数',
+ route: {
+ articleLabels: '文章标签',
+ articleLabelDetail: '标签详情',
+ systemSettings: 'システム設定',
+ bannerManage: 'Banner管理',
+ permissionManage: '権限管理',
+ articleManage: '記事の管理',
+ menuManage: 'メニュー管理',
+ roleManage: 'キャラクター管理',
+ adminManage: '管理者の管理',
+ configManage: '設定管理',
+ friendlinks: '相互リンク',
+ versionManage: 'バージョン管理',
+ logManage: 'ログ管理',
+ adminLoginLog: '管理者登録ログ',
+ adminOperationLog: '管理者操作ログ',
+ articleLists: '記事リスト',
+ articleCategory: '文章の分類',
+ dashboard: 'トップ',
+ documentation: 'ドキュメント',
+ guide: 'ガイド',
+ permission: '権限',
+ rolePermission: '権限ロール',
+ pagePermission: 'ページ権限',
+ directivePermission: 'ディレクティブ権限',
+ icons: 'アイコン',
+ components: 'コンポーネント',
+ tinymce: 'TinyMCE',
+ markdown: 'Markdown',
+ jsonEditor: 'JSON Editor',
+ dndList: 'Drag-And-Drop',
+ splitPane: 'パネル',
+ avatarUpload: 'アバターアップロード',
+ dropzone: 'Dropzone',
+ sticky: 'Sticky',
+ countTo: 'Count To',
+ componentMixin: 'コンポーネントMixin',
+ backToTop: 'BackToTop',
+ dragDialog: 'Drag Dialog',
+ dragSelect: 'Drag Select',
+ dragKanban: 'Drag 看板',
+ charts: 'チャート',
+ keyboardChart: 'Keyboardチャート',
+ lineChart: 'Lineチャート',
+ mixChart: 'Mixチャート',
+ example: 'Example',
+ nested: 'Nested Routes',
+ menu1: 'メニュー1',
+ 'menu1-1': 'メニュー 1-1',
+ 'menu1-2': 'メニュー 1-2',
+ 'menu1-2-1': 'メニュー 1-2-1',
+ 'menu1-2-2': 'メニュー 1-2-2',
+ 'menu1-3': 'メニュー 1-3',
+ menu2: 'メニュー 2',
+ Table: 'Table',
+ dynamicTable: '可変 Table',
+ dragTable: 'Drag Table',
+ inlineEditTable: 'Inline Edit Table',
+ complexTable: 'Complex Table',
+ tab: 'Tab',
+ form: 'フォーム',
+ createArticle: '投稿作成',
+ editArticle: '投稿編集',
+ articleList: '投稿リスト',
+ errorPages: 'エラーページ',
+ page401: '401',
+ page404: '404',
+ errorLog: 'エラーログ',
+ excel: 'Excel',
+ exportExcel: '一括エクスポート',
+ selectExcel: '複数選択エクスポート',
+ mergeHeader: 'ヘッダーマージ',
+ uploadExcel: 'アップロード',
+ zip: 'Zip',
+ pdf: 'PDF',
+ exportZip: 'Export Zip',
+ theme: 'テーマ変更',
+ clipboardDemo: 'Clipboard',
+ i18n: '多言語',
+ externalLink: '外部リンク',
+ profile: 'プロフィール'
+ },
+ navbar: {
+ dashboard: 'トップ',
+ github: 'GitHub',
+ logOut: 'ログアウト',
+ profile: 'プロフィール',
+ theme: 'テーマ変更',
+ size: '画面サイズ'
+ },
+ login: {
+ title: 'ユーザログイン',
+ logIn: 'ログイン',
+ username: 'ユーザ名',
+ password: 'パスワード',
+ any: 'password',
+ thirdparty: '外部IDでログイン',
+ thirdpartyTips: 'ローカル環境ではログインできません。実装が必要です。'
+ },
+ documentation: {
+ documentation: 'ドキュメント',
+ github: 'Github Link'
+ },
+ permission: {
+ addRole: 'ロール追加',
+ editPermission: 'ロール変更',
+ roles: 'ロール',
+ switchRoles: 'ロール切替',
+ tips: 'v-permissionは使えない時があります。例えば: Element-UI の el-tab、 el-table-column 及び他の dom。v-ifを使う必要があります。',
+ delete: '削除',
+ confirm: '確認',
+ cancel: 'キャンセル'
+ },
+ guide: {
+ description: 'ガイドは各機能の説明です。',
+ button: 'ガイドを見る'
+ },
+ components: {
+ documentation: 'ドキュメント',
+ tinymceTips: 'tinymceは管理画面に重要な機能ですが、その同時に落とし穴がありあす。tinymceを使う道のりが大変でした。Tinymceを使う時に各自のプロジェクト状況で判断が必要です。ドキュメントはこちら',
+ dropzoneTips: 'Third partyのパッケージを使わず、独自の実装しています。詳細は @/components/Dropzone',
+ stickyTips: 'ページの指定位置へスクロールした場合、表示されます。',
+ backToTopTips1: 'トップへスクロールが表示されます。',
+ backToTopTips2: 'ボタンのスタイルはカスタマイズできます。例えば、show/hide、height、position。 またはElementのel-tooltipを使って、ツールチップを実装できます。',
+ imageUploadTips: 'mockjsは使えないため、カスタマイズしています。公式の最新バージョンを使ってください。'
+ },
+ table: {
+ dynamicTips1: '先頭は固定、最後に追加',
+ dynamicTips2: '戦後に追加せず、指定列に追加',
+ dragTips1: 'デフォルト順番',
+ dragTips2: 'Drag後の順番',
+ title: 'タイトル',
+ importance: '重要',
+ type: 'タイプ',
+ remark: '評価',
+ search: '検索',
+ add: '追加',
+ export: 'エクスポート',
+ reviewer: 'レビュアー',
+ id: '番号',
+ date: '日時',
+ author: '作成者',
+ readings: '閲覧数',
+ status: 'ステータス',
+ actions: '操作',
+ edit: '編集',
+ publish: '公開',
+ draft: '下書き',
+ delete: 'キャンセル',
+ cancel: 'キャンセル',
+ confirm: '確認',
+ batchDelete: '一括削除',
+ },
+ example: {
+ warning: '新規作成と編集画面は keep-alive を使えないです。keep-alive の include はrouteのキャッシュは使えないです。そのため、component name を使ってキャッシュさせるようにします。このようなキャッシュ機能を作りたい場合,localStorageを使う手があります。もしくは keep-alive の includeを使って、全ページキャッシュする方法はあります。'
+ },
+ errorLog: {
+ tips: '右上のbugアイコンをクリックしてください。',
+ description: '管理画面はspaを使う場合が多い、ユーザ体現向上はできますが、想定外エラーが発生する場合があります。Vueはそのエラーハンドリング機能を提供し、エラーレポートができます。',
+ documentation: 'ドキュメント'
+ },
+ excel: {
+ export: 'エクスポート',
+ selectedExport: 'エクスポート対象を選択してください。',
+ placeholder: 'ファイル名を入力してください。'
+ },
+ zip: {
+ export: 'エクスポート',
+ placeholder: 'ファイル名を入力してください。'
+ },
+ pdf: {
+ tips: 'window.print() を使ってPDFダウンロードしています。'
+ },
+ theme: {
+ change: 'テーマ切替',
+ documentation: 'ドキュメント',
+ tips: 'Tips: テーマの切り替え方法はnavbarのtheme-pickと異なります、使い方はドキュメントを確認してください。'
+ },
+ tagsView: {
+ refresh: '更新',
+ close: '閉じる',
+ closeOthers: 'その他閉じる',
+ closeAll: 'すべて閉じる'
+ },
+ settings: {
+ title: 'システムテーマ',
+ theme: 'テーマ色',
+ tagsView: 'Tags-View 開く',
+ fixedHeader: 'Fixed Header',
+ sidebarLogo: 'Sidebar Logo'
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/lang/zh.js b/app/Modules/Admin/Resources/vue-element-admin/lang/zh.js
new file mode 100644
index 0000000000000000000000000000000000000000..99d2ecb19a51e61f5197044570e08e2a1b55c894
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/lang/zh.js
@@ -0,0 +1,198 @@
+export default {
+ admin: '管理员',
+ banner: 'Banner',
+ article: '文章',
+ friendlinks: '友情链接',
+ number: '数量',
+ route: {
+ articleLabels: '文章标签',
+ articleLabelDetail: '标签详情',
+ systemSettings: '系统设置',
+ bannerManage: 'Banner管理',
+ permissionManage: '权限管理',
+ articleManage: '文章管理',
+ menuManage: '菜单管理',
+ roleManage: '角色管理',
+ adminManage: '管理员管理',
+ configManage: '配置管理',
+ friendlinks: '友情链接',
+ versionManage: '版本管理',
+ logManage: '日志管理',
+ adminLoginLog: '管理员登录日志',
+ adminOperationLog: '管理员操作日志',
+ articleLists: '文章列表',
+ articleCategory: '文章分类',
+ dashboard: '首页',
+ documentation: '文档',
+ guide: '引导页',
+ permission: '权限测试页',
+ rolePermission: '角色权限',
+ pagePermission: '页面权限',
+ directivePermission: '指令权限',
+ icons: '图标',
+ components: '组件',
+ tinymce: '富文本编辑器',
+ markdown: 'Markdown',
+ jsonEditor: 'JSON 编辑器',
+ dndList: '列表拖拽',
+ splitPane: 'Splitpane',
+ avatarUpload: '头像上传',
+ dropzone: 'Dropzone',
+ sticky: 'Sticky',
+ countTo: 'Count To',
+ componentMixin: '小组件',
+ backToTop: '返回顶部',
+ dragDialog: '拖拽 Dialog',
+ dragSelect: '拖拽 Select',
+ dragKanban: '可拖拽看板',
+ charts: '图表',
+ keyboardChart: '键盘图表',
+ lineChart: '折线图',
+ mixChart: '混合图表',
+ example: '综合实例',
+ nested: '路由嵌套',
+ menu1: '菜单1',
+ 'menu1-1': '菜单 1-1',
+ 'menu1-2': '菜单 1-2',
+ 'menu1-2-1': '菜单 1-2-1',
+ 'menu1-2-2': '菜单 1-2-2',
+ 'menu1-3': '菜单 1-3',
+ menu2: '菜单 2',
+ Table: 'Table',
+ dynamicTable: '动态 Table',
+ dragTable: '拖拽 Table',
+ inlineEditTable: 'Table 内编辑',
+ complexTable: '综合 Table',
+ tab: 'Tab',
+ form: '表单',
+ createArticle: '创建文章',
+ editArticle: '编辑文章',
+ articleList: '文章列表',
+ errorPages: '错误页面',
+ page401: '401',
+ page404: '404',
+ errorLog: '错误日志',
+ excel: 'Excel',
+ exportExcel: '导出 Excel',
+ selectExcel: '导出 已选择项',
+ mergeHeader: '导出 多级表头',
+ uploadExcel: '上传 Excel',
+ zip: 'Zip',
+ pdf: 'PDF',
+ exportZip: 'Export Zip',
+ theme: '换肤',
+ clipboardDemo: 'Clipboard',
+ i18n: '国际化',
+ externalLink: '外链',
+ profile: '个人中心'
+ },
+ navbar: {
+ dashboard: '首页',
+ github: '项目地址',
+ logOut: '退出登录',
+ profile: '个人中心',
+ theme: '换肤',
+ size: '布局大小'
+ },
+ login: {
+ title: '系统登录',
+ logIn: '登录',
+ username: '账号',
+ password: '密码',
+ any: '随便填',
+ thirdparty: '第三方登录',
+ thirdpartyTips: '本地不能模拟,请结合自己业务进行模拟!!!'
+ },
+ documentation: {
+ documentation: '文档',
+ github: 'Github 地址'
+ },
+ permission: {
+ addRole: '新增角色',
+ editPermission: '编辑权限',
+ roles: '你的权限',
+ switchRoles: '切换权限',
+ tips: '在某些情况下,不适合使用 v-permission。例如:Element-UI 的 el-tab 或 el-table-column 以及其它动态渲染 dom 的场景。你只能通过手动设置 v-if 来实现。',
+ delete: '删除',
+ confirm: '确定',
+ cancel: '取消'
+ },
+ guide: {
+ description: '引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能。本 Demo 是基于',
+ button: '打开引导'
+ },
+ components: {
+ documentation: '文档',
+ tinymceTips: '富文本是管理后台一个核心的功能,但同时又是一个有很多坑的地方。在选择富文本的过程中我也走了不少的弯路,市面上常见的富文本都基本用过了,最终权衡了一下选择了Tinymce。更详细的富文本比较和介绍见',
+ dropzoneTips: '由于我司业务有特殊需求,而且要传七牛 所以没用第三方,选择了自己封装。代码非常的简单,具体代码你可以在这里看到 @/components/Dropzone',
+ stickyTips: '当页面滚动到预设的位置会吸附在顶部',
+ backToTopTips1: '页面滚动到指定位置会在右下角出现返回顶部按钮',
+ backToTopTips2: '可自定义按钮的样式、show/hide、出现的高度、返回的位置 如需文字提示,可在外部使用Element的el-tooltip元素',
+ imageUploadTips: '由于我在使用时它只有vue@1版本,而且和mockjs不兼容,所以自己改造了一下,如果大家要使用的话,优先还是使用官方版本。'
+ },
+ table: {
+ dynamicTips1: '固定表头, 按照表头顺序排序',
+ dynamicTips2: '不固定表头, 按照点击顺序排序',
+ dragTips1: '默认顺序',
+ dragTips2: '拖拽后顺序',
+ title: '标题',
+ importance: '重要性',
+ type: '类型',
+ remark: '点评',
+ search: '搜索',
+ add: '添加',
+ export: '导出',
+ reviewer: '审核人',
+ id: '序号',
+ date: '时间',
+ author: '作者',
+ readings: '阅读数',
+ status: '状态',
+ actions: '操作',
+ edit: '编辑',
+ publish: '发布',
+ draft: '草稿',
+ delete: '删除',
+ cancel: '取 消',
+ confirm: '确 定',
+ batchDelete: '批量删除',
+ },
+ example: {
+ warning: '创建和编辑页面是不能被 keep-alive 缓存的,因为keep-alive 的 include 目前不支持根据路由来缓存,所以目前都是基于 component name 来进行缓存的。如果你想类似的实现缓存效果,可以使用 localStorage 等浏览器缓存方案。或者不要使用 keep-alive 的 include,直接缓存所有页面。详情见'
+ },
+ errorLog: {
+ tips: '请点击右上角bug小图标',
+ description: '现在的管理后台基本都是spa的形式了,它增强了用户体验,但同时也会增加页面出问题的可能性,可能一个小小的疏忽就导致整个页面的死锁。好在 Vue 官网提供了一个方法来捕获处理异常,你可以在其中进行错误处理或者异常上报。',
+ documentation: '文档介绍'
+ },
+ excel: {
+ export: '导出',
+ selectedExport: '导出已选择项',
+ placeholder: '请输入文件名(默认excel-list)'
+ },
+ zip: {
+ export: '导出',
+ placeholder: '请输入文件名(默认file)'
+ },
+ pdf: {
+ tips: '这里使用 window.print() 来实现下载pdf的功能'
+ },
+ theme: {
+ change: '换肤',
+ documentation: '换肤文档',
+ tips: 'Tips: 它区别于 navbar 上的 theme-pick, 是两种不同的换肤方法,各自有不同的应用场景,具体请参考文档。'
+ },
+ tagsView: {
+ refresh: '刷新',
+ close: '关闭',
+ closeOthers: '关闭其它',
+ closeAll: '关闭所有'
+ },
+ settings: {
+ title: '系统布局配置',
+ theme: '主题色',
+ tagsView: '开启 Tags-View',
+ fixedHeader: '固定 Header',
+ sidebarLogo: '侧边栏 Logo'
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/AppMain.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/components/AppMain.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a89763806df2d5cb76afd06744ed4faf06d43a94
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/AppMain.vue
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/Navbar.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Navbar.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f90cac1e652e080b1e8e40183f86bac5c5cc44dd
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Navbar.vue
@@ -0,0 +1,167 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/Settings/index.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Settings/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..119c6dff879c406555473bfdf5ea453ec6e34aac
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Settings/index.vue
@@ -0,0 +1,145 @@
+
+
+
+
{{ $t('settings.title') }}
+
+
+ {{ $t('settings.theme') }}
+
+
+
+
+ {{ $t('settings.tagsView') }}
+
+
+
+
+ {{ $t('settings.fixedHeader') }}
+
+
+
+
+ {{ $t('settings.sidebarLogo') }}
+
+
+
+
+
+
+
+ 菜单支持拼音搜索
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/FixiOSBug.js b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/FixiOSBug.js
new file mode 100644
index 0000000000000000000000000000000000000000..bc14856f0768d6b1aed2f59bbfed3f2775977ac8
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/FixiOSBug.js
@@ -0,0 +1,26 @@
+export default {
+ computed: {
+ device() {
+ return this.$store.state.app.device
+ }
+ },
+ mounted() {
+ // In order to fix the click on menu on the ios device will trigger the mouseleave bug
+ // https://github.com/PanJiaChen/vue-element-admin/issues/1135
+ this.fixBugIniOS()
+ },
+ methods: {
+ fixBugIniOS() {
+ const $subMenu = this.$refs.subMenu
+ if ($subMenu) {
+ const handleMouseleave = $subMenu.handleMouseleave
+ $subMenu.handleMouseleave = (e) => {
+ if (this.device === 'mobile') {
+ return
+ }
+ handleMouseleave(e)
+ }
+ }
+ }
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/Item.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/Item.vue
new file mode 100644
index 0000000000000000000000000000000000000000..aa1f5da4de23482ad3fdb4a0d8d07772117ecd36
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/Item.vue
@@ -0,0 +1,41 @@
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/Link.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/Link.vue
new file mode 100644
index 0000000000000000000000000000000000000000..530b3d5b3749538745ffbf2fcb32547a4de3bfa3
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/Link.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/Logo.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/Logo.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7c5c83f48b48e1c80f6c55ff6bdd399294ac830a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/Logo.vue
@@ -0,0 +1,83 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/SidebarItem.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/SidebarItem.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f87b70b13204ac53d2f38d038bf855c7482b3b4c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/SidebarItem.vue
@@ -0,0 +1,98 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/index.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..fb014a23fa97acd98634e7fe5baa5193e764c530
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/Sidebar/index.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/TagsView/ScrollPane.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/components/TagsView/ScrollPane.vue
new file mode 100644
index 0000000000000000000000000000000000000000..bb753a12421f90bb05d559a33c34c92e07ef0124
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/TagsView/ScrollPane.vue
@@ -0,0 +1,94 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/TagsView/index.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/components/TagsView/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3929722ab2c39bce6d6d36e91f890e5d8d76d4d6
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/TagsView/index.vue
@@ -0,0 +1,294 @@
+
+
+
+
+ {{ generateTitle(tag.title) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/components/index.js b/app/Modules/Admin/Resources/vue-element-admin/layout/components/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..104bd3ac63fdad6e0d1c1fc60a21239b174006db
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/components/index.js
@@ -0,0 +1,5 @@
+export { default as AppMain } from './AppMain'
+export { default as Navbar } from './Navbar'
+export { default as Settings } from './Settings'
+export { default as Sidebar } from './Sidebar/index.vue'
+export { default as TagsView } from './TagsView/index.vue'
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/index.vue b/app/Modules/Admin/Resources/vue-element-admin/layout/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..965bcd1b1df67b0bab716b8e1e41f96d4a5788f4
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/index.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/layout/mixin/ResizeHandler.js b/app/Modules/Admin/Resources/vue-element-admin/layout/mixin/ResizeHandler.js
new file mode 100644
index 0000000000000000000000000000000000000000..e8d0df8c237c20405aacc19a1e317ce5b09cd5d1
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/layout/mixin/ResizeHandler.js
@@ -0,0 +1,45 @@
+import store from '@/store'
+
+const { body } = document
+const WIDTH = 992 // refer to Bootstrap's responsive design
+
+export default {
+ watch: {
+ $route(route) {
+ if (this.device === 'mobile' && this.sidebar.opened) {
+ store.dispatch('app/closeSideBar', { withoutAnimation: false })
+ }
+ }
+ },
+ beforeMount() {
+ window.addEventListener('resize', this.$_resizeHandler)
+ },
+ beforeDestroy() {
+ window.removeEventListener('resize', this.$_resizeHandler)
+ },
+ mounted() {
+ const isMobile = this.$_isMobile()
+ if (isMobile) {
+ store.dispatch('app/toggleDevice', 'mobile')
+ store.dispatch('app/closeSideBar', { withoutAnimation: true })
+ }
+ },
+ methods: {
+ // use $_ for mixins properties
+ // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+ $_isMobile() {
+ const rect = body.getBoundingClientRect()
+ return rect.width - 1 < WIDTH
+ },
+ $_resizeHandler() {
+ if (!document.hidden) {
+ const isMobile = this.$_isMobile()
+ store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop')
+
+ if (isMobile) {
+ store.dispatch('app/closeSideBar', { withoutAnimation: true })
+ }
+ }
+ }
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/main.js b/app/Modules/Admin/Resources/vue-element-admin/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..5ba947f4fa8ae74d32f1c55838f41d6f1acfaa28
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/main.js
@@ -0,0 +1,56 @@
+import Vue from 'vue'
+
+import Cookies from 'js-cookie'
+
+import 'normalize.css/normalize.css' // a modern alternative to CSS resets
+
+import Element from 'element-ui'
+import './styles/element-variables.scss'
+
+import '@/styles/index.scss' // global css
+
+import App from './App'
+
+import store from '@/store';
+
+import router from '@/router';
+
+import i18n from './lang' // internationalization
+import './icons' // icon
+import './permission' // permission control
+import './utils/error-log' // error log
+
+import * as filters from './filters' // global filters
+
+// 日期格式转换
+import Moment from "moment"
+Vue.prototype.moment = Moment;
+
+/**
+ * If you don't want to use mock-server
+ * you want to use MockJs for mock api
+ * you can execute: mockXHR()
+ *
+ * Currently MockJs will be used in the production environment,
+ * please remove it before going online ! ! !
+ */
+
+Vue.use(Element, {
+ size: Cookies.get('size') || 'medium', // set element-ui default size
+ i18n: (key, value) => i18n.t(key, value)
+})
+
+// register global utility filters
+Object.keys(filters).forEach(key => {
+ Vue.filter(key, filters[key])
+})
+
+Vue.config.productionTip = false
+
+new Vue({
+ el: '#app',
+ router,
+ store,
+ i18n,
+ render: h => h(App)
+})
diff --git a/app/Modules/Admin/Resources/vue-element-admin/permission.js b/app/Modules/Admin/Resources/vue-element-admin/permission.js
new file mode 100644
index 0000000000000000000000000000000000000000..63d661215ec8cdf18d1343e337edf50bef6d1c6d
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/permission.js
@@ -0,0 +1,74 @@
+import router from './router'
+import store from '@/store'
+import { Message } from 'element-ui'
+import NProgress from 'nprogress' // progress bar
+import 'nprogress/nprogress.css' // progress bar style
+import { getToken } from '@/utils/auth' // get token from cookie
+import getPageTitle from '@/utils/get-page-title';
+
+NProgress.configure({ showSpinner: false }) // NProgress Configuration
+
+const whiteList = ['/login', '/auth-redirect'] // no redirect whitelist
+
+router.beforeEach(async(to, from, next) => {
+ // start progress bar
+ NProgress.start()
+
+ // set page title
+ document.title = getPageTitle(to.meta.title)
+
+ // determine whether the user has logged in
+ const hasToken = getToken()
+
+ if (hasToken) {
+ if (to.path === '/login') {
+ // if is logged in, redirect to the home page
+ next({ path: '/' })
+ NProgress.done() // hack: https://github.com/PanJiaChen/vue-element-admin/pull/2939
+ } else {
+ // determine whether the user has obtained his permission roles through getInfo
+ const hasRoles = store.getters.roles && store.getters.roles.length > 0
+ if (hasRoles) {
+ next()
+ } else {
+ try {
+ // get user info
+ // note: roles must be a object array! such as: ['admin'] or ,['developer','editor']
+ const { roles } = await store.dispatch('user/getInfo')
+
+ // generate accessible routes map based on roles
+ const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
+
+ // dynamically add accessible routes
+ router.addRoutes(accessRoutes)
+
+ // hack method to ensure that addRoutes is complete
+ // set the replace: true, so the navigation will not leave a history record
+ next({ ...to, replace: true })
+ } catch (error) {
+ // remove token and go to login page to re-login
+ await store.dispatch('user/resetToken')
+ Message.error(error || 'Has Error')
+ next(`/login?redirect=${to.fullPath}`)
+ NProgress.done()
+ }
+ }
+ }
+ } else {
+ /* has no token*/
+
+ if (whiteList.indexOf(to.path) !== -1) {
+ // in the free login whitelist, go directly
+ next()
+ } else {
+ // other pages that do not have permission to access are redirected to the login page.
+ next(`/login?redirect=${to.fullPath}`)
+ NProgress.done()
+ }
+ }
+})
+
+router.afterEach(() => {
+ // finish progress bar
+ NProgress.done()
+})
diff --git a/app/Modules/Admin/Resources/vue-element-admin/router/index.js b/app/Modules/Admin/Resources/vue-element-admin/router/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..3ffbeb32346f807ff8c6d2615eb8662cabf39cb7
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/router/index.js
@@ -0,0 +1,178 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+
+Vue.use(Router)
+
+/* Layout */
+import Layout from '@/layout'
+
+/* Router Modules */
+import componentsRouter from './modules/components'
+import chartsRouter from './modules/charts'
+
+/**
+ * Note: sub-menu only appear when route children.length >= 1
+ * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
+ *
+ * hidden: true if set true, item will not show in the sidebar(default is false)
+ * alwaysShow: true if set true, will always show the root menu
+ * if not set alwaysShow, when item has more than one children route,
+ * it will becomes nested mode, otherwise not show the root menu
+ * redirect: noRedirect if set noRedirect will no redirect in the breadcrumb
+ * name:'router-name' the name is used by (must set!!!)
+ * meta : {
+ roles: ['admin','editor'] control the page roles (you can set multiple roles)
+ title: 'title' the name show in sidebar and breadcrumb (recommend set)
+ icon: 'svg-name'/'el-icon-x' the icon show in the sidebar
+ noCache: true if set true, the page will no be cached(default is false)
+ affix: true if set true, the tag will affix in the tags-view
+ breadcrumb: false if set false, the item will hidden in breadcrumb(default is true)
+ activeMenu: '/example/list' if set path, the sidebar will highlight the path you set
+ }
+ */
+
+/**
+ * constantRoutes
+ * a base page that does not have permission requirements
+ * all roles can be accessed
+ */
+export const constantRoutes = [
+ {
+ path: '/redirect',
+ component: Layout,
+ hidden: true,
+ children: [
+ {
+ path: '/redirect/:path(.*)',
+ component: () => import('@/views/demo/redirect/index')
+ }
+ ]
+ },
+ {
+ path: '/login',
+ component: () => import('@/views/login/index'),
+ hidden: true
+ },
+ {
+ path: '/auth-redirect',
+ component: () => import('@/views/login/auth-redirect'),
+ hidden: true
+ },
+ {
+ path: '/404',
+ component: () => import('@/views/error-page/404'),
+ hidden: true
+ },
+ {
+ path: '/401',
+ component: () => import('@/views/error-page/401'),
+ hidden: true
+ },
+ {
+ path: '/',
+ component: Layout,
+ redirect: '/dashboard',
+ children: [
+ {
+ path: 'dashboard',
+ component: () => import('@/views/dashboard/index'),
+ name: 'Dashboard',
+ meta: {title: 'dashboard', icon: 'dashboard', affix: true}
+ }
+ ]
+ },
+ {
+ path: '/profile',
+ component: Layout,
+ redirect: '/profile/index',
+ // hidden: true,
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/profile/index'),
+ name: 'Profile',
+ meta: {title: 'profile', icon: 'el-icon-user', noCache: true}
+ }
+ ]
+ },
+ {
+ path: '/icon',
+ component: Layout,
+ children: [
+ {
+ path: 'index',
+ component: () => import('@/views/demo/icons/index'),
+ name: 'Icons',
+ meta: {title: 'icons', icon: 'icon', noCache: true}
+ }
+ ]
+ },
+
+ componentsRouter,
+ chartsRouter
+];
+
+
+/**
+ * asyncRoutes
+ * the routes that need to be dynamically loaded based on user roles
+ */
+export const asyncRoutes = [
+ /** when your routing map is too long, you can split it into small modules **/
+ // componentsRouter,
+ // chartsRouter,
+
+ // {
+ // path: 'external-link',
+ // component: Layout,
+ // children: [
+ // {
+ // path: 'https://github.com/PanJiaChen/vue-element-admin',
+ // meta: {title: 'externalLink', icon: 'link'}
+ // }
+ // ]
+ // },
+
+ {
+ path: '/error',
+ component: Layout,
+ redirect: 'noRedirect',
+ name: 'ErrorPages',
+ meta: {
+ title: 'errorPages',
+ icon: '404'
+ },
+ children: [
+ {
+ path: '401',
+ component: () => import('@/views/error-page/401'),
+ name: 'Page401',
+ meta: {title: 'page401', noCache: true}
+ },
+ {
+ path: '404',
+ component: () => import('@/views/error-page/404'),
+ name: 'Page404',
+ meta: {title: 'page404', noCache: true}
+ }
+ ]
+ },
+ {path: '*', redirect: '/404', hidden: true},
+ // 404 page must be placed at the end !!!
+]
+
+const createRouter = () => new Router({
+ // mode: 'history', // require service support
+ scrollBehavior: () => ({y: 0}),
+ routes: constantRoutes
+})
+
+const router = createRouter()
+
+// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
+export function resetRouter() {
+ const newRouter = createRouter()
+ router.matcher = newRouter.matcher // reset router
+}
+
+export default router
diff --git a/app/Modules/Admin/Resources/vue-element-admin/router/modules/charts.js b/app/Modules/Admin/Resources/vue-element-admin/router/modules/charts.js
new file mode 100644
index 0000000000000000000000000000000000000000..1d3c9442241811ebc5c0210d1ea887e2e9e1e51a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/router/modules/charts.js
@@ -0,0 +1,36 @@
+/** When your routing table is too long, you can split it into small modules**/
+
+import Layout from '@/layout'
+
+const chartsRouter = {
+ path: '/charts',
+ component: Layout,
+ redirect: 'noRedirect',
+ name: 'Charts',
+ meta: {
+ title: 'charts',
+ icon: 'chart'
+ },
+ children: [
+ {
+ path: 'keyboard',
+ component: () => import('@/views/demo/charts/keyboard'),
+ name: 'KeyboardChart',
+ meta: {title: 'keyboardChart', noCache: true}
+ },
+ {
+ path: 'line',
+ component: () => import('@/views/demo/charts/line'),
+ name: 'LineChart',
+ meta: {title: 'lineChart', noCache: true}
+ },
+ {
+ path: 'mix-chart',
+ component: () => import('@/views/demo/charts/mix-chart'),
+ name: 'MixChart',
+ meta: {title: 'mixChart', noCache: true}
+ }
+ ]
+}
+
+export default chartsRouter
diff --git a/app/Modules/Admin/Resources/vue-element-admin/router/modules/components.js b/app/Modules/Admin/Resources/vue-element-admin/router/modules/components.js
new file mode 100644
index 0000000000000000000000000000000000000000..16da791e8a59586943911922205a7bf08019fa41
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/router/modules/components.js
@@ -0,0 +1,78 @@
+/** When your routing table is too long, you can split it into small modules **/
+
+import Layout from '@/layout'
+
+const componentsRouter = {
+ path: '/components',
+ component: Layout,
+ redirect: 'noRedirect',
+ name: 'ComponentDemo',
+ meta: {
+ title: 'components',
+ icon: 'component'
+ },
+ children: [
+ {
+ path: 'tinymce',
+ component: () => import('@/views/demo/components-demo/tinymce'),
+ name: 'TinymceDemo',
+ meta: {title: 'tinymce'}
+ },
+ {
+ path: 'markdown',
+ component: () => import('@/views/demo/components-demo/markdown'),
+ name: 'MarkdownDemo',
+ meta: {title: 'markdown'}
+ },
+ {
+ path: 'json-editor',
+ component: () => import('@/views/demo/components-demo/json-editor'),
+ name: 'JsonEditorDemo',
+ meta: {title: 'jsonEditor'}
+ },
+ {
+ path: 'avatar-upload',
+ component: () => import('@/views/demo/components-demo/avatar-upload'),
+ name: 'AvatarUploadDemo',
+ meta: {title: 'avatarUpload'}
+ },
+ {
+ path: 'dropzone',
+ component: () => import('@/views/demo/components-demo/dropzone'),
+ name: 'DropzoneDemo',
+ meta: {title: 'dropzone'}
+ },
+ {
+ path: 'count-to',
+ component: () => import('@/views/demo/components-demo/count-to'),
+ name: 'CountToDemo',
+ meta: {title: 'countTo'}
+ },
+ {
+ path: 'mixin',
+ component: () => import('@/views/demo/components-demo/mixin'),
+ name: 'ComponentMixinDemo',
+ meta: {title: 'componentMixin'}
+ },
+ {
+ path: 'back-to-top',
+ component: () => import('@/views/demo/components-demo/back-to-top'),
+ name: 'BackToTopDemo',
+ meta: {title: 'backToTop'}
+ },
+ {
+ path: 'drag-select',
+ component: () => import('@/views/demo/components-demo/drag-select'),
+ name: 'DragSelectDemo',
+ meta: {title: 'dragSelect'}
+ },
+ {
+ path: 'drag-kanban',
+ component: () => import('@/views/demo/components-demo/drag-kanban'),
+ name: 'DragKanbanDemo',
+ meta: {title: 'dragKanban'}
+ }
+ ]
+}
+
+export default componentsRouter
diff --git a/app/Modules/Admin/Resources/vue-element-admin/settings.js b/app/Modules/Admin/Resources/vue-element-admin/settings.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e4683f90151979c32e1c7f3f69069d170ac152f
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/settings.js
@@ -0,0 +1,42 @@
+module.exports = {
+ title: 'Vue Element Admin',
+
+ /**
+ * @type {boolean} true | false
+ * @description Whether show the settings right-panel
+ */
+ showSettings: true,
+
+ /**
+ * @type {boolean} true | false
+ * @description Whether need tagsView
+ */
+ tagsView: true,
+
+ /**
+ * @type {boolean} true | false
+ * @description Whether fix the header
+ */
+ fixedHeader: false,
+
+ /**
+ * @type {boolean} true | false
+ * @description Whether show the logo in sidebar
+ */
+ sidebarLogo: false,
+
+ /**
+ * @type {boolean} true | false
+ * @description Whether support pinyin search in headerSearch
+ * Bundle size minified 47.3kb,minified + gzipped 63kb
+ */
+ supportPinyinSearch: true,
+
+ /**
+ * @type {string | array} 'production' | ['production', 'development']
+ * @description Need show err logs component.
+ * The default is only used in the production env
+ * If you want to also use it in dev, you can pass ['production', 'development']
+ */
+ errorLog: 'production'
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/store/getters.js b/app/Modules/Admin/Resources/vue-element-admin/store/getters.js
new file mode 100644
index 0000000000000000000000000000000000000000..cfbd9595ad4b538dc599f5cddf4ac1a9fa6aad4c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/store/getters.js
@@ -0,0 +1,17 @@
+const getters = {
+ sidebar: state => state.app.sidebar,
+ language: state => state.app.language,
+ size: state => state.app.size,
+ device: state => state.app.device,
+ visitedViews: state => state.tagsView.visitedViews,
+ cachedViews: state => state.tagsView.cachedViews,
+ token: state => state.user.token,
+ avatar: state => state.user.avatar,
+ name: state => state.user.name,
+ introduction: state => state.user.introduction,
+ roles: state => state.user.roles,
+ menus: state => state.user.menus,
+ permission_routes: state => state.permission.routes,
+ errorLogs: state => state.errorLog.logs
+}
+export default getters
diff --git a/app/Modules/Admin/Resources/vue-element-admin/store/index.js b/app/Modules/Admin/Resources/vue-element-admin/store/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..0fd8395561c93326be8518c074f5f69ecee418c9
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/store/index.js
@@ -0,0 +1,25 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+import getters from './getters'
+
+Vue.use(Vuex)
+
+// https://webpack.js.org/guides/dependency-management/#requirecontext
+const modulesFiles = require.context('./modules', true, /\.js$/)
+
+// you do not need `import app from './modules/app'`
+// it will auto require all vuex module from modules file
+const modules = modulesFiles.keys().reduce((modules, modulePath) => {
+ // set './app.js' => 'app'
+ const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1')
+ const value = modulesFiles(modulePath)
+ modules[moduleName] = value.default
+ return modules
+}, {})
+
+const store = new Vuex.Store({
+ modules,
+ getters
+})
+
+export default store
diff --git a/app/Modules/Admin/Resources/vue-element-admin/store/modules/app.js b/app/Modules/Admin/Resources/vue-element-admin/store/modules/app.js
new file mode 100644
index 0000000000000000000000000000000000000000..73616469bd42aabb8c9a9dbd1b4e19fe398e67ef
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/store/modules/app.js
@@ -0,0 +1,65 @@
+import Cookies from 'js-cookie'
+import { getLanguage } from '@/lang/index'
+
+const state = {
+ sidebar: {
+ opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+ withoutAnimation: false
+ },
+ device: 'desktop',
+ language: getLanguage(),
+ size: Cookies.get('size') || 'medium'
+}
+
+const mutations = {
+ TOGGLE_SIDEBAR: state => {
+ state.sidebar.opened = !state.sidebar.opened
+ state.sidebar.withoutAnimation = false
+ if (state.sidebar.opened) {
+ Cookies.set('sidebarStatus', 1)
+ } else {
+ Cookies.set('sidebarStatus', 0)
+ }
+ },
+ CLOSE_SIDEBAR: (state, withoutAnimation) => {
+ Cookies.set('sidebarStatus', 0)
+ state.sidebar.opened = false
+ state.sidebar.withoutAnimation = withoutAnimation
+ },
+ TOGGLE_DEVICE: (state, device) => {
+ state.device = device
+ },
+ SET_LANGUAGE: (state, language) => {
+ state.language = language
+ Cookies.set('language', language)
+ },
+ SET_SIZE: (state, size) => {
+ state.size = size
+ Cookies.set('size', size)
+ }
+}
+
+const actions = {
+ toggleSideBar({ commit }) {
+ commit('TOGGLE_SIDEBAR')
+ },
+ closeSideBar({ commit }, { withoutAnimation }) {
+ commit('CLOSE_SIDEBAR', withoutAnimation)
+ },
+ toggleDevice({ commit }, device) {
+ commit('TOGGLE_DEVICE', device)
+ },
+ setLanguage({ commit }, language) {
+ commit('SET_LANGUAGE', language)
+ },
+ setSize({ commit }, size) {
+ commit('SET_SIZE', size)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/store/modules/errorLog.js b/app/Modules/Admin/Resources/vue-element-admin/store/modules/errorLog.js
new file mode 100644
index 0000000000000000000000000000000000000000..6b01f957543a78e2fff174283ebef65b8c9aa886
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/store/modules/errorLog.js
@@ -0,0 +1,28 @@
+const state = {
+ logs: []
+}
+
+const mutations = {
+ ADD_ERROR_LOG: (state, log) => {
+ state.logs.push(log)
+ },
+ CLEAR_ERROR_LOG: (state) => {
+ state.logs.splice(0)
+ }
+}
+
+const actions = {
+ addErrorLog({ commit }, log) {
+ commit('ADD_ERROR_LOG', log)
+ },
+ clearErrorLog({ commit }) {
+ commit('CLEAR_ERROR_LOG')
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/store/modules/permission.js b/app/Modules/Admin/Resources/vue-element-admin/store/modules/permission.js
new file mode 100644
index 0000000000000000000000000000000000000000..5c371c905e90a107b5f45e02131d898fe9f0bf5a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/store/modules/permission.js
@@ -0,0 +1,123 @@
+import {
+ asyncRoutes,
+ constantRoutes
+} from '@/router';
+
+import {
+ getMenus
+} from '@/api/login';
+
+import Layout from '@/layout';
+
+/**
+ * Use meta.role to determine if the current user has permission
+ * @param roles
+ * @param route
+ */
+function hasPermission(roles, route) {
+ if (route.meta && route.meta.roles) {
+ return roles.some(role => route.meta.roles.includes(role))
+ } else {
+ return true
+ }
+}
+
+/**
+ * Filter asynchronous routing tables by recursion
+ * @param routes asyncRoutes
+ * @param roles
+ */
+export function filterAsyncRoutes(routes, roles) {
+ const res = []
+
+ routes.forEach(route => {
+ const tmp = {...route}
+ if (hasPermission(roles, tmp)) {
+ if (tmp.children) {
+ tmp.children = filterAsyncRoutes(tmp.children, roles)
+ }
+ res.push(tmp)
+ }
+ })
+
+ return res
+}
+
+/**
+ * 后台查询的菜单数据拼装成路由格式的数据
+ * @param routes
+ */
+export function generaMenu(routes, data) {
+ data.forEach(item => {
+ // 如果不存在路由页面,那么不追究到路由中
+ if (item.vue_component.length <= 0) return;
+
+ const menu = {
+ path: item.vue_path,
+ component: (item.vue_component === 'Layout') ? Layout : (resolve) => require([`@/views/${item.vue_component}`], resolve),
+ children: [],
+ name: item.vue_name,
+ };
+
+ if (item.vue_path != '/') menu.meta = {
+ icon: item.vue_icon,
+ title: item.vue_name,
+ id: item.menu_id
+ };
+
+ // 首页
+ if (item.vue_path == 'dashboard') menu.meta.affix = true;
+
+ // 是否跳转
+ if (item.vue_redirect) menu.redirect = item.vue_redirect;
+
+ // 隐藏的菜单栏目
+ if (item.is_hidden == 1) menu.hidden = true;
+
+ // 子菜单
+ if (item._child) {
+ generaMenu(menu.children, item._child);
+ }
+
+ routes.push(menu);
+ });
+}
+
+const state = {
+ routes: [],
+ addRoutes: []
+};
+
+const mutations = {
+ SET_ROUTES: (state, routes) => {
+ state.addRoutes = routes;
+ state.routes = constantRoutes.concat(routes);
+ }
+}
+
+const actions = {
+ generateRoutes({commit}, roles) {
+ return new Promise(resolve => {
+ getMenus(state.token).then((response) => {
+ const {
+ data
+ } = response;
+
+ var pushRouter = [];
+ generaMenu(pushRouter, data);
+ commit('SET_ROUTES', pushRouter);
+ resolve(pushRouter);
+ }).catch(error => {
+ console.log(error);
+ resolve([]);
+ });
+ });
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/store/modules/settings.js b/app/Modules/Admin/Resources/vue-element-admin/store/modules/settings.js
new file mode 100644
index 0000000000000000000000000000000000000000..640368cdba7f9ca6e70567973ae98d51f21215b0
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/store/modules/settings.js
@@ -0,0 +1,36 @@
+import variables from '@/styles/element-variables.scss'
+import defaultSettings from '@/settings'
+
+const { showSettings, tagsView, fixedHeader, sidebarLogo, supportPinyinSearch } = defaultSettings
+
+const state = {
+ theme: variables.theme,
+ showSettings,
+ tagsView,
+ fixedHeader,
+ sidebarLogo,
+ supportPinyinSearch
+}
+
+const mutations = {
+ CHANGE_SETTING: (state, { key, value }) => {
+ // eslint-disable-next-line no-prototype-builtins
+ if (state.hasOwnProperty(key)) {
+ state[key] = value
+ }
+ }
+}
+
+const actions = {
+ changeSetting({ commit }, data) {
+ commit('CHANGE_SETTING', data)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/store/modules/tagsView.js b/app/Modules/Admin/Resources/vue-element-admin/store/modules/tagsView.js
new file mode 100644
index 0000000000000000000000000000000000000000..57e72421e6b12fa20906ac59a7a442bfe5343c7a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/store/modules/tagsView.js
@@ -0,0 +1,160 @@
+const state = {
+ visitedViews: [],
+ cachedViews: []
+}
+
+const mutations = {
+ ADD_VISITED_VIEW: (state, view) => {
+ if (state.visitedViews.some(v => v.path === view.path)) return
+ state.visitedViews.push(
+ Object.assign({}, view, {
+ title: view.meta.title || 'no-name'
+ })
+ )
+ },
+ ADD_CACHED_VIEW: (state, view) => {
+ if (state.cachedViews.includes(view.name)) return
+ if (!view.meta.noCache) {
+ state.cachedViews.push(view.name)
+ }
+ },
+
+ DEL_VISITED_VIEW: (state, view) => {
+ for (const [i, v] of state.visitedViews.entries()) {
+ if (v.path === view.path) {
+ state.visitedViews.splice(i, 1)
+ break
+ }
+ }
+ },
+ DEL_CACHED_VIEW: (state, view) => {
+ const index = state.cachedViews.indexOf(view.name)
+ index > -1 && state.cachedViews.splice(index, 1)
+ },
+
+ DEL_OTHERS_VISITED_VIEWS: (state, view) => {
+ state.visitedViews = state.visitedViews.filter(v => {
+ return v.meta.affix || v.path === view.path
+ })
+ },
+ DEL_OTHERS_CACHED_VIEWS: (state, view) => {
+ const index = state.cachedViews.indexOf(view.name)
+ if (index > -1) {
+ state.cachedViews = state.cachedViews.slice(index, index + 1)
+ } else {
+ // if index = -1, there is no cached tags
+ state.cachedViews = []
+ }
+ },
+
+ DEL_ALL_VISITED_VIEWS: state => {
+ // keep affix tags
+ const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
+ state.visitedViews = affixTags
+ },
+ DEL_ALL_CACHED_VIEWS: state => {
+ state.cachedViews = []
+ },
+
+ UPDATE_VISITED_VIEW: (state, view) => {
+ for (let v of state.visitedViews) {
+ if (v.path === view.path) {
+ v = Object.assign(v, view)
+ break
+ }
+ }
+ }
+}
+
+const actions = {
+ addView({ dispatch }, view) {
+ dispatch('addVisitedView', view)
+ dispatch('addCachedView', view)
+ },
+ addVisitedView({ commit }, view) {
+ commit('ADD_VISITED_VIEW', view)
+ },
+ addCachedView({ commit }, view) {
+ commit('ADD_CACHED_VIEW', view)
+ },
+
+ delView({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delVisitedView', view)
+ dispatch('delCachedView', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delVisitedView({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_VISITED_VIEW', view)
+ resolve([...state.visitedViews])
+ })
+ },
+ delCachedView({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_CACHED_VIEW', view)
+ resolve([...state.cachedViews])
+ })
+ },
+
+ delOthersViews({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delOthersVisitedViews', view)
+ dispatch('delOthersCachedViews', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delOthersVisitedViews({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_OTHERS_VISITED_VIEWS', view)
+ resolve([...state.visitedViews])
+ })
+ },
+ delOthersCachedViews({ commit, state }, view) {
+ return new Promise(resolve => {
+ commit('DEL_OTHERS_CACHED_VIEWS', view)
+ resolve([...state.cachedViews])
+ })
+ },
+
+ delAllViews({ dispatch, state }, view) {
+ return new Promise(resolve => {
+ dispatch('delAllVisitedViews', view)
+ dispatch('delAllCachedViews', view)
+ resolve({
+ visitedViews: [...state.visitedViews],
+ cachedViews: [...state.cachedViews]
+ })
+ })
+ },
+ delAllVisitedViews({ commit, state }) {
+ return new Promise(resolve => {
+ commit('DEL_ALL_VISITED_VIEWS')
+ resolve([...state.visitedViews])
+ })
+ },
+ delAllCachedViews({ commit, state }) {
+ return new Promise(resolve => {
+ commit('DEL_ALL_CACHED_VIEWS')
+ resolve([...state.cachedViews])
+ })
+ },
+
+ updateVisitedView({ commit }, view) {
+ commit('UPDATE_VISITED_VIEW', view)
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/store/modules/user.js b/app/Modules/Admin/Resources/vue-element-admin/store/modules/user.js
new file mode 100644
index 0000000000000000000000000000000000000000..b08cc8317137047138133bf19c92b657dda5097b
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/store/modules/user.js
@@ -0,0 +1,167 @@
+import {
+ login,
+ logout,
+ getInfo,
+ getMenus
+} from '@/api/login';
+
+import {
+ getToken,
+ setToken,
+ removeToken
+} from '@/utils/auth';
+
+import router, {
+ resetRouter
+} from '@/router';
+
+import {
+ Message
+} from 'element-ui';
+
+const state = {
+ token: getToken(),
+ name: '',
+ avatar: '',
+ introduction: '',
+ roles: [],
+ menus: []
+}
+
+const mutations = {
+ SET_TOKEN: (state, token) => {
+ state.token = token
+ },
+ SET_INTRODUCTION: (state, introduction) => {
+ state.introduction = introduction
+ },
+ SET_NAME: (state, name) => {
+ state.name = name
+ },
+ SET_AVATAR: (state, avatar) => {
+ state.avatar = avatar
+ },
+ SET_ROLES: (state, roles) => {
+ state.roles = roles
+ },
+ SET_MENUS: (state, menus) => {
+ state.menus = menus
+ }
+}
+
+const actions = {
+ // user login
+ login({commit}, userInfo) {
+ const {username, password} = userInfo
+ return new Promise((resolve, reject) => {
+ login({admin_name: username.trim(), password: password}).then(response => {
+ const {data} = response;
+ Message({
+ message: response.msg,
+ type: 'success',
+ duration: 1500
+ });
+
+ commit('SET_TOKEN', data.access_token);
+ setToken(data.access_token);
+
+ console.log('登录完成 - login - end');
+ resolve();
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // get user info
+ getInfo({commit, state}) {
+
+ console.log('获取基本信息 - getInfo');
+ return new Promise((resolve, reject) => {
+ getInfo(state.token).then(response => {
+ const {data} = response
+
+ if (!data) {
+ reject('Verification failed, please Login again.')
+ }
+
+ const {roles, admin_name, admin_head} = data
+
+
+ // 强行定义:路由权限后端做了处理,前端如何没有权限就不会展示菜单栏目 === vue的路由
+ roles.push('admin');
+ roles.push('editor');
+
+ // roles must be a non-empty array
+ if (!roles || roles.length <= 0) {
+ reject('getInfo: roles must be a non-null array!')
+ }
+
+ commit('SET_ROLES', roles)
+ commit('SET_NAME', admin_name)
+ commit('SET_AVATAR', admin_head)
+ commit('SET_INTRODUCTION', admin_name)
+ resolve(data)
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // user logout
+ logout({commit, state, dispatch}) {
+ return new Promise((resolve, reject) => {
+ logout(state.token).then(() => {
+ commit('SET_TOKEN', '')
+ commit('SET_ROLES', [])
+ removeToken()
+ resetRouter()
+
+ // reset visited views and cached views
+ // to fixed https://github.com/PanJiaChen/vue-element-admin/issues/2485
+ dispatch('tagsView/delAllViews', null, {root: true})
+
+ resolve()
+ }).catch(error => {
+ reject(error)
+ })
+ })
+ },
+
+ // remove token
+ resetToken({commit}) {
+ return new Promise(resolve => {
+ commit('SET_TOKEN', '')
+ commit('SET_ROLES', [])
+ removeToken()
+ resolve()
+ })
+ },
+
+ // dynamically modify permissions
+ async changeRoles({commit, dispatch}, role) {
+ const token = role + '-token'
+
+ commit('SET_TOKEN', token)
+ setToken(token)
+
+ const {roles} = await dispatch('getInfo')
+
+ resetRouter()
+
+ // generate accessible routes map based on roles
+ const accessRoutes = await dispatch('permission/generateRoutes', roles, {root: true})
+ // dynamically add accessible routes
+ router.addRoutes(accessRoutes)
+
+ // reset visited views and cached views
+ dispatch('tagsView/delAllViews', null, {root: true})
+ }
+}
+
+export default {
+ namespaced: true,
+ state,
+ mutations,
+ actions
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/styles/btn.scss b/app/Modules/Admin/Resources/vue-element-admin/styles/btn.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e6ba1a8e197532a3435f0d028717b21fc2c30c9f
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/styles/btn.scss
@@ -0,0 +1,99 @@
+@import './variables.scss';
+
+@mixin colorBtn($color) {
+ background: $color;
+
+ &:hover {
+ color: $color;
+
+ &:before,
+ &:after {
+ background: $color;
+ }
+ }
+}
+
+.blue-btn {
+ @include colorBtn($blue)
+}
+
+.light-blue-btn {
+ @include colorBtn($light-blue)
+}
+
+.red-btn {
+ @include colorBtn($red)
+}
+
+.pink-btn {
+ @include colorBtn($pink)
+}
+
+.green-btn {
+ @include colorBtn($green)
+}
+
+.tiffany-btn {
+ @include colorBtn($tiffany)
+}
+
+.yellow-btn {
+ @include colorBtn($yellow)
+}
+
+.pan-btn {
+ font-size: 14px;
+ color: #fff;
+ padding: 14px 36px;
+ border-radius: 8px;
+ border: none;
+ outline: none;
+ transition: 600ms ease all;
+ position: relative;
+ display: inline-block;
+
+ &:hover {
+ background: #fff;
+
+ &:before,
+ &:after {
+ width: 100%;
+ transition: 600ms ease all;
+ }
+ }
+
+ &:before,
+ &:after {
+ content: '';
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 2px;
+ width: 0;
+ transition: 400ms ease all;
+ }
+
+ &::after {
+ right: inherit;
+ top: inherit;
+ left: 0;
+ bottom: 0;
+ }
+}
+
+.custom-button {
+ display: inline-block;
+ line-height: 1;
+ white-space: nowrap;
+ cursor: pointer;
+ background: #fff;
+ color: #fff;
+ -webkit-appearance: none;
+ text-align: center;
+ box-sizing: border-box;
+ outline: 0;
+ margin: 0;
+ padding: 10px 15px;
+ font-size: 14px;
+ border-radius: 4px;
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/styles/common.scss b/app/Modules/Admin/Resources/vue-element-admin/styles/common.scss
new file mode 100644
index 0000000000000000000000000000000000000000..3230876cec142d5a876f1df7173e172529e5e25a
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/styles/common.scss
@@ -0,0 +1,22 @@
+.el-dialog{
+ width: 600px;
+ margin-bottom: 5vh;
+}
+.danger-text{
+ color: #ff4949!important;
+}
+.width-200-px{
+ width: 200px!important;
+}
+.margin-buttom-10{
+ margin-bottom: 10px!important;
+}
+
+
+// 表单 下拉框 100%宽度占比
+.el-form{
+ .el-select,
+ .el-input{
+ width: 100%;
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/styles/element-ui.scss b/app/Modules/Admin/Resources/vue-element-admin/styles/element-ui.scss
new file mode 100644
index 0000000000000000000000000000000000000000..49474de3bd3ddc8e6b78d54c8a30c5481dfb2d61
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/styles/element-ui.scss
@@ -0,0 +1,84 @@
+// cover some element-ui styles
+
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+ font-weight: 400 !important;
+}
+
+.el-upload {
+ input[type="file"] {
+ display: none !important;
+ }
+}
+
+.el-upload__input {
+ display: none;
+}
+
+.cell {
+ .el-tag {
+ margin-right: 0px;
+ }
+}
+
+.small-padding {
+ .cell {
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+.fixed-width {
+ .el-button--mini {
+ padding: 7px 10px;
+ min-width: 60px;
+ }
+}
+
+.status-col {
+ .cell {
+ padding: 0 10px;
+ text-align: center;
+
+ .el-tag {
+ margin-right: 0px;
+ }
+ }
+}
+
+// to fixed https://github.com/ElemeFE/element/issues/2461
+.el-dialog {
+ transform: none;
+ left: 0;
+ position: relative;
+ margin: 0 auto;
+}
+
+// refine element ui upload
+.upload-container {
+ .el-upload {
+ width: 100%;
+
+ .el-upload-dragger {
+ width: 100%;
+ height: 200px;
+ }
+ }
+}
+
+// dropdown
+.el-dropdown-menu {
+ a {
+ display: block
+ }
+}
+
+// fix date-picker ui bug in filter-item
+.el-range-editor.el-input__inner {
+ display: inline-flex !important;
+}
+
+// to fix el-date-picker css style
+.el-range-separator {
+ box-sizing: content-box;
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/styles/element-variables.scss b/app/Modules/Admin/Resources/vue-element-admin/styles/element-variables.scss
new file mode 100644
index 0000000000000000000000000000000000000000..5bdc4dadc42a88a16efc51d2911f18de8ae77373
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/styles/element-variables.scss
@@ -0,0 +1,31 @@
+/**
+* I think element-ui's default theme color is too light for long-term use.
+* So I modified the default color and you can modify it to your liking.
+**/
+
+/* theme color */
+$--color-primary: #1890ff;
+$--color-success: #13ce66;
+$--color-warning: #ffba00;
+$--color-danger: #ff4949;
+// $--color-info: #1E1E1E;
+
+$--button-font-weight: 400;
+
+// $--color-text-regular: #1f2d3d;
+
+$--border-color-light: #dfe4ed;
+$--border-color-lighter: #e6ebf5;
+
+$--table-border: 1px solid #dfe6ec;
+
+/* icon font path, required */
+$--font-path: "~element-ui/lib/theme-chalk/fonts";
+
+@import "~element-ui/packages/theme-chalk/src/index";
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ theme: $--color-primary;
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/styles/index.scss b/app/Modules/Admin/Resources/vue-element-admin/styles/index.scss
new file mode 100644
index 0000000000000000000000000000000000000000..c870160ac70f995cca70c804b6ce503576a91b9e
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/styles/index.scss
@@ -0,0 +1,192 @@
+@import './variables.scss';
+@import './mixin.scss';
+@import './transition.scss';
+@import './element-ui.scss';
+@import './sidebar.scss';
+@import './btn.scss';
+@import './common.scss';
+
+body {
+ height: 100%;
+ -moz-osx-font-smoothing: grayscale;
+ -webkit-font-smoothing: antialiased;
+ text-rendering: optimizeLegibility;
+ font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+}
+
+label {
+ font-weight: 700;
+}
+
+html {
+ height: 100%;
+ box-sizing: border-box;
+}
+
+#app {
+ height: 100%;
+}
+
+*,
+*:before,
+*:after {
+ box-sizing: inherit;
+}
+
+.no-padding {
+ padding: 0px !important;
+}
+
+.padding-content {
+ padding: 4px 0;
+}
+
+a:focus,
+a:active {
+ outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+ cursor: pointer;
+ color: inherit;
+ text-decoration: none;
+}
+
+div:focus {
+ outline: none;
+}
+
+.fr {
+ float: right;
+}
+
+.fl {
+ float: left;
+}
+
+.pr-5 {
+ padding-right: 5px;
+}
+
+.pl-5 {
+ padding-left: 5px;
+}
+
+.block {
+ display: block;
+}
+
+.pointer {
+ cursor: pointer;
+}
+
+.inlineBlock {
+ display: block;
+}
+
+.clearfix {
+ &:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+ }
+}
+
+aside {
+ background: #eef1f6;
+ padding: 8px 24px;
+ margin-bottom: 20px;
+ border-radius: 2px;
+ display: block;
+ line-height: 32px;
+ font-size: 16px;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
+ color: #2c3e50;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+
+ a {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+ }
+}
+
+//main-container全局样式
+.app-container {
+ padding: 20px;
+}
+
+.components-container {
+ margin: 30px 50px;
+ position: relative;
+}
+
+.pagination-container {
+ margin-top: 30px;
+}
+
+.text-center {
+ text-align: center
+}
+
+.sub-navbar {
+ height: 50px;
+ line-height: 50px;
+ position: relative;
+ width: 100%;
+ text-align: right;
+ padding-right: 20px;
+ transition: 600ms ease position;
+ background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
+
+ .subtitle {
+ font-size: 20px;
+ color: #fff;
+ }
+
+ &.draft {
+ background: #d0d0d0;
+ }
+
+ &.deleted {
+ background: #d0d0d0;
+ }
+}
+
+.link-type,
+.link-type:focus {
+ color: #337ab7;
+ cursor: pointer;
+
+ &:hover {
+ color: rgb(32, 160, 255);
+ }
+}
+
+.filter-container {
+ padding-bottom: 10px;
+
+ .filter-item {
+ display: inline-block;
+ vertical-align: middle;
+ margin-bottom: 10px;
+ }
+}
+
+//refine vue-multiselect plugin
+.multiselect {
+ line-height: 16px;
+}
+
+.multiselect--active {
+ z-index: 1000 !important;
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/styles/mixin.scss b/app/Modules/Admin/Resources/vue-element-admin/styles/mixin.scss
new file mode 100644
index 0000000000000000000000000000000000000000..06fa06125834695b9ca9b679faaf46c574168c46
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/styles/mixin.scss
@@ -0,0 +1,66 @@
+@mixin clearfix {
+ &:after {
+ content: "";
+ display: table;
+ clear: both;
+ }
+}
+
+@mixin scrollBar {
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+}
+
+@mixin relative {
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+@mixin pct($pct) {
+ width: #{$pct};
+ position: relative;
+ margin: 0 auto;
+}
+
+@mixin triangle($width, $height, $color, $direction) {
+ $width: $width/2;
+ $color-border-style: $height solid $color;
+ $transparent-border-style: $width solid transparent;
+ height: 0;
+ width: 0;
+
+ @if $direction==up {
+ border-bottom: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==right {
+ border-left: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+
+ @else if $direction==down {
+ border-top: $color-border-style;
+ border-left: $transparent-border-style;
+ border-right: $transparent-border-style;
+ }
+
+ @else if $direction==left {
+ border-right: $color-border-style;
+ border-top: $transparent-border-style;
+ border-bottom: $transparent-border-style;
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/styles/sidebar.scss b/app/Modules/Admin/Resources/vue-element-admin/styles/sidebar.scss
new file mode 100644
index 0000000000000000000000000000000000000000..94760cc76136d17fe1350793dd07b98e85d370bb
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/styles/sidebar.scss
@@ -0,0 +1,226 @@
+#app {
+
+ .main-container {
+ min-height: 100%;
+ transition: margin-left .28s;
+ margin-left: $sideBarWidth;
+ position: relative;
+ }
+
+ .sidebar-container {
+ transition: width 0.28s;
+ width: $sideBarWidth !important;
+ background-color: $menuBg;
+ height: 100%;
+ position: fixed;
+ font-size: 0px;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1001;
+ overflow: hidden;
+
+ // reset element-ui css
+ .horizontal-collapse-transition {
+ transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+ }
+
+ .scrollbar-wrapper {
+ overflow-x: hidden !important;
+ }
+
+ .el-scrollbar__bar.is-vertical {
+ right: 0px;
+ }
+
+ .el-scrollbar {
+ height: 100%;
+ }
+
+ &.has-logo {
+ .el-scrollbar {
+ height: calc(100% - 50px);
+ }
+ }
+
+ .is-horizontal {
+ display: none;
+ }
+
+ a {
+ display: inline-block;
+ width: 100%;
+ overflow: hidden;
+ }
+
+ .svg-icon {
+ margin-right: 16px;
+ }
+
+ .sub-el-icon {
+ margin-right: 12px;
+ margin-left: -2px;
+ }
+
+ .el-menu {
+ border: none;
+ height: 100%;
+ width: 100% !important;
+ }
+
+ // menu hover
+ .submenu-title-noDropdown,
+ .el-submenu__title {
+ &:hover {
+ background-color: $menuHover !important;
+ }
+ }
+
+ .is-active>.el-submenu__title {
+ color: $subMenuActiveText !important;
+ }
+
+ & .nest-menu .el-submenu>.el-submenu__title,
+ & .el-submenu .el-menu-item {
+ min-width: $sideBarWidth !important;
+ background-color: $subMenuBg !important;
+
+ &:hover {
+ background-color: $subMenuHover !important;
+ }
+ }
+ }
+
+ .hideSidebar {
+ .sidebar-container {
+ width: 54px !important;
+ }
+
+ .main-container {
+ margin-left: 54px;
+ }
+
+ .submenu-title-noDropdown {
+ padding: 0 !important;
+ position: relative;
+
+ .el-tooltip {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+
+ .sub-el-icon {
+ margin-left: 19px;
+ }
+ }
+ }
+
+ .el-submenu {
+ overflow: hidden;
+
+ &>.el-submenu__title {
+ padding: 0 !important;
+
+ .svg-icon {
+ margin-left: 20px;
+ }
+
+ .sub-el-icon {
+ margin-left: 19px;
+ }
+
+ .el-submenu__icon-arrow {
+ display: none;
+ }
+ }
+ }
+
+ .el-menu--collapse {
+ .el-submenu {
+ &>.el-submenu__title {
+ &>span {
+ height: 0;
+ width: 0;
+ overflow: hidden;
+ visibility: hidden;
+ display: inline-block;
+ }
+ }
+ }
+ }
+ }
+
+ .el-menu--collapse .el-menu .el-submenu {
+ min-width: $sideBarWidth !important;
+ }
+
+ // mobile responsive
+ .mobile {
+ .main-container {
+ margin-left: 0px;
+ }
+
+ .sidebar-container {
+ transition: transform .28s;
+ width: $sideBarWidth !important;
+ }
+
+ &.hideSidebar {
+ .sidebar-container {
+ pointer-events: none;
+ transition-duration: 0.3s;
+ transform: translate3d(-$sideBarWidth, 0, 0);
+ }
+ }
+ }
+
+ .withoutAnimation {
+
+ .main-container,
+ .sidebar-container {
+ transition: none;
+ }
+ }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+ &>.el-menu {
+ .svg-icon {
+ margin-right: 16px;
+ }
+ .sub-el-icon {
+ margin-right: 12px;
+ margin-left: -2px;
+ }
+ }
+
+ .nest-menu .el-submenu>.el-submenu__title,
+ .el-menu-item {
+ &:hover {
+ // you can use $subMenuHover
+ background-color: $menuHover !important;
+ }
+ }
+
+ // the scroll bar appears when the subMenu is too long
+ >.el-menu--popup {
+ max-height: 100vh;
+ overflow-y: auto;
+
+ &::-webkit-scrollbar-track-piece {
+ background: #d3dce6;
+ }
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: #99a9bf;
+ border-radius: 20px;
+ }
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/styles/transition.scss b/app/Modules/Admin/Resources/vue-element-admin/styles/transition.scss
new file mode 100644
index 0000000000000000000000000000000000000000..4cb27cc811e28605bb6d0657a6257f0c901f6809
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/styles/transition.scss
@@ -0,0 +1,48 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+ transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+ opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+ transition: all .5s;
+}
+
+.fade-transform-enter {
+ opacity: 0;
+ transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+ opacity: 0;
+ transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+ transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+ opacity: 0;
+ transform: translateX(20px);
+}
+
+.breadcrumb-move {
+ transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+ position: absolute;
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/styles/variables.scss b/app/Modules/Admin/Resources/vue-element-admin/styles/variables.scss
new file mode 100644
index 0000000000000000000000000000000000000000..a19c27c1453d5e5f5666b3274836daba54e16acf
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/styles/variables.scss
@@ -0,0 +1,35 @@
+// base color
+$blue:#324157;
+$light-blue:#3A71A8;
+$red:#C03639;
+$pink: #E65D6E;
+$green: #30B08F;
+$tiffany: #4AB7BD;
+$yellow:#FEC171;
+$panGreen: #30B08F;
+
+// sidebar
+$menuText:#bfcbd9;
+$menuActiveText:#409EFF;
+$subMenuActiveText:#f4f4f5; // https://github.com/ElemeFE/element/issues/12951
+
+$menuBg:#304156;
+$menuHover:#263445;
+
+$subMenuBg:#1f2d3d;
+$subMenuHover:#001528;
+
+$sideBarWidth: 210px;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+ menuText: $menuText;
+ menuActiveText: $menuActiveText;
+ subMenuActiveText: $subMenuActiveText;
+ menuBg: $menuBg;
+ menuHover: $menuHover;
+ subMenuBg: $subMenuBg;
+ subMenuHover: $subMenuHover;
+ sideBarWidth: $sideBarWidth;
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/auth.js b/app/Modules/Admin/Resources/vue-element-admin/utils/auth.js
new file mode 100644
index 0000000000000000000000000000000000000000..d8c2c41613ef5dea50ad3bf7f211bad7d2ab369e
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/auth.js
@@ -0,0 +1,15 @@
+const TokenKey = 'Authorization'
+
+export function getToken() {
+ var token = localStorage.getItem(TokenKey);
+ if (token) return 'Bearer ' + token;
+ else return token;
+}
+
+export function setToken(token) {
+ return localStorage.setItem(TokenKey, token);
+}
+
+export function removeToken() {
+ return localStorage.removeItem(TokenKey);
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/clipboard.js b/app/Modules/Admin/Resources/vue-element-admin/utils/clipboard.js
new file mode 100644
index 0000000000000000000000000000000000000000..cf5b07a1123934f014191fe2108bf92de93b2455
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/clipboard.js
@@ -0,0 +1,32 @@
+import Vue from 'vue'
+import Clipboard from 'clipboard'
+
+function clipboardSuccess() {
+ Vue.prototype.$message({
+ message: 'Copy successfully',
+ type: 'success',
+ duration: 1500
+ })
+}
+
+function clipboardError() {
+ Vue.prototype.$message({
+ message: 'Copy failed',
+ type: 'error'
+ })
+}
+
+export default function handleClipboard(text, event) {
+ const clipboard = new Clipboard(event.target, {
+ text: () => text
+ })
+ clipboard.on('success', () => {
+ clipboardSuccess()
+ clipboard.destroy()
+ })
+ clipboard.on('error', () => {
+ clipboardError()
+ clipboard.destroy()
+ })
+ clipboard.onClick(event)
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/error-log.js b/app/Modules/Admin/Resources/vue-element-admin/utils/error-log.js
new file mode 100644
index 0000000000000000000000000000000000000000..a7f5b55fd896bac15b4f3d4dadac7762c5cae67c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/error-log.js
@@ -0,0 +1,35 @@
+import Vue from 'vue'
+import store from '@/store'
+import { isString, isArray } from '@/utils/validate'
+import settings from '@/settings'
+
+// you can set in settings.js
+// errorLog:'production' | ['production', 'development']
+const { errorLog: needErrorLog } = settings
+
+function checkNeed() {
+ const env = process.env.NODE_ENV
+ if (isString(needErrorLog)) {
+ return env === needErrorLog
+ }
+ if (isArray(needErrorLog)) {
+ return needErrorLog.includes(env)
+ }
+ return false
+}
+
+if (checkNeed()) {
+ Vue.config.errorHandler = function(err, vm, info, a) {
+ // Don't ask me why I use Vue.nextTick, it just a hack.
+ // detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500
+ Vue.nextTick(() => {
+ store.dispatch('errorLog/addErrorLog', {
+ err,
+ vm,
+ info,
+ url: window.location.href
+ })
+ console.error(err, info)
+ })
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/get-page-title.js b/app/Modules/Admin/Resources/vue-element-admin/utils/get-page-title.js
new file mode 100644
index 0000000000000000000000000000000000000000..4b6604cdea85c8104afea395b855e4d2affeb0a6
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/get-page-title.js
@@ -0,0 +1,13 @@
+import defaultSettings from '@/settings'
+import i18n from '@/lang'
+
+const title = defaultSettings.title || 'Vue Element Admin'
+
+export default function getPageTitle(key) {
+ const hasKey = i18n.te(`route.${key}`)
+ if (hasKey) {
+ const pageName = i18n.t(`route.${key}`)
+ return `${pageName} - ${title}`
+ }
+ return `${title}`
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/i18n.js b/app/Modules/Admin/Resources/vue-element-admin/utils/i18n.js
new file mode 100644
index 0000000000000000000000000000000000000000..76be5a4e90606445fe2865b6433f6223eba6f778
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/i18n.js
@@ -0,0 +1,12 @@
+// translate router.meta.title, be used in breadcrumb sidebar tagsview
+export function generateTitle(title) {
+ const hasKey = this.$te('route.' + title)
+
+ if (hasKey) {
+ // $t :this method from vue-i18n, inject in @/lang/index.js
+ const translatedTitle = this.$t('route.' + title)
+
+ return translatedTitle
+ }
+ return title
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/index.js b/app/Modules/Admin/Resources/vue-element-admin/utils/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..3eadf0f5c52049ca2e6f714c9472302c429ea8b6
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/index.js
@@ -0,0 +1,374 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * Parse the time to string
+ * @param {(Object|string|number)} time
+ * @param {string} cFormat
+ * @returns {string | null}
+ */
+export function parseTime(time, cFormat) {
+ if (arguments.length === 0 || !time) {
+ return '';
+ }
+ const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string')) {
+ if ((/^[0-9]+$/.test(time))) {
+ // support "1548221490638"
+ time = parseInt(time)
+ } else {
+ // support safari
+ // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
+ time = time.replace(new RegExp(/-/gm), '/')
+ }
+ }
+
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
+ time = time * 1000
+ }
+ date = new Date(time)
+ }
+ const formatObj = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+ const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
+ const value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') {
+ return ['日', '一', '二', '三', '四', '五', '六'][value]
+ }
+ return value.toString().padStart(2, '0')
+ })
+ return time_str
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+ if (('' + time).length === 10) {
+ time = parseInt(time) * 1000
+ } else {
+ time = +time
+ }
+ const d = new Date(time)
+ const now = Date.now()
+
+ const diff = (now - d) / 1000
+
+ if (diff < 30) {
+ return '刚刚'
+ } else if (diff < 3600) {
+ // less 1 hour
+ return Math.ceil(diff / 60) + '分钟前'
+ } else if (diff < 3600 * 24) {
+ return Math.ceil(diff / 3600) + '小时前'
+ } else if (diff < 3600 * 24 * 2) {
+ return '1天前'
+ }
+ if (option) {
+ return parseTime(time, option)
+ } else {
+ return (
+ d.getMonth() +
+ 1 +
+ '月' +
+ d.getDate() +
+ '日' +
+ d.getHours() +
+ '时' +
+ d.getMinutes() +
+ '分'
+ )
+ }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function getQueryObject(url) {
+ url = url == null ? window.location.href : url
+ const search = url.substring(url.lastIndexOf('?') + 1)
+ const obj = {}
+ const reg = /([^?&=]+)=([^?&=]*)/g
+ search.replace(reg, (rs, $1, $2) => {
+ const name = decodeURIComponent($1)
+ let val = decodeURIComponent($2)
+ val = String(val)
+ obj[name] = val
+ return rs
+ })
+ return obj
+}
+
+/**
+ * @param {string} input value
+ * @returns {number} output value
+ */
+export function byteLength(str) {
+ // returns the byte length of an utf8 string
+ let s = str.length
+ for (var i = str.length - 1; i >= 0; i--) {
+ const code = str.charCodeAt(i)
+ if (code > 0x7f && code <= 0x7ff) s++
+ else if (code > 0x7ff && code <= 0xffff) s += 2
+ if (code >= 0xDC00 && code <= 0xDFFF) i--
+ }
+ return s
+}
+
+/**
+ * @param {Array} actual
+ * @returns {Array}
+ */
+export function cleanArray(actual) {
+ const newArray = []
+ for (let i = 0; i < actual.length; i++) {
+ if (actual[i]) {
+ newArray.push(actual[i])
+ }
+ }
+ return newArray
+}
+
+/**
+ * @param {Object} json
+ * @returns {Array}
+ */
+export function param(json) {
+ if (!json) return ''
+ return cleanArray(
+ Object.keys(json).map(key => {
+ if (json[key] === undefined) return ''
+ return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
+ })
+ ).join('&')
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+ const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+ if (!search) {
+ return {}
+ }
+ const obj = {}
+ const searchArr = search.split('&')
+ searchArr.forEach(v => {
+ const index = v.indexOf('=')
+ if (index !== -1) {
+ const name = v.substring(0, index)
+ const val = v.substring(index + 1, v.length)
+ obj[name] = val
+ }
+ })
+ return obj
+}
+
+/**
+ * @param {string} val
+ * @returns {string}
+ */
+export function html2Text(val) {
+ const div = document.createElement('div')
+ div.innerHTML = val
+ return div.textContent || div.innerText
+}
+
+/**
+ * Merges two objects, giving the last one precedence
+ * @param {Object} target
+ * @param {(Object|Array)} source
+ * @returns {Object}
+ */
+export function objectMerge(target, source) {
+ if (typeof target !== 'object') {
+ target = {}
+ }
+ if (Array.isArray(source)) {
+ return source.slice()
+ }
+ Object.keys(source).forEach(property => {
+ const sourceProperty = source[property]
+ if (typeof sourceProperty === 'object') {
+ target[property] = objectMerge(target[property], sourceProperty)
+ } else {
+ target[property] = sourceProperty
+ }
+ })
+ return target
+}
+
+/**
+ * @param {HTMLElement} element
+ * @param {string} className
+ */
+export function toggleClass(element, className) {
+ if (!element || !className) {
+ return
+ }
+ let classString = element.className
+ const nameIndex = classString.indexOf(className)
+ if (nameIndex === -1) {
+ classString += '' + className
+ } else {
+ classString =
+ classString.substr(0, nameIndex) +
+ classString.substr(nameIndex + className.length)
+ }
+ element.className = classString
+}
+
+/**
+ * @param {string} type
+ * @returns {Date}
+ */
+export function getTime(type) {
+ if (type === 'start') {
+ return new Date().getTime() - 3600 * 1000 * 24 * 90
+ } else {
+ return new Date(new Date().toDateString())
+ }
+}
+
+// 获取当前时间
+export function getFormatDate() {
+ var date = new Date();
+ var month = date.getMonth() + 1;
+ var strDate = date.getDate();
+ if (month >= 1 && month <= 9) {
+ month = "0" + month;
+ }
+ if (strDate >= 0 && strDate <= 9) {
+ strDate = "0" + strDate;
+ }
+ return date.getFullYear() + "-" + month + "-" + strDate
+ + " " + date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
+}
+
+/**
+ * @param {Function} func
+ * @param {number} wait
+ * @param {boolean} immediate
+ * @return {*}
+ */
+export function debounce(func, wait, immediate) {
+ let timeout, args, context, timestamp, result
+
+ const later = function () {
+ // 据上一次触发时间间隔
+ const last = +new Date() - timestamp
+
+ // 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
+ if (last < wait && last > 0) {
+ timeout = setTimeout(later, wait - last)
+ } else {
+ timeout = null
+ // 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
+ if (!immediate) {
+ result = func.apply(context, args)
+ if (!timeout) context = args = null
+ }
+ }
+ }
+
+ return function (...args) {
+ context = this
+ timestamp = +new Date()
+ const callNow = immediate && !timeout
+ // 如果延时不存在,重新设定延时
+ if (!timeout) timeout = setTimeout(later, wait)
+ if (callNow) {
+ result = func.apply(context, args)
+ context = args = null
+ }
+
+ return result
+ }
+}
+
+/**
+ * This is just a simple version of deep copy
+ * Has a lot of edge cases bug
+ * If you want to use a perfect deep copy, use lodash's _.cloneDeep
+ * @param {Object} source
+ * @returns {Object}
+ */
+export function deepClone(source) {
+ if (!source && typeof source !== 'object') {
+ throw new Error('error arguments', 'deepClone')
+ }
+ const targetObj = source.constructor === Array ? [] : {}
+ Object.keys(source).forEach(keys => {
+ if (source[keys] && typeof source[keys] === 'object') {
+ targetObj[keys] = deepClone(source[keys])
+ } else {
+ targetObj[keys] = source[keys]
+ }
+ })
+ return targetObj
+}
+
+/**
+ * @param {Array} arr
+ * @returns {Array}
+ */
+export function uniqueArr(arr) {
+ return Array.from(new Set(arr))
+}
+
+/**
+ * @returns {string}
+ */
+export function createUniqueString() {
+ const timestamp = +new Date() + ''
+ const randomNum = parseInt((1 + Math.random()) * 65536) + ''
+ return (+(randomNum + timestamp)).toString(32)
+}
+
+/**
+ * Check if an element has a class
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ * @returns {boolean}
+ */
+export function hasClass(ele, cls) {
+ return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
+}
+
+/**
+ * Add class to element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function addClass(ele, cls) {
+ if (!hasClass(ele, cls)) ele.className += ' ' + cls
+}
+
+/**
+ * Remove class from element
+ * @param {HTMLElement} elm
+ * @param {string} cls
+ */
+export function removeClass(ele, cls) {
+ if (hasClass(ele, cls)) {
+ const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
+ ele.className = ele.className.replace(reg, ' ')
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/open-window.js b/app/Modules/Admin/Resources/vue-element-admin/utils/open-window.js
new file mode 100644
index 0000000000000000000000000000000000000000..1a655d777ff6c5be13ee11b5a8ceca7584bbc1a7
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/open-window.js
@@ -0,0 +1,25 @@
+/**
+ *Created by PanJiaChen on 16/11/29.
+ * @param {Sting} url
+ * @param {Sting} title
+ * @param {Number} w
+ * @param {Number} h
+ */
+export default function openWindow(url, title, w, h) {
+ // Fixes dual-screen position Most browsers Firefox
+ const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : screen.left
+ const dualScreenTop = window.screenTop !== undefined ? window.screenTop : screen.top
+
+ const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width
+ const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height
+
+ const left = ((width / 2) - (w / 2)) + dualScreenLeft
+ const top = ((height / 2) - (h / 2)) + dualScreenTop
+ const newWindow = window.open(url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, copyhistory=no, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left)
+
+ // Puts focus on the newWindow
+ if (window.focus) {
+ newWindow.focus()
+ }
+}
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js b/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js
new file mode 100644
index 0000000000000000000000000000000000000000..8e2bbadad0b3837edc2565b6cf5c323680855a6c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/permission.js
@@ -0,0 +1,21 @@
+import store from '@/store'
+
+/**
+ * @param {Array} value
+ * @returns {Boolean}
+ * @example see @/views/permission/directive.vue
+ */
+export default function checkPermission(value) {
+ if (value && value instanceof Array && value.length > 0) {
+ const roles = store.getters && store.getters.roles
+ const permissionRoles = value
+
+ const hasPermission = roles.some(role => {
+ return permissionRoles.includes(role)
+ })
+ return hasPermission
+ } else {
+ console.error(`need roles! Like v-permission="['admin','editor']"`)
+ return false
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/request.js b/app/Modules/Admin/Resources/vue-element-admin/utils/request.js
new file mode 100644
index 0000000000000000000000000000000000000000..b3df91fb34ddb1cd904b6bbba8a894aeaaf209bc
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/request.js
@@ -0,0 +1,127 @@
+import axios from 'axios';
+import {
+ MessageBox,
+ Message
+} from 'element-ui';
+import store from '@/store';
+import {
+ getToken
+} from '@/utils/auth';
+
+console.log(process);
+// console.log(process.env);
+// console.log(process.env.VUE_APP_BASE_API);
+
+// process失效了,默认为当前URL为请求地址
+process.env.VUE_APP_BASE_API = window.location.origin + window.location.pathname;
+// console.log(process.env.VUE_APP_BASE_API);
+
+let timeout = 15000;
+
+// create an axios instance
+const service = axios.create({
+ baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
+ // withCredentials: true, // send cookies when cross-domain requests
+ timeout: timeout, // request timeout
+ headers: {
+ // 'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
+ "Content-Type": "application/json;charset=utf-8",
+ }
+});
+
+// request interceptor
+service.interceptors.request.use(
+ config => {
+ // do something before request is sent
+
+ if (store.getters.token) {
+ // let each request carry token
+ // ['X-Token'] is a custom headers key
+ // please modify it according to the actual situation
+ config.headers['Authorization'] = getToken();
+ }
+
+ if (config.headers['Content-Type'] === 'application/x-www-form-urlencoded;charset=UTF-8') {
+ if (config.data) {
+ // config.data = JSON.stringify(config.data)
+ }
+ }
+ return config;
+ },
+ error => {
+ // do something with request error
+ console.log(error); // for debug
+ return Promise.reject(error);
+ }
+)
+
+// response interceptor
+service.interceptors.response.use(
+ /**
+ * If you want to get http information such as headers or status
+ * Please return response => response
+ */
+
+ /**
+ * Determine the request status by custom code
+ * Here is just an example
+ * You can also judge the status by HTTP Status Code
+ */
+ response => {
+ const res = response.data;
+
+ // if the custom code is not 20000, it is judged as an error.
+ if (res.status !== 1) {
+ Message({
+ message: res.msg || 'Error',
+ type: 'error',
+ duration: 5 * 1000,
+ });
+
+ // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
+ if (res.status === -1) {
+ // to re-login
+ MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again',
+ 'Confirm logout', {
+ confirmButtonText: 'Re-Login',
+ cancelButtonText: 'Cancel',
+ type: 'warning'
+ }).then(() => {
+ store.dispatch('user/resetToken').then(() => {
+ location.reload();
+ })
+ })
+ }
+ return Promise.reject(new Error(res.msg || 'Error'));
+ } else {
+ return res;
+ }
+ },
+ error => {
+ console.log('err' + error); // for debug
+ let msg = error.msg;
+ if (error.response == undefined){
+ msg = '超时 ' + timeout + ' ms,请刷新!';
+ }else{
+ switch (error.response.status) {
+ case 404:
+ msg = error.response.statusText;
+ break;
+ case 401: // 认证失败
+ msg = error.response.data.msg;
+ break;
+ case 500: // 认证失败
+ msg = error.response.statusText;
+ break;
+ }
+ }
+ Message({
+ message: msg,
+ type: 'error',
+ duration: 5 * 1000
+ });
+ return Promise.reject(error);
+ }
+)
+
+export default service
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/scroll-to.js b/app/Modules/Admin/Resources/vue-element-admin/utils/scroll-to.js
new file mode 100644
index 0000000000000000000000000000000000000000..c5d8e04e07b21b45da43c4dadd7c65ee0d946289
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/scroll-to.js
@@ -0,0 +1,58 @@
+Math.easeInOutQuad = function(t, b, c, d) {
+ t /= d / 2
+ if (t < 1) {
+ return c / 2 * t * t + b
+ }
+ t--
+ return -c / 2 * (t * (t - 2) - 1) + b
+}
+
+// requestAnimationFrame for Smart Animating http://goo.gl/sx5sts
+var requestAnimFrame = (function() {
+ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
+})()
+
+/**
+ * Because it's so fucking difficult to detect the scrolling element, just move them all
+ * @param {number} amount
+ */
+function move(amount) {
+ document.documentElement.scrollTop = amount
+ document.body.parentNode.scrollTop = amount
+ document.body.scrollTop = amount
+}
+
+function position() {
+ return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
+}
+
+/**
+ * @param {number} to
+ * @param {number} duration
+ * @param {Function} callback
+ */
+export function scrollTo(to, duration, callback) {
+ const start = position()
+ const change = to - start
+ const increment = 20
+ let currentTime = 0
+ duration = (typeof (duration) === 'undefined') ? 500 : duration
+ var animateScroll = function() {
+ // increment the time
+ currentTime += increment
+ // find the value with the quadratic in-out easing function
+ var val = Math.easeInOutQuad(currentTime, start, change, duration)
+ // move the document.body
+ move(val)
+ // do the animation unless its over
+ if (currentTime < duration) {
+ requestAnimFrame(animateScroll)
+ } else {
+ if (callback && typeof (callback) === 'function') {
+ // the animation is done so lets callback
+ callback()
+ }
+ }
+ }
+ animateScroll()
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/utils/validate.js b/app/Modules/Admin/Resources/vue-element-admin/utils/validate.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d77fd768a76291f073c120799ac9cd9ad371c7d
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/utils/validate.js
@@ -0,0 +1,293 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isExternal(path) {
+ return /^(https?:|mailto:|tel:)/.test(path)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 校验密码是否小于6位
+ * @param str
+ * @returns {boolean}
+ */
+export function isPassword(str) {
+ return str.length >= 6
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否为数字
+ * @param value
+ * @returns {boolean}
+ */
+export function isNumber(value) {
+ const reg = /^[0-9]*$/
+ return reg.test(value)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否是名称
+ * @param value
+ * @returns {boolean}
+ */
+export function isName(value) {
+ const reg = /^[\u4e00-\u9fa5a-zA-Z0-9]+$/
+ return reg.test(value)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否为IP
+ * @param ip
+ * @returns {boolean}
+ */
+export function isIP(ip) {
+ const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
+ return reg.test(ip)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否是传统网站
+ * @param url
+ * @returns {boolean}
+ */
+export function isUrl(url) {
+ const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+ return reg.test(url)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否是小写字母
+ * @param str
+ * @returns {boolean}
+ */
+export function isLowerCase(str) {
+ const reg = /^[a-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否是大写字母
+ * @param str
+ * @returns {boolean}
+ */
+export function isUpperCase(str) {
+ const reg = /^[A-Z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否是大写字母开头
+ * @param str
+ * @returns {boolean}
+ */
+export function isAlphabets(str) {
+ const reg = /^[A-Za-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} url
+ * @returns {Boolean}
+ */
+export function validURL(url) {
+ const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
+ return reg.test(url)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validLowerCase(str) {
+ const reg = /^[a-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUpperCase(str) {
+ const reg = /^[A-Z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validAlphabets(str) {
+ const reg = /^[A-Za-z]+$/
+ return reg.test(str)
+}
+
+/**
+ * @param {string} email
+ * @returns {Boolean}
+ */
+export function validEmail(email) {
+ const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
+ return reg.test(email)
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function isString(str) {
+ if (typeof str === 'string' || str instanceof String) {
+ return true
+ }
+ return false
+}
+
+/**
+ * @param {Array} arg
+ * @returns {Boolean}
+ */
+export function isArray(arg) {
+ if (typeof Array.isArray === 'undefined') {
+ return Object.prototype.toString.call(arg) === '[object Array]'
+ }
+ return Array.isArray(arg)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否是端口号
+ * @param str
+ * @returns {boolean}
+ */
+export function isPort(str) {
+ const reg = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否是手机号
+ * @param str
+ * @returns {boolean}
+ */
+export function isPhone(str) {
+ const reg = /^1\d{10}$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否是身份证号(第二代)
+ * @param str
+ * @returns {boolean}
+ */
+export function isIdCard(str) {
+ const reg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否是邮箱
+ * @param str
+ * @returns {boolean}
+ */
+export function isEmail(str) {
+ const reg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否中文
+ * @param str
+ * @returns {boolean}
+ */
+export function isChina(str) {
+ const reg = /^[\u4E00-\u9FA5]{2,4}$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否为空
+ * @param str
+ * @returns {boolean}
+ */
+export function isBlank(str) {
+ return (
+ str == null ||
+ false ||
+ str === '' ||
+ str.trim() === '' ||
+ str.toLocaleLowerCase().trim() === 'null'
+ )
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否为固话
+ * @param str
+ * @returns {boolean}
+ */
+export function isTel(str) {
+ const reg = /^(400|800)([0-9\\-]{7,10})|(([0-9]{4}|[0-9]{3})(-| )?)?([0-9]{7,8})((-| |转)*([0-9]{1,4}))?$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断是否为数字且最多两位小数
+ * @param str
+ * @returns {boolean}
+ */
+export function isNum(str) {
+ const reg = /^\d+(\.\d{1,2})?$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断经度 -180.0~+180.0(整数部分为0~180,必须输入1到5位小数)
+ * @param str
+ * @returns {boolean}
+ */
+export function isLongitude(str) {
+ const reg = /^[-|+]?(0?\d{1,2}\.\d{1,5}|1[0-7]?\d{1}\.\d{1,5}|180\.0{1,5})$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description 判断纬度 -90.0~+90.0(整数部分为0~90,必须输入1到5位小数)
+ * @param str
+ * @returns {boolean}
+ */
+export function isLatitude(str) {
+ const reg = /^[-|+]?([0-8]?\d{1}\.\d{1,5}|90\.0{1,5})$/
+ return reg.test(str)
+}
+
+/**
+ * @copyright chuzhixin 1204505056@qq.com
+ * @description rtsp校验,只要有rtsp://
+ * @param str
+ * @returns {boolean}
+ */
+export function isRTSP(str) {
+ const reg = /^rtsp:\/\/([a-z]{0,10}:.{0,10}@)?(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/
+ const reg1 = /^rtsp:\/\/([a-z]{0,10}:.{0,10}@)?(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]):[0-9]{1,5}/
+ const reg2 = /^rtsp:\/\/([a-z]{0,10}:.{0,10}@)?(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\//
+ return reg.test(str) || reg1.test(str) || reg2.test(str)
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/vendor/Export2Excel.js b/app/Modules/Admin/Resources/vue-element-admin/vendor/Export2Excel.js
new file mode 100644
index 0000000000000000000000000000000000000000..d8a2af3d4b4d16fd906a940933cd24e38ad0dee2
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/vendor/Export2Excel.js
@@ -0,0 +1,220 @@
+/* eslint-disable */
+import { saveAs } from 'file-saver'
+import XLSX from 'xlsx'
+
+function generateArray(table) {
+ var out = [];
+ var rows = table.querySelectorAll('tr');
+ var ranges = [];
+ for (var R = 0; R < rows.length; ++R) {
+ var outRow = [];
+ var row = rows[R];
+ var columns = row.querySelectorAll('td');
+ for (var C = 0; C < columns.length; ++C) {
+ var cell = columns[C];
+ var colspan = cell.getAttribute('colspan');
+ var rowspan = cell.getAttribute('rowspan');
+ var cellValue = cell.innerText;
+ if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
+
+ //Skip ranges
+ ranges.forEach(function (range) {
+ if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
+ for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
+ }
+ });
+
+ //Handle Row Span
+ if (rowspan || colspan) {
+ rowspan = rowspan || 1;
+ colspan = colspan || 1;
+ ranges.push({
+ s: {
+ r: R,
+ c: outRow.length
+ },
+ e: {
+ r: R + rowspan - 1,
+ c: outRow.length + colspan - 1
+ }
+ });
+ };
+
+ //Handle Value
+ outRow.push(cellValue !== "" ? cellValue : null);
+
+ //Handle Colspan
+ if (colspan)
+ for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
+ }
+ out.push(outRow);
+ }
+ return [out, ranges];
+};
+
+function datenum(v, date1904) {
+ if (date1904) v += 1462;
+ var epoch = Date.parse(v);
+ return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
+}
+
+function sheet_from_array_of_arrays(data, opts) {
+ var ws = {};
+ var range = {
+ s: {
+ c: 10000000,
+ r: 10000000
+ },
+ e: {
+ c: 0,
+ r: 0
+ }
+ };
+ for (var R = 0; R != data.length; ++R) {
+ for (var C = 0; C != data[R].length; ++C) {
+ if (range.s.r > R) range.s.r = R;
+ if (range.s.c > C) range.s.c = C;
+ if (range.e.r < R) range.e.r = R;
+ if (range.e.c < C) range.e.c = C;
+ var cell = {
+ v: data[R][C]
+ };
+ if (cell.v == null) continue;
+ var cell_ref = XLSX.utils.encode_cell({
+ c: C,
+ r: R
+ });
+
+ if (typeof cell.v === 'number') cell.t = 'n';
+ else if (typeof cell.v === 'boolean') cell.t = 'b';
+ else if (cell.v instanceof Date) {
+ cell.t = 'n';
+ cell.z = XLSX.SSF._table[14];
+ cell.v = datenum(cell.v);
+ } else cell.t = 's';
+
+ ws[cell_ref] = cell;
+ }
+ }
+ if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
+ return ws;
+}
+
+function Workbook() {
+ if (!(this instanceof Workbook)) return new Workbook();
+ this.SheetNames = [];
+ this.Sheets = {};
+}
+
+function s2ab(s) {
+ var buf = new ArrayBuffer(s.length);
+ var view = new Uint8Array(buf);
+ for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
+ return buf;
+}
+
+export function export_table_to_excel(id) {
+ var theTable = document.getElementById(id);
+ var oo = generateArray(theTable);
+ var ranges = oo[1];
+
+ /* original data */
+ var data = oo[0];
+ var ws_name = "SheetJS";
+
+ var wb = new Workbook(),
+ ws = sheet_from_array_of_arrays(data);
+
+ /* add ranges to worksheet */
+ // ws['!cols'] = ['apple', 'banan'];
+ ws['!merges'] = ranges;
+
+ /* add worksheet to workbook */
+ wb.SheetNames.push(ws_name);
+ wb.Sheets[ws_name] = ws;
+
+ var wbout = XLSX.write(wb, {
+ bookType: 'xlsx',
+ bookSST: false,
+ type: 'binary'
+ });
+
+ saveAs(new Blob([s2ab(wbout)], {
+ type: "application/octet-stream"
+ }), "test.xlsx")
+}
+
+export function export_json_to_excel({
+ multiHeader = [],
+ header,
+ data,
+ filename,
+ merges = [],
+ autoWidth = true,
+ bookType = 'xlsx'
+} = {}) {
+ /* original data */
+ filename = filename || 'excel-list'
+ data = [...data]
+ data.unshift(header);
+
+ for (let i = multiHeader.length - 1; i > -1; i--) {
+ data.unshift(multiHeader[i])
+ }
+
+ var ws_name = "SheetJS";
+ var wb = new Workbook(),
+ ws = sheet_from_array_of_arrays(data);
+
+ if (merges.length > 0) {
+ if (!ws['!merges']) ws['!merges'] = [];
+ merges.forEach(item => {
+ ws['!merges'].push(XLSX.utils.decode_range(item))
+ })
+ }
+
+ if (autoWidth) {
+ /*设置worksheet每列的最大宽度*/
+ const colWidth = data.map(row => row.map(val => {
+ /*先判断是否为null/undefined*/
+ if (val == null) {
+ return {
+ 'wch': 10
+ };
+ }
+ /*再判断是否为中文*/
+ else if (val.toString().charCodeAt(0) > 255) {
+ return {
+ 'wch': val.toString().length * 2
+ };
+ } else {
+ return {
+ 'wch': val.toString().length
+ };
+ }
+ }))
+ /*以第一行为初始值*/
+ let result = colWidth[0];
+ for (let i = 1; i < colWidth.length; i++) {
+ for (let j = 0; j < colWidth[i].length; j++) {
+ if (result[j]['wch'] < colWidth[i][j]['wch']) {
+ result[j]['wch'] = colWidth[i][j]['wch'];
+ }
+ }
+ }
+ ws['!cols'] = result;
+ }
+
+ /* add worksheet to workbook */
+ wb.SheetNames.push(ws_name);
+ wb.Sheets[ws_name] = ws;
+
+ var wbout = XLSX.write(wb, {
+ bookType: bookType,
+ bookSST: false,
+ type: 'binary'
+ });
+ saveAs(new Blob([s2ab(wbout)], {
+ type: "application/octet-stream"
+ }), `${filename}.${bookType}`);
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/vendor/Export2Zip.js b/app/Modules/Admin/Resources/vue-element-admin/vendor/Export2Zip.js
new file mode 100644
index 0000000000000000000000000000000000000000..db70707d6d58a45cc74ca4aef6212a6041c8ac89
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/vendor/Export2Zip.js
@@ -0,0 +1,24 @@
+/* eslint-disable */
+import { saveAs } from 'file-saver'
+import JSZip from 'jszip'
+
+export function export_txt_to_zip(th, jsonData, txtName, zipName) {
+ const zip = new JSZip()
+ const txt_name = txtName || 'file'
+ const zip_name = zipName || 'file'
+ const data = jsonData
+ let txtData = `${th}\r\n`
+ data.forEach((row) => {
+ let tempStr = ''
+ tempStr = row.toString()
+ txtData += `${tempStr}\r\n`
+ })
+ zip.file(`${txt_name}.txt`, txtData)
+ zip.generateAsync({
+ type: "blob"
+ }).then((blob) => {
+ saveAs(blob, `${zip_name}.zip`)
+ }, (err) => {
+ alert('导出失败')
+ })
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admin_menus/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admin_menus/components/detail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..328f7ad402957e57589851c821f5cff0b1e67754
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/admin_menus/components/detail.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admin_menus/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admin_menus/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..014c730d4969f6d1be6c02d12f7f42ce3203fec4
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/admin_menus/index.vue
@@ -0,0 +1,199 @@
+
+
+
+
+ {{ $t('table.add') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.is_hidden == 1 ? "隐藏" : "展示" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 隐藏
+
+
+
+
+
+ 展示
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..fe8450e16878b975245bbd604062b331273c265c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/admin_roles/index.vue
@@ -0,0 +1,489 @@
+
+
+
+
+
+
+
+
+ {{ $t('table.search') }}
+
+
+ {{ $t('table.batchDelete') }}
+
+
+ {{ $t('table.add') }}
+
+
+ {{ $t('table.export') }}
+
+
+
+
+
+
+
+
+
+ {{ row.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }}
+
+
+
+
+
+
+ {{ row.is_check | checkFilter }}
+
+
+
+
+
+
+
+
+
+ 启用
+
+
+
+
+
+ 禁用
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 禁用
+ 启用
+
+
+
+
+
+
+
+ {{ $t('permission.cancel') }}
+ {{ $t('permission.confirm') }}
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/adminloginlogs/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/adminloginlogs/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d7f02efb5e3dd0f079b63b91de162e5c9a77990b
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/adminloginlogs/index.vue
@@ -0,0 +1,300 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('table.search') }}
+
+
+ {{ $t('table.batchDelete') }}
+
+
+
+
+
+
+
+
+
+
+
+ Id:{{ row.admin.admin_id }}
+
+ 账户:{{ row.admin.admin_name }}
+
+
+
+
+
+
+
+
+
+
+ {{ row.log_duration }} s
+
+
+
+
+
+
+
+
+
+ {{ row.log_status | checkFilter }}
+
+
+
+
+
+
+
+
+ {{ row.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }}
+
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/adminlogs/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/adminlogs/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c58e13a4b758e6f9b89fc36c29778408b2f56d9e
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/adminlogs/index.vue
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('table.search') }}
+
+
+ {{ $t('table.batchDelete') }}
+
+
+
+
+
+
+
+
+
+ Id:{{ row.admin.admin_id }}
+
+ 账户:{{ row.admin.admin_name }}
+
+
+
+
+
+
+
+ {{ row.log_duration }} s
+
+
+
+
+
+
+
+ {{ row.log_status | checkFilter }}
+
+
+
+
+
+ {{ row.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }}
+
+
+
+
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admins/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admins/components/detail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e24d1083990970b34ab226ff604264d5620e5d4c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/admins/components/detail.vue
@@ -0,0 +1,239 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 头像
+
+
+
+
+
+
+
+ 已设置密码【再次输入,默认会更改;不输入,则不变动】
+
+ 请设置密码【默认为:123456】
+
+
+
+
+
+
+
+
+
+ 超管无需设置角色
+
+
+
+ 禁用
+ 启用
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..4fd3e0e8b7ecb898f31e97524e6ad0b3197efa1f
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/admins/index.vue
@@ -0,0 +1,366 @@
+
+
+
+
+
+
+
+
+ {{ $t('table.search') }}
+
+
+ {{ $t('table.batchDelete') }}
+
+
+ {{ $t('table.add') }}
+
+
+ {{ $t('table.export') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.admin_info.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }}
+
+
+
+
+
+
+ {{ row.is_check | checkFilter }}
+
+
+
+
+
+
+
+
+
+ 启用
+
+
+
+
+
+ 禁用
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/article_categories/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/article_categories/components/detail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..3cb8eab496c63131d1667c51cdd112edd262a8a5
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/article_categories/components/detail.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 禁用
+ 启用
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/article_categories/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/article_categories/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c4d3664b38da2f27044b0d43049da85d4ec5cdff
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/article_categories/index.vue
@@ -0,0 +1,179 @@
+
+
+
+
+ {{ $t('table.add') }}
+
+
+
+
+
+
+
+
+
+
+ {{ row.is_check | checkFilter }}
+
+
+
+
+
+ {{ row.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }}
+
+
+
+
+
+
+
+
+ 启用
+
+
+
+
+
+ 禁用
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/article_labels/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/article_labels/components/detail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e0155fc1e9e382986a294664c5402fedce9a32b1
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/article_labels/components/detail.vue
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/article_labels/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/article_labels/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..17251ec1cca5043312e844e5b634b23977c088e3
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/article_labels/index.vue
@@ -0,0 +1,199 @@
+
+
+
+
+
+ {{ $t('table.search') }}
+
+
+ {{ $t('table.batchDelete') }}
+
+
+ {{ $t('table.add') }}
+
+
+
+
+
+
+
+
+
+ {{ row.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }}
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/ArticleDetail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/ArticleDetail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..02b3e2dfbc38eb636712891e3cda0bf35326fe0f
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/ArticleDetail.vue
@@ -0,0 +1,441 @@
+
+
+
+
+
+
+ Publish
+
+
+
+
+
+
+ Title
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 文章封面
+
+
+
+
+
+
+
+
+
+
+
+ {{ contentShortLength }}words
+
+
+
+
+ 文章内容:
+
+
+
+
+
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+ 否
+ 是
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/Dropdown/SourceUrl.vue b/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/Dropdown/SourceUrl.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8f47485a3587abacd7c764fe98163f92f7e2310c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/Dropdown/SourceUrl.vue
@@ -0,0 +1,38 @@
+
+
+
+ Link
+
+
+
+
+
+
+ URL
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/Dropdown/index.js b/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/Dropdown/index.js
new file mode 100644
index 0000000000000000000000000000000000000000..1553f75223b92e4992e13ff6f04dce682537f2ec
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/articles/components/Dropdown/index.js
@@ -0,0 +1 @@
+export { default as SourceUrlDropdown } from './SourceUrl'
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/articles/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/articles/detail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2a5ae1eb35fa1c5cc4ce24b6f1467ebe021f4a4f
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/articles/detail.vue
@@ -0,0 +1,12 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/articles/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/articles/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..75e2545a406d08ce443489cf0f71c1ca0e5ce129
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/articles/index.vue
@@ -0,0 +1,466 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('table.search') }}
+
+
+ {{ $t('table.batchDelete') }}
+
+
+ {{ $t('table.add') }}
+
+
+ {{ $t('table.export') }}
+
+
+
+
+
+
+ {{ row.article_id }}
+
+
+
+
+
+
+ {{ row.article_title }}
+
+
+
+
+
+
+ {{ row.category? row.category.category_name : ('Id:' + row.category_id) }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.article_sort }}
+
+
+
+
+
+ {{ row.created_time | parseTime('{y}-{m}-{d} {h}:{i}') }}
+
+
+
+
+
+
+
+ {{ row.set_top == 1 ? '是' : '否' }}
+
+
+
+
+
+
+
+
+ {{ row.is_recommend == 1 ? '是' : '否' }}
+
+
+
+
+
+
+
+
+ {{ row.is_public == 1 ? '是' : '否' }}
+
+
+
+
+
+
+
+
+
+
+ 置顶
+
+
+
+
+
+ 取消’置顶‘
+
+
+
+
+
+
+ 推荐
+
+
+
+
+
+ 取消’推荐‘
+
+
+
+
+
+
+ 公开
+
+
+
+
+
+ 私密
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/banners/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/banners/components/detail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..d8cf46aedb5eb73ef18ce1713059dad728ea6943
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/banners/components/detail.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+ 封面
+
+
+
+
+
+
+
+
+
+
+
+
+ 禁用
+ 启用
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/banners/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/banners/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f157f4ab0e45fb7d22dd4221e56405911fc2f720
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/banners/index.vue
@@ -0,0 +1,369 @@
+
+
+
+
+
+
+
+
+ {{ $t('table.search') }}
+
+
+ {{ $t('table.batchDelete') }}
+
+
+ {{ $t('table.add') }}
+
+
+ {{ $t('table.export') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }}
+
+
+
+
+
+
+ {{ row.is_check | checkFilter }}
+
+
+
+
+
+
+
+
+
+ 启用
+
+
+
+
+
+ 禁用
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/configs/components/ConfigDetail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/configs/components/ConfigDetail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a4a1908b09dc4ccb39bdfb08e8982188cf8504ff
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/configs/components/ConfigDetail.vue
@@ -0,0 +1,360 @@
+
+
+
+
+
+ Publish
+
+
+
+
+
+
+ Title
+
+ 唯一标识
+
+
+
+
+ 英文字符串
+
+
+
+
+
+
+ 用于区分展示列表
+
+
+
+
+
+
+ 系统会根据不同类型解析配置值
+
+
+
+
+
+
+
+
+
+
+ 图片
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 如果是枚举型,需要配置该项!
+
+
+
+
+ 从小到大,升序
+
+
+
+
+ 配置项的具体说明详情!
+
+
+
+
+ 禁用
+ 启用
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/configs/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/configs/detail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c13527b868ccd18662e30d9cf65cf7da5c7c9cd6
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/configs/detail.vue
@@ -0,0 +1,15 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/configs/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/configs/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8d4c4125ca0f95431099368ea781f6578e2bf051
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/configs/index.vue
@@ -0,0 +1,448 @@
+
+
+
+
+
+
+
+
+ {{ $t('table.search') }}
+
+
+ {{ $t('table.batchDelete') }}
+
+
+ {{ $t('table.add') }}
+
+
+ {{ $t('table.export') }}
+
+
+ 同步配置文件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.config_value }}
+
+
+
+
+
+
+
+
+
+
+ {{ row.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }}
+
+
+
+
+
+
+
+ {{ row.is_check | checkFilter }}
+
+
+
+
+
+
+
+
+
+ 启用
+
+
+
+
+ 禁用
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/BarChart.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/BarChart.vue
new file mode 100644
index 0000000000000000000000000000000000000000..be0af34f841d40aeaaa4ff25bc6bf5d6afb256a1
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/BarChart.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/BoxCard.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/BoxCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..aedc29713c19df74275e40d0e110662e3db233f6
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/BoxCard.vue
@@ -0,0 +1,131 @@
+
+
+
+
+
+
+
+
+ {{item.name}}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/LineChart.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/LineChart.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f2fd57d421a6b18eb24e42d56621f4d65bec7289
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/LineChart.vue
@@ -0,0 +1,139 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/LineMarker.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/LineMarker.vue
new file mode 100644
index 0000000000000000000000000000000000000000..36e4a851008d57c1af7d005d5297180ca7dfd81e
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/LineMarker.vue
@@ -0,0 +1,237 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/PanelGroup.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/PanelGroup.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c279cdb71f8985b73cb4c3a3ef6092e2e31e4f1f
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/PanelGroup.vue
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+ {{ $t('admin') + $t('number') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('article') + $t('number') }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('banner') + $t('number') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('friendlinks') + $t('number') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/PieChart.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/PieChart.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e43bc985e030e5b817ddd927f431e96db1fba5c4
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/PieChart.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/Timeline.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/Timeline.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f5589a6179a600d1486be3b31645491230671221
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/Timeline.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+ {{ item.version_name }}[{{ item.version_number }}]
+
+ {{ item.version_content }}
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/mixins/resize.js b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/mixins/resize.js
new file mode 100644
index 0000000000000000000000000000000000000000..6567a1e9259389fe0ace752c492d3ddd29a02ae9
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/components/mixins/resize.js
@@ -0,0 +1,55 @@
+import {debounce} from '@/utils'
+
+export default {
+ data() {
+ return {
+ $_sidebarElm: null,
+ $_resizeHandler: null
+ }
+ },
+ mounted() {
+ this.$_resizeHandler = debounce(() => {
+ if (this.chart) {
+ this.chart.resize()
+ }
+ }, 100)
+ this.$_initResizeEvent()
+ this.$_initSidebarResizeEvent()
+ },
+ beforeDestroy() {
+ this.$_destroyResizeEvent()
+ this.$_destroySidebarResizeEvent()
+ },
+ // to fixed bug when cached by keep-alive
+ // https://github.com/PanJiaChen/vue-element-admin/issues/2116
+ activated() {
+ this.$_initResizeEvent()
+ this.$_initSidebarResizeEvent()
+ },
+ deactivated() {
+ this.$_destroyResizeEvent()
+ this.$_destroySidebarResizeEvent()
+ },
+ methods: {
+ // use $_ for mixins properties
+ // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+ $_initResizeEvent() {
+ window.addEventListener('resize', this.$_resizeHandler)
+ },
+ $_destroyResizeEvent() {
+ window.removeEventListener('resize', this.$_resizeHandler)
+ },
+ $_sidebarResizeHandler(e) {
+ if (e.propertyName === 'width') {
+ this.$_resizeHandler()
+ }
+ },
+ $_initSidebarResizeEvent() {
+ this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
+ this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
+ },
+ $_destroySidebarResizeEvent() {
+ this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
+ }
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9b748403f31abaa2a054af511cea0592e3026327
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/admin/index.vue
@@ -0,0 +1,236 @@
+
+
+
+
+
+
+
+
服务器状态信息
+
+
+
+
+
CPU使用率(%)
+
+ windows系统,CPU获取极为不准确!
+
+
+
+
+
+
+
+
+
磁盘使用率(G)
+
+ 共计:
+ {{ server_data.disk_info.total }} G
+
+
+
+
+
+
+
+
+
内存使用率(MB)
+
+ 共计:
+ {{ server_data.memory_info.total }} MB
+
+
+
+
+
+
+
+
+
+
+
+ 技能
+
+
+
+
+
+
+
+
+ 版本历史记录
+
+
+
+
+
+
+
+
+
+
+ 请求日志统计
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2a99a970ce74f75398c2c2e71afe235dee638a57
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/dashboard/index.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/charts/keyboard.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/charts/keyboard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..917f8eebdf00b5ad07441adde6430410556a96ca
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/charts/keyboard.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/charts/line.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/charts/line.vue
new file mode 100644
index 0000000000000000000000000000000000000000..fea1497ef5de9e6b0bfd94023bc2b18d5e4c1589
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/charts/line.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/charts/mix-chart.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/charts/mix-chart.vue
new file mode 100644
index 0000000000000000000000000000000000000000..c57db75a7a1c1f5e36f9521db6f4f3d9fb667f42
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/charts/mix-chart.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/avatar-upload.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/avatar-upload.vue
new file mode 100644
index 0000000000000000000000000000000000000000..5fb6471e6526820309aa370b34ba50f164c0a91b
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/avatar-upload.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
+ Change Avatar
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/back-to-top.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/back-to-top.vue
new file mode 100644
index 0000000000000000000000000000000000000000..58d9d75cadb059c6b9b988ef3f48144fd5714c93
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/back-to-top.vue
@@ -0,0 +1,150 @@
+
+
+
{{ $t('components.backToTopTips1') }}
+
{{ $t('components.backToTopTips2') }}
+
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
placeholder
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/count-to.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/count-to.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ea5ce0316de48cab8caaaccae7560867d7064a3b
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/count-to.vue
@@ -0,0 +1,222 @@
+
+
+
+
+
+
<count-to :start-val='{{ _startVal }}' :end-val='{{ _endVal }}' :duration='{{
+ _duration }}'
+ :decimals='{{ _decimals }}' :separator='{{ _separator }}' :prefix='{{ _prefix }}'
+ :suffix='{{ _suffix }}'
+ :autoplay=false>
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/drag-kanban.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/drag-kanban.vue
new file mode 100644
index 0000000000000000000000000000000000000000..943be455328ba73397331e1b72e1a5027f0f2031
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/drag-kanban.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/drag-select.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/drag-select.vue
new file mode 100644
index 0000000000000000000000000000000000000000..905ecb94e906a744e15cfa56d5f85c7a26503aff
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/drag-select.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+ {{ item }}
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/dropzone.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/dropzone.vue
new file mode 100644
index 0000000000000000000000000000000000000000..940df5c510560540cbcacf10faa848fc24582fec
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/dropzone.vue
@@ -0,0 +1,29 @@
+
+
+
+ Based on dropzone .
+ {{ $t('components.dropzoneTips') }}
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/json-editor.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/json-editor.vue
new file mode 100644
index 0000000000000000000000000000000000000000..85bf3834d2cf997bf67b49e26d4b9e9755a7545f
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/json-editor.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/markdown.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/markdown.vue
new file mode 100644
index 0000000000000000000000000000000000000000..f2195032e4d25f70aa5089b3b1d199bdd4f728ba
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/markdown.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+ Basic:
+
+
+
+
+
+
+ Markdown Mode:
+
+
+
+
+
+
+ Customize Toolbar:
+
+
+
+
+
+
+ I18n:
+
+
+
+
+
+
+ Get HTML
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/mixin.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/mixin.vue
new file mode 100644
index 0000000000000000000000000000000000000000..b435d37605d364cc0cfd89f2133496679e642c52
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/mixin.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+ Buttons
+
+
+
+
+ Documentation
+
+
+
+
+ Icons
+
+
+
+
+ Excel
+
+
+
+
+ Table
+
+
+
+
+ Form
+
+
+
+
+ Theme
+
+
+
+
+
+
+
+
+
+
+ Material Design 的input
+
+
+
+
+
+ 标题
+
+
+
+
+
+
+
+
+
+
+ 图片hover效果
+
+
+
+ vue-element-admin
+
+
+
+
+
+
+
+
+ 水波纹 waves v-directive
+
+
+
+ 水波纹效果
+
+
+
+
+
+
+
+
+ hover text
+
+
+
+
+
+
+
+
+
+
+
+
+ Share
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/tinymce.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/tinymce.vue
new file mode 100644
index 0000000000000000000000000000000000000000..544219f51e67b95944885c7dede7a3a5f82aea76
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/components-demo/tinymce.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/icons/element-icons.js b/app/Modules/Admin/Resources/vue-element-admin/views/demo/icons/element-icons.js
new file mode 100644
index 0000000000000000000000000000000000000000..9ea4d63fdeed8af3c21c728e9fbfc5153d8ecd46
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/icons/element-icons.js
@@ -0,0 +1,3 @@
+const elementIcons = ['platform-eleme', 'eleme', 'delete-solid', 'delete', 's-tools', 'setting', 'user-solid', 'user', 'phone', 'phone-outline', 'more', 'more-outline', 'star-on', 'star-off', 's-goods', 'goods', 'warning', 'warning-outline', 'question', 'info', 'remove', 'circle-plus', 'success', 'error', 'zoom-in', 'zoom-out', 'remove-outline', 'circle-plus-outline', 'circle-check', 'circle-close', 's-help', 'help', 'minus', 'plus', 'check', 'close', 'picture', 'picture-outline', 'picture-outline-round', 'upload', 'upload2', 'download', 'camera-solid', 'camera', 'video-camera-solid', 'video-camera', 'message-solid', 'bell', 's-cooperation', 's-order', 's-platform', 's-fold', 's-unfold', 's-operation', 's-promotion', 's-home', 's-release', 's-ticket', 's-management', 's-open', 's-shop', 's-marketing', 's-flag', 's-comment', 's-finance', 's-claim', 's-custom', 's-opportunity', 's-data', 's-check', 's-grid', 'menu', 'share', 'd-caret', 'caret-left', 'caret-right', 'caret-bottom', 'caret-top', 'bottom-left', 'bottom-right', 'back', 'right', 'bottom', 'top', 'top-left', 'top-right', 'arrow-left', 'arrow-right', 'arrow-down', 'arrow-up', 'd-arrow-left', 'd-arrow-right', 'video-pause', 'video-play', 'refresh', 'refresh-right', 'refresh-left', 'finished', 'sort', 'sort-up', 'sort-down', 'rank', 'loading', 'view', 'c-scale-to-original', 'date', 'edit', 'edit-outline', 'folder', 'folder-opened', 'folder-add', 'folder-remove', 'folder-delete', 'folder-checked', 'tickets', 'document-remove', 'document-delete', 'document-copy', 'document-checked', 'document', 'document-add', 'printer', 'paperclip', 'takeaway-box', 'search', 'monitor', 'attract', 'mobile', 'scissors', 'umbrella', 'headset', 'brush', 'mouse', 'coordinate', 'magic-stick', 'reading', 'data-line', 'data-board', 'pie-chart', 'data-analysis', 'collection-tag', 'film', 'suitcase', 'suitcase-1', 'receiving', 'collection', 'files', 'notebook-1', 'notebook-2', 'toilet-paper', 'office-building', 'school', 'table-lamp', 'house', 'no-smoking', 'smoking', 'shopping-cart-full', 'shopping-cart-1', 'shopping-cart-2', 'shopping-bag-1', 'shopping-bag-2', 'sold-out', 'sell', 'present', 'box', 'bank-card', 'money', 'coin', 'wallet', 'discount', 'price-tag', 'news', 'guide', 'male', 'female', 'thumb', 'cpu', 'link', 'connection', 'open', 'turn-off', 'set-up', 'chat-round', 'chat-line-round', 'chat-square', 'chat-dot-round', 'chat-dot-square', 'chat-line-square', 'message', 'postcard', 'position', 'turn-off-microphone', 'microphone', 'close-notification', 'bangzhu', 'time', 'odometer', 'crop', 'aim', 'switch-button', 'full-screen', 'copy-document', 'mic', 'stopwatch', 'medal-1', 'medal', 'trophy', 'trophy-1', 'first-aid-kit', 'discover', 'place', 'location', 'location-outline', 'location-information', 'add-location', 'delete-location', 'map-location', 'alarm-clock', 'timer', 'watch-1', 'watch', 'lock', 'unlock', 'key', 'service', 'mobile-phone', 'bicycle', 'truck', 'ship', 'basketball', 'football', 'soccer', 'baseball', 'wind-power', 'light-rain', 'lightning', 'heavy-rain', 'sunrise', 'sunrise-1', 'sunset', 'sunny', 'cloudy', 'partly-cloudy', 'cloudy-and-sunny', 'moon', 'moon-night', 'dish', 'dish-1', 'food', 'chicken', 'fork-spoon', 'knife-fork', 'burger', 'tableware', 'sugar', 'dessert', 'ice-cream', 'hot-water', 'water-cup', 'coffee-cup', 'cold-drink', 'goblet', 'goblet-full', 'goblet-square', 'goblet-square-full', 'refrigerator', 'grape', 'watermelon', 'cherry', 'apple', 'pear', 'orange', 'coffee', 'ice-tea', 'ice-drink', 'milk-tea', 'potato-strips', 'lollipop', 'ice-cream-square', 'ice-cream-round']
+
+export default elementIcons
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/icons/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/icons/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..4c483db4ffaa7a7ed098fad412f43ffd612696f4
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/icons/index.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+ {{ generateIconCode(item) }}
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+ {{ generateElementIconCode(item) }}
+
+
+
+ {{ item }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/icons/svg-icons.js b/app/Modules/Admin/Resources/vue-element-admin/views/demo/icons/svg-icons.js
new file mode 100644
index 0000000000000000000000000000000000000000..590cfe46db790e47911fc07ec93f322d839b0ab1
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/icons/svg-icons.js
@@ -0,0 +1,10 @@
+const req = require.context('@/icons/svg', false, /\.svg$/)
+const requireAll = requireContext => requireContext.keys()
+
+const re = /\.\/(.*)\.svg/
+
+const svgIcons = requireAll(req).map(i => {
+ return i.match(re)[1]
+})
+
+export default svgIcons
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/demo/redirect/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/demo/redirect/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..db4c1d66d13ee0e5e29baef1b4b05347a45f7377
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/demo/redirect/index.vue
@@ -0,0 +1,12 @@
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/error-page/401.vue b/app/Modules/Admin/Resources/vue-element-admin/views/error-page/401.vue
new file mode 100644
index 0000000000000000000000000000000000000000..a52ed23b84650f8a79a44f4da685a3d647acd0ac
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/error-page/401.vue
@@ -0,0 +1,99 @@
+
+
+
+ 返回
+
+
+
+
+ Oops!
+
+ gif来源airbnb 页面
+ 你没有权限去该页面
+ 如有不满请联系你领导
+
+ 或者你可以去:
+
+
+ 回首页
+
+
+
+ 随便看看
+
+ 点我看图
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/error-page/404.vue b/app/Modules/Admin/Resources/vue-element-admin/views/error-page/404.vue
new file mode 100644
index 0000000000000000000000000000000000000000..1791f55a34ef18dae1cbd583d62f997bf33fffa9
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/error-page/404.vue
@@ -0,0 +1,228 @@
+
+
+
+
+
+
OOPS!
+
+
{{ message }}
+
Please check that the URL you entered is correct, or click the button below to return to the homepage.
+
Back to home
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/friendlinks/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/friendlinks/components/detail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2cb65d250b7306ca60a77cde8b3bb592b6551457
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/friendlinks/components/detail.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+ 站点图标
+
+
+
+
+
+
+
+
+
+
+
+
+ 禁用
+ 启用
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/friendlinks/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/friendlinks/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8c06ba3d760fd3180d565e16fd6cd5b52b03fa42
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/friendlinks/index.vue
@@ -0,0 +1,367 @@
+
+
+
+
+
+
+
+
+ {{ $t('table.search') }}
+
+
+ {{ $t('table.batchDelete') }}
+
+
+ {{ $t('table.add') }}
+
+
+ {{ $t('table.export') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }}
+
+
+
+
+
+
+ {{ row.is_check | checkFilter }}
+
+
+
+
+
+
+
+
+
+ 启用
+
+
+
+
+
+ 禁用
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..2fe739caee886471d2b448c0f22d6a461190ddad
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/index.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+ {{ $t('i18nView.title') }}
+
+
+
+
+ 简体中文
+
+
+ English
+
+
+ Español
+
+
+ 日本語
+
+
+
+ {{ $t('i18nView.note') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('i18nView.default') }}
+
+
+ {{ $t('i18nView.primary') }}
+
+
+ {{ $t('i18nView.success') }}
+
+
+ {{ $t('i18nView.info') }}
+
+
+ {{ $t('i18nView.warning') }}
+
+
+ {{ $t('i18nView.danger') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/local.js b/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/local.js
new file mode 100644
index 0000000000000000000000000000000000000000..e6970f573805ad3bf14e2af1ae656eb8516d3e7c
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/i18n-demo/local.js
@@ -0,0 +1,82 @@
+export default {
+ zh: {
+ i18nView: {
+ title: '切换语言',
+ note: '本项目国际化基于 vue-i18n',
+ datePlaceholder: '请选择日期',
+ selectPlaceholder: '请选择',
+ tableDate: '日期',
+ tableName: '姓名',
+ tableAddress: '地址',
+ default: '默认按钮',
+ primary: '主要按钮',
+ success: '成功按钮',
+ info: '信息按钮',
+ warning: '警告按钮',
+ danger: '危险按钮',
+ one: '一',
+ two: '二',
+ three: '三'
+ }
+ },
+ en: {
+ i18nView: {
+ title: 'Switch Language',
+ note: 'The internationalization of this project is based on vue-i18n',
+ datePlaceholder: 'Pick a day',
+ selectPlaceholder: 'Select',
+ tableDate: 'tableDate',
+ tableName: 'tableName',
+ tableAddress: 'tableAddress',
+ default: 'default:',
+ primary: 'primary',
+ success: 'success',
+ info: 'info',
+ warning: 'warning',
+ danger: 'danger',
+ one: 'One',
+ two: 'Two',
+ three: 'Three'
+ }
+ },
+ es: {
+ i18nView: {
+ title: 'Switch Language',
+ note: 'The internationalization of this project is based on vue-i18n',
+ datePlaceholder: 'Pick a day',
+ selectPlaceholder: 'Select',
+ tableDate: 'tableDate',
+ tableName: 'tableName',
+ tableAddress: 'tableAddress',
+ default: 'default:',
+ primary: 'primary',
+ success: 'success',
+ info: 'info',
+ warning: 'warning',
+ danger: 'danger',
+ one: 'One',
+ two: 'Two',
+ three: 'Three'
+ }
+ },
+ ja: {
+ i18nView: {
+ title: '言語切替',
+ note: 'vue-i18nを使っています',
+ datePlaceholder: '日時選択',
+ selectPlaceholder: '選択してください',
+ tableDate: '日時',
+ tableName: '姓名',
+ tableAddress: '住所',
+ default: 'default',
+ primary: 'primary',
+ success: 'success',
+ info: 'info',
+ warning: 'warning',
+ danger: 'danger',
+ one: '1',
+ two: '2',
+ three: '3'
+ }
+ }
+}
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/login/auth-redirect.vue b/app/Modules/Admin/Resources/vue-element-admin/views/login/auth-redirect.vue
new file mode 100644
index 0000000000000000000000000000000000000000..7df89342ac3a978e07f804db8d12325463966194
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/login/auth-redirect.vue
@@ -0,0 +1,15 @@
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/login/components/SocialSignin.vue b/app/Modules/Admin/Resources/vue-element-admin/views/login/components/SocialSignin.vue
new file mode 100644
index 0000000000000000000000000000000000000000..e9bf4f21a7196b67ba6942b94b0bd6efdede613f
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/login/components/SocialSignin.vue
@@ -0,0 +1,72 @@
+
+
+
+
+ WeChat
+
+
+
+ QQ
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/login/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/login/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..444fdf6ff481b387628beff01888616270829061
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/login/index.vue
@@ -0,0 +1,310 @@
+
+
+
+
+
+
+ {{ $t('login.title') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('login.logIn') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Account.vue b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Account.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ff6cf7707707c1152c0939099bd57dca06efa425
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Account.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+ Update
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Activity.vue b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Activity.vue
new file mode 100644
index 0000000000000000000000000000000000000000..87271133b53c450191a318036add3c0b1265e7fe
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Activity.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
Iron Man
+
Shared publicly - 7:30 PM today
+
+
+ Lorem ipsum represents a long-held tradition for designers,
+ typographers and the like. Some people hate it and argue for
+ its demise, but others ignore the hate as they create awesome
+ tools to help create filler text for everyone from bacon lovers
+ to Charlie Sheen fans.
+
+
+
+
+
+ Share
+
+
+
+
+
+ Like
+
+
+
+
+
+
+
+
Captain American
+
Sent you a message - yesterday
+
+
+ Lorem ipsum represents a long-held tradition for designers,
+ typographers and the like. Some people hate it and argue for
+ its demise, but others ignore the hate as they create awesome
+ tools to help create filler text for everyone from bacon lovers
+ to Charlie Sheen fans.
+
+
+
+
+
+ Share
+
+
+
+
+
+ Like
+
+
+
+
+
+
+
+
Spider Man
+
Posted 4 photos - 2 days ago
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Timeline.vue b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Timeline.vue
new file mode 100644
index 0000000000000000000000000000000000000000..8b9e405f9b307e8bc5dcb009b423cdfe333b4527
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/Timeline.vue
@@ -0,0 +1,43 @@
+
+
+
+
+
+ {{ item.title }}
+ {{ item.content }}
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/UserCard.vue b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/UserCard.vue
new file mode 100644
index 0000000000000000000000000000000000000000..497247cca08690902d2d7cf33e8bd40605ed4cf9
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/profile/components/UserCard.vue
@@ -0,0 +1,138 @@
+
+
+
+ About me
+
+
+
+
+
+ Hello
+ {{ user.role }}
+
+
+
+
{{ user.name }}
+
{{ user.role | uppercaseFirst }}
+
+
+
+
+
+
+
+
+ JS in Computer Science from the University of Technology
+
+
+
+
+
+
+
+
+ Vue
+
+
+
+ JavaScript
+
+
+
+ Css
+
+
+
+ ESLint
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/profile/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/profile/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..9e765c0d9babd5c7a7db9230bc7c60cbb4f96594
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/profile/index.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/versions/components/detail.vue b/app/Modules/Admin/Resources/vue-element-admin/views/versions/components/detail.vue
new file mode 100644
index 0000000000000000000000000000000000000000..28725e8cae02e014158d9d4c97e3c3d64d30db68
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/versions/components/detail.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Resources/vue-element-admin/views/versions/index.vue b/app/Modules/Admin/Resources/vue-element-admin/views/versions/index.vue
new file mode 100644
index 0000000000000000000000000000000000000000..ff5ac51e35c0aced00b370475c4aff3ecca7e8da
--- /dev/null
+++ b/app/Modules/Admin/Resources/vue-element-admin/views/versions/index.vue
@@ -0,0 +1,302 @@
+
+
+
+
+
+ {{ $t('table.search') }}
+
+
+ {{ $t('table.batchDelete') }}
+
+
+ {{ $t('table.add') }}
+
+
+ {{ $t('table.export') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.created_time | parseTime("{y}-{m}-{d} {h}:{i}") }}
+
+
+
+
+
+
+ 编辑
+ 删除
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/Modules/Admin/Routes/.gitkeep b/app/Modules/Admin/Routes/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Routes/api.php b/app/Modules/Admin/Routes/api.php
new file mode 100644
index 0000000000000000000000000000000000000000..ba485c589866bc99b9b078ffbd038ab48872a6f0
--- /dev/null
+++ b/app/Modules/Admin/Routes/api.php
@@ -0,0 +1,18 @@
+get('/admin', function (Request $request) {
+ return $request->user();
+});
\ No newline at end of file
diff --git a/app/Modules/Admin/Routes/web.php b/app/Modules/Admin/Routes/web.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f409a1db9ef47421a12c95f165637d57e0a4bd5
--- /dev/null
+++ b/app/Modules/Admin/Routes/web.php
@@ -0,0 +1,166 @@
+group(function() {
+// Route::get('/', 'AdminController@index');
+ //后台管理路由
+ Route::get('/', function(){
+ return view('admin::admin');
+ });
+
+ // Auth
+ Route::prefix('auth')->group(function() {
+ Route::post('login', 'AuthController@login');
+ Route::post('me', 'AuthController@me')->middleware(CheckAuth::class);
+ Route::post('logout', 'AuthController@logout')->middleware(CheckAuth::class);
+ Route::post('getRabcList', 'AuthController@getRabcList')->middleware(CheckAuth::class);
+ });
+
+ Route::middleware([CheckAuth::class, AdminLog::class])->group(function () {
+ // 首页
+ Route::get('indexs', 'IndexController@index');
+ // 编辑登录管理员资料
+ Route::put('updateAdmin', 'IndexController@update');
+ // 按照日志类型的统计图数据
+ Route::get('logsStatistics', 'IndexController@logsStatistics');
+ // 版本的历史记录
+ Route::get('versionLogs', 'IndexController@versionLogs');
+ // 获取服务器状态
+ Route::get('getServerStatus', 'IndexController@getServerStatus');
+ // 月份表列表
+ Route::get('get_month_lists', 'IndexController@getMonthList');
+ // 文件上传
+ Route::post('upload_file', 'UploadController@file');
+
+ // 权限中间件
+ Route::middleware([CheckRabc::class])->group(function () {
+ Route::prefix('banners')->group(function() {
+ Route::get('/', 'System\BannerController@index');
+ Route::post('/create', 'System\BannerController@create');
+ Route::put('/update', 'System\BannerController@update');
+ Route::delete('/delete', 'System\BannerController@delete');
+ Route::put('/changeFiledStatus', 'System\BannerController@changeFiledStatus');
+ });
+
+ // 配置管理
+ Route::prefix('configs')->group(function() {
+ Route::get('/', 'System\ConfigController@index');
+ Route::get('/detail', 'System\ConfigController@detail');
+ Route::post('/create', 'System\ConfigController@create');
+ Route::put('/update', 'System\ConfigController@update');
+ Route::delete('/delete', 'System\ConfigController@delete');
+ Route::put('/changeFiledStatus', 'System\ConfigController@changeFiledStatus');
+ Route::get('/getConfigGroupType', 'System\ConfigController@getConfigGroupType')->withoutMiddleware([CheckRabc::class]);
+ Route::put('/pushRefreshConfig', 'System\ConfigController@pushRefreshConfig');
+ });
+
+ // 友情链接
+ Route::prefix('friendlinks')->group(function() {
+ Route::get('/', 'System\FriendlinkController@index');
+ Route::post('/create', 'System\FriendlinkController@create');
+ Route::put('/update', 'System\FriendlinkController@update');
+ Route::delete('/delete', 'System\FriendlinkController@delete');
+ Route::put('/changeFiledStatus', 'System\FriendlinkController@changeFiledStatus');
+ });
+
+ Route::prefix('protocols')->group(function() {
+ Route::get('/', 'System\ProtocolController@index');
+ Route::post('/create', 'System\ProtocolController@create');
+ Route::put('/update', 'System\ProtocolController@update');
+ Route::delete('/delete', 'System\ProtocolController@delete');
+ });
+
+ Route::prefix('versions')->group(function() {
+ Route::get('/', 'System\VersionController@index');
+ Route::post('/create', 'System\VersionController@create');
+ Route::put('/update', 'System\VersionController@update');
+ Route::delete('/delete', 'System\VersionController@delete');
+ Route::put('/changeFiledStatus', 'System\VersionController@changeFiledStatus');
+ });
+
+ Route::prefix('admins')->group(function() {
+ Route::get('/', 'Rabc\AdminController@index');
+ Route::post('/create', 'Rabc\AdminController@create');
+ Route::put('/update', 'Rabc\AdminController@update');
+ Route::delete('/delete', 'Rabc\AdminController@delete');
+ Route::get('/getSelectLists', 'Rabc\AdminController@getSelectLists');
+ Route::put('/changeFiledStatus', 'Rabc\AdminController@changeFiledStatus');
+ });
+
+ Route::prefix('admin_roles')->group(function() {
+ Route::get('/', 'Rabc\AdminRoleController@index');
+ Route::post('/create', 'Rabc\AdminRoleController@create');
+ Route::put('/update', 'Rabc\AdminRoleController@update');
+ Route::delete('/delete', 'Rabc\AdminRoleController@delete');
+ Route::get('/getSelectLists', 'Rabc\AdminRoleController@getSelectLists')->withoutMiddleware([CheckRabc::class]);
+ Route::put('/changeFiledStatus', 'Rabc\AdminRoleController@changeFiledStatus');
+ });
+
+ Route::prefix('admin_menus')->group(function() {
+ Route::get('/', 'Rabc\AdminMenuController@index');
+ Route::post('/create', 'Rabc\AdminMenuController@create');
+ Route::put('/update', 'Rabc\AdminMenuController@update');
+ Route::delete('/delete', 'Rabc\AdminMenuController@delete');
+ Route::get('/getSelectLists', 'Rabc\AdminMenuController@getSelectLists')->withoutMiddleware([CheckRabc::class]);
+ Route::put('/changeFiledStatus', 'Rabc\AdminMenuController@changeFiledStatus');
+ });
+
+ // 管理员日志
+ Route::prefix('adminlogs')->group(function() {
+ Route::get('/', 'Log\AdminLogController@index');
+ Route::delete('/delete', 'Log\AdminLogController@delete');
+ });
+
+ // 管理员登录日志
+ Route::prefix('adminloginlogs')->group(function() {
+ Route::get('/', 'Log\AdminLoginLogController@index');
+ Route::delete('/delete', 'Log\AdminLoginLogController@delete');
+ });
+
+ // 文章分类
+ Route::prefix('article_categories')->group(function() {
+ Route::get('/', 'Article\ArticleCategoryController@index');
+ Route::post('/create', 'Article\ArticleCategoryController@create');
+ Route::put('/update', 'Article\ArticleCategoryController@update');
+ Route::delete('/delete', 'Article\ArticleCategoryController@delete');
+ Route::get('/getSelectLists', 'Article\ArticleCategoryController@getSelectLists')->withoutMiddleware([CheckRabc::class]);
+ Route::put('/changeFiledStatus', 'Article\ArticleCategoryController@changeFiledStatus');
+ });
+
+ // 文章标签
+ Route::prefix('article_labels')->group(function() {
+ Route::get('/', 'Article\ArticleLabelController@index');
+ Route::post('/create', 'Article\ArticleLabelController@create');
+ Route::put('/update', 'Article\ArticleLabelController@update');
+ Route::delete('/delete', 'Article\ArticleLabelController@delete');
+ Route::get('/getSelectLists', 'Article\ArticleLabelController@getSelectLists')->withoutMiddleware([CheckRabc::class]);
+ });
+
+ // 文章管理
+ Route::prefix('articles')->group(function() {
+ Route::get('/', 'Article\ArticleController@index');
+ Route::get('/detail', 'Article\ArticleController@detail');
+ Route::post('/create', 'Article\ArticleController@create');
+ Route::put('/update', 'Article\ArticleController@update');
+ Route::delete('/delete', 'Article\ArticleController@delete');
+ Route::put('/changeFiledStatus', 'Article\ArticleController@changeFiledStatus');
+ });
+ });
+ });
+});
diff --git a/app/Modules/Admin/Services/.idea/Services.iml b/app/Modules/Admin/Services/.idea/Services.iml
new file mode 100644
index 0000000000000000000000000000000000000000..d6ebd4805981b8400db3e3291c74a743fef9a824
--- /dev/null
+++ b/app/Modules/Admin/Services/.idea/Services.iml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Services/.idea/misc.xml b/app/Modules/Admin/Services/.idea/misc.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7e5bdf89fec4690a0218e8d99983b379c8218059
--- /dev/null
+++ b/app/Modules/Admin/Services/.idea/misc.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Services/.idea/modules.xml b/app/Modules/Admin/Services/.idea/modules.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3c4934d5e608cece09dc38e1bf67e87d84f913f8
--- /dev/null
+++ b/app/Modules/Admin/Services/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Services/.idea/vcs.xml b/app/Modules/Admin/Services/.idea/vcs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4fce1d86b49521afe1cee4ed1c13b6396ebbc6f3
--- /dev/null
+++ b/app/Modules/Admin/Services/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Services/.idea/workspace.xml b/app/Modules/Admin/Services/.idea/workspace.xml
new file mode 100644
index 0000000000000000000000000000000000000000..006bf1907e970bc03db0695cb909f2ca9e5eb0d8
--- /dev/null
+++ b/app/Modules/Admin/Services/.idea/workspace.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1607869134694
+
+
+ 1607869134694
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/Modules/Admin/Services/AdminLogService.php b/app/Modules/Admin/Services/AdminLogService.php
new file mode 100644
index 0000000000000000000000000000000000000000..7e8f2338d81d3c11292335675ca431a225a8f444
--- /dev/null
+++ b/app/Modules/Admin/Services/AdminLogService.php
@@ -0,0 +1,42 @@
+model = $adminLog;
+ }
+
+ public function lists(array $params) : array
+ {
+ $model = $this->model->setMonthTable($this->getSearchMonth())
+ ->with([
+ 'admin' => function($query) {
+ $query->select('admin_id', 'admin_name');
+ },
+ ]);
+ if ( isset($params['search']) && !empty($params['search']) ) {
+ $model = $model->whereHas('admin', function($query) use ($params) {
+ $search = trim($params['search'] ?? '');
+ if ( !empty($search) ) {
+ $query->where('admin_name', 'LIKE', '%' . $search . '%')
+ ->orWhere('admin_id', '=', intval($search));
+ }
+ });
+ }
+ $lists = $model->orderBy($this->model->getKeyName(), 'DESC')
+ ->paginate($this->getLimit($params['limit'] ?? 10));
+
+ return [
+ 'current_page' => $lists->currentPage(),
+ 'per_page' => $lists->perPage(),
+ 'count_page' => $lists->lastPage(),
+ 'total' => $lists->total(),
+ 'data' => $lists->items(),
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Services/AdminLoginLogService.php b/app/Modules/Admin/Services/AdminLoginLogService.php
new file mode 100644
index 0000000000000000000000000000000000000000..59b94396282848e674b18ec13a9ac67fd4f3bcdd
--- /dev/null
+++ b/app/Modules/Admin/Services/AdminLoginLogService.php
@@ -0,0 +1,47 @@
+model = $adminLoginLog;
+ }
+
+ public function lists(array $params) : array
+ {
+ $model = $this->model->setMonthTable($this->getSearchMonth())
+ ->with([
+ 'admin' => function($query) {
+ $query->select('admin_id', 'admin_name');
+ },
+ ]);
+ $admin_id = $params['admin_id'] ?? 0;
+ $search = trim($params['search'] ?? '');
+ if ( !empty($search) || $admin_id > 0 ) {
+ $model = $model->whereHas('admin', function($query) use ($search, $admin_id) {
+ if ( !empty($search) ) {
+ $query->where('admin_name', 'LIKE', '%' . $search . '%')
+ ->orWhere('admin_id', '=', intval($search));
+ }
+ // 指定管理员筛选
+ if ( $admin_id > 0 ) {
+ $query->where('admin_id', '=', $admin_id);
+ }
+ });
+ }
+ $lists = $model->orderBy($this->model->getKeyName(), 'DESC')
+ ->paginate($this->getLimit($params['limit'] ?? 10));
+
+ return [
+ 'current_page' => $lists->currentPage(),
+ 'per_page' => $lists->perPage(),
+ 'count_page' => $lists->lastPage(),
+ 'total' => $lists->total(),
+ 'data' => $lists->items(),
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Services/AdminMenuService.php b/app/Modules/Admin/Services/AdminMenuService.php
new file mode 100644
index 0000000000000000000000000000000000000000..15c9c7a671c66bf58751e0e8d39f8044414590b1
--- /dev/null
+++ b/app/Modules/Admin/Services/AdminMenuService.php
@@ -0,0 +1,31 @@
+model = $adminMenu;
+ }
+
+ /**
+ * 菜单列表
+ *
+ * @param array $params
+ * @return array
+ */
+ public function lists(array $params) : array
+ {
+ $lists = $this->model->with($this->with)->orderBy('menu_sort', 'ASC')->get();
+
+ return list_to_tree($lists->toArray());
+ }
+
+ public function getSelectLists($request)
+ {
+ return $this->model->getSelectLists();
+ }
+}
diff --git a/app/Modules/Admin/Services/AdminRoleService.php b/app/Modules/Admin/Services/AdminRoleService.php
new file mode 100644
index 0000000000000000000000000000000000000000..d39de37981da970b889c965e762bb730ea93de9d
--- /dev/null
+++ b/app/Modules/Admin/Services/AdminRoleService.php
@@ -0,0 +1,135 @@
+model = $adminRole;
+ $this->with = ['menus'];
+ }
+
+ public function lists(array $params) : array
+ {
+ $params['where_callback'] = function($query) use ($params){
+ $request = request();
+ // 按照名称进行搜索
+ if (!empty($search = $request->input('search', ''))){
+ $query->where('role_name', 'LIKE', '%' . trim($search) . '%');
+ }
+ // 状态
+ $is_check = $request->input('is_check', -1);
+ if ($is_check > -1){
+ $query->where('is_check', '=', $is_check);
+ }
+ };
+ return parent::lists($params); // TODO: Change the autogenerated stub
+ }
+
+ public function getSelectLists($request)
+ {
+ return $this->model->where(function($query) use ($request){
+ $search = $request->input('search', '');
+ // 可以按照名称进行搜索
+ if (!empty($search)){
+ $query->where('role_name', 'LIKE', '%' . trim($search) . '%');
+ }
+ })->with(['menus'])->orderBy($this->model->getKeyName(), 'ASC')->limit(100)->get();
+ }
+
+ public function create(array $params)
+ {
+ DB::beginTransaction();
+ try{
+ parent::create($params); // TODO: Change the autogenerated stub
+
+ $this->setMenuForRole($params);
+
+ DB::commit();
+ return true;
+ }catch (Exception $e){
+ DB::rollBack();
+ $this->setError($e->getMessage());
+ return false;
+ }
+ }
+
+ public function update(array $params)
+ {
+ DB::beginTransaction();
+ try{
+ parent::update($params); // TODO: Change the autogenerated stub
+
+ $this->setMenuForRole($params);
+
+ DB::commit();
+ return true;
+ }catch (Exception $e){
+ DB::rollBack();
+ $this->setError($e->getMessage());
+ return false;
+ }
+ }
+
+ protected function setMenuForRole($params)
+ {
+ // 超级管理员角色不可编辑
+ if (isset($params['menu_ids']) && $this->detail->{$this->model->getKeyName()} != 1){
+ $menu_rules = $params['menu_ids'];
+
+ $all_menus = AdminMenu::select('menu_id')->find($menu_rules)->toArray();//当前选中的菜单权限
+ $new_all_menus = array_column($all_menus, 'menu_id', 'menu_id');
+ $has_menus = $this->detail->menus->toArray();//当前已有的菜单权限
+ $new_has_menus = array_column($has_menus, 'menu_id', 'menu_id');
+
+ $primary_key = $this->model->getKeyName();
+ /**
+ * 添加的权限
+ */
+ $add_menus = get_array_diff($new_all_menus, $new_has_menus);
+ if (!empty($add_menus)) {
+ foreach ($add_menus as $menus) $this->model->grantMenus([
+ $primary_key => $this->detail->{$primary_key},
+ 'menu_id' => $menus,
+ ]);
+ }
+
+ /**
+ * 要删除的权限
+ */
+ $delete_menus = get_array_diff($new_has_menus, $new_all_menus);
+ if (!empty($delete_menus)) {
+ foreach ($delete_menus as $menus) $this->model->deleteMenus([
+ $primary_key => $this->detail->{$primary_key},
+ 'menu_id' => $menus,
+ ]);
+ }
+ }
+ }
+
+ public function delete(array $params)
+ {
+ $primaryKey = $this->model->getKeyName();
+ if (isset($params[$primaryKey]) && $params[$primaryKey] == 1){
+ $this->setError('超管角色禁止删除!');
+ return false;
+ }
+
+ // 如果是批量删除,那么移除Id
+ if(isset($params['is_batch']) && $params['is_batch'] == 1){
+ $ids_ary = explode(',', $params[$primaryKey]);
+ if (in_array(1, $ids_ary)){
+ $key = array_search(1, $ids_ary);
+ unset($ids_ary[$key]);
+ $params[$primaryKey] = implode(',', $ids_ary);
+ }
+ }
+ return parent::delete($params); // TODO: Change the autogenerated stub
+ }
+}
diff --git a/app/Modules/Admin/Services/AdminService.php b/app/Modules/Admin/Services/AdminService.php
new file mode 100644
index 0000000000000000000000000000000000000000..835d0545e58514695285d80f9932486c7cab0b85
--- /dev/null
+++ b/app/Modules/Admin/Services/AdminService.php
@@ -0,0 +1,142 @@
+model = $admin;
+ $this->with = ['adminInfo', 'roles'];
+ }
+
+ public function lists(array $params) : array
+ {
+ $params['where_callback'] = function($query) use ($params){
+ $request = request();
+ // 按照名称进行搜索
+ if (!empty($search = $request->input('search', ''))){
+ $query->where('admin_name', 'LIKE', '%' . trim($search) . '%');
+ }
+ // 状态
+ $is_check = $request->input('is_check', -1);
+ if ($is_check > -1){
+ $query->where('is_check', '=', $is_check);
+ }
+ };
+ return parent::lists($params); // TODO: Change the autogenerated stub
+ }
+
+ public function getSelectLists($request)
+ {
+ return $this->model->where(function($query) use ($request){
+ $search = $request->input('search', '');
+ // 可以按照名称进行搜索
+ if (!empty($search)){
+ $query->where('admin_name', 'LIKE', '%' . trim($search) . '%');
+ }
+ })->orderBy($this->model->getKeyName(), 'ASC')->limit(100)->get();
+ }
+
+ public function create(array $params)
+ {
+ DB::beginTransaction();
+ try{
+ $detail = parent::create($params); // TODO: Change the autogenerated stub
+
+ $primary_key = $this->model->getKeyName();
+
+ // 管理员详情
+ $ip_agent = get_client_info();
+ $detail->adminInfo()->create([
+ $primary_key => $detail->{$primary_key},
+ 'created_ip' => $ip_agent['ip'] ?? get_ip(),
+ 'browser_type' => $ip_agent['agent'] ?? $_SERVER['HTTP_USER_AGENT'],
+ ]);
+
+ // 管理员关联角色设置
+ $this->setRoleForAdmin($params);
+
+ DB::commit();
+ return true;
+ }catch (Exception $e){
+ DB::rollBack();
+ $this->setError($e->getMessage());
+ return false;
+ }
+ }
+
+ public function update(array $params)
+ {
+ DB::beginTransaction();
+ try{
+ parent::update($params); // TODO: Change the autogenerated stub
+
+ // 管理员关联角色设置
+ $this->setRoleForAdmin($params);
+
+ DB::commit();
+ return true;
+ }catch (Exception $e){
+ DB::rollBack();
+ $this->setError($e->getMessage());
+ return false;
+ }
+ }
+
+ /**
+ * 管理员关联角色设置
+ *
+ * @param array $request_data
+ */
+ protected function setRoleForAdmin(array $request_data)
+ {
+ if (!isset($request_data['role_ids'])) return;
+ /**
+ * 角色操作
+ */
+ $request_roles = $request_data['role_ids'] ?? [];
+ $all_roles = AdminRole::findMany($request_roles);//当前选中的角色
+ $has_roles = $this->detail->roles;//当前已有的角色
+
+ /**
+ * 添加的角色
+ */
+ $add_roles = $all_roles->diff($has_roles);
+ if (!empty($add_roles)) {
+ foreach ($add_roles as $roles) $this->detail->assignRole($roles);
+ }
+
+ /**
+ * 要删除的角色
+ */
+ $delete_roles = $has_roles->diff($all_roles);
+ if (!empty($delete_roles)) {
+ foreach ($delete_roles as $roles) $this->detail->deleteRole($roles);
+ }
+ }
+
+ public function delete(array $params)
+ {
+ $primaryKey = $this->model->getKeyName();
+ if (isset($params[$primaryKey]) && $params[$primaryKey] == 1){
+ $this->setError('超管禁止删除!');
+ return false;
+ }
+ // 如果是批量删除,那么移除Id
+ if(isset($params['is_batch']) && $params['is_batch'] == 1){
+ $ids_ary = explode(',', $params[$primaryKey]);
+ if (in_array(1, $ids_ary)){
+ $key = array_search(1, $ids_ary);
+ unset($ids_ary[$key]);
+ $params[$primaryKey] = implode(',', $ids_ary);
+ }
+ }
+ return parent::delete($params); // TODO: Change the autogenerated stub
+ }
+}
diff --git a/app/Modules/Admin/Services/ArticleCategoryService.php b/app/Modules/Admin/Services/ArticleCategoryService.php
new file mode 100644
index 0000000000000000000000000000000000000000..a086caa5d9e613c08d8d1b980e84caecacccc195
--- /dev/null
+++ b/app/Modules/Admin/Services/ArticleCategoryService.php
@@ -0,0 +1,63 @@
+model = $article;
+ }
+
+ public function lists(array $params) : array
+ {
+ return $this->model->getSelectLists();
+ }
+
+ public function getSelectLists($request)
+ {
+ return $this->model->getSelectLists();
+ }
+
+ public function create(array $params)
+ {
+ $result = parent::create($params); // TODO: Change the autogenerated stub;
+
+ // 清除数据缓存
+ $this->model->delCache();
+
+ return $result;
+ }
+
+ public function update(array $params)
+ {
+ $result = parent::update($params); // TODO: Change the autogenerated stub;
+
+ // 清除数据缓存
+ $this->model->delCache();
+
+ return $result;
+ }
+
+ public function delete(array $params)
+ {
+ parent::delete($params); // TODO: Change the autogenerated stub;
+
+ // 清除数据缓存
+ $this->model->delCache();
+
+ return true;
+ }
+
+ public function changeFiledStatus(array $params)
+ {
+ $result = parent::changeFiledStatus($params); // TODO: Change the autogenerated stub;
+
+ // 清除数据缓存
+ $this->model->delCache();
+
+ return $result;
+ }
+}
diff --git a/app/Modules/Admin/Services/ArticleLabelService.php b/app/Modules/Admin/Services/ArticleLabelService.php
new file mode 100644
index 0000000000000000000000000000000000000000..7bc7fec7fdb72d40f0a6f55e79a7f197cf0204db
--- /dev/null
+++ b/app/Modules/Admin/Services/ArticleLabelService.php
@@ -0,0 +1,36 @@
+model = $article;
+ }
+
+ public function lists(array $params): array
+ {
+ $params['where_callback'] = function($query) use ($params){
+ $request = request();
+ // 按照名称进行搜索
+ if (!empty($search = $request->input('search', ''))){
+ $query->where('label_name', 'LIKE', '%' . trim($search) . '%');
+ }
+ };
+ return parent::lists($params); // TODO: Change the autogenerated stub
+ }
+
+ public function getSelectLists($request)
+ {
+ return $this->model->where(function($query) use ($request){
+ $search = $request->input('search', '');
+ // 可以按照名称进行搜索
+ if (!empty($search)){
+ $query->where('label_name', 'LIKE', '%' . trim($search) . '%');
+ }
+ })->orderBy($this->model->getKeyName(), 'ASC')->limit(100)->get();
+ }
+}
diff --git a/app/Modules/Admin/Services/ArticleService.php b/app/Modules/Admin/Services/ArticleService.php
new file mode 100644
index 0000000000000000000000000000000000000000..f0420f88f51572e3b63bc0eeacbb02d14924509d
--- /dev/null
+++ b/app/Modules/Admin/Services/ArticleService.php
@@ -0,0 +1,104 @@
+model = $article;
+ $this->with = ['category'];
+ $this->detailWith = ['labels'];
+ }
+
+ public function lists(array $params) : array
+ {
+ $params['where_callback'] = function($query) use ($params){
+ $request = request();
+ // 按照名称进行搜索
+ if (!empty($search = $request->input('search', ''))){
+ $search = trim($search);
+ $query->where('article_title', 'LIKE', '%' . $search . '%')
+ ->whereOr('article_keywords', 'LIKE', $search . '%')
+ ->whereOr('article_description', 'LIKE', $search . '%');
+ }
+ // 文章分类:包含所有子集的分类筛选
+ $category_id = $request->input('category_id', -1);
+ if ($category_id > -1){
+ $category_ids = ArticleCategory::getInstance()->getChildIds((int)$category_id);
+ $query->whereIn('category_id', $category_ids);
+ }
+ // 置顶
+ $set_top = $request->input('set_top', -1);
+ if ($set_top > -1){
+ $query->where('set_top', '=', $set_top);
+ }
+ // 推荐
+ $is_recommend = $request->input('is_recommend', -1);
+ if ($is_recommend > -1){
+ $query->where('is_recommend', '=', $is_recommend);
+ }
+ // 是否公开
+ $is_public = $request->input('is_public', -1);
+ if ($is_public > -1){
+ $query->where('is_public', '=', $is_public);
+ }
+ };
+ return parent::lists($params); // TODO: Change the autogenerated stub
+ }
+
+ public function create(array $params)
+ {
+ DB::beginTransaction();
+ try{
+ parent::create($params); // TODO: Change the autogenerated stub
+
+ $this->setArticleLabels($params);
+
+ DB::commit();
+ return true;
+ }catch (Exception $exception){
+ DB::rollBack();
+ return false;
+ }
+ }
+
+ public function update(array $params)
+ {
+ DB::beginTransaction();
+ try{
+ parent::update($params); // TODO: Change the autogenerated stub
+
+ $this->setArticleLabels($params);
+
+ DB::commit();
+ return true;
+ }catch (Exception $exception){
+ DB::rollBack();
+ return false;
+ }
+ }
+
+ private function setArticleLabels($params)
+ {
+ if (isset($params['label_ids'])){
+ $articleWithLabel = ArticleWithLabel::getInstance();
+ $article_id = $this->detail->{$this->model->getKeyName()};
+ // 先删除全部的标签
+ $articleWithLabel->where('article_id', $article_id)->delete();
+ // 关联标签录入
+ foreach ($params['label_ids'] as $label){
+ $articleWithLabel->create([
+ 'label_id' => $label,
+ 'article_id' => $article_id,
+ ]);
+ }
+ }
+ }
+}
diff --git a/app/Modules/Admin/Services/AuthService.php b/app/Modules/Admin/Services/AuthService.php
new file mode 100644
index 0000000000000000000000000000000000000000..5bdfc724baf9f09044c4f14af724a8cd94202920
--- /dev/null
+++ b/app/Modules/Admin/Services/AuthService.php
@@ -0,0 +1,96 @@
+guard);
+ $token = $auth->attempt($data);
+ if (!$token) throw new AuthException('认证失败!');
+ $admin = $auth->user();
+ if ( !$admin ) throw new AuthException('管理员账户不存在!');
+ switch ($admin->is_check) {
+ case 0:
+ throw new AuthException('该管理员尚未启用!', 0, $admin->admin_id);
+ break;
+ case 2:
+ throw new AuthException('该管理员已禁用!', 0, $admin->admin_id);
+ break;
+ }
+ AdminLoginLog::getInstance()->add($admin->admin_id, 1, '登录成功');
+ return $this->respondWithToken($token);
+ }
+
+ /**
+ * 登录管理员信息获取
+ *
+ * @return \Illuminate\Contracts\Auth\Authenticatable|null
+ * @throws \App\Exceptions\Admin\AuthTokenException
+ */
+ public function me()
+ {
+ if (!$admin = Auth::guard($this->guard)->user()){
+ throw new AuthTokenException('认证失败!');
+ }
+ $admin->admin_head = asset($admin->admin_head);
+ $admin['roles'] = ['admin'];
+ return $admin;
+ }
+
+ /**
+ * 退出登录
+ *
+ * @return bool
+ */
+ public function logout()
+ {
+ Auth::guard($this->guard)->logout();
+ return true;
+ }
+
+ /**
+ * Refresh a token.
+ * 刷新token,如果开启黑名单,以前的token便会失效。
+ * 值得注意的是用上面的getToken再获取一次Token并不算做刷新,两次获得的Token是并行的,即两个都可用。
+ *
+ * @return \Illuminate\Http\JsonResponse
+ */
+ public function refresh()
+ {
+ return $this->respondWithToken(auth($this->guard)->refresh());
+ }
+
+ /**
+ * Get the token array structure.
+ *
+ * @param $token
+ * @return array
+ */
+ protected function respondWithToken($token)
+ {
+ return [
+ 'access_token' => $token,
+ 'token_type' => 'Bearer',
+ 'expires_time' => time() + Auth::guard($this->guard)->factory()->getTTL() * 60
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Services/BannerService.php b/app/Modules/Admin/Services/BannerService.php
new file mode 100644
index 0000000000000000000000000000000000000000..84fbd0c0f75337ac13b9b269144d18e74fc03e40
--- /dev/null
+++ b/app/Modules/Admin/Services/BannerService.php
@@ -0,0 +1,32 @@
+model = $banner;
+ }
+
+ public function lists(array $params): array
+ {
+ $params['where_callback'] = function($query) use ($params){
+ $request = request();
+ // 按照名称进行搜索
+ if (!empty($search = $request->input('search', ''))){
+ $query->where('banner_title', 'LIKE', '%' . trim($search) . '%');
+ }
+ // 状态
+ $is_check = $request->input('is_check', -1);
+ if ($is_check > -1){
+ $query->where('is_check', '=', $is_check);
+ }
+ };
+ $params['order'] = 'banner_sort';
+ $params['order_sort'] = 'ASC';
+ return parent::lists($params); // TODO: Change the autogenerated stub
+ }
+}
diff --git a/app/Modules/Admin/Services/BaseService.php b/app/Modules/Admin/Services/BaseService.php
new file mode 100644
index 0000000000000000000000000000000000000000..891528e5104dddeb8d85dc83ecdc390639343317
--- /dev/null
+++ b/app/Modules/Admin/Services/BaseService.php
@@ -0,0 +1,153 @@
+model instanceof MonthModel){
+ $this->model = $this->model->setMonthTable($this->getSearchMonth());
+ }
+ $model = $this->model->where($params['where_callback'] ?? [])
+ ->with($this->with)
+ ->orderBy(empty($params['order']) ? $this->model->getKeyName() : $params['order'], empty($params['order_sort']) ? 'DESC' : $params['order_sort']);
+ // 如果是下载,那么数据将不分页。
+ if (isset($params['is_download']) && $params['is_download'] == 1){
+ return $model->get()->toArray() ?? [];
+ }else{
+ $lists = $model->paginate($this->getLimit($params['limit'] ?? 10));
+ return [
+ 'current_page' => $lists->currentPage(),
+ 'per_page' => $lists->perPage(),
+ 'count_page' => $lists->lastPage(),
+ 'total' => $lists->total(),
+ 'data' => $lists->items(),
+ ];
+ }
+ }
+
+ /**
+ * 详情
+ *
+ * @param $id
+ *
+ * @return mixed
+ */
+ public function detail($request)
+ {
+ $id = $request->input($this->model->getKeyName(), 0);
+ return $this->model->detail($id, '*', false, $this->detailWith);
+ }
+
+ /**
+ * 新增数据
+ *
+ * @param array $params
+ *
+ * @return mixed
+ */
+ public function create(array $params)
+ {
+ return $this->detail = $this->model->create($this->model->setFilterFields($params));
+ }
+
+ /**
+ * 更新数据
+ *
+ * @param array $params
+ *
+ * @return mixed
+ */
+ public function update(array $params)
+ {
+ $primaryKey = $this->model->getKeyName();
+ $this->detail = $this->model->find($params[$primaryKey]);
+ foreach ($this->model->setFilterFields($params) as $field => $value){
+ $this->detail->$field = $value ?? '';
+ }
+ return $this->detail->save();
+ }
+
+ /**
+ * 删除:单个或匹配删除
+ * @param array $params
+ *
+ * @return bool
+ */
+ public function delete(array $params)
+ {
+ $primaryKey = $this->model->getKeyName();
+ if ( empty($params[$primaryKey]) && empty($params['is_batch'])) {
+ $this->setError('请指定删除标识!');
+ return false;
+ }
+ // 是否为批量删除
+ if (isset($params['is_batch']) && $params['is_batch'] == 1){
+ $ids = explode(',', $params['ids'] ?? $params[$primaryKey]);
+ }else{
+ $ids = [$params[$primaryKey]];
+ }
+ /**
+ * 如果是月份表进行删除的话,那么需要指定表名
+ */
+ if ($this->model instanceof MonthModel && isset($params['month'])){
+ $this->model = $this->model->setMonthTable($params['month']);
+ }
+ if ($this->model->getIsDelete() == 0){
+ return $this->model->whereIn($primaryKey, $ids)->update([$this->model->getDeleteField() => 1]);
+ }else{
+ return $this->model->whereIn($primaryKey, $ids)->delete();
+ }
+ }
+
+ /**
+ * 指定字段变动
+ * @param array $params
+ *
+ * @return bool
+ */
+ public function changeFiledStatus(array $params)
+ {
+ $primaryKey = $this->model->getKeyName();
+ if (empty($params[$primaryKey])) {
+ $this->setError('请指定删除标识!');
+ return false;
+ }
+ if ( $this->model->where([$primaryKey => $params[$primaryKey]])->update([$params['change_field'] => $params['change_value']]) ) {
+ $this->setError('设置成功!');
+ return true;
+ } else {
+ $this->setError('设置失败!');
+ return false;
+ }
+ }
+
+ /**
+ * 下拉列表
+ *
+ * @param $request
+ *
+ * @return mixed
+ */
+ public function getSelectLists($request)
+ {
+ return $this->model->orderBy($this->model->getKeyName(), 'ASC')->limit(100)->get();
+ }
+}
diff --git a/app/Modules/Admin/Services/ConfigService.php b/app/Modules/Admin/Services/ConfigService.php
new file mode 100644
index 0000000000000000000000000000000000000000..20f27f145e535f990e3e3253ee0f898826962c55
--- /dev/null
+++ b/app/Modules/Admin/Services/ConfigService.php
@@ -0,0 +1,43 @@
+model = $config;
+ }
+
+ public function lists(array $params): array
+ {
+ $params['where_callback'] = function($query) use ($params){
+ $request = request();
+ // 按照名称进行搜索
+ if (!empty($search = $request->input('search', ''))){
+ $query->where('config_title', 'LIKE', '%' . trim($search) . '%')
+ ->whereOr('config_name', 'LIKE', '%' . trim($search) . '%');
+ }
+ // 状态
+ $is_check = $request->input('is_check', -1);
+ if ($is_check > -1){
+ $query->where('is_check', '=', $is_check);
+ }
+ };
+ $params['order'] = 'config_sort';
+ $params['order_sort'] = 'ASC';
+ return parent::lists($params); // TODO: Change the autogenerated stub
+ }
+
+ /**
+ * 同步配置
+ *
+ * @return mixed
+ */
+ public function pushRefreshConfig()
+ {
+ return $this->model->pushRefreshConfig();
+ }
+}
diff --git a/app/Modules/Admin/Services/FriendlinkService.php b/app/Modules/Admin/Services/FriendlinkService.php
new file mode 100644
index 0000000000000000000000000000000000000000..e5f72c5ed632ebe15e94abdd2c22ff04b5e8b532
--- /dev/null
+++ b/app/Modules/Admin/Services/FriendlinkService.php
@@ -0,0 +1,32 @@
+model = $friendlink;
+ }
+
+ public function lists(array $params): array
+ {
+ $params['where_callback'] = function($query) use ($params){
+ $request = request();
+ // 按照名称进行搜索
+ if (!empty($search = $request->input('search', ''))){
+ $query->where('link_name', 'LIKE', '%' . trim($search) . '%');
+ }
+ // 状态
+ $is_check = $request->input('is_check', -1);
+ if ($is_check > -1){
+ $query->where('is_check', '=', $is_check);
+ }
+ };
+ $params['order'] = 'link_sort';
+ $params['order_sort'] = 'ASC';
+ return parent::lists($params); // TODO: Change the autogenerated stub
+ }
+}
diff --git a/app/Modules/Admin/Services/IndexService.php b/app/Modules/Admin/Services/IndexService.php
new file mode 100644
index 0000000000000000000000000000000000000000..de0693c8646f2e90ef9a17aa9ef797566fb79f62
--- /dev/null
+++ b/app/Modules/Admin/Services/IndexService.php
@@ -0,0 +1,229 @@
+ Admin::count(),
+ // 文章总数
+ 'articles_count' => Article::count(),
+ // Banner数量
+ 'banners_count' => Banner::count(),
+ // 友情链接数量
+ 'friendlinks_count' => Friendlink::count(),
+ // 技能
+ 'skill' => $this->skill(),
+ // 统计图:使用请求日志来做数据
+ 'statistics' => $this->logsStatistics(),
+ ];
+ }
+
+ private function skill()
+ {
+ $arr = [
+ 'cnpscy' => 100,
+ 'PHP' => rand(70, 99),
+ 'Mysql' => rand(70, 99),
+ 'Redis' => rand(70, 99),
+ 'Thinkphp' => rand(70, 99),
+ 'Laravel' => rand(50, 99),
+ 'Hypref' => rand(50, 99),
+ 'Vue' => rand(10, 99),
+ 'JavaScript' => rand(20, 99),
+ ];
+ $list = [];
+ foreach ($arr as $key => $value) {
+ $list[] = [
+ 'name' => $key,
+ 'value' => $value,
+ ];
+ }
+ return $list;
+ }
+
+ /**
+ * 按照日志的请求类型来获取对应的统计图数据
+ *
+ * @return array
+ */
+ public function logsStatistics()
+ {
+ $default_time_interval = 300;
+ // 时段间隔:5分钟,自己调整
+ $time_interval_key = "logs-statistics's-time-interval";
+ $time_interval = Cache::get($time_interval_key, $default_time_interval);
+ // 通过缓存进行读写
+ return Cache::remember('logs-statistics', $time_interval, function() use ($time_interval, $time_interval_key) {
+ $default_data = [
+ 'xAxis' => [
+ 'data' => [],
+ ],
+ 'list_name' => [
+ // 'GET',
+ 'POST',
+ 'PUT',
+ 'DELETE',
+ ],
+ 'data_lists' => [
+ // 'GET' => [],
+ 'POST' => [],
+ 'PUT' => [],
+ 'DELETE' => [],
+ ],
+ ];
+ $adminLogInstance = AdminLog::getInstance();
+ $interval_nums = 100; // 时段次数:100个时间段,自己调整
+ $hours = ceil($time_interval / 3600); // 时间间隔设置,超过几小时:查询时的开始时间需要加上才有意义
+ $time = strtotime(date('Y-m-d H:i', strtotime('+' . $hours . ' hour')) . ':00');
+
+ // 数据查询
+ $list = $adminLogInstance->whereBetWeen('created_time', [
+ $time - $interval_nums * $time_interval,
+ $time,
+ ])->get();
+
+ // 是否存在区间有效的日志记录
+ $has_records = false;
+
+ for ($i = 0; $i < $interval_nums; $i++) {
+ $end_time = $time - $time_interval;
+ // 默认X轴的时段
+ $default_data['xAxis']['data'][$i] = date('Y-m-d H:i', $end_time);
+
+ // $default_data['data_lists']['GET'][$i] =
+ $default_data['data_lists']['POST'][$i] = $default_data['data_lists']['PUT'][$i] = $default_data['data_lists']['DELETE'][$i] = 0;
+
+ if ( $list ) {
+ foreach ($list as $v) {
+ if ( $v->created_time >= $end_time && $v->created_time <= $time ) {
+ $has_records = true;
+ if ( $v->log_method == 'GET' ) {
+ // ++$default_data['data_lists']['GET'][$i];
+ } elseif ( $v->log_method == 'POST' ) {
+ ++$default_data['data_lists']['POST'][$i];
+ } elseif ( $v->log_method == 'PUT' ) {
+ ++$default_data['data_lists']['PUT'][$i];
+ } elseif ( $v->log_method == 'DELETE' ) {
+ ++$default_data['data_lists']['DELETE'][$i];
+ }
+ }
+ }
+ }
+
+ // 把当前的结束时间设置为下一次的开始时间
+ $time = $end_time;
+ }
+
+ // 当没有记录是,时间间隔慢慢往上扩大两倍,实现统计图效果
+ if ( !$has_records ) {
+ Cache::put($time_interval_key, $time_interval * 2);
+ }
+
+ return (array)$default_data;
+ });
+ }
+
+ /**
+ * 编辑登录管理员信息
+ *
+ * @param $request
+ *
+ * @return mixed
+ */
+ public function updateAdmin($request)
+ {
+ $update['admin_name'] = $request->input('admin_name');
+ $password = $request->input('password', '');
+ if ( !empty($password) ) {
+ $update['password'] = $password;
+ }
+ return $request->user()->update($update);
+ }
+
+ /**
+ * 版本历史记录
+ *
+ * @return mixed
+ */
+ public function versionLogs()
+ {
+ return Version::getInstance()->select('version_name', 'version_number', 'version_content', 'publish_date')->orderBy('version_sort', 'DESC')->orderBy('publish_date', 'DESC')->orderBy('version_id', 'ASC')->get();
+ }
+
+ /**
+ * 获取服务器状态信息
+ *
+ * @return array
+ */
+ public function getServerStatus()
+ {
+ $systemInfo = new SystemInfo;
+ $disk_info = $systemInfo->getDisk();
+ $disk = [
+ 'chart_legend' => ['used', 'free'],
+ 'chart_series' => [
+ [
+ 'name' => 'used',
+ 'value' => $disk_info['used'],
+ ],
+ [
+ 'name' => 'free',
+ 'value' => $disk_info['free'],
+ ],
+ ],
+ ];
+
+
+ $memory_info = $systemInfo->getMemory();
+ $memory = [
+ 'chart_legend' => ['used', 'free'],
+ 'chart_series' => [
+ [
+ 'name' => 'used',
+ 'value' => $memory_info['used'],
+ ],
+ [
+ 'name' => 'free',
+ 'value' => $memory_info['free'],
+ ],
+ ],
+ ];
+
+ $cpu_info = $systemInfo->getCpu();
+ $cpu = [
+ 'chart_legend' => ['used', 'free'],
+ 'chart_series' => [
+ [
+ 'name' => 'used',
+ 'value' => $cpu_info['usage_ratio'],
+ ],
+ [
+ 'name' => 'free',
+ 'value' => 100 - $cpu_info['usage_ratio'],
+ ],
+ ],
+ ];
+ return [
+ 'php_os' => PHP_OS, // 服务器系统
+ 'system' => is_windows() ? 1 : 0, // 1.windows;0.Linux
+ 'disk' => $disk, // chart数据
+ 'disk_info' => $disk_info, // 默认数据
+ 'memory' => $memory,
+ 'memory_info' => $memory_info, // 默认数据
+ 'cpu' => $cpu,
+ ];
+ }
+}
diff --git a/app/Modules/Admin/Services/ProtocolService.php b/app/Modules/Admin/Services/ProtocolService.php
new file mode 100644
index 0000000000000000000000000000000000000000..83364ac95b672a6ac2df3652b0e4008770d38cb6
--- /dev/null
+++ b/app/Modules/Admin/Services/ProtocolService.php
@@ -0,0 +1,30 @@
+model = $protocol;
+ }
+
+ public function lists(array $params): array
+ {
+ $params['where_callback'] = function($query) use ($params){
+ $request = request();
+ // 按照名称进行搜索
+ if (!empty($search = $request->input('search', ''))){
+ $query->where('protocol_title', 'LIKE', '%' . trim($search) . '%');
+ }
+ // 状态
+ $is_check = $request->input('is_check', -1);
+ if ($is_check > -1){
+ $query->where('is_check', '=', $is_check);
+ }
+ };
+ return parent::lists($params); // TODO: Change the autogenerated stub
+ }
+}
diff --git a/app/Modules/Admin/Services/VersionService.php b/app/Modules/Admin/Services/VersionService.php
new file mode 100644
index 0000000000000000000000000000000000000000..4bbd4cdd7edb818940f9805b44f0a156cda6916c
--- /dev/null
+++ b/app/Modules/Admin/Services/VersionService.php
@@ -0,0 +1,28 @@
+model = $version;
+ }
+
+ public function lists(array $params): array
+ {
+ $params['where_callback'] = function($query) use ($params){
+ $request = request();
+ // 按照名称进行搜索
+ if (!empty($search = $request->input('search', ''))){
+ $query->where('version_name', 'LIKE', '%' . trim($search) . '%')
+ ->whereOr('version_number', 'LIKE', '%' . trim($search) . '%');
+ }
+ };
+ $params['order'] = 'version_sort';
+ $params['order_sort'] = 'ASC';
+ return parent::lists($params); // TODO: Change the autogenerated stub
+ }
+}
diff --git a/app/Modules/Admin/Tests/Feature/.gitkeep b/app/Modules/Admin/Tests/Feature/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/Tests/Unit/.gitkeep b/app/Modules/Admin/Tests/Unit/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/app/Modules/Admin/composer.json b/app/Modules/Admin/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..f2bd8ee9bfcad79b16aab60ee75dcdcc0a0f8efa
--- /dev/null
+++ b/app/Modules/Admin/composer.json
@@ -0,0 +1,23 @@
+{
+ "name": "nwidart/admin",
+ "description": "",
+ "authors": [
+ {
+ "name": "Nicolas Widart",
+ "email": "n.widart@gmail.com"
+ }
+ ],
+ "extra": {
+ "laravel": {
+ "providers": [],
+ "aliases": {
+
+ }
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "App\\Modules\\Admin\\": ""
+ }
+ }
+}
diff --git a/app/Modules/Admin/module.json b/app/Modules/Admin/module.json
new file mode 100644
index 0000000000000000000000000000000000000000..d527dbf88457fcf8998088c47df01adde2e3b8a0
--- /dev/null
+++ b/app/Modules/Admin/module.json
@@ -0,0 +1,13 @@
+{
+ "name": "Admin",
+ "alias": "admin",
+ "description": "",
+ "keywords": [],
+ "priority": 0,
+ "providers": [
+ "App\\Modules\\Admin\\Providers\\AdminServiceProvider"
+ ],
+ "aliases": {},
+ "files": [],
+ "requires": []
+}
diff --git a/app/Modules/Admin/package.json b/app/Modules/Admin/package.json
new file mode 100644
index 0000000000000000000000000000000000000000..4599509fec4714d417d12fefac9ec04b09a2659a
--- /dev/null
+++ b/app/Modules/Admin/package.json
@@ -0,0 +1,17 @@
+{
+ "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 --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+ },
+ "devDependencies": {
+ "cross-env": "^7.0",
+ "laravel-mix": "^5.0.1",
+ "laravel-mix-merge-manifest": "^0.1.2"
+ }
+}
diff --git a/app/Modules/Admin/webpack.admin.config.js b/app/Modules/Admin/webpack.admin.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..7a4c540c3126a3bcd8fb70df6fbbac3fb1da0481
--- /dev/null
+++ b/app/Modules/Admin/webpack.admin.config.js
@@ -0,0 +1,54 @@
+const path = require('path');
+const webpack = require('webpack');
+const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
+const ChunkRenamePlugin = require("webpack-chunk-rename-plugin");
+const vue_dir_path = '/Resources/vue-element-admin';
+
+function resolve(dir) {
+ return path.join(
+ __dirname,
+ vue_dir_path,
+ dir
+ );
+}
+
+const rawArgv = process.argv.slice(2);
+const args = rawArgv.join(' ');
+const report = rawArgv.includes('--report');
+let plugins = [new ChunkRenamePlugin({
+ initialChunksWithEntry: true,
+ '/js/app': 'js/app.js',
+ '/js/vendor': 'js/vendor.js'
+})];
+if (report) {
+ plugins.push(new BundleAnalyzerPlugin({
+ openAnalyzer: true,
+ }));
+}
+
+module.exports = {
+ resolve: {
+ extensions: ['.js', '.vue', '.json'],
+ alias: {
+ vue$: 'vue/dist/vue.esm.js',
+ '@': path.join(__dirname, vue_dir_path),
+ },
+ },
+ module: {
+ rules: [
+ {
+ test: /\.svg$/,
+ loader: 'svg-sprite-loader',
+ include: [resolve('icons')],
+ options: {
+ symbolId: 'icon-[name]',
+ },
+ },
+ ],
+ },
+ plugins: plugins,
+ output: {
+ filename: '[name].js',
+ chunkFilename: 'js/[name].[chunkhash:6].js',
+ },
+};
diff --git a/app/Modules/Admin/webpack.admin.js b/app/Modules/Admin/webpack.admin.js
new file mode 100644
index 0000000000000000000000000000000000000000..df4a62ffb3080929a91a23e14c9c99471cd6c86d
--- /dev/null
+++ b/app/Modules/Admin/webpack.admin.js
@@ -0,0 +1,73 @@
+const config = require('./webpack.admin.config');
+const mix = require('laravel-mix');
+const vue_dir_path = '/Resources/vue-element-admin';
+
+/*
+ |--------------------------------------------------------------------------
+ | Mix Asset Management
+ |--------------------------------------------------------------------------
+ |
+ | Mix provides a clean, fluent API for defining some Webpack build steps
+ | for your Laravel applications. By default, we are compiling the CSS
+ | file for the application as well as bundling up all the JS files.
+ |
+ */
+
+function resolve(dir) {
+ return path.join(
+ __dirname,
+ vue_dir_path,
+ dir
+ );
+}
+
+Mix.listen('configReady', webpackConfig => {
+ // Add "svg" to image loader test
+ const imageLoaderConfig = webpackConfig.module.rules.find(
+ rule =>
+ String(rule.test) ===
+ String(/(\.(png|jpe?g|gif|webp)$|^((?!font).)*\.svg$)/)
+ );
+ imageLoaderConfig.exclude = resolve('icons');
+});
+
+mix.webpackConfig(config);
+
+mix
+ .js(__dirname + vue_dir_path + '/main.js', 'public/js')
+ .sass(__dirname + '/Resources/assets/sass/app.scss', 'public/css')
+ .extract([
+ 'vue',
+ 'axios',
+ 'vuex',
+ 'vue-router',
+ 'vue-i18n',
+ 'element-ui',
+ 'echarts',
+ 'highlight.js',
+ 'sortablejs',
+ 'dropzone',
+ 'xlsx',
+ 'tui-editor',
+ 'codemirror',
+ ])
+ .options({
+ processCssUrls: false,
+ postCss: [
+ require('autoprefixer'),
+ ],
+ });
+
+if (mix.inProduction()) {
+ mix.version();
+} else {
+ if (process.env.LARAVUE_USE_ESLINT === 'true') {
+ mix.eslint();
+ }
+ // Development settings
+ mix
+ .sourceMaps()
+ .webpackConfig({
+ devtool: 'cheap-eval-source-map', // Fastest for development
+ });
+}
diff --git a/app/Modules/Admin/webpack.mix.js b/app/Modules/Admin/webpack.mix.js
new file mode 100644
index 0000000000000000000000000000000000000000..b62817f747f28dd02dfbdbcfebd2634be297f4c0
--- /dev/null
+++ b/app/Modules/Admin/webpack.mix.js
@@ -0,0 +1,14 @@
+const dotenvExpand = require('dotenv-expand');
+dotenvExpand(require('dotenv').config({ path: '../../.env'/*, debug: true*/}));
+
+const mix = require('laravel-mix');
+require('laravel-mix-merge-manifest');
+
+mix.setPublicPath('../../public').mergeManifest();
+
+mix.js(__dirname + '/Resources/assets/js/app.js', 'js/admin.js')
+ .sass( __dirname + '/Resources/assets/sass/app.scss', 'css/admin.css');
+
+if (mix.inProduction()) {
+ mix.version();
+}
diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..8802ed7a5663251312afa95d57c94677ad8d28ad
--- /dev/null
+++ b/app/Providers/AppServiceProvider.php
@@ -0,0 +1,29 @@
+ '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 0000000000000000000000000000000000000000..395c518bc47b94752d00b8dc7aeb7d241633e7cf
--- /dev/null
+++ b/app/Providers/BroadcastServiceProvider.php
@@ -0,0 +1,21 @@
+ [
+ SendEmailVerificationNotification::class,
+ ],
+ 'Illuminate\Database\Events\QueryExecuted' => [
+ 'App\Listeners\QueryListener',
+ ],
+ ];
+
+ /**
+ * Register any events for your application.
+ *
+ * @return void
+ */
+ public function boot()
+ {
+ //
+ }
+}
diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..3bd3c81eb2b6df0dc0a897ed95054e848013950e
--- /dev/null
+++ b/app/Providers/RouteServiceProvider.php
@@ -0,0 +1,63 @@
+configureRateLimiting();
+
+ $this->routes(function () {
+ Route::prefix('api')
+ ->middleware('api')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/api.php'));
+
+ Route::middleware('web')
+ ->namespace($this->namespace)
+ ->group(base_path('routes/web.php'));
+ });
+ }
+
+ /**
+ * Configure the rate limiters for the application.
+ *
+ * @return void
+ */
+ protected function configureRateLimiting()
+ {
+ RateLimiter::for('api', function (Request $request) {
+ return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
+ });
+ }
+}
diff --git a/app/Scopes/DeleteScope.php b/app/Scopes/DeleteScope.php
new file mode 100644
index 0000000000000000000000000000000000000000..6fe95f3d22e571c6385d328f3da15d6af4a467b1
--- /dev/null
+++ b/app/Scopes/DeleteScope.php
@@ -0,0 +1,31 @@
+is_delete = $model->getIsDelete();
+ $this->delete_field = $model->getDeleteField();
+ }
+
+ /**
+ * 把约束加到 Eloquent 查询构造中
+ *
+ * @param \Illuminate\Database\Eloquent\Builder $builder
+ * @param \Illuminate\Database\Eloquent\Model $model
+ * @return void
+ */
+ public function apply(Builder $builder, Model $model)
+ {
+ if ($this->is_delete == 0) $builder->where($this->delete_field, $this->is_delete);
+ }
+}
diff --git a/app/Services/Service.php b/app/Services/Service.php
new file mode 100644
index 0000000000000000000000000000000000000000..7294864acc614dc4232b5328d793f8ecd1452c72
--- /dev/null
+++ b/app/Services/Service.php
@@ -0,0 +1,37 @@
+input('search_month', '');
+ if (empty($search_month)) return '';
+ return $search_month;
+ }
+
+ /**
+ * 列表页:部分接口需要自定义展示数量,对于数量做一个限制处理
+ *
+ * @param int $limit
+ *
+ * @return int
+ */
+ protected function getLimit(int $limit = 10)
+ {
+ // 不可为0
+ $limit = $limit <= 0 ? 10 : $limit;
+ // 每页最多100条数据
+ $limit = $limit > 100 ? 100 : $limit;
+ return $limit;
+ }
+}
diff --git a/app/Traits/Error.php b/app/Traits/Error.php
new file mode 100644
index 0000000000000000000000000000000000000000..3a248b90d692bdcb1d50739dbbc4f1a597a1f9eb
--- /dev/null
+++ b/app/Traits/Error.php
@@ -0,0 +1,32 @@
+error;
+ }
+
+ public function getStatus() : int
+ {
+ return $this->status;
+ }
+
+ public function setError(string $error, int $status = 0) : void
+ {
+ $this->error = $error;
+ $this->status = $status;
+ }
+
+ public function setStatus(int $status) : void
+ {
+ $this->status = $status;
+ }
+}
diff --git a/app/Traits/Instance.php b/app/Traits/Instance.php
new file mode 100644
index 0000000000000000000000000000000000000000..7bb3ac0faf0dceb9b02b8426cbf38cca29cb2ddd
--- /dev/null
+++ b/app/Traits/Instance.php
@@ -0,0 +1,34 @@
+myAjaxReturn(array_merge(['data' => $data, 'msg' => $msg, 'status' => 1], $other));
+ }
+
+ public function errorJson($msg = 'error', $status = 0, $data = [], $other = [])
+ {
+ return $this->myAjaxReturn(array_merge(['msg' => $msg, 'status' => $status, 'data' => $data], $other));
+ }
+
+ public function setHttpCode(int $http_code): void
+ {
+ $this->http_code = $http_code;
+ }
+
+ /**
+ * [myAjaxReturn]
+ * @author:cnpscy <[2278757482@qq.com]>
+ * @chineseAnnotation:API接口返回格式统一
+ * @englishAnnotation:
+ * @version:1.0
+ * @param [type] $data [description]
+ */
+ public function myAjaxReturn($data)
+ {
+ $data['data'] = $data['data'] ?? [];
+ $data['status'] = intval($data['status'] ?? (empty($data['data']) ? 0 : 1));
+ $data['msg'] = $data['msg'] ?? (empty($data['status']) ? '数据不存在!' : 'success');
+
+ return response()->json($data, $this->http_code);
+ }
+}
diff --git a/app/Traits/MysqlTable.php b/app/Traits/MysqlTable.php
new file mode 100644
index 0000000000000000000000000000000000000000..ea82ed60d1f9ae24551353a343a3e569aed0cbea
--- /dev/null
+++ b/app/Traits/MysqlTable.php
@@ -0,0 +1,58 @@
+setError('请先设置要生成的新表名');
+ return false;
+ }
+ return DB::select("CREATE TABLE IF NOT EXISTS `{$new_table}` LIKE `{$old_table}`");
+ }
+
+ public function detail(int $id, string $filed = '*', bool $lock = false, array $with = [], array $withCount = [])
+ {
+ return $this->select($filed)
+ ->lock($lock)
+ ->with($with)
+ ->withCount($withCount)
+ ->find($id);
+ }
+
+ /**
+ * 过滤移除非当前表的字段参数
+ *
+ * @param array $params
+ *
+ * @return array
+ */
+ public function setFilterFields(array $params) : array
+ {
+ $fields = Schema::getColumnListing($this->getTable());
+ foreach ($params as $key => $param) {
+ if ( !in_array($key, $fields) ) unset($params[$key]);
+ }
+ // 同时过滤时间戳字段【时间戳只允许自动更改,不允许手动设置】
+ if ( $this->timestamps === true && isset($params[self::CREATED_AT]) ) unset($params[self::CREATED_AT]);
+ if ( $this->timestamps === true && isset($params[self::UPDATED_AT]) ) unset($params[self::UPDATED_AT]);
+ return $params;
+ }
+}
diff --git a/artisan b/artisan
new file mode 100644
index 0000000000000000000000000000000000000000..5c23e2e24fc5d9e8224d7357dbb583c83884582b
--- /dev/null
+++ b/artisan
@@ -0,0 +1,53 @@
+#!/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/babel.config.js b/babel.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..fb82b2715f46a87182f3e004dcc731f5a5f49fe8
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,14 @@
+module.exports = {
+ presets: [
+ // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app
+ '@vue/cli-plugin-babel/preset'
+ ],
+ 'env': {
+ 'development': {
+ // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().
+ // This plugin can significantly increase the speed of hot updates, when you have a large number of pages.
+ // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html
+ 'plugins': ['dynamic-import-node']
+ }
+ }
+}
diff --git a/bootstrap/app.php b/bootstrap/app.php
new file mode 100644
index 0000000000000000000000000000000000000000..037e17df03b0598d7bbd27ed333312e8e337fb1b
--- /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/cache/.gitignore b/bootstrap/cache/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..d6b7ef32c8478a48c3994dcadc86837f4371184d
--- /dev/null
+++ b/bootstrap/cache/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..d6d7ac8ecf513afb4cf54620590cd0a61a63f284
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,73 @@
+{
+ "name": "laravel/laravel",
+ "type": "project",
+ "description": "The Laravel Framework.",
+ "keywords": [
+ "framework",
+ "laravel"
+ ],
+ "license": "MIT",
+ "require": {
+ "php": "^7.3|^8.0",
+ "fideloper/proxy": "^4.4",
+ "fruitcake/laravel-cors": "^2.0",
+ "graham-campbell/exceptions": "14.1",
+ "guzzlehttp/guzzle": "^7.0.1",
+ "laravel/framework": "^8.12",
+ "laravel/tinker": "^2.5",
+ "nwidart/laravel-modules": "^8.2",
+ "predis/predis": "^1.1",
+ "tymon/jwt-auth": "^1.0"
+ },
+ "require-dev": {
+ "barryvdh/laravel-debugbar": "^3.5",
+ "beyondcode/laravel-dump-server": "^1.6",
+ "facade/ignition": "^2.5",
+ "fakerphp/faker": "^1.9.1",
+ "laravel/sail": "^0.0.5",
+ "mockery/mockery": "^1.4.2",
+ "nunomaduro/collision": "^5.0",
+ "phpunit/phpunit": "^9.3.3"
+ },
+ "config": {
+ "optimize-autoloader": true,
+ "preferred-install": "dist",
+ "sort-packages": true
+ },
+ "extra": {
+ "laravel": {
+ "dont-discover": []
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "App\\": "app/",
+ "Modules\\": "Modules/",
+ "Database\\Factories\\": "database/factories/",
+ "Database\\Seeders\\": "database/seeders/"
+ },
+ "files": [
+ "app/Helper/functions.php",
+ "app/Helper/builtin-functions.php"
+ ]
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Tests\\": "tests/"
+ }
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "scripts": {
+ "post-autoload-dump": [
+ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
+ "@php artisan package:discover --ansi"
+ ],
+ "post-root-package-install": [
+ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+ ],
+ "post-create-project-cmd": [
+ "@php artisan key:generate --ansi"
+ ]
+ }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000000000000000000000000000000000000..10876da8d1c412559f0c2bcc130ffc2cdc30fa15
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,8424 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "e99b9ac837fe1142d1258a23965d8514",
+ "packages": [
+ {
+ "name": "asm89/stack-cors",
+ "version": "v2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/asm89/stack-cors.git",
+ "reference": "8d8f88b3b3830916be94292c1fbce84433efb1aa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/asm89/stack-cors/zipball/8d8f88b3b3830916be94292c1fbce84433efb1aa",
+ "reference": "8d8f88b3b3830916be94292c1fbce84433efb1aa",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.0|^8.0",
+ "symfony/http-foundation": "~2.7|~3.0|~4.0|~5.0",
+ "symfony/http-kernel": "~2.7|~3.0|~4.0|~5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6|^7|^8|^9",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Asm89\\Stack\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Alexander",
+ "email": "iam.asm89@gmail.com"
+ }
+ ],
+ "description": "Cross-origin resource sharing library and stack middleware",
+ "homepage": "https://github.com/asm89/stack-cors",
+ "keywords": [
+ "cors",
+ "stack"
+ ],
+ "time": "2020-10-29T16:03:21+00:00"
+ },
+ {
+ "name": "brick/math",
+ "version": "0.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/brick/math.git",
+ "reference": "283a40c901101e66de7061bd359252c013dcc43c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/brick/math/zipball/283a40c901101e66de7061bd359252c013dcc43c",
+ "reference": "283a40c901101e66de7061bd359252c013dcc43c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.1|^8.0"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.2",
+ "phpunit/phpunit": "^7.5.15|^8.5",
+ "vimeo/psalm": "^3.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Brick\\Math\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Arbitrary-precision arithmetic library",
+ "keywords": [
+ "Arbitrary-precision",
+ "BigInteger",
+ "BigRational",
+ "arithmetic",
+ "bigdecimal",
+ "bignum",
+ "brick",
+ "math"
+ ],
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/brick/math",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-08-18T23:57:15+00:00"
+ },
+ {
+ "name": "dnoegel/php-xdg-base-dir",
+ "version": "v0.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
+ "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
+ "reference": "8f8a6e48c5ecb0f991c2fdcf5f154a47d85f9ffd",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~7.0|~6.0|~5.0|~4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "XdgBaseDir\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "implementation of xdg base directory specification for php",
+ "time": "2019-12-04T15:06:13+00:00"
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/9cf661f4eb38f7c881cac67c75ea9b00bf97b210",
+ "reference": "9cf661f4eb38f7c881cac67c75ea9b00bf97b210",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^7.0",
+ "phpstan/phpstan": "^0.11",
+ "phpstan/phpstan-phpunit": "^0.11",
+ "phpstan/phpstan-strict-rules": "^0.11",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Inflector\\": "lib/Doctrine/Inflector"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.",
+ "homepage": "https://www.doctrine-project.org/projects/inflector.html",
+ "keywords": [
+ "inflection",
+ "inflector",
+ "lowercase",
+ "manipulation",
+ "php",
+ "plural",
+ "singular",
+ "strings",
+ "uppercase",
+ "words"
+ ],
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-05-29T15:13:26+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "e864bbf5904cb8f5bb334f99209b48018522f042"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042",
+ "reference": "e864bbf5904cb8f5bb334f99209b48018522f042",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^6.0",
+ "phpstan/phpstan": "^0.11.8",
+ "phpunit/phpunit": "^8.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "https://www.doctrine-project.org/projects/lexer.html",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "lexer",
+ "parser",
+ "php"
+ ],
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-05-25T17:44:05+00:00"
+ },
+ {
+ "name": "dragonmantank/cron-expression",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/dragonmantank/cron-expression.git",
+ "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c",
+ "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2|^8.0",
+ "webmozart/assert": "^1.7.0"
+ },
+ "replace": {
+ "mtdowling/cron-expression": "^1.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-webmozart-assert": "^0.12.7",
+ "phpunit/phpunit": "^7.0|^8.0|^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Cron\\": "src/Cron/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Tankersley",
+ "email": "chris@ctankersley.com",
+ "homepage": "https://github.com/dragonmantank"
+ }
+ ],
+ "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
+ "keywords": [
+ "cron",
+ "schedule"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/dragonmantank",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-24T19:55:57+00:00"
+ },
+ {
+ "name": "egulias/email-validator",
+ "version": "2.1.25",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4",
+ "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "doctrine/lexer": "^1.0.1",
+ "php": ">=5.5",
+ "symfony/polyfill-intl-idn": "^1.10"
+ },
+ "require-dev": {
+ "dominicsayers/isemail": "^3.0.7",
+ "phpunit/phpunit": "^4.8.36|^7.5.15",
+ "satooshi/php-coveralls": "^1.0.1"
+ },
+ "suggest": {
+ "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Egulias\\EmailValidator\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eduardo Gulias Davis"
+ }
+ ],
+ "description": "A library for validating emails against several RFCs",
+ "homepage": "https://github.com/egulias/EmailValidator",
+ "keywords": [
+ "email",
+ "emailvalidation",
+ "emailvalidator",
+ "validation",
+ "validator"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/egulias",
+ "type": "github"
+ }
+ ],
+ "time": "2020-12-29T14:50:06+00:00"
+ },
+ {
+ "name": "fideloper/proxy",
+ "version": "4.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fideloper/TrustedProxy.git",
+ "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/c073b2bd04d1c90e04dc1b787662b558dd65ade0",
+ "reference": "c073b2bd04d1c90e04dc1b787662b558dd65ade0",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "illuminate/contracts": "^5.0|^6.0|^7.0|^8.0|^9.0",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "illuminate/http": "^5.0|^6.0|^7.0|^8.0|^9.0",
+ "mockery/mockery": "^1.0",
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Fideloper\\Proxy\\TrustedProxyServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fideloper\\Proxy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Fidao",
+ "email": "fideloper@gmail.com"
+ }
+ ],
+ "description": "Set trusted proxies for Laravel",
+ "keywords": [
+ "load balancing",
+ "proxy",
+ "trusted proxy"
+ ],
+ "time": "2020-10-22T13:48:01+00:00"
+ },
+ {
+ "name": "fruitcake/laravel-cors",
+ "version": "v2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruitcake/laravel-cors.git",
+ "reference": "01de0fe5f71c70d1930ee9a80385f9cc28e0f63a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruitcake/laravel-cors/zipball/01de0fe5f71c70d1930ee9a80385f9cc28e0f63a",
+ "reference": "01de0fe5f71c70d1930ee9a80385f9cc28e0f63a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "asm89/stack-cors": "^2.0.1",
+ "illuminate/contracts": "^6|^7|^8|^9",
+ "illuminate/support": "^6|^7|^8|^9",
+ "php": ">=7.2",
+ "symfony/http-foundation": "^4|^5",
+ "symfony/http-kernel": "^4.3.4|^5"
+ },
+ "require-dev": {
+ "laravel/framework": "^6|^7|^8",
+ "orchestra/testbench-dusk": "^4|^5|^6",
+ "phpunit/phpunit": "^6|^7|^8",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Fruitcake\\Cors\\CorsServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fruitcake\\Cors\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fruitcake",
+ "homepage": "https://fruitcake.nl"
+ },
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application",
+ "keywords": [
+ "api",
+ "cors",
+ "crossdomain",
+ "laravel"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-22T13:57:20+00:00"
+ },
+ {
+ "name": "graham-campbell/exceptions",
+ "version": "v14.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/GrahamCampbell/Laravel-Exceptions.git",
+ "reference": "e57e229816e61c10a2b8b0ba4b86e1e61877b262"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/GrahamCampbell/Laravel-Exceptions/zipball/e57e229816e61c10a2b8b0ba4b86e1e61877b262",
+ "reference": "e57e229816e61c10a2b8b0ba4b86e1e61877b262",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "illuminate/contracts": "^7.0 || ^8.0",
+ "illuminate/support": "^7.0 || ^8.0",
+ "php": "^7.2.5 || ^8.0",
+ "psr/log": "^1.1",
+ "symfony/console": "^5.0",
+ "symfony/error-handler": "^5.0",
+ "symfony/http-foundation": "^5.0"
+ },
+ "require-dev": {
+ "filp/whoops": "^2.7.1",
+ "graham-campbell/analyzer": "^3.0",
+ "graham-campbell/testbench": "^5.4",
+ "mockery/mockery": "^1.3.1",
+ "phpunit/phpunit": "^8.5.8 || ^9.3.7"
+ },
+ "suggest": {
+ "filp/whoops": "Enables use of the debug displayer."
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "GrahamCampbell\\Exceptions\\ExceptionsServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GrahamCampbell\\Exceptions\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com"
+ }
+ ],
+ "description": "Provides A Powerful Error Response System For Both Development And Production",
+ "keywords": [
+ "Graham Campbell",
+ "GrahamCampbell",
+ "Laravel Exceptions",
+ "Laravel-Exceptions",
+ "error",
+ "errors",
+ "exception",
+ "exceptions",
+ "framework",
+ "laravel",
+ "whoops"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/exceptions",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-08-14T14:50:11+00:00"
+ },
+ {
+ "name": "graham-campbell/result-type",
+ "version": "v1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/GrahamCampbell/Result-Type.git",
+ "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/7e279d2cd5d7fbb156ce46daada972355cea27bb",
+ "reference": "7e279d2cd5d7fbb156ce46daada972355cea27bb",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.0|^8.0",
+ "phpoption/phpoption": "^1.7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5|^7.5|^8.5|^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GrahamCampbell\\ResultType\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com"
+ }
+ ],
+ "description": "An Implementation Of The Result Type",
+ "keywords": [
+ "Graham Campbell",
+ "GrahamCampbell",
+ "Result Type",
+ "Result-Type",
+ "result"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-04-13T13:17:36+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "7.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0aa74dfb41ae110835923ef10a9d803a22d50e79",
+ "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "guzzlehttp/promises": "^1.4",
+ "guzzlehttp/psr7": "^1.7",
+ "php": "^7.2.5 || ^8.0",
+ "psr/http-client": "^1.0"
+ },
+ "provide": {
+ "psr/http-client-implementation": "1.0"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "php-http/client-integration-tests": "^3.0",
+ "phpunit/phpunit": "^8.5.5 || ^9.3.5",
+ "psr/log": "^1.1"
+ },
+ "suggest": {
+ "ext-curl": "Required for CURL handler support",
+ "ext-intl": "Required for Internationalized Domain Name (IDN) support",
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "7.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Márk Sági-Kazár",
+ "email": "mark.sagikazar@gmail.com",
+ "homepage": "https://sagikazarmark.hu"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "psr-18",
+ "psr-7",
+ "rest",
+ "web service"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/Nyholm",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/alexeyshockov",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/gmponos",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-10T11:47:56+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "60d379c243457e073cff02bc323a2a86cb355631"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631",
+ "reference": "60d379c243457e073cff02bc323a2a86cb355631",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "^4.4 || ^5.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "time": "2020-09-30T07:37:28+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3",
+ "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0",
+ "ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "ext-zlib": "*",
+ "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
+ },
+ "suggest": {
+ "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "psr-7",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "time": "2020-09-30T07:37:11+00:00"
+ },
+ {
+ "name": "laravel/framework",
+ "version": "v8.20.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/framework.git",
+ "reference": "b5d8573ab16027867eaa1ac148893833434f9b02"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/framework/zipball/b5d8573ab16027867eaa1ac148893833434f9b02",
+ "reference": "b5d8573ab16027867eaa1ac148893833434f9b02",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "doctrine/inflector": "^1.4|^2.0",
+ "dragonmantank/cron-expression": "^3.0.2",
+ "egulias/email-validator": "^2.1.10",
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "league/commonmark": "^1.3",
+ "league/flysystem": "^1.1",
+ "monolog/monolog": "^2.0",
+ "nesbot/carbon": "^2.31",
+ "opis/closure": "^3.6",
+ "php": "^7.3|^8.0",
+ "psr/container": "^1.0",
+ "psr/simple-cache": "^1.0",
+ "ramsey/uuid": "^4.0",
+ "swiftmailer/swiftmailer": "^6.0",
+ "symfony/console": "^5.1.4",
+ "symfony/error-handler": "^5.1.4",
+ "symfony/finder": "^5.1.4",
+ "symfony/http-foundation": "^5.1.4",
+ "symfony/http-kernel": "^5.1.4",
+ "symfony/mime": "^5.1.4",
+ "symfony/process": "^5.1.4",
+ "symfony/routing": "^5.1.4",
+ "symfony/var-dumper": "^5.1.4",
+ "tijsverkoyen/css-to-inline-styles": "^2.2.2",
+ "vlucas/phpdotenv": "^5.2",
+ "voku/portable-ascii": "^1.4.8"
+ },
+ "conflict": {
+ "tightenco/collect": "<5.5.33"
+ },
+ "provide": {
+ "psr/container-implementation": "1.0"
+ },
+ "replace": {
+ "illuminate/auth": "self.version",
+ "illuminate/broadcasting": "self.version",
+ "illuminate/bus": "self.version",
+ "illuminate/cache": "self.version",
+ "illuminate/collections": "self.version",
+ "illuminate/config": "self.version",
+ "illuminate/console": "self.version",
+ "illuminate/container": "self.version",
+ "illuminate/contracts": "self.version",
+ "illuminate/cookie": "self.version",
+ "illuminate/database": "self.version",
+ "illuminate/encryption": "self.version",
+ "illuminate/events": "self.version",
+ "illuminate/filesystem": "self.version",
+ "illuminate/hashing": "self.version",
+ "illuminate/http": "self.version",
+ "illuminate/log": "self.version",
+ "illuminate/macroable": "self.version",
+ "illuminate/mail": "self.version",
+ "illuminate/notifications": "self.version",
+ "illuminate/pagination": "self.version",
+ "illuminate/pipeline": "self.version",
+ "illuminate/queue": "self.version",
+ "illuminate/redis": "self.version",
+ "illuminate/routing": "self.version",
+ "illuminate/session": "self.version",
+ "illuminate/support": "self.version",
+ "illuminate/testing": "self.version",
+ "illuminate/translation": "self.version",
+ "illuminate/validation": "self.version",
+ "illuminate/view": "self.version"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^3.155",
+ "doctrine/dbal": "^2.6|^3.0",
+ "filp/whoops": "^2.8",
+ "guzzlehttp/guzzle": "^6.5.5|^7.0.1",
+ "league/flysystem-cached-adapter": "^1.0",
+ "mockery/mockery": "^1.4.2",
+ "orchestra/testbench-core": "^6.8",
+ "pda/pheanstalk": "^4.0",
+ "phpunit/phpunit": "^8.5.8|^9.3.3",
+ "predis/predis": "^1.1.1",
+ "symfony/cache": "^5.1.4"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.155).",
+ "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.6|^3.0).",
+ "ext-ftp": "Required to use the Flysystem FTP driver.",
+ "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().",
+ "ext-memcached": "Required to use the memcache cache driver.",
+ "ext-pcntl": "Required to use all features of the queue worker.",
+ "ext-posix": "Required to use all features of the queue worker.",
+ "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).",
+ "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).",
+ "filp/whoops": "Required for friendly error pages in development (^2.8).",
+ "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).",
+ "laravel/tinker": "Required to use the tinker console command (^2.0).",
+ "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).",
+ "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).",
+ "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).",
+ "mockery/mockery": "Required to use mocking (^1.4.2).",
+ "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).",
+ "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).",
+ "phpunit/phpunit": "Required to use assertions and run tests (^8.5.8|^9.3.3).",
+ "predis/predis": "Required to use the predis connector (^1.1.2).",
+ "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).",
+ "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0).",
+ "symfony/cache": "Required to PSR-6 cache bridge (^5.1.4).",
+ "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).",
+ "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).",
+ "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "8.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Illuminate/Collections/helpers.php",
+ "src/Illuminate/Events/functions.php",
+ "src/Illuminate/Foundation/helpers.php",
+ "src/Illuminate/Support/helpers.php"
+ ],
+ "psr-4": {
+ "Illuminate\\": "src/Illuminate/",
+ "Illuminate\\Support\\": [
+ "src/Illuminate/Macroable/",
+ "src/Illuminate/Collections/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Laravel Framework.",
+ "homepage": "https://laravel.com",
+ "keywords": [
+ "framework",
+ "laravel"
+ ],
+ "time": "2020-12-22T21:21:19+00:00"
+ },
+ {
+ "name": "laravel/tinker",
+ "version": "v2.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/tinker.git",
+ "reference": "45884b526e10a88a1b179fa1a1a24d5468c668c2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/tinker/zipball/45884b526e10a88a1b179fa1a1a24d5468c668c2",
+ "reference": "45884b526e10a88a1b179fa1a1a24d5468c668c2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "illuminate/console": "^6.0|^7.0|^8.0",
+ "illuminate/contracts": "^6.0|^7.0|^8.0",
+ "illuminate/support": "^6.0|^7.0|^8.0",
+ "php": "^7.2.5|^8.0",
+ "psy/psysh": "^0.10.4",
+ "symfony/var-dumper": "^4.3.4|^5.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.3|^1.4.2",
+ "phpunit/phpunit": "^8.5.8|^9.3.3"
+ },
+ "suggest": {
+ "illuminate/database": "The Illuminate Database package (^6.0|^7.0|^8.0)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Laravel\\Tinker\\TinkerServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Tinker\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Powerful REPL for the Laravel framework.",
+ "keywords": [
+ "REPL",
+ "Tinker",
+ "laravel",
+ "psysh"
+ ],
+ "time": "2020-10-29T13:07:12+00:00"
+ },
+ {
+ "name": "lcobucci/jwt",
+ "version": "3.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/lcobucci/jwt.git",
+ "reference": "c1123697f6a2ec29162b82f170dd4a491f524773"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/lcobucci/jwt/zipball/c1123697f6a2ec29162b82f170dd4a491f524773",
+ "reference": "c1123697f6a2ec29162b82f170dd4a491f524773",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "php": "^5.6 || ^7.0"
+ },
+ "require-dev": {
+ "mikey179/vfsstream": "~1.5",
+ "phpmd/phpmd": "~2.2",
+ "phpunit/php-invoker": "~1.1",
+ "phpunit/phpunit": "^5.7 || ^7.3",
+ "squizlabs/php_codesniffer": "~2.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Lcobucci\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Luís Otávio Cobucci Oblonczyk",
+ "email": "lcobucci@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to work with JSON Web Token and JSON Web Signature",
+ "keywords": [
+ "JWS",
+ "jwt"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/lcobucci",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/lcobucci",
+ "type": "patreon"
+ }
+ ],
+ "time": "2020-08-20T13:22:28+00:00"
+ },
+ {
+ "name": "league/commonmark",
+ "version": "1.5.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/commonmark.git",
+ "reference": "11df9b36fd4f1d2b727a73bf14931d81373b9a54"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/11df9b36fd4f1d2b727a73bf14931d81373b9a54",
+ "reference": "11df9b36fd4f1d2b727a73bf14931d81373b9a54",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "scrutinizer/ocular": "1.7.*"
+ },
+ "require-dev": {
+ "cebe/markdown": "~1.0",
+ "commonmark/commonmark.js": "0.29.2",
+ "erusev/parsedown": "~1.0",
+ "ext-json": "*",
+ "github/gfm": "0.29.0",
+ "michelf/php-markdown": "~1.4",
+ "mikehaertl/php-shellcommand": "^1.4",
+ "phpstan/phpstan": "^0.12",
+ "phpunit/phpunit": "^7.5 || ^8.5 || ^9.2",
+ "scrutinizer/ocular": "^1.5",
+ "symfony/finder": "^4.2"
+ },
+ "bin": [
+ "bin/commonmark"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\CommonMark\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Colin O'Dell",
+ "email": "colinodell@gmail.com",
+ "homepage": "https://www.colinodell.com",
+ "role": "Lead Developer"
+ }
+ ],
+ "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and Github-Flavored Markdown (GFM)",
+ "homepage": "https://commonmark.thephpleague.com",
+ "keywords": [
+ "commonmark",
+ "flavored",
+ "gfm",
+ "github",
+ "github-flavored",
+ "markdown",
+ "md",
+ "parser"
+ ],
+ "funding": [
+ {
+ "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.colinodell.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.paypal.me/colinpodell/10.00",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/colinodell",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/colinodell",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/commonmark",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-31T13:49:32+00:00"
+ },
+ {
+ "name": "league/flysystem",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem.git",
+ "reference": "9be3b16c877d477357c015cec057548cf9b2a14a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/9be3b16c877d477357c015cec057548cf9b2a14a",
+ "reference": "9be3b16c877d477357c015cec057548cf9b2a14a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "league/mime-type-detection": "^1.3",
+ "php": "^7.2.5 || ^8.0"
+ },
+ "conflict": {
+ "league/flysystem-sftp": "<1.0.6"
+ },
+ "require-dev": {
+ "phpspec/prophecy": "^1.11.1",
+ "phpunit/phpunit": "^8.5.8"
+ },
+ "suggest": {
+ "ext-fileinfo": "Required for MimeType",
+ "ext-ftp": "Allows you to use FTP server storage",
+ "ext-openssl": "Allows you to use FTPS server storage",
+ "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
+ "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+ "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+ "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+ "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+ "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+ "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+ "league/flysystem-webdav": "Allows you to use WebDAV storage",
+ "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
+ "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
+ "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Flysystem\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frenky.net"
+ }
+ ],
+ "description": "Filesystem abstraction: Many filesystems, one API.",
+ "keywords": [
+ "Cloud Files",
+ "WebDAV",
+ "abstraction",
+ "aws",
+ "cloud",
+ "copy.com",
+ "dropbox",
+ "file systems",
+ "files",
+ "filesystem",
+ "filesystems",
+ "ftp",
+ "rackspace",
+ "remote",
+ "s3",
+ "sftp",
+ "storage"
+ ],
+ "funding": [
+ {
+ "url": "https://offset.earth/frankdejonge",
+ "type": "other"
+ }
+ ],
+ "time": "2020-08-23T07:39:11+00:00"
+ },
+ {
+ "name": "league/mime-type-detection",
+ "version": "1.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/mime-type-detection.git",
+ "reference": "353f66d7555d8a90781f6f5e7091932f9a4250aa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/353f66d7555d8a90781f6f5e7091932f9a4250aa",
+ "reference": "353f66d7555d8a90781f6f5e7091932f9a4250aa",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-fileinfo": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/phpstan": "^0.12.36",
+ "phpunit/phpunit": "^8.5.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\MimeTypeDetection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frankdejonge.nl"
+ }
+ ],
+ "description": "Mime-type detection for Flysystem",
+ "funding": [
+ {
+ "url": "https://github.com/frankdejonge",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/league/flysystem",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-18T11:50:25+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1cb1cde8e8dd0f70cc0fe51354a59acad9302084",
+ "reference": "1cb1cde8e8dd0f70cc0fe51354a59acad9302084",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2",
+ "psr/log": "^1.0.1"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+ "doctrine/couchdb": "~1.0@dev",
+ "elasticsearch/elasticsearch": "^7",
+ "graylog2/gelf-php": "^1.4.2",
+ "mongodb/mongodb": "^1.8",
+ "php-amqplib/php-amqplib": "~2.4",
+ "php-console/php-console": "^3.1.3",
+ "phpspec/prophecy": "^1.6.1",
+ "phpstan/phpstan": "^0.12.59",
+ "phpunit/phpunit": "^8.5",
+ "predis/predis": "^1.1",
+ "rollbar/rollbar": "^1.3",
+ "ruflin/elastica": ">=0.90 <7.0.1",
+ "swiftmailer/swiftmailer": "^5.3|^6.0"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+ "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client",
+ "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+ "ext-mbstring": "Allow to work properly with unicode symbols",
+ "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+ "php-console/php-console": "Allow sending log messages to Google Chrome",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic Search server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "https://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+ "homepage": "https://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/Seldaek",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/monolog/monolog",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-14T13:15:25+00:00"
+ },
+ {
+ "name": "namshi/jose",
+ "version": "7.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/namshi/jose.git",
+ "reference": "89a24d7eb3040e285dd5925fcad992378b82bcff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/namshi/jose/zipball/89a24d7eb3040e285dd5925fcad992378b82bcff",
+ "reference": "89a24d7eb3040e285dd5925fcad992378b82bcff",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-date": "*",
+ "ext-hash": "*",
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-spl": "*",
+ "php": ">=5.5",
+ "symfony/polyfill-php56": "^1.0"
+ },
+ "require-dev": {
+ "phpseclib/phpseclib": "^2.0",
+ "phpunit/phpunit": "^4.5|^5.0",
+ "satooshi/php-coveralls": "^1.0"
+ },
+ "suggest": {
+ "ext-openssl": "Allows to use OpenSSL as crypto engine.",
+ "phpseclib/phpseclib": "Allows to use Phpseclib as crypto engine, use version ^2.0."
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Namshi\\JOSE\\": "src/Namshi/JOSE/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Alessandro Nadalin",
+ "email": "alessandro.nadalin@gmail.com"
+ },
+ {
+ "name": "Alessandro Cinelli (cirpo)",
+ "email": "alessandro.cinelli@gmail.com"
+ }
+ ],
+ "description": "JSON Object Signing and Encryption library for PHP.",
+ "keywords": [
+ "JSON Web Signature",
+ "JSON Web Token",
+ "JWS",
+ "json",
+ "jwt",
+ "token"
+ ],
+ "time": "2016-12-05T07:27:31+00:00"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "2.43.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/briannesbitt/Carbon.git",
+ "reference": "d32c57d8389113742f4a88725a170236470012e2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/d32c57d8389113742f4a88725a170236470012e2",
+ "reference": "d32c57d8389113742f4a88725a170236470012e2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "php": "^7.1.8 || ^8.0",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/translation": "^3.4 || ^4.0 || ^5.0"
+ },
+ "require-dev": {
+ "doctrine/orm": "^2.7",
+ "friendsofphp/php-cs-fixer": "^2.14 || ^3.0",
+ "kylekatarnls/multi-tester": "^2.0",
+ "phpmd/phpmd": "^2.9",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12.54",
+ "phpunit/phpunit": "^7.5 || ^8.0",
+ "squizlabs/php_codesniffer": "^3.4"
+ },
+ "bin": [
+ "bin/carbon"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev",
+ "dev-3.x": "3.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Carbon\\Laravel\\ServiceProvider"
+ ]
+ },
+ "phpstan": {
+ "includes": [
+ "extension.neon"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Carbon\\": "src/Carbon/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "http://nesbot.com"
+ },
+ {
+ "name": "kylekatarnls",
+ "homepage": "http://github.com/kylekatarnls"
+ }
+ ],
+ "description": "An API extension for DateTime that supports 281 different languages.",
+ "homepage": "http://carbon.nesbot.com",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "funding": [
+ {
+ "url": "https://opencollective.com/Carbon",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-17T20:55:32+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v4.10.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+ "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "time": "2020-12-20T10:01:03+00:00"
+ },
+ {
+ "name": "nwidart/laravel-modules",
+ "version": "8.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nWidart/laravel-modules.git",
+ "reference": "6ade5ec19e81a0e4807834886a2c47509d069cb7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nWidart/laravel-modules/zipball/6ade5ec19e81a0e4807834886a2c47509d069cb7",
+ "reference": "6ade5ec19e81a0e4807834886a2c47509d069cb7",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.16",
+ "laravel/framework": "^8.0",
+ "mockery/mockery": "~1.0",
+ "orchestra/testbench": "^6.2",
+ "phpstan/phpstan": "^0.12.14",
+ "phpunit/phpunit": "^8.5",
+ "spatie/phpunit-snapshot-assertions": "^2.1.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Nwidart\\Modules\\LaravelModulesServiceProvider"
+ ],
+ "aliases": {
+ "Module": "Nwidart\\Modules\\Facades\\Module"
+ }
+ },
+ "branch-alias": {
+ "dev-master": "8.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Nwidart\\Modules\\": "src"
+ },
+ "files": [
+ "src/helpers.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Widart",
+ "email": "n.widart@gmail.com",
+ "homepage": "https://nicolaswidart.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Laravel Module management",
+ "keywords": [
+ "laravel",
+ "module",
+ "modules",
+ "nwidart",
+ "rad"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/nwidart",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-11T09:24:22+00:00"
+ },
+ {
+ "name": "opis/closure",
+ "version": "3.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/opis/closure.git",
+ "reference": "943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/opis/closure/zipball/943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5",
+ "reference": "943b5d70cc5ae7483f6aff6ff43d7e34592ca0f5",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^5.4 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "jeremeamia/superclosure": "^2.0",
+ "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Opis\\Closure\\": "src/"
+ },
+ "files": [
+ "functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marius Sarca",
+ "email": "marius.sarca@gmail.com"
+ },
+ {
+ "name": "Sorin Sarca",
+ "email": "sarca_sorin@hotmail.com"
+ }
+ ],
+ "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.",
+ "homepage": "https://opis.io/closure",
+ "keywords": [
+ "anonymous functions",
+ "closure",
+ "function",
+ "serializable",
+ "serialization",
+ "serialize"
+ ],
+ "time": "2020-11-07T02:01:34+00:00"
+ },
+ {
+ "name": "phpoption/phpoption",
+ "version": "1.7.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/php-option.git",
+ "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/994ecccd8f3283ecf5ac33254543eb0ac946d525",
+ "reference": "994ecccd8f3283ecf5ac33254543eb0ac946d525",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^5.5.9 || ^7.0 || ^8.0"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "phpunit/phpunit": "^4.8.35 || ^5.7.27 || ^6.5.6 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpOption\\": "src/PhpOption/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Johannes M. Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com"
+ }
+ ],
+ "description": "Option Type for PHP",
+ "keywords": [
+ "language",
+ "option",
+ "php",
+ "type"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-07-20T17:29:33+00:00"
+ },
+ {
+ "name": "predis/predis",
+ "version": "v1.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/predis/predis.git",
+ "reference": "9930e933c67446962997b05201c69c2319bf26de"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/predis/predis/zipball/9930e933c67446962997b05201c69c2319bf26de",
+ "reference": "9930e933c67446962997b05201c69c2319bf26de",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "cweagans/composer-patches": "^1.6",
+ "phpunit/phpunit": "~4.8"
+ },
+ "suggest": {
+ "ext-curl": "Allows access to Webdis when paired with phpiredis",
+ "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol"
+ },
+ "type": "library",
+ "extra": {
+ "composer-exit-on-patch-failure": true,
+ "patches": {
+ "phpunit/phpunit-mock-objects": {
+ "Fix PHP 7 and 8 compatibility": "./tests/phpunit_mock_objects.patch"
+ },
+ "phpunit/phpunit": {
+ "Fix PHP 7 compatibility": "./tests/phpunit_php7.patch",
+ "Fix PHP 8 compatibility": "./tests/phpunit_php8.patch"
+ }
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Predis\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Daniele Alessandri",
+ "email": "suppakilla@gmail.com",
+ "homepage": "http://clorophilla.net",
+ "role": "Creator & Maintainer"
+ },
+ {
+ "name": "Till Krüss",
+ "homepage": "https://till.im",
+ "role": "Maintainer"
+ }
+ ],
+ "description": "Flexible and feature-complete Redis client for PHP and HHVM",
+ "homepage": "http://github.com/predis/predis",
+ "keywords": [
+ "nosql",
+ "predis",
+ "redis"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sponsors/tillkruss",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-11T19:18:05+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/event-dispatcher",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/event-dispatcher.git",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\EventDispatcher\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Standard interfaces for event handling.",
+ "keywords": [
+ "events",
+ "psr",
+ "psr-14"
+ ],
+ "time": "2019-01-08T18:20:26+00:00"
+ },
+ {
+ "name": "psr/http-client",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "time": "2020-06-29T06:28:15+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "time": "2016-08-06T14:39:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "reference": "0f73288fd15629204f9d42b7055f72dacbe811fc",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Log\\": "Psr/Log/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for logging libraries",
+ "homepage": "https://github.com/php-fig/log",
+ "keywords": [
+ "log",
+ "psr",
+ "psr-3"
+ ],
+ "time": "2020-03-23T09:12:05+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "time": "2017-10-23T01:57:42+00:00"
+ },
+ {
+ "name": "psy/psysh",
+ "version": "v0.10.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bobthecow/psysh.git",
+ "reference": "7c710551d4a2653afa259c544508dc18a9098956"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/bobthecow/psysh/zipball/7c710551d4a2653afa259c544508dc18a9098956",
+ "reference": "7c710551d4a2653afa259c544508dc18a9098956",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "dnoegel/php-xdg-base-dir": "0.1.*",
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "nikic/php-parser": "~4.0|~3.0|~2.0|~1.3",
+ "php": "^8.0 || ^7.0 || ^5.5.9",
+ "symfony/console": "~5.0|~4.0|~3.0|^2.4.2|~2.3.10",
+ "symfony/var-dumper": "~5.0|~4.0|~3.0|~2.7"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.2",
+ "hoa/console": "3.17.*"
+ },
+ "suggest": {
+ "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+ "ext-pdo-sqlite": "The doc command requires SQLite to work.",
+ "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
+ "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.",
+ "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit."
+ },
+ "bin": [
+ "bin/psysh"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.10.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Psy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Justin Hileman",
+ "email": "justin@justinhileman.info",
+ "homepage": "http://justinhileman.com"
+ }
+ ],
+ "description": "An interactive shell for modern PHP.",
+ "homepage": "http://psysh.org",
+ "keywords": [
+ "REPL",
+ "console",
+ "interactive",
+ "shell"
+ ],
+ "time": "2020-12-04T02:51:30+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "ramsey/collection",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/collection.git",
+ "reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/collection/zipball/24d93aefb2cd786b7edd9f45b554aea20b28b9b1",
+ "reference": "24d93aefb2cd786b7edd9f45b554aea20b28b9b1",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "ergebnis/composer-normalize": "^2.6",
+ "fzaninotto/faker": "^1.5",
+ "hamcrest/hamcrest-php": "^2",
+ "jangregor/phpstan-prophecy": "^0.6",
+ "mockery/mockery": "^1.3",
+ "phpstan/extension-installer": "^1",
+ "phpstan/phpstan": "^0.12.32",
+ "phpstan/phpstan-mockery": "^0.12.5",
+ "phpstan/phpstan-phpunit": "^0.12.11",
+ "phpunit/phpunit": "^8.5",
+ "psy/psysh": "^0.10.4",
+ "slevomat/coding-standard": "^6.3",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^3.12.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Collection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ben Ramsey",
+ "email": "ben@benramsey.com",
+ "homepage": "https://benramsey.com"
+ }
+ ],
+ "description": "A PHP 7.2+ library for representing and manipulating collections.",
+ "keywords": [
+ "array",
+ "collection",
+ "hash",
+ "map",
+ "queue",
+ "set"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-10T20:58:17+00:00"
+ },
+ {
+ "name": "ramsey/uuid",
+ "version": "4.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "cd4032040a750077205918c86049aa0f43d22947"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947",
+ "reference": "cd4032040a750077205918c86049aa0f43d22947",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "brick/math": "^0.8 || ^0.9",
+ "ext-json": "*",
+ "php": "^7.2 || ^8",
+ "ramsey/collection": "^1.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "codeception/aspect-mock": "^3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0",
+ "doctrine/annotations": "^1.8",
+ "goaop/framework": "^2",
+ "mockery/mockery": "^1.3",
+ "moontoast/math": "^1.1",
+ "paragonie/random-lib": "^2",
+ "php-mock/php-mock-mockery": "^1.3",
+ "php-mock/php-mock-phpunit": "^2.5",
+ "php-parallel-lint/php-parallel-lint": "^1.1",
+ "phpbench/phpbench": "^0.17.1",
+ "phpstan/extension-installer": "^1.0",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-mockery": "^0.12",
+ "phpstan/phpstan-phpunit": "^0.12",
+ "phpunit/phpunit": "^8.5",
+ "psy/psysh": "^0.10.0",
+ "slevomat/coding-standard": "^6.0",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "3.9.4"
+ },
+ "suggest": {
+ "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+ "ext-ctype": "Enables faster processing of character classification using ctype functions.",
+ "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+ "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+ "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+ "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Uuid\\": "src/"
+ },
+ "files": [
+ "src/functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+ "homepage": "https://github.com/ramsey/uuid",
+ "keywords": [
+ "guid",
+ "identifier",
+ "uuid"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ }
+ ],
+ "time": "2020-08-18T17:17:46+00:00"
+ },
+ {
+ "name": "swiftmailer/swiftmailer",
+ "version": "v6.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/swiftmailer/swiftmailer.git",
+ "reference": "56f0ab23f54c4ccbb0d5dcc67ff8552e0c98d59e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/56f0ab23f54c4ccbb0d5dcc67ff8552e0c98d59e",
+ "reference": "56f0ab23f54c4ccbb0d5dcc67ff8552e0c98d59e",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "egulias/email-validator": "^2.0",
+ "php": ">=7.0.0",
+ "symfony/polyfill-iconv": "^1.0",
+ "symfony/polyfill-intl-idn": "^1.10",
+ "symfony/polyfill-mbstring": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^1.0",
+ "symfony/phpunit-bridge": "^4.4|^5.0"
+ },
+ "suggest": {
+ "ext-intl": "Needed to support internationalized email addresses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.2-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "lib/swift_required.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Corbyn"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Swiftmailer, free feature-rich PHP mailer",
+ "homepage": "https://swiftmailer.symfony.com",
+ "keywords": [
+ "email",
+ "mail",
+ "mailer"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-08T18:02:06+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "47c02526c532fb381374dab26df05e7313978976"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/47c02526c532fb381374dab26df05e7313978976",
+ "reference": "47c02526c532fb381374dab26df05e7313978976",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php73": "^1.8",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/service-contracts": "^1.1|^2",
+ "symfony/string": "^5.1"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<4.4",
+ "symfony/dotenv": "<5.1",
+ "symfony/event-dispatcher": "<4.4",
+ "symfony/lock": "<4.4",
+ "symfony/process": "<4.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/event-dispatcher": "^4.4|^5.0",
+ "symfony/lock": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "symfony/var-dumper": "^4.4|^5.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "cli",
+ "command line",
+ "console",
+ "terminal"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-18T08:03:05+00:00"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "f789e7ead4c79e04ca9a6d6162fc629c89bd8054"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/f789e7ead4c79e04ca9a6d6162fc629c89bd8054",
+ "reference": "f789e7ead4c79e04ca9a6d6162fc629c89bd8054",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\CssSelector\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony CssSelector Component",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-08T17:02:38+00:00"
+ },
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5fa56b4074d1ae755beb55617ddafe6f5d78f665",
+ "reference": "5fa56b4074d1ae755beb55617ddafe6f5d78f665",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
+ },
+ {
+ "name": "symfony/error-handler",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/error-handler.git",
+ "reference": "59b190ce16ddf32771a22087b60f6dafd3407147"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/error-handler/zipball/59b190ce16ddf32771a22087b60f6dafd3407147",
+ "reference": "59b190ce16ddf32771a22087b60f6dafd3407147",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/log": "^1.0",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/var-dumper": "^4.4|^5.0"
+ },
+ "require-dev": {
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/http-kernel": "^4.4|^5.0",
+ "symfony/serializer": "^4.4|^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ErrorHandler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony ErrorHandler Component",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-09T18:54:12+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "1c93f7a1dff592c252574c79a8635a8a80856042"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1c93f7a1dff592c252574c79a8635a8a80856042",
+ "reference": "1c93f7a1dff592c252574c79a8635a8a80856042",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/event-dispatcher-contracts": "^2",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<4.4"
+ },
+ "provide": {
+ "psr/event-dispatcher-implementation": "1.0",
+ "symfony/event-dispatcher-implementation": "2.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/error-handler": "^4.4|^5.0",
+ "symfony/expression-language": "^4.4|^5.0",
+ "symfony/http-foundation": "^4.4|^5.0",
+ "symfony/service-contracts": "^1.1|^2",
+ "symfony/stopwatch": "^4.4|^5.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-18T08:03:05+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher-contracts",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher-contracts.git",
+ "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/0ba7d54483095a198fa51781bc608d17e84dffa2",
+ "reference": "0ba7d54483095a198fa51781bc608d17e84dffa2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/event-dispatcher": "^1"
+ },
+ "suggest": {
+ "symfony/event-dispatcher-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to dispatching event",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "0b9231a5922fd7287ba5b411893c0ecd2733e5ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/finder/zipball/0b9231a5922fd7287ba5b411893c0ecd2733e5ba",
+ "reference": "0b9231a5922fd7287ba5b411893c0ecd2733e5ba",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Finder\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Finder Component",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-08T17:02:38+00:00"
+ },
+ {
+ "name": "symfony/http-client-contracts",
+ "version": "v2.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-client-contracts.git",
+ "reference": "41db680a15018f9c1d4b23516059633ce280ca33"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/41db680a15018f9c1d4b23516059633ce280ca33",
+ "reference": "41db680a15018f9c1d4b23516059633ce280ca33",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "suggest": {
+ "symfony/http-client-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-version": "2.3",
+ "branch-alias": {
+ "dev-main": "2.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\HttpClient\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to HTTP clients",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-14T17:08:19+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "a1f6218b29897ab52acba58cfa905b83625bef8d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/a1f6218b29897ab52acba58cfa905b83625bef8d",
+ "reference": "a1f6218b29897ab52acba58cfa905b83625bef8d",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/polyfill-mbstring": "~1.1",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "require-dev": {
+ "predis/predis": "~1.0",
+ "symfony/cache": "^4.4|^5.0",
+ "symfony/expression-language": "^4.4|^5.0",
+ "symfony/mime": "^4.4|^5.0"
+ },
+ "suggest": {
+ "symfony/mime": "To use the file extension guesser"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony HttpFoundation Component",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-18T10:00:10+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "1feb619286d819180f7b8bc0dc44f516d9c62647"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1feb619286d819180f7b8bc0dc44f516d9c62647",
+ "reference": "1feb619286d819180f7b8bc0dc44f516d9c62647",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/log": "~1.0",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/error-handler": "^4.4|^5.0",
+ "symfony/event-dispatcher": "^5.0",
+ "symfony/http-client-contracts": "^1.1|^2",
+ "symfony/http-foundation": "^4.4|^5.0",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-php73": "^1.9",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "symfony/browser-kit": "<4.4",
+ "symfony/cache": "<5.0",
+ "symfony/config": "<5.0",
+ "symfony/console": "<4.4",
+ "symfony/dependency-injection": "<5.1.8",
+ "symfony/doctrine-bridge": "<5.0",
+ "symfony/form": "<5.0",
+ "symfony/http-client": "<5.0",
+ "symfony/mailer": "<5.0",
+ "symfony/messenger": "<5.0",
+ "symfony/translation": "<5.0",
+ "symfony/twig-bridge": "<5.0",
+ "symfony/validator": "<5.0",
+ "twig/twig": "<2.4"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0"
+ },
+ "require-dev": {
+ "psr/cache": "~1.0",
+ "symfony/browser-kit": "^4.4|^5.0",
+ "symfony/config": "^5.0",
+ "symfony/console": "^4.4|^5.0",
+ "symfony/css-selector": "^4.4|^5.0",
+ "symfony/dependency-injection": "^5.1.8",
+ "symfony/dom-crawler": "^4.4|^5.0",
+ "symfony/expression-language": "^4.4|^5.0",
+ "symfony/finder": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "symfony/routing": "^4.4|^5.0",
+ "symfony/stopwatch": "^4.4|^5.0",
+ "symfony/translation": "^4.4|^5.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "twig/twig": "^2.4|^3.0"
+ },
+ "suggest": {
+ "symfony/browser-kit": "",
+ "symfony/config": "",
+ "symfony/console": "",
+ "symfony/dependency-injection": ""
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony HttpKernel Component",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-18T13:49:39+00:00"
+ },
+ {
+ "name": "symfony/mime",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/mime.git",
+ "reference": "de97005aef7426ba008c46ba840fc301df577ada"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/mime/zipball/de97005aef7426ba008c46ba840fc301df577ada",
+ "reference": "de97005aef7426ba008c46ba840fc301df577ada",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/polyfill-intl-idn": "^1.10",
+ "symfony/polyfill-mbstring": "^1.0",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "symfony/mailer": "<4.4"
+ },
+ "require-dev": {
+ "egulias/email-validator": "^2.1.10",
+ "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/property-access": "^4.4|^5.1",
+ "symfony/property-info": "^4.4|^5.1",
+ "symfony/serializer": "^5.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Mime\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A library to manipulate MIME messages",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "mime",
+ "mime-type"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-09T18:54:12+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+ "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-iconv",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-iconv.git",
+ "reference": "c536646fdb4f29104dd26effc2fdcb9a5b085024"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/c536646fdb4f29104dd26effc2fdcb9a5b085024",
+ "reference": "c536646fdb4f29104dd26effc2fdcb9a5b085024",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-iconv": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Iconv\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Iconv extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "iconv",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-grapheme",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-grapheme.git",
+ "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c",
+ "reference": "c7cf3f858ec7d70b89559d6e6eb1f7c2517d479c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Grapheme\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's grapheme_* functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "grapheme",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-idn",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-idn.git",
+ "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/3b75acd829741c768bc8b1f84eb33265e7cc5117",
+ "reference": "3b75acd829741c768bc8b1f84eb33265e7cc5117",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1",
+ "symfony/polyfill-intl-normalizer": "^1.10",
+ "symfony/polyfill-php72": "^1.10"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Idn\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Laurent Bassin",
+ "email": "laurent@bassin.info"
+ },
+ {
+ "name": "Trevor Rowbotham",
+ "email": "trevor.rowbotham@pm.me"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "idn",
+ "intl",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-intl-normalizer",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-intl-normalizer.git",
+ "reference": "727d1096295d807c309fb01a851577302394c897"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/727d1096295d807c309fb01a851577302394c897",
+ "reference": "727d1096295d807c309fb01a851577302394c897",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-intl": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Intl\\Normalizer\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for intl's Normalizer class and related functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "intl",
+ "normalizer",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "39d483bdf39be819deabf04ec872eb0b2410b531"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531",
+ "reference": "39d483bdf39be819deabf04ec872eb0b2410b531",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php56",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php56.git",
+ "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
+ "reference": "54b8cd7e6c1643d78d011f3be89f3ef1f9f4c675",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "metapackage",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php72",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php72.git",
+ "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/cede45fcdfabdd6043b3592e83678e42ec69e930",
+ "reference": "cede45fcdfabdd6043b3592e83678e42ec69e930",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php72\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php73",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php73.git",
+ "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/8ff431c517be11c78c48a39a66d37431e26a6bed",
+ "reference": "8ff431c517be11c78c48a39a66d37431e26a6bed",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php73\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php80",
+ "version": "v1.20.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php80.git",
+ "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de",
+ "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.20-dev"
+ },
+ "thanks": {
+ "name": "symfony/polyfill",
+ "url": "https://github.com/symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php80\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ion Bazan",
+ "email": "ion.bazan@gmail.com"
+ },
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-10-23T14:02:19+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/bd8815b8b6705298beaa384f04fabd459c10bedd",
+ "reference": "bd8815b8b6705298beaa384f04fabd459c10bedd",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-08T17:03:37+00:00"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "934ac2720dcc878a47a45c986b483a7ee7193620"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/934ac2720dcc878a47a45c986b483a7ee7193620",
+ "reference": "934ac2720dcc878a47a45c986b483a7ee7193620",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/deprecation-contracts": "^2.1",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "symfony/config": "<5.0",
+ "symfony/dependency-injection": "<4.4",
+ "symfony/yaml": "<4.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "^1.7",
+ "psr/log": "~1.0",
+ "symfony/config": "^5.0",
+ "symfony/dependency-injection": "^4.4|^5.0",
+ "symfony/expression-language": "^4.4|^5.0",
+ "symfony/http-foundation": "^4.4|^5.0",
+ "symfony/yaml": "^4.4|^5.0"
+ },
+ "suggest": {
+ "doctrine/annotations": "For using the annotation loader",
+ "symfony/config": "For using the all-in-one router or any loader",
+ "symfony/expression-language": "For using expression matching",
+ "symfony/http-foundation": "For using a Symfony Request object",
+ "symfony/yaml": "For using the YAML loader"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Routing\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Routing Component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-08T17:03:37+00:00"
+ },
+ {
+ "name": "symfony/service-contracts",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/service-contracts.git",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "reference": "d15da7ba4957ffb8f1747218be9e1a121fd298a1",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "psr/container": "^1.0"
+ },
+ "suggest": {
+ "symfony/service-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Service\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to writing services",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-07T11:33:47+00:00"
+ },
+ {
+ "name": "symfony/string",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/string.git",
+ "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/string/zipball/5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed",
+ "reference": "5bd67751d2e3f7d6f770c9154b8fbcb2aa05f7ed",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "~1.8",
+ "symfony/polyfill-intl-grapheme": "~1.0",
+ "symfony/polyfill-intl-normalizer": "~1.0",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "~1.15"
+ },
+ "require-dev": {
+ "symfony/error-handler": "^4.4|^5.0",
+ "symfony/http-client": "^4.4|^5.0",
+ "symfony/translation-contracts": "^1.1|^2",
+ "symfony/var-exporter": "^4.4|^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\String\\": ""
+ },
+ "files": [
+ "Resources/functions.php"
+ ],
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony String component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "grapheme",
+ "i18n",
+ "string",
+ "unicode",
+ "utf-8",
+ "utf8"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-05T07:33:16+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "a04209ba0d1391c828e5b2373181dac63c52ee70"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/a04209ba0d1391c828e5b2373181dac63c52ee70",
+ "reference": "a04209ba0d1391c828e5b2373181dac63c52ee70",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.15",
+ "symfony/translation-contracts": "^2.3"
+ },
+ "conflict": {
+ "symfony/config": "<4.4",
+ "symfony/dependency-injection": "<5.0",
+ "symfony/http-kernel": "<5.0",
+ "symfony/twig-bundle": "<5.0",
+ "symfony/yaml": "<4.4"
+ },
+ "provide": {
+ "symfony/translation-implementation": "2.0"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "^4.4|^5.0",
+ "symfony/console": "^4.4|^5.0",
+ "symfony/dependency-injection": "^5.0",
+ "symfony/finder": "^4.4|^5.0",
+ "symfony/http-kernel": "^5.0",
+ "symfony/intl": "^4.4|^5.0",
+ "symfony/service-contracts": "^1.1.2|^2",
+ "symfony/yaml": "^4.4|^5.0"
+ },
+ "suggest": {
+ "psr/log-implementation": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Translation Component",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-08T17:03:37+00:00"
+ },
+ {
+ "name": "symfony/translation-contracts",
+ "version": "v2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation-contracts.git",
+ "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/e2eaa60b558f26a4b0354e1bbb25636efaaad105",
+ "reference": "e2eaa60b558f26a4b0354e1bbb25636efaaad105",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5"
+ },
+ "suggest": {
+ "symfony/translation-implementation": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Contracts\\Translation\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Generic abstractions related to translation",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "abstractions",
+ "contracts",
+ "decoupling",
+ "interfaces",
+ "interoperability",
+ "standards"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-28T13:05:58+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v5.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "13e7e882eaa55863faa7c4ad7c60f12f1a8b5089"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/var-dumper/zipball/13e7e882eaa55863faa7c4ad7c60f12f1a8b5089",
+ "reference": "13e7e882eaa55863faa7c4ad7c60f12f1a8b5089",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-mbstring": "~1.0",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.4.3",
+ "symfony/console": "<4.4"
+ },
+ "require-dev": {
+ "ext-iconv": "*",
+ "symfony/console": "^4.4|^5.0",
+ "symfony/process": "^4.4|^5.0",
+ "twig/twig": "^2.4|^3.0"
+ },
+ "suggest": {
+ "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+ "ext-intl": "To show region name in time zone dump",
+ "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script"
+ },
+ "bin": [
+ "Resources/bin/var-dump-server"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "Resources/functions/dump.php"
+ ],
+ "psr-4": {
+ "Symfony\\Component\\VarDumper\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony mechanism for exploring and dumping PHP variables",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "debug",
+ "dump"
+ ],
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-16T17:02:19+00:00"
+ },
+ {
+ "name": "tijsverkoyen/css-to-inline-styles",
+ "version": "2.2.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
+ "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5",
+ "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "php": "^5.5 || ^7.0 || ^8.0",
+ "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "TijsVerkoyen\\CssToInlineStyles\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Tijs Verkoyen",
+ "email": "css_to_inline_styles@verkoyen.eu",
+ "role": "Developer"
+ }
+ ],
+ "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
+ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
+ "time": "2020-07-13T06:12:54+00:00"
+ },
+ {
+ "name": "tymon/jwt-auth",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tymondesigns/jwt-auth.git",
+ "reference": "e588cb719539366c0e2f6017f975379cb73e9680"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/tymondesigns/jwt-auth/zipball/e588cb719539366c0e2f6017f975379cb73e9680",
+ "reference": "e588cb719539366c0e2f6017f975379cb73e9680",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "illuminate/auth": "^5.2|^6|^7|^8",
+ "illuminate/contracts": "^5.2|^6|^7|^8",
+ "illuminate/http": "^5.2|^6|^7|^8",
+ "illuminate/support": "^5.2|^6|^7|^8",
+ "lcobucci/jwt": "<3.4",
+ "namshi/jose": "^7.0",
+ "nesbot/carbon": "^1.0|^2.0",
+ "php": "^5.5.9|^7.0"
+ },
+ "require-dev": {
+ "illuminate/console": "^5.2|^6|^7|^8",
+ "illuminate/database": "^5.2|^6|^7|^8",
+ "illuminate/routing": "^5.2|^6|^7|^8",
+ "mockery/mockery": ">=0.9.9",
+ "phpunit/phpunit": "~4.8|~6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-develop": "1.0-dev"
+ },
+ "laravel": {
+ "aliases": {
+ "JWTAuth": "Tymon\\JWTAuth\\Facades\\JWTAuth",
+ "JWTFactory": "Tymon\\JWTAuth\\Facades\\JWTFactory"
+ },
+ "providers": [
+ "Tymon\\JWTAuth\\Providers\\LaravelServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Tymon\\JWTAuth\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Sean Tymon",
+ "email": "tymon148@gmail.com",
+ "homepage": "https://tymon.xyz",
+ "role": "Developer"
+ }
+ ],
+ "description": "JSON Web Token Authentication for Laravel and Lumen",
+ "homepage": "https://github.com/tymondesigns/jwt-auth",
+ "keywords": [
+ "Authentication",
+ "JSON Web Token",
+ "auth",
+ "jwt",
+ "laravel"
+ ],
+ "funding": [
+ {
+ "url": "https://www.patreon.com/seantymon",
+ "type": "patreon"
+ }
+ ],
+ "time": "2020-11-27T12:32:42+00:00"
+ },
+ {
+ "name": "vlucas/phpdotenv",
+ "version": "v5.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vlucas/phpdotenv.git",
+ "reference": "fba64139db67123c7a57072e5f8d3db10d160b66"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/fba64139db67123c7a57072e5f8d3db10d160b66",
+ "reference": "fba64139db67123c7a57072e5f8d3db10d160b66",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-pcre": "*",
+ "graham-campbell/result-type": "^1.0.1",
+ "php": "^7.1.3 || ^8.0",
+ "phpoption/phpoption": "^1.7.4",
+ "symfony/polyfill-ctype": "^1.17",
+ "symfony/polyfill-mbstring": "^1.17",
+ "symfony/polyfill-php80": "^1.17"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "ext-filter": "*",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.2 || ^9.0"
+ },
+ "suggest": {
+ "ext-filter": "Required to use the boolean validator."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dotenv\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "homepage": "https://gjcampbell.co.uk/"
+ },
+ {
+ "name": "Vance Lucas",
+ "email": "vance@vancelucas.com",
+ "homepage": "https://vancelucas.com/"
+ }
+ ],
+ "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+ "keywords": [
+ "dotenv",
+ "env",
+ "environment"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/GrahamCampbell",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-09-14T15:57:31+00:00"
+ },
+ {
+ "name": "voku/portable-ascii",
+ "version": "1.5.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/voku/portable-ascii.git",
+ "reference": "80953678b19901e5165c56752d087fc11526017c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c",
+ "reference": "80953678b19901e5165c56752d087fc11526017c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0"
+ },
+ "suggest": {
+ "ext-intl": "Use Intl for transliterator_transliterate() support"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "voku\\": "src/voku/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Lars Moelleken",
+ "homepage": "http://www.moelleken.org/"
+ }
+ ],
+ "description": "Portable ASCII library - performance optimized (ascii) string functions for php.",
+ "homepage": "https://github.com/voku/portable-ascii",
+ "keywords": [
+ "ascii",
+ "clean",
+ "php"
+ ],
+ "funding": [
+ {
+ "url": "https://www.paypal.me/moelleken",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/voku",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/portable-ascii",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://www.patreon.com/voku",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-12T00:07:28+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0 || ^8.0",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "phpstan/phpstan": "<0.12.20",
+ "vimeo/psalm": "<3.9.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2020-07-08T17:02:28+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "barryvdh/laravel-debugbar",
+ "version": "v3.5.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/barryvdh/laravel-debugbar.git",
+ "reference": "233c10688f4c1a6e66ed2ef123038b1363d1bedc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/233c10688f4c1a6e66ed2ef123038b1363d1bedc",
+ "reference": "233c10688f4c1a6e66ed2ef123038b1363d1bedc",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "illuminate/routing": "^6|^7|^8",
+ "illuminate/session": "^6|^7|^8",
+ "illuminate/support": "^6|^7|^8",
+ "maximebf/debugbar": "^1.16.3",
+ "php": ">=7.2",
+ "symfony/debug": "^4.3|^5",
+ "symfony/finder": "^4.3|^5"
+ },
+ "require-dev": {
+ "orchestra/testbench-dusk": "^4|^5|^6",
+ "phpunit/phpunit": "^8.5|^9.0",
+ "squizlabs/php_codesniffer": "^3.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.5-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Barryvdh\\Debugbar\\ServiceProvider"
+ ],
+ "aliases": {
+ "Debugbar": "Barryvdh\\Debugbar\\Facade"
+ }
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Barryvdh\\Debugbar\\": "src/"
+ },
+ "files": [
+ "src/helpers.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "PHP Debugbar integration for Laravel",
+ "keywords": [
+ "debug",
+ "debugbar",
+ "laravel",
+ "profiler",
+ "webprofiler"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/barryvdh",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-07T19:32:39+00:00"
+ },
+ {
+ "name": "beyondcode/laravel-dump-server",
+ "version": "1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/beyondcode/laravel-dump-server.git",
+ "reference": "e27c7b942ab62f6ac7168359393d328ec5215b89"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/beyondcode/laravel-dump-server/zipball/e27c7b942ab62f6ac7168359393d328ec5215b89",
+ "reference": "e27c7b942ab62f6ac7168359393d328ec5215b89",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "illuminate/console": "5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0",
+ "illuminate/http": "5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0",
+ "illuminate/support": "5.6.*|5.7.*|5.8.*|^6.0|^7.0|^8.0",
+ "php": ">=7.2.5",
+ "symfony/var-dumper": "^5.0"
+ },
+ "require-dev": {
+ "larapack/dd": "^1.0",
+ "phpunit/phpunit": "^7.0|^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "BeyondCode\\DumpServer\\DumpServerServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "BeyondCode\\DumpServer\\": "src"
+ },
+ "files": [
+ "helpers.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marcel Pociot",
+ "email": "marcel@beyondco.de",
+ "homepage": "https://beyondco.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Symfony Var-Dump Server for Laravel",
+ "homepage": "https://github.com/beyondcode/laravel-dump-server",
+ "keywords": [
+ "beyondcode",
+ "laravel-dump-server"
+ ],
+ "time": "2020-12-15T10:57:43+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^8.0",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpbench/phpbench": "^0.13 || 1.0.0-alpha2",
+ "phpstan/phpstan": "^0.12",
+ "phpstan/phpstan-phpunit": "^0.12",
+ "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "https://ocramius.github.io/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://www.doctrine-project.org/projects/instantiator.html",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-10T18:47:58+00:00"
+ },
+ {
+ "name": "facade/flare-client-php",
+ "version": "1.3.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/facade/flare-client-php.git",
+ "reference": "fd688d3c06658f2b3b5f7bb19f051ee4ddf02492"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/facade/flare-client-php/zipball/fd688d3c06658f2b3b5f7bb19f051ee4ddf02492",
+ "reference": "fd688d3c06658f2b3b5f7bb19f051ee4ddf02492",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "facade/ignition-contracts": "~1.0",
+ "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0",
+ "php": "^7.1|^8.0",
+ "symfony/http-foundation": "^3.3|^4.1|^5.0",
+ "symfony/mime": "^3.4|^4.0|^5.1",
+ "symfony/var-dumper": "^3.4|^4.0|^5.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.14",
+ "phpunit/phpunit": "^7.5.16",
+ "spatie/phpunit-snapshot-assertions": "^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Facade\\FlareClient\\": "src"
+ },
+ "files": [
+ "src/helpers.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Send PHP errors to Flare",
+ "homepage": "https://github.com/facade/flare-client-php",
+ "keywords": [
+ "exception",
+ "facade",
+ "flare",
+ "reporting"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/spatie",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-21T16:02:39+00:00"
+ },
+ {
+ "name": "facade/ignition",
+ "version": "2.5.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/facade/ignition.git",
+ "reference": "8e907d81244649c5ea746e2ec30c32c5f59df472"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/facade/ignition/zipball/8e907d81244649c5ea746e2ec30c32c5f59df472",
+ "reference": "8e907d81244649c5ea746e2ec30c32c5f59df472",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-mbstring": "*",
+ "facade/flare-client-php": "^1.3.7",
+ "facade/ignition-contracts": "^1.0.2",
+ "filp/whoops": "^2.4",
+ "illuminate/support": "^7.0|^8.0",
+ "monolog/monolog": "^2.0",
+ "php": "^7.2.5|^8.0",
+ "symfony/console": "^5.0",
+ "symfony/var-dumper": "^5.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^2.14",
+ "mockery/mockery": "^1.3",
+ "orchestra/testbench": "^5.0|^6.0",
+ "psalm/plugin-laravel": "^1.2"
+ },
+ "suggest": {
+ "laravel/telescope": "^3.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Facade\\Ignition\\IgnitionServiceProvider"
+ ],
+ "aliases": {
+ "Flare": "Facade\\Ignition\\Facades\\Flare"
+ }
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Facade\\Ignition\\": "src"
+ },
+ "files": [
+ "src/helpers.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A beautiful error page for Laravel applications.",
+ "homepage": "https://github.com/facade/ignition",
+ "keywords": [
+ "error",
+ "flare",
+ "laravel",
+ "page"
+ ],
+ "time": "2020-12-29T09:12:55+00:00"
+ },
+ {
+ "name": "facade/ignition-contracts",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/facade/ignition-contracts.git",
+ "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
+ "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.3|^8.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "^v2.15.8",
+ "phpunit/phpunit": "^9.3.11",
+ "vimeo/psalm": "^3.17.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Facade\\IgnitionContracts\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Freek Van der Herten",
+ "email": "freek@spatie.be",
+ "homepage": "https://flareapp.io",
+ "role": "Developer"
+ }
+ ],
+ "description": "Solution contracts for Ignition",
+ "homepage": "https://github.com/facade/ignition-contracts",
+ "keywords": [
+ "contracts",
+ "flare",
+ "ignition"
+ ],
+ "time": "2020-10-16T08:27:54+00:00"
+ },
+ {
+ "name": "fakerphp/faker",
+ "version": "v1.13.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FakerPHP/Faker.git",
+ "reference": "ab3f5364d01f2c2c16113442fb987d26e4004913"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/ab3f5364d01f2c2c16113442fb987d26e4004913",
+ "reference": "ab3f5364d01f2c2c16113442fb987d26e4004913",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "fzaninotto/faker": "*"
+ },
+ "require-dev": {
+ "bamarni/composer-bin-plugin": "^1.4.1",
+ "ext-intl": "*",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.8 || ^9.4.2"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Faker\\": "src/Faker/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "François Zaninotto"
+ }
+ ],
+ "description": "Faker is a PHP library that generates fake data for you.",
+ "keywords": [
+ "data",
+ "faker",
+ "fixtures"
+ ],
+ "time": "2020-12-18T16:50:48+00:00"
+ },
+ {
+ "name": "filp/whoops",
+ "version": "2.9.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/filp/whoops.git",
+ "reference": "307fb34a5ab697461ec4c9db865b20ff2fd40771"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/filp/whoops/zipball/307fb34a5ab697461ec4c9db865b20ff2fd40771",
+ "reference": "307fb34a5ab697461ec4c9db865b20ff2fd40771",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^5.5.9 || ^7.0 || ^8.0",
+ "psr/log": "^1.0.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9 || ^1.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3",
+ "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0"
+ },
+ "suggest": {
+ "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
+ "whoops/soap": "Formats errors as SOAP responses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Whoops\\": "src/Whoops/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Filipe Dobreira",
+ "homepage": "https://github.com/filp",
+ "role": "Developer"
+ }
+ ],
+ "description": "php error handling for cool kids",
+ "homepage": "https://filp.github.io/whoops/",
+ "keywords": [
+ "error",
+ "exception",
+ "handling",
+ "library",
+ "throwable",
+ "whoops"
+ ],
+ "time": "2020-11-01T12:00:00+00:00"
+ },
+ {
+ "name": "hamcrest/hamcrest-php",
+ "version": "v2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hamcrest/hamcrest-php.git",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^5.3|^7.0|^8.0"
+ },
+ "replace": {
+ "cordoval/hamcrest-php": "*",
+ "davedevelopment/hamcrest-php": "*",
+ "kodova/hamcrest-php": "*"
+ },
+ "require-dev": {
+ "phpunit/php-file-iterator": "^1.4 || ^2.0",
+ "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "hamcrest"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "This is the PHP port of Hamcrest Matchers",
+ "keywords": [
+ "test"
+ ],
+ "time": "2020-07-09T08:09:16+00:00"
+ },
+ {
+ "name": "laravel/sail",
+ "version": "v0.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/sail.git",
+ "reference": "d9b0575ece889a35b9741789452c1c7abca5bc2f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/laravel/sail/zipball/d9b0575ece889a35b9741789452c1c7abca5bc2f",
+ "reference": "d9b0575ece889a35b9741789452c1c7abca5bc2f",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "illuminate/contracts": "^8.0|^9.0",
+ "illuminate/support": "^8.0|^9.0",
+ "php": "^7.3|^8.0"
+ },
+ "bin": [
+ "bin/sail"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Laravel\\Sail\\SailServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Sail\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Docker files for running a basic Laravel application.",
+ "keywords": [
+ "docker",
+ "laravel"
+ ],
+ "time": "2020-12-07T20:58:56+00:00"
+ },
+ {
+ "name": "maximebf/debugbar",
+ "version": "v1.16.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/maximebf/php-debugbar.git",
+ "reference": "c86c717e4bf3c6d98422da5c38bfa7b0f494b04c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/maximebf/php-debugbar/zipball/c86c717e4bf3c6d98422da5c38bfa7b0f494b04c",
+ "reference": "c86c717e4bf3c6d98422da5c38bfa7b0f494b04c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.1|^8",
+ "psr/log": "^1.0",
+ "symfony/var-dumper": "^2.6|^3|^4|^5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.5.20 || ^9.4.2"
+ },
+ "suggest": {
+ "kriswallsmith/assetic": "The best way to manage assets",
+ "monolog/monolog": "Log using Monolog",
+ "predis/predis": "Redis storage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.16-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "DebugBar\\": "src/DebugBar/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Maxime Bouroumeau-Fuseau",
+ "email": "maxime.bouroumeau@gmail.com",
+ "homepage": "http://maximebf.com"
+ },
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Debug bar in the browser for php application",
+ "homepage": "https://github.com/maximebf/php-debugbar",
+ "keywords": [
+ "debug",
+ "debugbar"
+ ],
+ "time": "2020-12-07T10:48:48+00:00"
+ },
+ {
+ "name": "mockery/mockery",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mockery/mockery.git",
+ "reference": "20cab678faed06fac225193be281ea0fddb43b93"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mockery/mockery/zipball/20cab678faed06fac225193be281ea0fddb43b93",
+ "reference": "20cab678faed06fac225193be281ea0fddb43b93",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "hamcrest/hamcrest-php": "^2.0.1",
+ "lib-pcre": ">=7.0",
+ "php": "^7.3 || ^8.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^8.5 || ^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Mockery": "library/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Pádraic Brady",
+ "email": "padraic.brady@gmail.com",
+ "homepage": "http://blog.astrumfutura.com"
+ },
+ {
+ "name": "Dave Marshall",
+ "email": "dave.marshall@atstsolutions.co.uk",
+ "homepage": "http://davedevelopment.co.uk"
+ }
+ ],
+ "description": "Mockery is a simple yet flexible PHP mock object framework",
+ "homepage": "https://github.com/mockery/mockery",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "library",
+ "mock",
+ "mock objects",
+ "mockery",
+ "stub",
+ "test",
+ "test double",
+ "testing"
+ ],
+ "time": "2020-08-11T18:10:13+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "replace": {
+ "myclabs/deep-copy": "self.version"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.0",
+ "doctrine/common": "^2.6",
+ "phpunit/phpunit": "^7.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ },
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "funding": [
+ {
+ "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-13T09:40:50+00:00"
+ },
+ {
+ "name": "nunomaduro/collision",
+ "version": "v5.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nunomaduro/collision.git",
+ "reference": "7c2b95589bf81e274e61e47f7672a1b2c3e06eaa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nunomaduro/collision/zipball/7c2b95589bf81e274e61e47f7672a1b2c3e06eaa",
+ "reference": "7c2b95589bf81e274e61e47f7672a1b2c3e06eaa",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "facade/ignition-contracts": "^1.0",
+ "filp/whoops": "^2.7.2",
+ "php": "^7.3 || ^8.0",
+ "symfony/console": "^5.0"
+ },
+ "require-dev": {
+ "fideloper/proxy": "^4.4.0",
+ "friendsofphp/php-cs-fixer": "^2.16.4",
+ "fruitcake/laravel-cors": "^2.0.1",
+ "laravel/framework": "^8.0",
+ "laravel/tinker": "^2.4.1",
+ "nunomaduro/larastan": "^0.6.2",
+ "nunomaduro/mock-final-classes": "^1.0",
+ "orchestra/testbench": "^6.0",
+ "phpstan/phpstan": "^0.12.36",
+ "phpunit/phpunit": "^9.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "NunoMaduro\\Collision\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nuno Maduro",
+ "email": "enunomaduro@gmail.com"
+ }
+ ],
+ "description": "Cli error handling for console/command-line PHP applications.",
+ "keywords": [
+ "artisan",
+ "cli",
+ "command-line",
+ "console",
+ "error",
+ "handling",
+ "laravel",
+ "laravel-zero",
+ "php",
+ "symfony"
+ ],
+ "funding": [
+ {
+ "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/nunomaduro",
+ "type": "github"
+ },
+ {
+ "url": "https://www.patreon.com/nunomaduro",
+ "type": "patreon"
+ }
+ ],
+ "time": "2020-10-29T14:50:40+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "time": "2020-06-27T14:33:11+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "e4782611070e50613683d2b9a57730e9a3ba5451"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/e4782611070e50613683d2b9a57730e9a3ba5451",
+ "reference": "e4782611070e50613683d2b9a57730e9a3ba5451",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "time": "2020-12-13T23:18:30+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-2.x": "2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2020-06-27T09:03:43+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "5.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-filter": "*",
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.2",
+ "phpdocumentor/type-resolver": "^1.3",
+ "webmozart/assert": "^1.9.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "~1.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ },
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "account@ijaap.nl"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2020-09-03T19:13:55+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": "^7.2 || ^8.0",
+ "phpdocumentor/reflection-common": "^2.0"
+ },
+ "require-dev": {
+ "ext-tokenizer": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-1.x": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
+ "time": "2020-09-17T18:55:26+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "1.12.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "245710e971a030f42e08f4912863805570f23d39"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/245710e971a030f42e08f4912863805570f23d39",
+ "reference": "245710e971a030f42e08f4912863805570f23d39",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "doctrine/instantiator": "^1.2",
+ "php": "^7.2 || ~8.0, <8.1",
+ "phpdocumentor/reflection-docblock": "^5.2",
+ "sebastian/comparator": "^3.0 || ^4.0",
+ "sebastian/recursion-context": "^3.0 || ^4.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^6.0",
+ "phpunit/phpunit": "^8.0 || ^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.11.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Prophecy\\": "src/Prophecy"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2020-12-19T10:15:11+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "9.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1",
+ "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^4.10.2",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.3",
+ "phpunit/php-text-template": "^2.0.2",
+ "sebastian/code-unit-reverse-lookup": "^2.0.2",
+ "sebastian/complexity": "^2.0",
+ "sebastian/environment": "^5.1.2",
+ "sebastian/lines-of-code": "^1.0.3",
+ "sebastian/version": "^3.0.1",
+ "theseer/tokenizer": "^1.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcov": "*",
+ "ext-xdebug": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:44:49+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "3.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:57:25+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:58:55+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "8e16c225d57c3d6808014df6b1dd7598d0a5bbbe"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8e16c225d57c3d6808014df6b1dd7598d0a5bbbe",
+ "reference": "8e16c225d57c3d6808014df6b1dd7598d0a5bbbe",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "doctrine/instantiator": "^1.3.1",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.1",
+ "phar-io/version": "^3.0.2",
+ "php": ">=7.3",
+ "phpspec/prophecy": "^1.12.1",
+ "phpunit/php-code-coverage": "^9.2.3",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.5",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.3",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^2.3",
+ "sebastian/version": "^3.0.2"
+ },
+ "require-dev": {
+ "ext-pdo": "*",
+ "phpspec/prophecy-phpunit": "^2.0.1"
+ },
+ "suggest": {
+ "ext-soap": "*",
+ "ext-xdebug": "*"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "9.5-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ],
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "funding": [
+ {
+ "url": "https://phpunit.de/donate.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-12-04T05:05:53+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:08:49+00:00"
+ },
+ {
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:08:54+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:30:19+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "4.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
+ "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:49:45+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+ "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "nikic/php-parser": "^4.7",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:52:27+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:10:38+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "5.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
+ "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:52:38+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "4.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T05:24:23+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "5.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455",
+ "reference": "a90ccbddffa067b51f574dea6eb25d5680839455",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T15:55:19+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "nikic/php-parser": "^4.6",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-11-28T06:42:11+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:12:34+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:14:26+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "4.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:17:30+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:45:17+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "2.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:18:59+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "3.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-09-28T06:39:44+00:00"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v4.4.18",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "5dfc7825f3bfe9bb74b23d8b8ce0e0894e32b544"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/5dfc7825f3bfe9bb74b23d8b8ce0e0894e32b544",
+ "reference": "5dfc7825f3bfe9bb74b23d8b8ce0e0894e32b544",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "php": ">=7.1.3",
+ "psr/log": "~1.0",
+ "symfony/polyfill-php80": "^1.15"
+ },
+ "conflict": {
+ "symfony/http-kernel": "<3.4"
+ },
+ "require-dev": {
+ "symfony/http-kernel": "^3.4|^4.0|^5.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "https://symfony.com",
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-12-10T16:34:26+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/75a63c33a8577608444246075ea0af0d052e452a",
+ "reference": "75a63c33a8577608444246075ea0af0d052e452a",
+ "shasum": "",
+ "mirrors": [
+ {
+ "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
+ "preferred": true
+ }
+ ]
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2020-07-12T23:59:07+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "dev",
+ "stability-flags": [],
+ "prefer-stable": true,
+ "prefer-lowest": false,
+ "platform": {
+ "php": "^7.3|^8.0"
+ },
+ "platform-dev": [],
+ "plugin-api-version": "1.1.0"
+}
diff --git a/config/admin.php b/config/admin.php
new file mode 100644
index 0000000000000000000000000000000000000000..0fa4b426518ee0066eb63724f10ece2a16a1eba1
--- /dev/null
+++ b/config/admin.php
@@ -0,0 +1,5 @@
+ 'Admin'
+];
diff --git a/config/app.php b/config/app.php
new file mode 100644
index 0000000000000000000000000000000000000000..e20462e263bdfa9738018790062612ab64f27866
--- /dev/null
+++ b/config/app.php
@@ -0,0 +1,232 @@
+ 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 the 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' => (bool) 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'),
+
+ 'asset_url' => env('ASSET_URL', null),
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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' => env('APP_TIMEZONE', 'UTC'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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' => env('APP_LOCALE', 'en'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Faker Locale
+ |--------------------------------------------------------------------------
+ |
+ | This locale will be used by the Faker PHP library when generating fake
+ | data for your database seeds. For example, this will be used to get
+ | localized telephone numbers, street address information and more.
+ |
+ */
+
+ 'faker_locale' => 'en_US',
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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',
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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...
+ */
+
+ /*
+ * 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,
+ 'Arr' => Illuminate\Support\Arr::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,
+ 'Http' => Illuminate\Support\Facades\Http::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,
+ 'Str' => Illuminate\Support\Str::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 0000000000000000000000000000000000000000..6bf22fcade327a78d4617bd6572028991cad3039
--- /dev/null
+++ b/config/auth.php
@@ -0,0 +1,123 @@
+ [
+ 'guard' => 'admin',
+ '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',
+ 'hash' => false,
+ ],
+
+ 'admin' => [
+ 'driver' => 'jwt',
+ 'provider' => 'admins',
+ 'hash' => false,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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,
+ ],
+
+ 'admins' => [
+ 'driver' => 'eloquent',
+ 'model' => \App\Modules\Admin\Entities\Rabc\Admin::class,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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,
+ 'throttle' => 60,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Password Confirmation Timeout
+ |--------------------------------------------------------------------------
+ |
+ | Here you may define the amount of seconds before a password confirmation
+ | times out and the user is prompted to re-enter their password via the
+ | confirmation screen. By default, the timeout lasts for three hours.
+ |
+ */
+
+ 'password_timeout' => 10800,
+
+];
diff --git a/config/broadcasting.php b/config/broadcasting.php
new file mode 100644
index 0000000000000000000000000000000000000000..ef20859859c593818dc1dc1e76a7f9980354afcf
--- /dev/null
+++ b/config/broadcasting.php
@@ -0,0 +1,64 @@
+ 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' => [
+ 'cluster' => env('PUSHER_APP_CLUSTER'),
+ 'useTLS' => true,
+ ],
+ ],
+
+ 'ably' => [
+ 'driver' => 'ably',
+ 'key' => env('ABLY_KEY'),
+ ],
+
+ '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 0000000000000000000000000000000000000000..9473acc9845cf6f170dff3443837fc6a89f1874f
--- /dev/null
+++ b/config/cache.php
@@ -0,0 +1,104 @@
+ 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.
+ |
+ | Supported drivers: "apc", "array", "database", "file",
+ | "memcached", "redis", "dynamodb", "null"
+ |
+ */
+
+ 'stores' => [
+
+ 'apc' => [
+ 'driver' => 'apc',
+ ],
+
+ 'array' => [
+ 'driver' => 'array',
+ 'serialize' => false,
+ ],
+
+ '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' => 'cache',
+ ],
+
+ 'dynamodb' => [
+ 'driver' => 'dynamodb',
+ 'key' => env('AWS_ACCESS_KEY_ID'),
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
+ 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
+ 'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
+ 'endpoint' => env('DYNAMODB_ENDPOINT'),
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
+
+];
diff --git a/config/cnpscy.php b/config/cnpscy.php
new file mode 100644
index 0000000000000000000000000000000000000000..92d879a7f88a7cd63bc86eb3e41e70f95574fe4a
--- /dev/null
+++ b/config/cnpscy.php
@@ -0,0 +1,68 @@
+ '小丑路人博客',
+ 'site_web_author' => '小丑路人',
+ 'site_web_keywords' => '小丑路人,小丑,路人,小丑疯狂吧,小丑博客,博客,laravel,yii,mysql',
+ 'site_web_description' => '小丑路人,小丑,路人,小丑疯狂吧,小丑博客,博客,laravel,yii,mysql',
+ 'site_web_site_icp' => '晋ICP备18007574号-1',
+ 'site_web_logo' => '/static/blog.jpg',
+ 'START_API_LOGS' => '1',
+ 'ARTICLE_CACHE_TIME' => '60',
+ 'WEB_SITE_CLOSE' => '1',
+ 'config_group_list' =>
+ array (
+ 0 => '不分组',
+ 1 => '基本',
+ 2 => '内容',
+ 3 => '用户',
+ 4 => '系统',
+ 5 => '博主',
+ 6 => '开发者',
+ 7 => '网站后台',
+ 8 => 'JWT',
+ 9 => '小丑社区配置',
+ 10 => '数据库',
+ ),
+ 'config_type_list' =>
+ array (
+ 0 => '字符串',
+ 1 => '文本',
+ 2 => '数字',
+ 3 => '数组',
+ 4 => '枚举',
+ 5 => '图片',
+ 6 => '富文本',
+ ),
+ 'web_detault_show_img' => '/static/blog.jpg',
+ 'web_url' => '',
+ 'api_admin_prefix' => 'admin',
+ 'web_admin_title' => '小丑路人博客后台管理',
+ 'web_admin_keywords' => '小丑路人博客后台',
+ 'web_admin_description' => '小丑路人博客后台',
+ 'menu_type_list' =>
+ array (
+ 0 => '作为频道页,不可作为栏目发布文章',
+ 1 => '不直接发布内容,用于跳转页面',
+ 2 => '作为发布栏目,文章列表模式',
+ 3 => '单页面模式,例如企业简介',
+ ),
+ 'admin_prefix' => 'cnpscy_blog_admin',
+ 'ADMIN_VIEWS' => '/_admin/',
+ 'privateKey' => '<<<EOD-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQC8kGa1pSjbSYZVebtTRBLxBz5H4i2p/llLCrEeQhta5kaQu/RnvuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t0tyazyZ8JXw+KgXTxldMPEL95+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4ehde/zUxo6UvS7UrBQIDAQABAoGAb/MXV46XxCFRx',
+ 'publicKey' => '<<<EOD-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC8kGa1pSjbSYZVebtTRBLxBz5H4i2p/llLCrEeQhta5kaQu/RnvuER4W8oDH3+3iuIYW4VQAzyqFpwuzjkDI+17t5t0tyazyZ8JXw+KgXTxldMPEL95+qVhgXvwtihXC1c5oGbRlEDvDF6Sa53rcFVsYJ4ehde/zUxo6UvS7UrBQIDAQ',
+ 'jwt_leeway' => '60',
+ 'jwt_token_name' => 'cnpscy-token',
+ 'return_jwt_token_name' => 'jwt_token',
+ 'server_user_unqiue' => 'login-user-id',
+ 'start_api_logs' => '1',
+ 'start_admin_operation_logs' => '1',
+ 'resource_version_number' => '20200410',
+ 'admin_default_pass' => '123456',
+ 'web_cdn_address' => '',
+ 'cnpscy_version_number' => 'v1.0',
+ 'system_timezone' => 'Asia/Shanghai',
+ 'forbiddenip' => '',
+ 'languages' => '',
+ 'admin_menu_session_unique' => 'rabc_menus_list',
+ 'admin_info_session_unique' => 'admin_info',
+ 'admin_rabc_session_unique' => 'admin_rabc',
+);
diff --git a/config/cors.php b/config/cors.php
new file mode 100644
index 0000000000000000000000000000000000000000..8a39e6daa63dd3a4c07693f728ff136c05a3ed6e
--- /dev/null
+++ b/config/cors.php
@@ -0,0 +1,34 @@
+ ['api/*', 'sanctum/csrf-cookie'],
+
+ 'allowed_methods' => ['*'],
+
+ 'allowed_origins' => ['*'],
+
+ 'allowed_origins_patterns' => [],
+
+ 'allowed_headers' => ['*'],
+
+ 'exposed_headers' => [],
+
+ 'max_age' => 0,
+
+ 'supports_credentials' => false,
+
+];
diff --git a/config/database.php b/config/database.php
new file mode 100644
index 0000000000000000000000000000000000000000..9f719cb528e45ba7ab3a916d2c81ce78b85c2712
--- /dev/null
+++ b/config/database.php
@@ -0,0 +1,147 @@
+ 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',
+ 'url' => env('DATABASE_URL'),
+ 'database' => env('DB_DATABASE', database_path('database.sqlite')),
+ 'prefix' => '',
+ 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
+ ],
+
+ 'mysql' => [
+ 'driver' => 'mysql',
+ 'url' => env('DATABASE_URL'),
+ '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' => env('DB_PREFIX', ''),
+ 'prefix_indexes' => true,
+ 'strict' => true,
+ 'engine' => null,
+ 'options' => extension_loaded('pdo_mysql') ? array_filter([
+ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
+ ]) : [],
+ ],
+
+ 'pgsql' => [
+ 'driver' => 'pgsql',
+ 'url' => env('DATABASE_URL'),
+ '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' => env('DB_PREFIX', ''),
+ 'prefix_indexes' => true,
+ 'schema' => 'public',
+ 'sslmode' => 'prefer',
+ ],
+
+ 'sqlsrv' => [
+ 'driver' => 'sqlsrv',
+ 'url' => env('DATABASE_URL'),
+ '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' => env('DB_PREFIX', ''),
+ 'prefix_indexes' => true,
+ ],
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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 body of commands than a typical key-value system
+ | such as APC or Memcached. Laravel makes it easy to dig right in.
+ |
+ */
+
+ 'redis' => [
+
+ 'client' => env('REDIS_CLIENT', 'phpredis'),
+
+ 'options' => [
+ 'cluster' => env('REDIS_CLUSTER', 'redis'),
+ 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
+ ],
+
+ 'default' => [
+ 'url' => env('REDIS_URL'),
+ 'host' => env('REDIS_HOST', '127.0.0.1'),
+ 'password' => env('REDIS_PASSWORD', null),
+ 'port' => env('REDIS_PORT', '6379'),
+ 'database' => env('REDIS_DB', '0'),
+ ],
+
+ 'cache' => [
+ 'url' => env('REDIS_URL'),
+ 'host' => env('REDIS_HOST', '127.0.0.1'),
+ 'password' => env('REDIS_PASSWORD', null),
+ 'port' => env('REDIS_PORT', '6379'),
+ 'database' => env('REDIS_CACHE_DB', '1'),
+ ],
+
+ ],
+
+];
diff --git a/config/debug-server.php b/config/debug-server.php
new file mode 100644
index 0000000000000000000000000000000000000000..d167b592afa3b5fde63ffd250ce9f2712634aceb
--- /dev/null
+++ b/config/debug-server.php
@@ -0,0 +1,8 @@
+ env('DUMP_SERVER_HOST', 'tcp://127.0.0.1:9912'),
+];
diff --git a/config/debugbar.php b/config/debugbar.php
new file mode 100644
index 0000000000000000000000000000000000000000..ada83c6d38528a0bfb1504f36a39e0d471d7e25d
--- /dev/null
+++ b/config/debugbar.php
@@ -0,0 +1,216 @@
+ env('DEBUGBAR_ENABLED', null),
+ 'except' => [
+ 'telescope*',
+ 'horizon*',
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Storage settings
+ |--------------------------------------------------------------------------
+ |
+ | DebugBar stores data for session/ajax requests.
+ | You can disable this, so the debugbar stores data in headers/session,
+ | but this can cause problems with large data collectors.
+ | By default, file storage (in the storage folder) is used. Redis and PDO
+ | can also be used. For PDO, run the package migrations first.
+ |
+ */
+ 'storage' => [
+ 'enabled' => true,
+ 'driver' => 'file', // redis, file, pdo, custom
+ 'path' => storage_path('debugbar'), // For file driver
+ 'connection' => null, // Leave null for default connection (Redis/PDO)
+ 'provider' => '', // Instance of StorageInterface for custom driver
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Vendors
+ |--------------------------------------------------------------------------
+ |
+ | Vendor files are included by default, but can be set to false.
+ | This can also be set to 'js' or 'css', to only include javascript or css vendor files.
+ | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files)
+ | and for js: jquery and and highlight.js
+ | So if you want syntax highlighting, set it to true.
+ | jQuery is set to not conflict with existing jQuery scripts.
+ |
+ */
+
+ 'include_vendors' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Capture Ajax Requests
+ |--------------------------------------------------------------------------
+ |
+ | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors),
+ | you can use this option to disable sending the data through the headers.
+ |
+ | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools.
+ */
+
+ 'capture_ajax' => true,
+ 'add_ajax_timing' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Custom Error Handler for Deprecated warnings
+ |--------------------------------------------------------------------------
+ |
+ | When enabled, the Debugbar shows deprecated warnings for Symfony components
+ | in the Messages tab.
+ |
+ */
+ 'error_handler' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Clockwork integration
+ |--------------------------------------------------------------------------
+ |
+ | The Debugbar can emulate the Clockwork headers, so you can use the Chrome
+ | Extension, without the server-side code. It uses Debugbar collectors instead.
+ |
+ */
+ 'clockwork' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | DataCollectors
+ |--------------------------------------------------------------------------
+ |
+ | Enable/disable DataCollectors
+ |
+ */
+
+ 'collectors' => [
+ 'phpinfo' => true, // Php version
+ 'messages' => true, // Messages
+ 'time' => true, // Time Datalogger
+ 'memory' => true, // Memory usage
+ 'exceptions' => true, // Exception displayer
+ 'log' => true, // Logs from Monolog (merged in messages if enabled)
+ 'db' => true, // Show database (PDO) queries and bindings
+ 'views' => true, // Views with their data
+ 'route' => true, // Current route information
+ 'auth' => false, // Display Laravel authentication status
+ 'gate' => true, // Display Laravel Gate checks
+ 'session' => true, // Display session data
+ 'symfony_request' => true, // Only one can be enabled..
+ 'mail' => true, // Catch mail messages
+ 'laravel' => false, // Laravel version and environment
+ 'events' => false, // All events fired
+ 'default_request' => false, // Regular or special Symfony request logger
+ 'logs' => false, // Add the latest log messages
+ 'files' => false, // Show the included files
+ 'config' => false, // Display config settings
+ 'cache' => false, // Display cache events
+ 'models' => true, // Display models
+ 'livewire' => true, // Display Livewire (when available)
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Extra options
+ |--------------------------------------------------------------------------
+ |
+ | Configure some DataCollectors
+ |
+ */
+
+ 'options' => [
+ 'auth' => [
+ 'show_name' => true, // Also show the users name/email in the debugbar
+ ],
+ 'db' => [
+ 'with_params' => true, // Render SQL with the parameters substituted
+ 'backtrace' => true, // Use a backtrace to find the origin of the query in your files.
+ 'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults)
+ 'timeline' => false, // Add the queries to the timeline
+ 'explain' => [ // Show EXPLAIN output on queries
+ 'enabled' => false,
+ 'types' => ['SELECT'], // Deprecated setting, is always only SELECT
+ ],
+ 'hints' => false, // Show hints for common mistakes
+ 'show_copy' => false, // Show copy button next to the query
+ ],
+ 'mail' => [
+ 'full_log' => false,
+ ],
+ 'views' => [
+ 'data' => false, //Note: Can slow down the application, because the data can be quite large..
+ ],
+ 'route' => [
+ 'label' => true, // show complete route on bar
+ ],
+ 'logs' => [
+ 'file' => null,
+ ],
+ 'cache' => [
+ 'values' => true, // collect cache values
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Inject Debugbar in Response
+ |--------------------------------------------------------------------------
+ |
+ | Usually, the debugbar is added just before