From f7e87bf0d3e3b22e1b9440f6832f4abaff2def38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B4=E6=98=8A=E5=A4=A9?= <442384644@qq.com> Date: Fri, 10 Feb 2023 11:47:42 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E7=A8=8B=E5=BA=8F=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E3=80=91=E6=9B=B4=E6=96=B0=E5=BC=80=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crmeb/.env | 1 - crmeb/.example.env | 1 - crmeb/.phpstorm.meta.php | 22 + crmeb/.version | 5 +- crmeb/LICENSE.txt | 2 +- .../app/adminapi/AdminApiExceptionHandle.php | 4 +- crmeb/app/adminapi/controller/Login.php | 6 +- .../application/routine/RoutineTemplate.php | 2 +- .../v1/application/wechat/WechatTemplate.php | 2 +- crmeb/app/adminapi/controller/v1/diy/Diy.php | 2 + .../controller/v1/export/ExportExcel.php | 128 ++++- .../controller/v1/kefu/StoreService.php | 2 +- .../v1/notification/sms/SmsConfig.php | 6 +- .../controller/v1/order/StoreOrder.php | 8 +- .../adminapi/controller/v1/serve/Login.php | 2 +- .../adminapi/controller/v1/serve/Serve.php | 6 +- .../controller/v1/setting/LangType.php | 4 +- .../controller/v1/setting/SystemAdmin.php | 7 +- .../app/adminapi/controller/v1/user/User.php | 30 +- crmeb/app/adminapi/route/export.php | 15 + crmeb/app/adminapi/route/route.php | 1 + crmeb/app/api/ApiExceptionHandle.php | 4 +- .../api/controller/pc/ProductController.php | 5 +- .../app/api/controller/v1/LoginController.php | 4 +- crmeb/app/api/controller/v1/PayController.php | 6 + .../api/controller/v1/PublicController.php | 12 +- .../app/api/controller/v1/TimerController.php | 119 +++++ .../v1/activity/StoreSeckillController.php | 19 +- .../v1/admin/StoreOrderController.php | 1 + .../v1/order/OtherOrderController.php | 21 +- .../v1/order/StoreOrderController.php | 32 +- .../v1/publics/ArticleCategoryController.php | 2 +- .../v1/store/CategoryController.php | 11 + .../controller/v1/user/UserBillController.php | 17 + .../api/controller/v1/user/UserController.php | 4 +- .../api/controller/v2/PublicController.php | 15 + .../v2/activity/LuckLotteryController.php | 4 +- .../controller/v2/wechat/AuthController.php | 98 ++-- .../app/api/middleware/BlockerMiddleware.php | 70 +++ crmeb/app/api/route/pc.php | 2 +- crmeb/app/api/route/v1.php | 36 +- crmeb/app/api/route/v2.php | 6 +- crmeb/app/common.php | 79 ++- crmeb/app/dao/BaseDao.php | 11 + crmeb/app/event.php | 3 +- crmeb/app/jobs/CheckQueueJob.php | 3 +- crmeb/app/jobs/OutPushJob.php | 20 +- crmeb/app/jobs/ProductCopyJob.php | 20 +- crmeb/app/jobs/ProductStockJob.php | 2 +- crmeb/app/jobs/TaskJob.php | 15 +- crmeb/app/jobs/TemplateJob.php | 2 +- crmeb/app/jobs/notice/EnterpriseWechatJob.php | 41 +- crmeb/app/jobs/notice/PrintJob.php | 24 +- crmeb/app/jobs/notice/SmsJob.php | 2 +- crmeb/app/jobs/notice/SyncMessageJob.php | 1 + crmeb/app/kefuapi/KefuApiExceptionHandle.php | 4 +- crmeb/app/kefuapi/controller/User.php | 2 +- crmeb/app/listener/admin/AdminInfo.php | 32 -- crmeb/app/listener/notice/Notice.php | 19 +- crmeb/app/listener/order/OrderCreateAfter.php | 6 +- crmeb/app/listener/order/OrderDelivery.php | 2 +- crmeb/app/listener/out/OutPush.php | 14 +- crmeb/app/listener/timer/SystemTimer.php | 24 +- crmeb/app/outapi/OutApiExceptionHandle.php | 4 +- crmeb/app/outapi/controller/StoreOrder.php | 2 +- crmeb/app/services/BaseServices.php | 6 + .../activity/bargain/StoreBargainServices.php | 8 + .../bargain/StoreBargainUserHelpServices.php | 3 - .../combination/StoreCombinationServices.php | 11 +- .../combination/StorePinkServices.php | 9 +- .../integral/StoreIntegralOrderServices.php | 3 - .../StoreIntegralOrderStatusServices.php | 2 - .../activity/live/LiveAnchorServices.php | 6 +- .../activity/lottery/LuckLotteryServices.php | 10 +- .../activity/seckill/StoreSeckillServices.php | 16 +- .../agent/DivisionAgentApplyServices.php | 43 +- crmeb/app/services/diy/DiyServices.php | 78 ++- .../app/services/diy/PageCategoryServices.php | 2 +- crmeb/app/services/kefu/LoginServices.php | 15 +- crmeb/app/services/kefu/UserServices.php | 2 - .../service/StoreServiceFeedbackServices.php | 3 - .../service/StoreServiceRecordServices.php | 3 - .../kefu/service/StoreServiceServices.php | 2 - crmeb/app/services/message/NoticeService.php | 81 +-- .../notice/EnterpriseWechatService.php | 48 +- .../notice/RoutineTemplateListService.php | 10 +- .../services/message/notice/SmsService.php | 21 +- .../message/notice/SystemMsgService.php | 22 +- .../notice/WechatTemplateListService.php | 10 +- .../message/wechat/MessageServices.php | 223 +++++--- .../app/services/order/OtherOrderServices.php | 46 +- .../services/order/OutStoreOrderServices.php | 6 - .../app/services/order/StoreCartServices.php | 5 +- .../order/StoreOrderCreateServices.php | 2 +- .../order/StoreOrderRefundServices.php | 22 + .../app/services/order/StoreOrderServices.php | 69 +-- .../order/StoreOrderStatusServices.php | 2 - crmeb/app/services/other/CategoryServices.php | 3 - crmeb/app/services/other/QrcodeServices.php | 14 +- .../services/other/export/ExportServices.php | 461 ++++++++++++----- crmeb/app/services/out/OutAccountServices.php | 22 +- crmeb/app/services/pay/OrderPayServices.php | 9 +- crmeb/app/services/pay/PayNotifyServices.php | 69 ++- crmeb/app/services/pay/PayServices.php | 89 +++- crmeb/app/services/pay/RechargeServices.php | 12 +- crmeb/app/services/pc/ProductServices.php | 10 +- .../product/OutStoreProductServices.php | 2 +- .../product/product/StoreCategoryServices.php | 38 +- .../product/StoreProductCouponServices.php | 4 +- .../product/product/StoreProductServices.php | 63 +-- .../sku/StoreProductAttrValueServices.php | 8 +- .../services/shipping/SystemCityServices.php | 2 +- crmeb/app/services/system/UpgradeServices.php | 6 +- .../system/admin/AdminAuthServices.php | 24 +- .../system/admin/SystemAdminServices.php | 5 +- .../system/admin/SystemRoleServices.php | 4 +- .../attachment/SystemAttachmentServices.php | 9 +- .../system/config/SystemConfigServices.php | 83 ++- .../system/config/SystemStorageServices.php | 2 - .../services/system/lang/LangCodeServices.php | 2 +- .../system/log/SystemFileServices.php | 17 +- crmeb/app/services/user/LoginServices.php | 2 +- crmeb/app/services/user/UserAuthServices.php | 10 +- crmeb/app/services/user/UserBillServices.php | 2 +- crmeb/app/services/user/UserGroupServices.php | 2 - .../services/user/UserLabelCateServices.php | 2 +- crmeb/app/services/user/UserServices.php | 2 +- crmeb/app/services/wechat/RoutineServices.php | 28 +- .../services/wechat/WechatMessageServices.php | 6 +- .../services/wechat/WechatQrcodeServices.php | 3 + crmeb/app/services/wechat/WechatServices.php | 22 +- .../services/wechat/WechatUserServices.php | 2 +- .../services/yihaotong/SmsAdminServices.php | 2 +- .../services/yihaotong/SmsRecordServices.php | 39 -- crmeb/baota.sh | 147 ------ crmeb/composer.json | 3 +- crmeb/composer.lock | 58 ++- crmeb/config/cache.php | 6 +- crmeb/config/printer.php | 2 + crmeb/config/upload.php | 1 + crmeb/crmeb/services/CacheService.php | 299 +++++------ crmeb/crmeb/services/GroupDataService.php | 4 +- crmeb/crmeb/services/SystemConfigService.php | 4 +- crmeb/crmeb/services/app/WechatService.php | 7 +- .../easywechat/Open3rd/AccessToken.php | 16 +- .../easywechat/Open3rd/ProgramProvider.php | 2 +- crmeb/crmeb/services/pay/Pay.php | 2 - .../services/pay/extend/allinpay/AllinPay.php | 353 +++++++++++++ .../services/pay/extend/allinpay/Client.php | 283 ++++++++++ crmeb/crmeb/services/pay/storage/AllinPay.php | 140 +++++ .../services/printer/storage/FeiEYun.php | 5 +- crmeb/crmeb/services/upload/BaseUpload.php | 15 +- crmeb/crmeb/services/upload/storage/Cos.php | 17 +- crmeb/crmeb/services/upload/storage/Local.php | 19 +- crmeb/crmeb/services/upload/storage/Oss.php | 17 +- crmeb/crmeb/services/upload/storage/Qiniu.php | 17 +- crmeb/crmeb/traits/QueueTrait.php | 89 ++-- crmeb/crmeb/traits/ServicesTrait.php | 10 + crmeb/crmeb/utils/Cache.php | 155 ++++++ crmeb/crmeb/utils/JwtAuth.php | 2 +- crmeb/index.html | 13 + crmeb/public/install/.env | 2 +- crmeb/public/install/crmeb.sql | 126 ++--- crmeb/public/install/css/install.css | 318 +++++++----- crmeb/public/install/css/step1.css | 124 +++++ crmeb/public/install/css/step2.css | 170 ++++++ crmeb/public/install/css/step3.css | 157 ++++++ crmeb/public/install/css/step4.css | 127 +++++ crmeb/public/install/css/step5.css | 59 +++ crmeb/public/install/css/theme-chalk.css | 1 + crmeb/public/install/images/install/bg.png | Bin crmeb/public/install/images/install/btn.png | Bin .../install/images/install/complete.png | Bin .../install/images/install/environment.png | Bin 0 -> 1427 bytes .../public/install/images/install/header.png | Bin crmeb/public/install/images/install/icon.png | Bin .../install/images/install/icon_install.png | Bin .../public/install/images/install/ignore.png | Bin .../install/images/install/jurisdiction.png | Bin 0 -> 3489 bytes .../public/install/images/install/loading.gif | Bin .../install/images/install/logo-step1.png | Bin 0 -> 8175 bytes crmeb/public/install/images/install/logo.png | Bin .../install/images/install/pop_loading.gif | Bin .../public/install/images/install/shuaxin.png | Bin 0 -> 791 bytes .../public/install/images/install/solgen.png | Bin 0 -> 8119 bytes crmeb/public/install/images/install/step.png | Bin .../public/install/images/install/success.png | Bin 0 -> 1692 bytes crmeb/public/install/images/install/sure.png | Bin 0 -> 705 bytes crmeb/public/install/images/install/tab.png | Bin .../install/images/install/tips_system.png | Bin .../install/images/install/trip-icon.png | Bin 0 -> 777 bytes .../public/install/images/install/upload.png | Bin 0 -> 824 bytes .../public/install/images/install/warring.png | Bin 0 -> 677 bytes crmeb/public/install/images/install/yes.png | Bin 0 -> 619 bytes crmeb/public/install/index.php | 250 ++++----- crmeb/public/install/js/ajaxForm.js | 0 crmeb/public/install/js/element-ui.js | 1 + crmeb/public/install/js/jquery.js | 0 crmeb/public/install/js/validate.js | 0 crmeb/public/install/js/vue2.6.11.js | 6 + crmeb/public/install/templates/footer.php | 2 +- crmeb/public/install/templates/header.php | 0 crmeb/public/install/templates/step1.php | 201 +++++--- crmeb/public/install/templates/step2.php | 464 ++++++++++------- crmeb/public/install/templates/step3.php | 484 ++++++++++-------- crmeb/public/install/templates/step4.php | 152 +++--- crmeb/public/install/templates/step5.php | 29 +- 207 files changed, 4986 insertions(+), 2318 deletions(-) delete mode 100644 crmeb/.example.env create mode 100644 crmeb/.phpstorm.meta.php create mode 100644 crmeb/app/api/controller/v1/TimerController.php create mode 100644 crmeb/app/api/middleware/BlockerMiddleware.php delete mode 100644 crmeb/app/listener/admin/AdminInfo.php delete mode 100644 crmeb/baota.sh create mode 100644 crmeb/crmeb/services/pay/extend/allinpay/AllinPay.php create mode 100644 crmeb/crmeb/services/pay/extend/allinpay/Client.php create mode 100644 crmeb/crmeb/services/pay/storage/AllinPay.php create mode 100644 crmeb/crmeb/utils/Cache.php create mode 100644 crmeb/index.html mode change 100644 => 100755 crmeb/public/install/css/install.css create mode 100755 crmeb/public/install/css/step1.css create mode 100755 crmeb/public/install/css/step2.css create mode 100755 crmeb/public/install/css/step3.css create mode 100755 crmeb/public/install/css/step4.css create mode 100755 crmeb/public/install/css/step5.css create mode 100755 crmeb/public/install/css/theme-chalk.css mode change 100644 => 100755 crmeb/public/install/images/install/bg.png mode change 100644 => 100755 crmeb/public/install/images/install/btn.png mode change 100644 => 100755 crmeb/public/install/images/install/complete.png create mode 100755 crmeb/public/install/images/install/environment.png mode change 100644 => 100755 crmeb/public/install/images/install/header.png mode change 100644 => 100755 crmeb/public/install/images/install/icon.png mode change 100644 => 100755 crmeb/public/install/images/install/icon_install.png mode change 100644 => 100755 crmeb/public/install/images/install/ignore.png create mode 100755 crmeb/public/install/images/install/jurisdiction.png mode change 100644 => 100755 crmeb/public/install/images/install/loading.gif create mode 100755 crmeb/public/install/images/install/logo-step1.png mode change 100644 => 100755 crmeb/public/install/images/install/logo.png mode change 100644 => 100755 crmeb/public/install/images/install/pop_loading.gif create mode 100755 crmeb/public/install/images/install/shuaxin.png create mode 100755 crmeb/public/install/images/install/solgen.png mode change 100644 => 100755 crmeb/public/install/images/install/step.png create mode 100755 crmeb/public/install/images/install/success.png create mode 100755 crmeb/public/install/images/install/sure.png mode change 100644 => 100755 crmeb/public/install/images/install/tab.png mode change 100644 => 100755 crmeb/public/install/images/install/tips_system.png create mode 100644 crmeb/public/install/images/install/trip-icon.png create mode 100755 crmeb/public/install/images/install/upload.png create mode 100755 crmeb/public/install/images/install/warring.png create mode 100755 crmeb/public/install/images/install/yes.png mode change 100644 => 100755 crmeb/public/install/index.php mode change 100644 => 100755 crmeb/public/install/js/ajaxForm.js create mode 100755 crmeb/public/install/js/element-ui.js mode change 100644 => 100755 crmeb/public/install/js/jquery.js mode change 100644 => 100755 crmeb/public/install/js/validate.js create mode 100755 crmeb/public/install/js/vue2.6.11.js mode change 100644 => 100755 crmeb/public/install/templates/footer.php mode change 100644 => 100755 crmeb/public/install/templates/header.php mode change 100644 => 100755 crmeb/public/install/templates/step1.php mode change 100644 => 100755 crmeb/public/install/templates/step2.php mode change 100644 => 100755 crmeb/public/install/templates/step3.php mode change 100644 => 100755 crmeb/public/install/templates/step4.php mode change 100644 => 100755 crmeb/public/install/templates/step5.php diff --git a/crmeb/.env b/crmeb/.env index e1b395e23..e69de29bb 100755 --- a/crmeb/.env +++ b/crmeb/.env @@ -1 +0,0 @@ -APP_DEBUG = false [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = mysql HOSTNAME = HOSTPORT = 3306 USERNAME = PASSWORD = '' DATABASE = PREFIX = eb_ CHARSET = utf8 DEBUG = true [LANG] default_lang = zh-cn [REDIS] REDIS_HOSTNAME = PORT = 6379 REDIS_PASSWORD = SELECT = 0 [QUEUE] QUEUE_NAME = \ No newline at end of file diff --git a/crmeb/.example.env b/crmeb/.example.env deleted file mode 100644 index 9bda52a31..000000000 --- a/crmeb/.example.env +++ /dev/null @@ -1 +0,0 @@ -APP_DEBUG = false [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = mysql HOSTNAME = HOSTPORT = 3306 USERNAME = PASSWORD = DATABASE = PREFIX = eb_ CHARSET = utf8 DEBUG = true [LANG] default_lang = zh-cn [REDIS] REDIS_HOSTNAME = PORT = 6379 REDIS_PASSWORD = SELECT = 0 [QUEUE] QUEUE_NAME = \ No newline at end of file diff --git a/crmeb/.phpstorm.meta.php b/crmeb/.phpstorm.meta.php new file mode 100644 index 000000000..ad7d71586 --- /dev/null +++ b/crmeb/.phpstorm.meta.php @@ -0,0 +1,22 @@ + \crmeb\utils\Json::class + ]) + ); + + override( + \think\Container::make(), + map([ + '' => '@' + ]) + ); + +} diff --git a/crmeb/.version b/crmeb/.version index b30f1da30..d29816ecc 100644 --- a/crmeb/.version +++ b/crmeb/.version @@ -1,5 +1,4 @@ -version=CRMEB-KY v4.6.0 -version_code=460 +version=CRMEB-KY v4.7.0 +version_code=470 platform=gitee app_id=ze7x9rxsv09l6pvsyo -app_key=fuF7U9zaybLa5gageVQzxtxQMFnvU2OI diff --git a/crmeb/LICENSE.txt b/crmeb/LICENSE.txt index 13d7fa79f..0c260af78 100644 --- a/crmeb/LICENSE.txt +++ b/crmeb/LICENSE.txt @@ -1,6 +1,6 @@ # 软件使用许可协议 本协议是您因使用CRMEB开源商城系统软件与西安众邦网络科技有限公司所订立的有效合约。 -CRMEB是国内最稳定、最强大、最先进的互联网电商平台解决方案之一,CRMEB基于 PHP + MySQL 的技术,采用ThinkPHP框架开发。 +CRMEB是国内稳定、强大、先进的互联网电商平台解决方案之一,CRMEB基于 PHP + MySQL 的技术,采用ThinkPHP框架开发。 CRMEB开源商城系统(以下简称“CRMEB”或“许可软件”或“本软件”),由西安众邦网络科技有限公司(以下称“众邦科技”)自主独创开发,CRMEB官方网站:http://www.crmeb.com,您在使用CRMEB客户管理+电商系统(以下称“许可软件”或“本软件”)之前,请您仔细阅读本协议,特别是法律适用和争议解决条款,您需要重点阅读。如您对协议有任何疑问,可咨询CRMEB官方客服。如果您安装或以其他任何方式使用本软件,则视为已经接受本协议。如果您不接受本协议的全部或部分条款,您将无权使用本软件,请立即终止安装、或以其他方式使用该软件,删除您已经安装或保留的该软件的任何组件。 一、定义 diff --git a/crmeb/app/adminapi/AdminApiExceptionHandle.php b/crmeb/app/adminapi/AdminApiExceptionHandle.php index 1927511f7..ea98583c0 100644 --- a/crmeb/app/adminapi/AdminApiExceptionHandle.php +++ b/crmeb/app/adminapi/AdminApiExceptionHandle.php @@ -84,9 +84,9 @@ class AdminApiExceptionHandle extends Handle 'trace' => $e->getTrace(), 'previous' => $e->getPrevious(), ] : []; - $message = Env::get('app_debug', false) ? '接口报错:' . $e->getMessage() : '很抱歉,系统开小差了'; + $message = Env::get('app_debug', false) ? $e->getMessage() : '很抱歉,系统开小差了'; // 添加自定义异常处理机制 - if ($e instanceof AuthException || $e instanceof AdminException || $e instanceof ApiException) { + if ($e instanceof AuthException || $e instanceof AdminException || $e instanceof ApiException || $e instanceof ValidateException) { return app('json')->make($e->getCode() ?: 400, $message, $massageData); } else { return app('json')->fail($message, $massageData); diff --git a/crmeb/app/adminapi/controller/Login.php b/crmeb/app/adminapi/controller/Login.php index 636c938b7..0dea6dadc 100644 --- a/crmeb/app/adminapi/controller/Login.php +++ b/crmeb/app/adminapi/controller/Login.php @@ -104,14 +104,14 @@ class Login extends AuthController $this->validate(['account' => $account, 'pwd' => $password], \app\adminapi\validate\setting\SystemAdminValidata::class, 'get'); $result = $this->services->login($account, $password, 'admin', $key); if (!$result) { - $num = CacheService::redisHandler()->get('login_captcha',1); + $num = CacheService::get('login_captcha',1); if ($num > 1) { return app('json')->fail(400140, ['login_captcha' => 1]); } - CacheService::redisHandler()->set('login_captcha', $num + 1, 60); + CacheService::set('login_captcha', $num + 1, 60); return app('json')->fail(400140, ['login_captcha' => 0]); } - CacheService::redisHandler()->delete('login_captcha'); + CacheService::delete('login_captcha'); return app('json')->success($result); } diff --git a/crmeb/app/adminapi/controller/v1/application/routine/RoutineTemplate.php b/crmeb/app/adminapi/controller/v1/application/routine/RoutineTemplate.php index 01f635f8b..b79155db4 100644 --- a/crmeb/app/adminapi/controller/v1/application/routine/RoutineTemplate.php +++ b/crmeb/app/adminapi/controller/v1/application/routine/RoutineTemplate.php @@ -61,7 +61,7 @@ class RoutineTemplate extends AuthController } if ($all['list']) { foreach ($all['list'] as $template) { - SyncMessageJob::dispatchDo('SyncSubscribe', [$template]); + SyncMessageJob::dispatch('SyncSubscribe', [$template]); } } return app('json')->success(100038); diff --git a/crmeb/app/adminapi/controller/v1/application/wechat/WechatTemplate.php b/crmeb/app/adminapi/controller/v1/application/wechat/WechatTemplate.php index f7247f614..93e68b02f 100644 --- a/crmeb/app/adminapi/controller/v1/application/wechat/WechatTemplate.php +++ b/crmeb/app/adminapi/controller/v1/application/wechat/WechatTemplate.php @@ -54,7 +54,7 @@ class WechatTemplate extends AuthController WechatService::deleleTemplate($v['template_id']); } foreach ($all['list'] as $template) { - SyncMessageJob::dispatchDo('SyncWechat', [$template]); + SyncMessageJob::dispatch('SyncWechat', [$template]); } return app('json')->success(100038); } diff --git a/crmeb/app/adminapi/controller/v1/diy/Diy.php b/crmeb/app/adminapi/controller/v1/diy/Diy.php index 056804883..4374c4e55 100644 --- a/crmeb/app/adminapi/controller/v1/diy/Diy.php +++ b/crmeb/app/adminapi/controller/v1/diy/Diy.php @@ -89,6 +89,7 @@ class Diy extends AuthController } } $data['value'] = json_encode($value); + $data['version'] = uniqid(); $this->services->saveData($id, $data); return app('json')->success(100000); } @@ -169,6 +170,7 @@ class Diy extends AuthController $data['version'] = '1.0'; $data['type'] = 2; $data['is_diy'] = 1; + $data['version'] = uniqid(); return app('json')->success($id ? 100001 : 100000, ['id' => $this->services->saveData($id, $data)]); } diff --git a/crmeb/app/adminapi/controller/v1/export/ExportExcel.php b/crmeb/app/adminapi/controller/v1/export/ExportExcel.php index b58e0759d..cde1ec352 100644 --- a/crmeb/app/adminapi/controller/v1/export/ExportExcel.php +++ b/crmeb/app/adminapi/controller/v1/export/ExportExcel.php @@ -49,6 +49,132 @@ class ExportExcel extends AuthController $this->service = $services; } + public function userList() + { + $where = $this->request->getMore([ + ['page', 1], + ['limit', 20], + ['nickname', ''], + ['status', ''], + ['pay_count', ''], + ['is_promoter', ''], + ['order', ''], + ['data', ''], + ['user_type', ''], + ['country', ''], + ['province', ''], + ['city', ''], + ['user_time_type', ''], + ['user_time', ''], + ['sex', ''], + [['level', 0], 0], + [['group_id', 'd'], 0], + ['label_id', ''], + ['now_money', 'normal'], + ['field_key', ''], + ['isMember', ''] + ]); + return app('json')->success($this->service->exportUserList($where)); + } + + /** + * 订单导出 + * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function orderList() + { + $where = $this->request->getMore([ + ['status', ''], + ['real_name', ''], + ['is_del', ''], + ['data', '', '', 'time'], + ['type', ''], + ['pay_type', ''], + ['order', ''], + ['field_key', ''], + ]); + $where['is_system_del'] = 0; + $where['pid'] = 0; + return app('json')->success($this->service->exportOrderList($where)); + } + + /** + * 商品列表导出 + * @return mixed + */ + public function productList() + { + $where = $this->request->getMore([ + ['store_name', ''], + ['cate_id', ''], + ['type', 1] + ]); + return app('json')->success($this->service->exportProductList($where)); + } + + /** + * 砍价商品列表导出 + * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function bargainList() + { + $where = $this->request->getMore([ + ['status', ''], + ['store_name', ''], + ]); + $where['is_del'] = 0; + return app('json')->success($this->service->exportBargainList($where)); + } + + /** + * 拼团商品导出 + * @return mixed + */ + public function combinationList() + { + $where = $this->request->getMore([ + ['is_show', ''], + ['store_name', ''] + ]); + $where['is_del'] = 0; + return app('json')->success($this->service->exportCombinationList($where)); + } + + /** + * 秒杀商品导出 + * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function seckillList() + { + $where = $this->request->getMore([ + [['status', 's'], ''], + [['store_name', 's'], ''] + ]); + return app('json')->success($this->service->exportSeckillList($where)); + } + + /** + * 会员卡导出 + * @param $id + * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function memberCardList($id) + { + return app('json')->success($this->service->exportMemberCard($id)); + } + /** * 保存用户资金监控的excel表格 * @param UserBillServices $services @@ -239,7 +365,7 @@ class ExportExcel extends AuthController } /** - * 产品导出 + * 商品导出 * @param StoreProductServices $services * @return mixed */ diff --git a/crmeb/app/adminapi/controller/v1/kefu/StoreService.php b/crmeb/app/adminapi/controller/v1/kefu/StoreService.php index 8401b5221..fdf0e93c4 100644 --- a/crmeb/app/adminapi/controller/v1/kefu/StoreService.php +++ b/crmeb/app/adminapi/controller/v1/kefu/StoreService.php @@ -62,7 +62,7 @@ class StoreService extends AuthController ['data', '', '', 'time'], ['type', '', '', 'user_type'], ]); - [$list, $count] = $services->getWhereUserList($where, 'u.nickname,u.uid,u.avatar as headimgurl,w.subscribe,w.province,w.country,w.city,w.sex,w.user_type,u.is_del'); + [$list, $count] = $services->getWhereUserList($where, 'u.nickname,u.uid,u.avatar as headimgurl,w.subscribe,w.province,w.country,w.city,w.sex,u.user_type,u.is_del'); return app('json')->success(compact('list', 'count')); } diff --git a/crmeb/app/adminapi/controller/v1/notification/sms/SmsConfig.php b/crmeb/app/adminapi/controller/v1/notification/sms/SmsConfig.php index af44d6785..941f73b6e 100644 --- a/crmeb/app/adminapi/controller/v1/notification/sms/SmsConfig.php +++ b/crmeb/app/adminapi/controller/v1/notification/sms/SmsConfig.php @@ -64,7 +64,7 @@ class SmsConfig extends AuthController */ public function is_login(ServeServices $services) { - $sms_info = CacheService::redisHandler()->get('sms_account'); + $sms_info = CacheService::get('sms_account'); $data = ['status' => false, 'info' => '']; if ($sms_info) { try { @@ -87,7 +87,7 @@ class SmsConfig extends AuthController if ($account && $password) { $res = $services->user()->login($account, $password); if ($res) { - CacheService::redisHandler()->set('sms_account', $account); + CacheService::set('sms_account', $account); $data['status'] = true; $data['info'] = $account; } @@ -103,7 +103,7 @@ class SmsConfig extends AuthController */ public function logout() { - $res = CacheService::redisHandler()->delete('sms_account'); + $res = CacheService::delete('sms_account'); if ($res) { $this->services->updateSmsConfig('', ''); CacheService::clear(); diff --git a/crmeb/app/adminapi/controller/v1/order/StoreOrder.php b/crmeb/app/adminapi/controller/v1/order/StoreOrder.php index ac53fbe1f..3f5052fc5 100644 --- a/crmeb/app/adminapi/controller/v1/order/StoreOrder.php +++ b/crmeb/app/adminapi/controller/v1/order/StoreOrder.php @@ -693,15 +693,17 @@ class StoreOrder extends AuthController } /** - * 易联云打印机打印 + * 小票打印机打印 * @param $id * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException */ public function order_print($id) { if (!$id) return app('json')->fail(100100); - - $res = $this->services->orderPrint($id); + $res = $this->services->orderPrintTicket($id, true); if ($res) { return app('json')->success(100010); } else { diff --git a/crmeb/app/adminapi/controller/v1/serve/Login.php b/crmeb/app/adminapi/controller/v1/serve/Login.php index 264da2567..61a0a89fa 100644 --- a/crmeb/app/adminapi/controller/v1/serve/Login.php +++ b/crmeb/app/adminapi/controller/v1/serve/Login.php @@ -107,7 +107,7 @@ class Login extends AuthController $res = $this->services->user()->login($account, $password); if ($res) { CacheService::clear(); - CacheService::redisHandler()->set('sms_account', $account); + CacheService::set('sms_account', $account); $services->updateSmsConfig($account, $password); return app('json')->success(400139, $res); } else { diff --git a/crmeb/app/adminapi/controller/v1/serve/Serve.php b/crmeb/app/adminapi/controller/v1/serve/Serve.php index c66b3b02f..89ce2b81f 100644 --- a/crmeb/app/adminapi/controller/v1/serve/Serve.php +++ b/crmeb/app/adminapi/controller/v1/serve/Serve.php @@ -44,7 +44,7 @@ class Serve extends AuthController */ public function is_login() { - $sms_info = CacheService::redisHandler()->get('sms_account'); + $sms_info = CacheService::get('sms_account'); if ($sms_info) { return app('json')->success(['status' => true, 'info' => $sms_info]); } else { @@ -188,7 +188,7 @@ class Serve extends AuthController $data['password'] = md5($data['password']); $this->services->user()->modify($data); - CacheService::redisHandler()->delete('sms_account'); + CacheService::delete('sms_account'); return app('json')->success(100001); } @@ -207,7 +207,7 @@ class Serve extends AuthController $this->validate($data, ServeValidata::class, 'phone'); $this->services->user()->modifyPhone($data); - CacheService::redisHandler()->delete('sms_account'); + CacheService::delete('sms_account'); return app('json')->success(100001); } } diff --git a/crmeb/app/adminapi/controller/v1/setting/LangType.php b/crmeb/app/adminapi/controller/v1/setting/LangType.php index df5e58554..ef46c0a44 100644 --- a/crmeb/app/adminapi/controller/v1/setting/LangType.php +++ b/crmeb/app/adminapi/controller/v1/setting/LangType.php @@ -65,7 +65,7 @@ class LangType extends AuthController ['status', 0] ]); $this->services->langTypeSave($data); - CacheService::redisHandler()->delete('lang_type_data'); + CacheService::delete('lang_type_data'); return app('json')->success(100000); } @@ -89,7 +89,7 @@ class LangType extends AuthController public function langTypeDel(int $id = 0) { $this->services->langTypeDel($id); - CacheService::redisHandler()->delete('lang_type_data'); + CacheService::delete('lang_type_data'); return app('json')->success(100002); } } \ No newline at end of file diff --git a/crmeb/app/adminapi/controller/v1/setting/SystemAdmin.php b/crmeb/app/adminapi/controller/v1/setting/SystemAdmin.php index 907279ab0..3cf87f47e 100644 --- a/crmeb/app/adminapi/controller/v1/setting/SystemAdmin.php +++ b/crmeb/app/adminapi/controller/v1/setting/SystemAdmin.php @@ -169,7 +169,7 @@ class SystemAdmin extends AuthController ['new_pwd', ''], ['conf_pwd', ''], ]); - if(!preg_match('/^(?![^a-zA-Z]+$)(?!\D+$).{6,}$/',$data['new_pwd'])){ + if (!preg_match('/^(?![^a-zA-Z]+$)(?!\D+$).{6,}$/', $data['new_pwd'])) { return app('json')->fail(400183); } if ($this->services->updateAdmin($this->adminId, $data)) @@ -177,6 +177,7 @@ class SystemAdmin extends AuthController else return app('json')->fail(100007); } + /** * 修改当前登陆admin的文件管理密码 * @return mixed @@ -187,7 +188,7 @@ class SystemAdmin extends AuthController ['file_pwd', ''], ['conf_file_pwd', ''], ]); - if(!preg_match('/^(?![^a-zA-Z]+$)(?!\D+$).{6,}$/',$data['file_pwd'])){ + if (!preg_match('/^(?![^a-zA-Z]+$)(?!\D+$).{6,}$/', $data['file_pwd'])) { return app('json')->fail(400183); } if ($this->services->setFilePassword($this->adminId, $data)) @@ -203,7 +204,7 @@ class SystemAdmin extends AuthController public function logout() { $key = trim(ltrim($this->request->header(Config::get('cookie.token_name')), 'Bearer')); - CacheService::redisHandler()->delete($key); + CacheService::delete(md5($key)); return app('json')->success(); } } diff --git a/crmeb/app/adminapi/controller/v1/user/User.php b/crmeb/app/adminapi/controller/v1/user/User.php index db138eb9b..9095316ad 100644 --- a/crmeb/app/adminapi/controller/v1/user/User.php +++ b/crmeb/app/adminapi/controller/v1/user/User.php @@ -107,19 +107,19 @@ class User extends AuthController ['is_promoter', 0], ['status', 0] ]); - if ($data['phone']) { - if (!check_phone($data['phone'])) { - return app('json')->fail(400252); - } - if ($this->services->count(['phone' => $data['phone'], 'is_del' => 0])) { - return app('json')->fail(400314); - } - if (trim($data['real_name']) != '') { - $data['nickname'] = $data['real_name']; - } else { - $data['nickname'] = substr_replace($data['phone'], '****', 3, 4); - } + if (!$data['real_name']) { + return app('json')->fail(410245); } + if (!$data['phone']) { + return app('json')->fail(410245); + } + if (!check_phone($data['phone'])) { + return app('json')->fail(400252); + } + if ($this->services->count(['phone' => $data['phone'], 'is_del' => 0])) { + return app('json')->fail(400314); + } + $data['nickname'] = $data['real_name']; if ($data['card_id']) { if (!check_card($data['card_id'])) return app('json')->fail(400315); } @@ -130,6 +130,9 @@ class User extends AuthController if ($data['pwd'] != $data['true_pwd']) { return app('json')->fail(400264); } + if (strlen($data['pwd']) < 6 || strlen($data['pwd']) > 32) { + return app('json')->fail(400762); + } $data['pwd'] = md5($data['pwd']); } else { unset($data['pwd']); @@ -389,6 +392,9 @@ class User extends AuthController if ($data['pwd'] != $data['true_pwd']) { return app('json')->fail(400264); } + if (strlen($data['pwd']) < 6 || strlen($data['pwd']) > 32) { + return app('json')->fail(400762); + } $data['pwd'] = md5($data['pwd']); } else { unset($data['pwd']); diff --git a/crmeb/app/adminapi/route/export.php b/crmeb/app/adminapi/route/export.php index 07a051dab..de2b97274 100644 --- a/crmeb/app/adminapi/route/export.php +++ b/crmeb/app/adminapi/route/export.php @@ -14,6 +14,21 @@ use think\facade\Route; * 导出excel相关路由 */ Route::group('export', function () { + //用户列表 + Route::get('user_list', 'v1.export.ExportExcel/userList')->option(['real_name' => '用户列表导出']); + //订单列表 + Route::get('order_list', 'v1.export.ExportExcel/orderList')->option(['real_name' => '订单列表导出']); + //商品列表 + Route::get('product_list', 'v1.export.ExportExcel/productList')->option(['real_name' => '商品列表导出']); + //砍价列表 + Route::get('bargain_list', 'v1.export.ExportExcel/bargainList')->option(['real_name' => '砍价商品列表导出']); + //拼团列表 + Route::get('combination_list', 'v1.export.ExportExcel/combinationList')->option(['real_name' => '拼团商品列表导出']); + //秒杀列表 + Route::get('seckill_list', 'v1.export.ExportExcel/seckillList')->option(['real_name' => '秒杀商品列表导出']); + //导出会员卡 + Route::get('member_card/:id', 'v1.export.ExportExcel/memberCardList')->option(['real_name' => '会员卡导出']); + //用户资金监控 Route::get('userFinance', 'v1.export.ExportExcel/userFinance')->option(['real_name' => '用户资金导出']); //用户佣金 diff --git a/crmeb/app/adminapi/route/route.php b/crmeb/app/adminapi/route/route.php index dcdee2125..3e14a674a 100644 --- a/crmeb/app/adminapi/route/route.php +++ b/crmeb/app/adminapi/route/route.php @@ -36,6 +36,7 @@ Route::group(function () { Route::get('get_workerman_url', 'PublicController/getWorkerManUrl')->option(['real_name' => '获取客服数据']); //测试 Route::get('index', 'Test/index')->option(['real_name' => '测试地址']); + Route::get('h5', 'Test/h5pay')->option(['real_name' => '测试地址2']); })->middleware(AllowOriginMiddleware::class); /** diff --git a/crmeb/app/api/ApiExceptionHandle.php b/crmeb/app/api/ApiExceptionHandle.php index f4b868e87..29f3ce40f 100644 --- a/crmeb/app/api/ApiExceptionHandle.php +++ b/crmeb/app/api/ApiExceptionHandle.php @@ -84,9 +84,9 @@ class ApiExceptionHandle extends Handle 'trace' => $e->getTrace(), 'previous' => $e->getPrevious(), ] : []; - $message = Env::get('app_debug', false) ? '接口报错:' . $e->getMessage() : '很抱歉,系统开小差了'; + $message = Env::get('app_debug', false) ? $e->getMessage() : '很抱歉,系统开小差了'; // 添加自定义异常处理机制 - if ($e instanceof AuthException || $e instanceof AdminException || $e instanceof ApiException) { + if ($e instanceof AuthException || $e instanceof AdminException || $e instanceof ApiException || $e instanceof ValidateException) { return app('json')->make($e->getCode() ?: 400, $message, $massageData); } else { return app('json')->fail($message, $massageData); diff --git a/crmeb/app/api/controller/pc/ProductController.php b/crmeb/app/api/controller/pc/ProductController.php index 0de132a55..fcbaeb01d 100644 --- a/crmeb/app/api/controller/pc/ProductController.php +++ b/crmeb/app/api/controller/pc/ProductController.php @@ -68,10 +68,11 @@ class ProductController */ public function getProductRoutineCode(Request $request) { - list($product_id) = $request->getMore([ + list($product_id, $type) = $request->getMore([ ['product_id', 0], + ['type', 'product'], ], true); - $routineCode = $this->services->getProductRoutineCode((int)$product_id); + $routineCode = $this->services->getProductRoutineCode((int)$product_id, $type); return app('json')->success(['routineCode' => $routineCode]); } diff --git a/crmeb/app/api/controller/v1/LoginController.php b/crmeb/app/api/controller/v1/LoginController.php index dd8716487..e25f23ca4 100644 --- a/crmeb/app/api/controller/v1/LoginController.php +++ b/crmeb/app/api/controller/v1/LoginController.php @@ -53,7 +53,7 @@ class LoginController [$account, $password, $spread] = $request->postMore([ 'account', 'password', 'spread' ], true); - TaskJob::dispatchDo('emptyYesterdayAttachment'); + TaskJob::dispatch('emptyYesterdayAttachment'); if (!$account || !$password) { return app('json')->fail(410000); } @@ -68,7 +68,7 @@ class LoginController public function logout(Request $request) { $key = trim(ltrim($request->header(Config::get('cookie.token_name')), 'Bearer')); - CacheService::redisHandler()->delete($key); + CacheService::delete(md5($key)); return app('json')->success(410002); } diff --git a/crmeb/app/api/controller/v1/PayController.php b/crmeb/app/api/controller/v1/PayController.php index a34042e71..e35a7d238 100644 --- a/crmeb/app/api/controller/v1/PayController.php +++ b/crmeb/app/api/controller/v1/PayController.php @@ -46,6 +46,12 @@ class PayController $pay = app()->make(Pay::class); } return $pay->handleNotify()->getContent(); + default: + if (strstr($type, 'allin') !== false) { + /** @var Pay $pay */ + $pay = app()->make(Pay::class, ['allin_pay']); + return $pay->handleNotify($type); + } } } diff --git a/crmeb/app/api/controller/v1/PublicController.php b/crmeb/app/api/controller/v1/PublicController.php index 24e04242a..babf927f3 100644 --- a/crmeb/app/api/controller/v1/PublicController.php +++ b/crmeb/app/api/controller/v1/PublicController.php @@ -284,12 +284,14 @@ class PublicController /** * 记录用户分享 * @param Request $request + * @param UserBillServices $services * @return mixed */ public function user_share(Request $request, UserBillServices $services) { $uid = (int)$request->uid(); - return app('json')->success($services->setUserShare($uid)); + $services->setUserShare($uid); + return app('json')->success(100012); } /** @@ -306,11 +308,11 @@ class PublicController if ($imageUrl !== '' && !preg_match('/.*(\.png|\.jpg|\.jpeg|\.gif)$/', $imageUrl)) { return app('json')->success(['code' => false, 'image' => false]); } - if ($codeUrl !== '' && !preg_match('/.*(\.png|\.jpg|\.jpeg|\.gif)$/', $codeUrl)) { + if ($codeUrl !== '' && !(preg_match('/.*(\.png|\.jpg|\.jpeg|\.gif)$/', $codeUrl) || strpos($codeUrl, 'https://mp.weixin.qq.com/cgi-bin/showqrcode') !== false)) { return app('json')->success(['code' => false, 'image' => false]); } try { - $code = CacheService::get($codeUrl, function () use ($codeUrl) { + $code = CacheService::remember($codeUrl, function () use ($codeUrl) { $codeTmp = $code = $codeUrl ? image_to_base64($codeUrl) : false; if (!$codeTmp) { $putCodeUrl = put_image($codeUrl); @@ -319,7 +321,7 @@ class PublicController } return $code; }); - $image = CacheService::get($imageUrl, function () use ($imageUrl) { + $image = CacheService::remember($imageUrl, function () use ($imageUrl) { $imageTmp = $image = $imageUrl ? image_to_base64($imageUrl) : false; if (!$imageTmp) { $putImageUrl = put_image($imageUrl); @@ -615,7 +617,7 @@ class PublicController $langStr = 'api_lang_' . str_replace('-', '_', $langData[$typeId]); //读取当前语言的语言包 - $lang = CacheService::redisHandler()->remember($langStr, function () use ($typeId, $range) { + $lang = CacheService::remember($langStr, function () use ($typeId, $range) { /** @var LangCodeServices $langCodeServices */ $langCodeServices = app()->make(LangCodeServices::class); return $langCodeServices->getColumn(['type_id' => $typeId, 'is_admin' => 0], 'lang_explain', 'code'); diff --git a/crmeb/app/api/controller/v1/TimerController.php b/crmeb/app/api/controller/v1/TimerController.php new file mode 100644 index 000000000..77153f692 --- /dev/null +++ b/crmeb/app/api/controller/v1/TimerController.php @@ -0,0 +1,119 @@ +make(StoreOrderServices::class); + $orderServices->orderUnpaidCancel(); + } + + /** + * 拼团到期订单处理 + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + */ + public function pinkExpiration() + { + /** @var StorePinkServices $storePinkServices */ + $storePinkServices = app()->make(StorePinkServices::class); + $storePinkServices->statusPink(); + } + + /** + * 自动解绑上级绑定 + */ + public function agentUnbind() + { + /** @var AgentManageServices $agentManage */ + $agentManage = app()->make(AgentManageServices::class); + $agentManage->removeSpread(); + } + + /** + * 更新直播商品状态 + */ + public function syncGoodStatus() + { + /** @var LiveGoodsServices $liveGoods */ + $liveGoods = app()->make(LiveGoodsServices::class); + $liveGoods->syncGoodStatus(); + } + + /** + * 更新直播间状态 + */ + public function syncRoomStatus() + { + /** @var LiveRoomServices $liveRoom */ + $liveRoom = app()->make(LiveRoomServices::class); + $liveRoom->syncRoomStatus(); + } + + /** + * 自动收货 + */ + public function autoTakeOrder() + { + /** @var StoreOrderTakeServices $services */ + $services = app()->make(StoreOrderTakeServices::class); + $services->autoTakeOrder(); + } + + /** + * 查询预售到期商品自动下架 + */ + public function downAdvance() + { + /** @var StoreProductServices $product */ + $product = app()->make(StoreProductServices::class); + $product->downAdvance(); + } + + /** + * 自动好评 + */ + public function autoComment() + { + /** @var StoreOrderServices $orderServices */ + $orderServices = app()->make(StoreOrderServices::class); + $orderServices->autoComment(); + } + + /** + * 清除昨日海报 + * @throws \Exception + */ + public function emptyYesterdayAttachment() + { + /** @var SystemAttachmentServices $attach */ + $attach = app()->make(SystemAttachmentServices::class); + $attach->emptyYesterdayAttachment(); + } +} \ No newline at end of file diff --git a/crmeb/app/api/controller/v1/activity/StoreSeckillController.php b/crmeb/app/api/controller/v1/activity/StoreSeckillController.php index 253c70954..be75357a3 100644 --- a/crmeb/app/api/controller/v1/activity/StoreSeckillController.php +++ b/crmeb/app/api/controller/v1/activity/StoreSeckillController.php @@ -39,7 +39,8 @@ class StoreSeckillController //秒杀时间段 $seckillTime = GroupDataService::getData('routine_seckill_time') ?? []; $seckillTimeIndex = -1; - $timeCount = count($seckillTime); + $timeCount = count($seckillTime);//总数 + $unTimeCunt = 0;//即将开始 if ($timeCount) { $today = strtotime(date('Y-m-d')); $currentHour = date('H'); @@ -62,6 +63,7 @@ class StoreSeckillController $value['state'] = '即将开始'; $value['status'] = 2; $value['stop'] = (int)bcadd($today, bcmul($activityEndHour, 3600, 0)); + $unTimeCunt += 1; } else if ($currentHour >= $activityEndHour) { $value['time'] = strlen((int)$value['time']) == 2 ? (int)$value['time'] . ':00' : '0' . (int)$value['time'] . ':00'; $value['state'] = '已结束'; @@ -71,9 +73,16 @@ class StoreSeckillController } } //有时间段但是都不在抢购中 - if ($seckillTimeIndex == -1) { - if ($currentHour < (int)$seckillTime[0]['time'] ?? 0) { + if ($seckillTimeIndex == -1 && $currentHour <= (int)$seckillTime[$timeCount - 1]['time'] ?? 0) { + if ($currentHour < (int)$seckillTime[0]['time'] ?? 0) {//当前时间 $seckillTimeIndex = 0; + } elseif ($unTimeCunt) {//存在未开始的 + foreach ($seckillTime as $key => $item) { + if ($item['status'] == 2) { + $seckillTimeIndex = $key; + break; + } + } } else { $seckillTimeIndex = $timeCount - 1; } @@ -123,11 +132,11 @@ class StoreSeckillController * @param $id * @return mixed */ - public function code(Request $request, $id, $stop_time = '') + public function code(Request $request, $id) { /** @var QrcodeServices $qrcodeService */ $qrcodeService = app()->make(QrcodeServices::class); - $url = $qrcodeService->getRoutineQrcodePath($id, $request->uid(), 2, compact('stop_time')); + $url = $qrcodeService->getRoutineQrcodePath($id, $request->uid(), 2); if ($url) { return app('json')->success(['code' => $url]); } else { diff --git a/crmeb/app/api/controller/v1/admin/StoreOrderController.php b/crmeb/app/api/controller/v1/admin/StoreOrderController.php index 6e4d81536..4b3fc3935 100644 --- a/crmeb/app/api/controller/v1/admin/StoreOrderController.php +++ b/crmeb/app/api/controller/v1/admin/StoreOrderController.php @@ -130,6 +130,7 @@ class StoreOrderController if (!$order) return app('json')->fail(410173); if ($order['paid']) { $order['nickname'] = $userServices->value(['uid' => $order['uid']], 'nickname'); + $order['config_export_open'] = (bool)((int)sys_config('config_export_open')); $order = $order->hidden(['uid', 'status', 'paid'])->toArray(); return app('json')->success($order); } diff --git a/crmeb/app/api/controller/v1/order/OtherOrderController.php b/crmeb/app/api/controller/v1/order/OtherOrderController.php index 77f2cc29c..50db61e0b 100644 --- a/crmeb/app/api/controller/v1/order/OtherOrderController.php +++ b/crmeb/app/api/controller/v1/order/OtherOrderController.php @@ -19,7 +19,7 @@ use app\services\pay\YuePayServices; use app\services\user\member\MemberCardServices; use app\services\user\UserServices; use crmeb\services\CacheService; -use crmeb\services\SystemConfigService; +use crmeb\services\pay\extend\allinpay\AllinPay; use app\Request; /** @@ -115,6 +115,8 @@ class OtherOrderController $info = compact('order_id'); + $payType = get_pay_type($payType); + if ($order_id) { switch ($payType) { case PayServices::WEIXIN_PAY: @@ -168,10 +170,20 @@ class OtherOrderController $payKey = md5($orderInfo['order_id']); CacheService::set($payKey, ['order_id' => $orderInfo['order_id'], 'other_pay_type' => true], 300); $info['pay_key'] = $payKey; - return app('json')->status(PayServices::ALIAPY_PAY . '_pay', 410196, $info); + return app('json')->status(PayServices::ALIAPY_PAY . '_pay', 410196, $info); } case PayServices::OFFLINE_PAY: return app('json')->status('success', 410196, $info); + case PayServices::ALLIN_PAY: + /** @var OrderPayServices $payServices */ + $payServices = app()->make(OrderPayServices::class); + $info['jsConfig'] = $payServices->orderPay($orderInfo, $payType, [ + 'returl' => sys_config('site_url') . '/pages/index/index', + ]); + if ($request->isWechat()) { + $info['pay_url'] = AllinPay::UNITODER_H5UNIONPAY; + } + return app('json')->status(PayServices::ALLIN_PAY . '_pay', 410196, $info); } } else return app('json')->fail(410200); } @@ -182,9 +194,8 @@ class OtherOrderController */ public function pay_type(Request $request) { - /** @var SystemConfigService $systemConfigService */ - $systemConfigService = app()->make(SystemConfigService::class); - $payType = $systemConfigService->more(['ali_pay_status', 'pay_weixin_open']); + $payType['ali_pay_status'] = is_ali_pay(); + $payType['pay_weixin_open'] = is_wecaht_pay(); $payType['site_name'] = sys_config('site_name'); $payType['now_money'] = $request->user('now_money'); $payType['offline_pay_status'] = true; diff --git a/crmeb/app/api/controller/v1/order/StoreOrderController.php b/crmeb/app/api/controller/v1/order/StoreOrderController.php index c7f404b6b..e68b2ed7b 100644 --- a/crmeb/app/api/controller/v1/order/StoreOrderController.php +++ b/crmeb/app/api/controller/v1/order/StoreOrderController.php @@ -15,6 +15,7 @@ use app\services\pay\PayServices; use app\services\shipping\ExpressServices; use app\services\system\admin\SystemAdminServices; use app\services\user\UserInvoiceServices; +use crmeb\services\pay\extend\allinpay\AllinPay; use app\services\activity\{lottery\LuckLotteryServices, bargain\StoreBargainServices, combination\StoreCombinationServices, @@ -213,7 +214,7 @@ class StoreOrderController } } if ($from != 'pc') { - if (!$this->services->checkPaytype($payType)) { + if (!$this->services->checkPaytype(get_pay_type($payType))) { return app('json')->fail(410213); } } else { @@ -342,6 +343,16 @@ class StoreOrderController case 'pc': case 'friend': return app('json')->status('success', 410203, $info); + case PayServices::ALLIN_PAY: + /** @var OrderPayServices $payServices */ + $payServices = app()->make(OrderPayServices::class); + $info['jsConfig'] = $payServices->orderPay($orderInfo, $payType, [ + 'returl' => sys_config('site_url') . '/pages/index/index', + ]); + if ($request->isWechat()) { + $info['pay_url'] = AllinPay::UNITODER_H5UNIONPAY; + } + return app('json')->status(PayServices::ALLIN_PAY . '_pay', 410203, $info); } } else return app('json')->fail(410200); } @@ -408,8 +419,7 @@ class StoreOrderController break; case 'routine': if ($type == 1 || in_array($order['is_channel'], [0, 2, 3, 4])) { - $order['order_id'] = app()->make(StoreOrderCreateServices::class)->getNewOrderId('cp'); - $this->services->update($order['id'], ['order_id' => $order['order_id']], 'id'); + $order['order_id'] = mt_rand(100, 999) . '_' . $order['order_id']; } break; case 'app': @@ -423,7 +433,7 @@ class StoreOrderController break; } } - $order['pay_type'] = $paytype; //重新支付选择支付方式 + $order['pay_type'] = get_pay_type($paytype); //重新支付选择支付方式 switch ($order['pay_type']) { case PayServices::WEIXIN_PAY: $jsConfig = $payServices->orderPay($order->toArray(), $from); @@ -460,6 +470,16 @@ class StoreOrderController return app('json')->status('success', 410203); else return app('json')->status('success', 410216); + case PayServices::ALLIN_PAY: + /** @var OrderPayServices $payServices */ + $payServices = app()->make(OrderPayServices::class); + $info['jsConfig'] = $payServices->orderPay($order->toArray(), $order['pay_type'], [ + 'returl' => sys_config('site_url') . '/pages/index/index', + ]); + if ($request->isWechat()) { + $info['pay_url'] = AllinPay::UNITODER_H5UNIONPAY; + } + return app('json')->status(PayServices::ALLIN_PAY . '_pay', 410203, $info); } return app('json')->fail(410218); } @@ -501,7 +521,7 @@ class StoreOrderController $where['is_system_del'] = 0; if (in_array($where['status'], [-1, -2, -3])) { $where['not_pid'] = 1; - } elseif (in_array($where['status'], [0, 1, 2, 3, 4])) { + } elseif (in_array($where['status'], [0, 1, 2, 3, 4, 9])) { $where['pid'] = 0; } $list = $this->services->getOrderApiList($where); @@ -778,7 +798,7 @@ class StoreOrderController */ public function data(Request $request) { - return app('json')->success($this->services->getOrderData((int)$request->uid(), true)); + return app('json')->success($this->services->getOrderData((int)$request->uid())); } /** diff --git a/crmeb/app/api/controller/v1/publics/ArticleCategoryController.php b/crmeb/app/api/controller/v1/publics/ArticleCategoryController.php index aee8d01ac..4544fba82 100644 --- a/crmeb/app/api/controller/v1/publics/ArticleCategoryController.php +++ b/crmeb/app/api/controller/v1/publics/ArticleCategoryController.php @@ -33,7 +33,7 @@ class ArticleCategoryController */ public function lst() { - $cateInfo = CacheService::get('ARTICLE_CATEGORY', function () { + $cateInfo = CacheService::remember('ARTICLE_CATEGORY', function () { $cateInfo = $this->services->getArticleCategory(); array_unshift($cateInfo, ['id' => 0, 'title' => '热门']); return $cateInfo; diff --git a/crmeb/app/api/controller/v1/store/CategoryController.php b/crmeb/app/api/controller/v1/store/CategoryController.php index cf44749ec..79200f13d 100644 --- a/crmeb/app/api/controller/v1/store/CategoryController.php +++ b/crmeb/app/api/controller/v1/store/CategoryController.php @@ -38,4 +38,15 @@ class CategoryController $category = $this->services->getCategory($where); return app('json')->success($category); } + + /** + * @author 等风来 + * @email 136327134@qq.com + * @date 2022/11/11 + * @return mixed + */ + public function getCategoryVersion() + { + return app('json')->success(['version' => $this->services->getCategoryVersion()]); + } } diff --git a/crmeb/app/api/controller/v1/user/UserBillController.php b/crmeb/app/api/controller/v1/user/UserBillController.php index 054d4fd9a..953255c88 100644 --- a/crmeb/app/api/controller/v1/user/UserBillController.php +++ b/crmeb/app/api/controller/v1/user/UserBillController.php @@ -388,7 +388,11 @@ class UserBillController /** * 获取海报详细信息 + * @param Request $request * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException */ public function getSpreadInfo(Request $request) { @@ -402,8 +406,18 @@ class UserBillController $routineSpreadBanner[] = ['pic' => $item]; } } + + if (sys_config('share_qrcode', 0) && request()->isWechat()) { + /** @var QrcodeServices $qrcodeService */ + $qrcodeService = app()->make(QrcodeServices::class); + $qrcode = $qrcodeService->getTemporaryQrcode('spread', $request->uid())->url; + } else { + $qrcode = ''; + } + return app('json')->success([ 'spread' => $routineSpreadBanner, + 'qrcode' => $qrcode, 'nickname' => $request->user('nickname'), 'site_name' => sys_config('site_name') ]); @@ -413,6 +427,9 @@ class UserBillController * 积分记录 * @param Request $request * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException */ public function integral_list(Request $request) { diff --git a/crmeb/app/api/controller/v1/user/UserController.php b/crmeb/app/api/controller/v1/user/UserController.php index 0bc226eb6..54ab23dfc 100644 --- a/crmeb/app/api/controller/v1/user/UserController.php +++ b/crmeb/app/api/controller/v1/user/UserController.php @@ -93,9 +93,9 @@ class UserController } $uid = (int)$request->uid(); if ($this->services->eidtNickname($uid, ['avatar' => $avatar, 'nickname' => $nickname])) { - return app('json')->success(100001); + return app('json')->success(100014); } - return app('json')->fail(100007); + return app('json')->fail(100015); } /** diff --git a/crmeb/app/api/controller/v2/PublicController.php b/crmeb/app/api/controller/v2/PublicController.php index 033a35b8a..b4b7546b3 100644 --- a/crmeb/app/api/controller/v2/PublicController.php +++ b/crmeb/app/api/controller/v2/PublicController.php @@ -74,6 +74,21 @@ class PublicController return app('json')->success($data); } + /** + * @param int $id + * @return mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function getVersion($id = 0) + { + /** @var DiyServices $diyService */ + $diyService = app()->make(DiyServices::class); + $version = $diyService->getDiyVersion((int)$id); + return app('json')->success(['version' => $version ?: '']); + } + /** * 是否强制绑定手机号 * @return mixed diff --git a/crmeb/app/api/controller/v2/activity/LuckLotteryController.php b/crmeb/app/api/controller/v2/activity/LuckLotteryController.php index df405d509..dde6e1a3f 100644 --- a/crmeb/app/api/controller/v2/activity/LuckLotteryController.php +++ b/crmeb/app/api/controller/v2/activity/LuckLotteryController.php @@ -75,10 +75,10 @@ class LuckLotteryController $uid = (int)$request->uid(); $key = 'lucklotter_limit_' . $uid; - if (CacheService::redisHandler()->get($key)) { + if (CacheService::get($key)) { return app('json')->fail('您求的频率太过频繁,请稍后请求!'); } - CacheService::redisHandler()->set('lucklotter_limit_' . $uid, $uid, 1); + CacheService::set('lucklotter_limit_' . $uid, $uid, 1); if ($type == 5 && request()->isWechat()) { /** @var WechatServices $wechat */ diff --git a/crmeb/app/api/controller/v2/wechat/AuthController.php b/crmeb/app/api/controller/v2/wechat/AuthController.php index ea54d4920..54f7d3ee7 100644 --- a/crmeb/app/api/controller/v2/wechat/AuthController.php +++ b/crmeb/app/api/controller/v2/wechat/AuthController.php @@ -35,13 +35,57 @@ class AuthController } /** - * 小程序授权登录 - * @param Request $request + * 静默授权 + * @param $code + * @param string $spread_code + * @param string $spread_spid * @return mixed * @throws \Psr\SimpleCache\InvalidArgumentException * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException - * @throws \think\exception\DbException + */ + public function silenceAuth($code, $spread_code = '', $spread_spid = '') + { + $token = $this->services->silenceAuth($code, $spread_code, $spread_spid); + if ($token && isset($token['key'])) { + return app('json')->success(410022, $token); + } else if ($token) { + return app('json')->success(410001, ['token' => $token['token'], 'expires_time' => $token['params']['exp'], 'new_user' => $token['new_user']]); + } else + return app('json')->fail(410019); + } + + /** + * 授权获取小程序用户手机号 直接绑定 + * @param string $code + * @param string $iv + * @param string $encryptedData + * @param string $spread_code + * @param string $spread_spid + * @param string $key + * @return mixed + * @throws \Psr\SimpleCache\InvalidArgumentException + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException + */ + public function authBindingPhone($code = '', $iv = '', $encryptedData = '', $spread_code = '', $spread_spid = '', $key = '') + { + if (!$code || !$iv || !$encryptedData) + return app('json')->fail(100100); + $token = $this->services->authBindingPhone($code, $iv, $encryptedData, $spread_code, $spread_spid, $key); + if ($token) { + return app('json')->success(410001, $token); + } else + return app('json')->fail(410019); + } + + /** 以下方法该版本暂未使用 */ + /** + * 小程序授权登录 + * @param Request $request + * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException */ public function auth(Request $request) { @@ -63,30 +107,13 @@ class AuthController return app('json')->fail(410019); } - /** - * 静默授权 - * @param $code - * @param string $spread_code - * @param string $spread_spid - * @return mixed - */ - public function silenceAuth($code, $spread_code = '', $spread_spid = '') - { - $token = $this->services->silenceAuth($code, $spread_code, $spread_spid); - if ($token && isset($token['key'])) { - return app('json')->success(410022, $token); - } else if ($token) { - return app('json')->success(410001, ['token' => $token['token'], 'expires_time' => $token['params']['exp'], 'new_user' => $token['new_user']]); - } else - return app('json')->fail(410019); - } - /** * 静默授权 不登录 * @param $code * @param string $spread_code * @param string $spread_spid * @return mixed + * @throws \Psr\SimpleCache\InvalidArgumentException */ public function silenceAuthNoLogin($code, $spread_code = '', $spread_spid = '') { @@ -107,7 +134,8 @@ class AuthController * @param string $phone * @param string $captcha * @return mixed - * @throws \Psr\SimpleCache\InvalidArgumentException + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\ModelNotFoundException */ public function silenceAuthBindingPhone($code = '', $spread_code = '', $spread_spid = '', $phone = '', $captcha = '') { @@ -129,31 +157,13 @@ class AuthController } /** - * 授权获取小程序用户手机号 直接绑定 - * @param string $code - * @param string $iv - * @param string $encryptedData - * @param string $spread_code - * @param string $spread_spid - * @param string $key - * @return mixed - */ - public function authBindingPhone($code = '', $iv = '', $encryptedData = '', $spread_code = '', $spread_spid = '', $key = '') - { - if (!$code || !$iv || !$encryptedData) - return app('json')->fail(100100); - $token = $this->services->authBindingPhone($code, $iv, $encryptedData, $spread_code, $spread_spid, $key); - if ($token) { - return app('json')->success(410001, $token); - } else - return app('json')->fail(410019); - } - - /** - * 更新用户信息 + * 更新用户信息 * @param Request $request * @param $userInfo * @return mixed + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException */ public function updateInfo(Request $request, $userInfo) { diff --git a/crmeb/app/api/middleware/BlockerMiddleware.php b/crmeb/app/api/middleware/BlockerMiddleware.php new file mode 100644 index 000000000..73b1fb106 --- /dev/null +++ b/crmeb/app/api/middleware/BlockerMiddleware.php @@ -0,0 +1,70 @@ + + * +---------------------------------------------------------------------- + */ + +namespace app\api\middleware; + + +use app\Request; +use crmeb\exceptions\ApiException; +use crmeb\interfaces\MiddlewareInterface; +use crmeb\services\CacheService; +use think\facade\Config; + +/** + * Redis锁 + * Class BlockerMiddleware + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + * @package app\api\middleware + */ +class BlockerMiddleware implements MiddlewareInterface +{ + /** + * @param Request $request + * @param \Closure $next + * @author 等风来 + * @email 136327134@qq.com + * @date 2022/11/21 + */ + public function handle(Request $request, \Closure $next) + { + if (Config::get('cache.default') == 'file') { + return $next($request); + } + + $uid = $request->uid(); + $key = md5($request->rule()->getRule() . $uid); + if (!CacheService::setMutex($key)) { + throw new ApiException('请求太过频繁,请稍后再试'); + } + + $response = $next($request); + + $this->after($response, $key); + + return $response; + } + + /** + * @param $response + * @param $key + * @author 等风来 + * @email 136327134@qq.com + * @date 2022/11/22 + */ + public function after($response, $key) + { + CacheService::delMutex($key); + } +} diff --git a/crmeb/app/api/route/pc.php b/crmeb/app/api/route/pc.php index 7e95f58c0..d42418efc 100644 --- a/crmeb/app/api/route/pc.php +++ b/crmeb/app/api/route/pc.php @@ -28,7 +28,7 @@ Route::group('pc', function () { Route::get('get_banner', 'pc.HomeController/getBanner')->name('getBanner');//PC首页轮播图 Route::get('get_category_product', 'pc.HomeController/getCategoryProduct')->name('getCategoryProduct');//首页分类尚品 Route::get('get_products', 'pc.ProductController/getProductList')->name('getProductList');//商品列表 - Route::get('get_product_code/:product_id', 'pc.ProductController/getProductRoutineCode')->name('getProductRoutineCode');//商品详情小程序二维码 + Route::get('get_product_code/:product_id/[:type]', 'pc.ProductController/getProductRoutineCode')->name('getProductRoutineCode');//商品详情小程序二维码 Route::get('get_city/:pid', 'pc.PublicController/getCity')->name('getCity');//获取城市数据 Route::get('check_order_status/:order_id/:end_time', 'pc.OrderController/checkOrderStatus')->name('checkOrderStatus');//轮询订单状态接口 Route::get('get_company_info', 'pc.PublicController/getCompanyInfo')->name('getCompanyInfo');//获取公司信息 diff --git a/crmeb/app/api/route/v1.php b/crmeb/app/api/route/v1.php index 5f6ae984f..3bfc48f58 100644 --- a/crmeb/app/api/route/v1.php +++ b/crmeb/app/api/route/v1.php @@ -9,6 +9,7 @@ // | Author: CRMEB Team // +---------------------------------------------------------------------- +use app\api\middleware\BlockerMiddleware; use think\facade\Route; use think\facade\Config; use think\Response; @@ -134,7 +135,7 @@ Route::group(function () { Route::get('sign/list', 'v1.user.UserSignController/sign_list')->name('signList');//签到列表 Route::get('sign/month', 'v1.user.UserSignController/sign_month')->name('signIntegral');//签到列表(年月) Route::post('sign/user', 'v1.user.UserSignController/sign_user')->name('signUser');//签到用户信息 - Route::post('sign/integral', 'v1.user.UserSignController/sign_integral')->name('signIntegral');//签到 + Route::post('sign/integral', 'v1.user.UserSignController/sign_integral')->name('signIntegral')->middleware(BlockerMiddleware::class);//签到 //优惠券类 Route::post('coupon/receive', 'v1.store.StoreCouponsController/receive')->name('couponReceive'); //领取优惠券 Route::post('coupon/receive/batch', 'v1.store.StoreCouponsController/receive_batch')->name('couponReceiveBatch'); //批量领取优惠券 @@ -151,14 +152,14 @@ Route::group(function () { Route::post('order/check_shipping', 'v1.order.StoreOrderController/checkShipping')->name('checkShipping'); //检测是否显示快递和自提标签 Route::post('order/confirm', 'v1.order.StoreOrderController/confirm')->name('orderConfirm'); //订单确认 Route::post('order/computed/:key', 'v1.order.StoreOrderController/computedOrder')->name('computedOrder'); //计算订单金额 - Route::post('order/create/:key', 'v1.order.StoreOrderController/create')->name('orderCreate'); //订单创建 + Route::post('order/create/:key', 'v1.order.StoreOrderController/create')->name('orderCreate')->middleware(BlockerMiddleware::class); //订单创建 Route::get('order/data', 'v1.order.StoreOrderController/data')->name('orderData'); //订单统计数据 Route::get('order/list', 'v1.order.StoreOrderController/lst')->name('orderList'); //订单列表 Route::get('order/detail/:uni/[:cartId]', 'v1.order.StoreOrderController/detail')->name('orderDetail'); //订单详情 Route::get('order/refund_detail/:uni/[:cartId]', 'v1.order.StoreOrderController/refund_detail')->name('refundDetail'); //退款订单详情 - Route::get('order/refund/reason', 'v1.order.StoreOrderController/refund_reason')->name('orderRefundReason'); //订单退款理由 - Route::post('order/refund/verify', 'v1.order.StoreOrderController/refund_verify')->name('orderRefundVerify'); //订单退款审核 - Route::post('order/take', 'v1.order.StoreOrderController/take')->name('orderTake'); //订单收货 + Route::get('order/refund/reason', 'v1.order.StoreOrderController/refund_reason')->name('orderRefundReason')->middleware(BlockerMiddleware::class); //订单退款理由 + Route::post('order/refund/verify', 'v1.order.StoreOrderController/refund_verify')->name('orderRefundVerify')->middleware(BlockerMiddleware::class); //订单退款审核 + Route::post('order/take', 'v1.order.StoreOrderController/take')->name('orderTake')->middleware(BlockerMiddleware::class); //订单收货 Route::get('order/express/:uni/[:type]', 'v1.order.StoreOrderController/express')->name('orderExpress'); //订单查看物流 Route::post('order/del', 'v1.order.StoreOrderController/del')->name('orderDel'); //订单删除 Route::post('order/again', 'v1.order.StoreOrderController/again')->name('orderAgain'); //订单 再次下单 @@ -287,6 +288,7 @@ Route::group(function () { Route::get('search/keyword', 'v1.PublicController/search')->name('searchKeyword');//热门搜索关键字获取 //商品分类类 Route::get('category', 'v1.store.CategoryController/category')->name('category'); + Route::get('category_version', 'v1.store.CategoryController/getCategoryVersion')->name('getCategoryVersion');//商品分类类版本 //商品类 Route::post('image_base64', 'v1.PublicController/get_image_base64')->name('getImageBase64');// 获取图片base64 Route::get('product/detail/:id/[:type]', 'v1.store.StoreProductController/detail')->name('detail');//商品详情 @@ -388,6 +390,30 @@ Route::group(function () { Route::get('get_lang_json', 'v1.PublicController/getLangJson')->name('getLangJson'); //获取当前后台设置的默认语言类型 Route::get('get_default_lang_type', 'v1.PublicController/getDefaultLangType')->name('getLangJson'); + + /** 定时任务接口 */ + //检测定时任务接口 + Route::get('timer/check', 'v1.TimerController/timerCheck')->name('timerCheck'); + //未支付自动取消订单 + Route::get('timer/order_cancel', 'v1.TimerController/orderUnpaidCancel')->name('orderUnpaidCancel'); + //拼团到期订单处理 + Route::get('timer/pink_expiration', 'v1.TimerController/pinkExpiration')->name('pinkExpiration'); + //自动解绑上级绑定 + Route::get('timer/agent_unbind', 'v1.TimerController/agentUnbind')->name('agentUnbind'); + //更新直播商品状态 + Route::get('timer/live_product_status', 'v1.TimerController/syncGoodStatus')->name('syncGoodStatus'); + //更新直播间状态 + Route::get('timer/live_room_status', 'v1.TimerController/syncRoomStatus')->name('syncRoomStatus'); + //自动收货 + Route::get('timer/take_delivery', 'v1.TimerController/autoTakeOrder')->name('autoTakeOrder'); + //查询预售到期商品自动下架 + Route::get('timer/advance_off', 'v1.TimerController/downAdvance')->name('downAdvance'); + //自动好评 + Route::get('timer/product_replay', 'v1.TimerController/autoComment')->name('autoComment'); + //清除昨日海报 + Route::get('timer/clear_poster', 'v1.TimerController/emptyYesterdayAttachment')->name('emptyYesterdayAttachment'); + + })->middleware(\app\http\middleware\AllowOriginMiddleware::class)->middleware(\app\api\middleware\StationOpenMiddleware::class)->middleware(\app\api\middleware\AuthTokenMiddleware::class, false); Route::miss(function () { diff --git a/crmeb/app/api/route/v2.php b/crmeb/app/api/route/v2.php index 2e24f8eff..02efa5e8b 100644 --- a/crmeb/app/api/route/v2.php +++ b/crmeb/app/api/route/v2.php @@ -8,6 +8,7 @@ // +---------------------------------------------------------------------- // | Author: CRMEB Team // +---------------------------------------------------------------------- +use app\api\middleware\BlockerMiddleware; use think\facade\Route; /** @@ -30,6 +31,7 @@ Route::group('v2', function () { Route::get('wechat/wx_silence_auth_login', 'v2.wechat.WechatController/silenceAuth'); //DIY接口 Route::get('diy/get_diy/[:name]', 'v2.PublicController/getDiy'); + Route::get('diy/get_version/[:name]', 'v2.PublicController/getVersion'); //是否强制绑定手机号 Route::get('bind_status', 'v2.PublicController/bindPhoneStatus'); //小程序授权绑定手机号 @@ -79,9 +81,9 @@ Route::group('v2', function () { //抽奖活动详情 Route::get('lottery/info/:factor', 'v2.activity.LuckLotteryController/lotteryInfo')->mame('lotteryInfo'); //参与抽奖 - Route::post('lottery', 'v2.activity.LuckLotteryController/luckLottery')->mame('luckLottery'); + Route::post('lottery', 'v2.activity.LuckLotteryController/luckLottery')->mame('luckLottery')->middleware(BlockerMiddleware::class); //领取奖品 - Route::post('lottery/receive', 'v2.activity.LuckLotteryController/lotteryReceive')->mame('lotteryReceive'); + Route::post('lottery/receive', 'v2.activity.LuckLotteryController/lotteryReceive')->mame('lotteryReceive')->middleware(BlockerMiddleware::class); //抽奖记录 Route::get('lottery/record', 'v2.activity.LuckLotteryController/lotteryRecord')->mame('lotteryRecord'); diff --git a/crmeb/app/common.php b/crmeb/app/common.php index 322a3d2d3..619450f9d 100644 --- a/crmeb/app/common.php +++ b/crmeb/app/common.php @@ -10,6 +10,7 @@ // +---------------------------------------------------------------------- // 应用公共文件 +use app\services\pay\PayServices; use crmeb\services\CacheService; use crmeb\services\HttpService; use Fastknife\Service\ClickWordCaptchaService; @@ -22,6 +23,80 @@ use app\services\system\lang\LangCodeServices; use app\services\system\lang\LangCountryServices; use think\facade\Config; +if (!function_exists('get_pay_type')) { + + /** + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/9 + * @param string $paytype + * @return string + */ + function get_pay_type(string $paytype) + { + $wechatPay = (int)sys_config('pay_weixin_open') == 1; + $allinPay = (int)sys_config('allin_pay_status') == 1; + //微信支付没有开启,通联支付开启,用户访问端在小程序或者公众号的时候,使用通联微信H5支付 + if ($paytype == PayServices::WEIXIN_PAY && !$wechatPay && $allinPay && (request()->isRoutine() || request()->isWechat())) { + $paytype = PayServices::ALLIN_PAY; + } + + $aliPay = (bool)sys_config('ali_pay_status'); + //支付宝没有开启,通联支付开了,用户使用支付宝支付,并且在app端访问的时候,使用通联app支付宝支付 + if (!$aliPay && $paytype == PayServices::ALIAPY_PAY && request()->isApp()) { + $paytype = PayServices::ALLIN_PAY; + } + return $paytype; + } +} + +if (!function_exists('is_wechat_pay')) { + /** + * @return bool + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + function is_wecaht_pay() + { + $wechatPay = (int)sys_config('pay_weixin_open') == 1; + $allinPay = (int)sys_config('allin_pay_status') == 1; + + if ($wechatPay) { + return true; + } else { + if ((request()->isRoutine() || request()->isWechat()) && $allinPay) { + return true; + } + } + + return false; + } +} + +if (!function_exists('is_ali_pay')) { + /** + * @return bool + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + function is_ali_pay() + { + $aliPay = (bool)sys_config('ali_pay_status'); + $allinPay = (int)sys_config('allin_pay_status') == 1; + + if ($aliPay) { + return true; + } else { + if (request()->isApp() && $allinPay) { + return true; + } + } + return false; + } +} + if (!function_exists('getWorkerManUrl')) { /** @@ -946,7 +1021,7 @@ if (!function_exists('getLang')) { $typeId = $langCountryServices->value(['code' => $range], 'type_id') ?: 1; // 获取类型 - $langData = CacheService::redisHandler()->remember('lang_type_data', function () use ($langTypeServices) { + $langData = CacheService::remember('lang_type_data', function () use ($langTypeServices) { return $langTypeServices->getColumn(['status' => 1, 'is_del' => 0], 'file_name', 'id'); }, 3600); @@ -954,7 +1029,7 @@ if (!function_exists('getLang')) { $langStr = 'lang_' . str_replace('-', '_', $langData[$typeId]); //读取当前语言的语言包 - $lang = CacheService::redisHandler()->remember($langStr, function () use ($typeId, $range, $langCodeServices) { + $lang = CacheService::remember($langStr, function () use ($typeId, $range, $langCodeServices) { return $langCodeServices->getColumn(['type_id' => $typeId, 'is_admin' => 1], 'lang_explain', 'code'); }, 3600); //获取返回文字 diff --git a/crmeb/app/dao/BaseDao.php b/crmeb/app/dao/BaseDao.php index 6c55c1385..338253d2c 100644 --- a/crmeb/app/dao/BaseDao.php +++ b/crmeb/app/dao/BaseDao.php @@ -126,6 +126,17 @@ abstract class BaseDao return $this->getModel()->getPk(); } + /** + * @return string + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function getTableName() + { + return $this->getModel()->getName(); + } + /** * 获取一条数据 * @param $id diff --git a/crmeb/app/event.php b/crmeb/app/event.php index 5d70c2835..f95462b8d 100644 --- a/crmeb/app/event.php +++ b/crmeb/app/event.php @@ -23,8 +23,7 @@ return [ 'LogLevel' => [], 'LogWrite' => [], 'queue.start' => [\app\listener\queue\QueueStart::class], - 'user.login' => [\app\listener\user\Login::class], // - 'admin.info' => [\app\listener\admin\AdminInfo::class],//管理员登录前获取登录信息事件 + 'user.login' => [\app\listener\user\Login::class], 'admin.login' => [\app\listener\admin\AdminLogin::class],//管理员登录 'user.register' => [\app\listener\user\Register::class], //用户注册后置事件 'wechat.auth' => [\app\listener\wechat\Auth::class], //用户授权后置事件 diff --git a/crmeb/app/jobs/CheckQueueJob.php b/crmeb/app/jobs/CheckQueueJob.php index 0bee1ab36..cfc108c8e 100644 --- a/crmeb/app/jobs/CheckQueueJob.php +++ b/crmeb/app/jobs/CheckQueueJob.php @@ -26,8 +26,7 @@ class CheckQueueJob extends BaseJobs { use QueueTrait; - - public function handle($key) + public function doJob($key) { $path = root_path('runtime') . '.queue'; file_put_contents($path, $key); diff --git a/crmeb/app/jobs/OutPushJob.php b/crmeb/app/jobs/OutPushJob.php index b37c7638d..b1cbbaa8d 100644 --- a/crmeb/app/jobs/OutPushJob.php +++ b/crmeb/app/jobs/OutPushJob.php @@ -31,11 +31,11 @@ class OutPushJob extends BaseJobs /** @var OutStoreOrderServices $services */ $services = app()->make(OutStoreOrderServices::class); if (!$services->orderCreatePush($oid, $pushUrl)) { - OutPushJob::dispatchSece(($step + 1) * 5, 'orderCreate', [$oid, $pushUrl, $step + 1]); + OutPushJob::dispatchSecs(($step + 1) * 5, 'orderCreate', [$oid, $pushUrl, $step + 1]); } } catch (\Exception $e) { Log::error('订单' . $oid . '推送失败,失败原因:' . $e->getMessage()); - OutPushJob::dispatchSece(($step + 1) * 5, 'orderCreate', [$oid, $pushUrl, $step + 1]); + OutPushJob::dispatchSecs(($step + 1) * 5, 'orderCreate', [$oid, $pushUrl, $step + 1]); } return true; @@ -59,11 +59,11 @@ class OutPushJob extends BaseJobs /** @var OutStoreOrderServices $services */ $services = app()->make(OutStoreOrderServices::class); if (!$services->paySuccessPush($oid, $pushUrl)) { - OutPushJob::dispatchSece(($step + 1) * 5, 'paySuccess', [$oid, $pushUrl, $step + 1]); + OutPushJob::dispatchSecs(($step + 1) * 5, 'paySuccess', [$oid, $pushUrl, $step + 1]); } } catch (\Exception $e) { Log::error('订单支付' . $oid . '推送失败,失败原因:' . $e->getMessage()); - OutPushJob::dispatchSece(($step + 1) * 5, 'paySuccess', [$oid, $pushUrl, $step + 1]); + OutPushJob::dispatchSecs(($step + 1) * 5, 'paySuccess', [$oid, $pushUrl, $step + 1]); } return true; @@ -87,11 +87,11 @@ class OutPushJob extends BaseJobs /** @var OutStoreOrderRefundServices $services */ $services = app()->make(OutStoreOrderRefundServices::class); if (!$services->refundCreatePush($oid, $pushUrl)) { - OutPushJob::dispatchSece(($step + 1) * 5, 'refundCreate', [$oid, $pushUrl, $step + 1]); + OutPushJob::dispatchSecs(($step + 1) * 5, 'refundCreate', [$oid, $pushUrl, $step + 1]); } } catch (\Exception $e) { Log::error('售后单' . $oid . '推送失败,失败原因:' . $e->getMessage()); - OutPushJob::dispatchSece(($step + 1) * 5, 'refundCreate', [$oid, $pushUrl, $step + 1]); + OutPushJob::dispatchSecs(($step + 1) * 5, 'refundCreate', [$oid, $pushUrl, $step + 1]); } return true; } @@ -114,11 +114,11 @@ class OutPushJob extends BaseJobs /** @var OutStoreOrderRefundServices $services */ $services = app()->make(OutStoreOrderRefundServices::class); if (!$services->cancelApplyPush($oid, $pushUrl)) { - OutPushJob::dispatchSece(($step + 1) * 5, 'refundCancel', [$oid, $pushUrl, $step + 1]); + OutPushJob::dispatchSecs(($step + 1) * 5, 'refundCancel', [$oid, $pushUrl, $step + 1]); } } catch (\Exception $e) { Log::error('取消售后单' . $oid . '推送失败,失败原因:' . $e->getMessage()); - OutPushJob::dispatchSece(($step + 1) * 5, 'refundCancel', [$oid, $pushUrl, $step + 1]); + OutPushJob::dispatchSecs(($step + 1) * 5, 'refundCancel', [$oid, $pushUrl, $step + 1]); } return true; } @@ -141,10 +141,10 @@ class OutPushJob extends BaseJobs /** @var UserServices $services */ $services = app()->make(UserServices::class); if (!$services->userUpdate($data, $pushUrl)) { - OutPushJob::dispatchSece(($step + 1) * 5, 'userUpdate', [$data, $pushUrl, $step + 1]); + OutPushJob::dispatchSecs(($step + 1) * 5, 'userUpdate', [$data, $pushUrl, $step + 1]); } } catch (\Exception $e) { - OutPushJob::dispatchSece(($step + 1) * 5, 'userUpdate', [$data, $pushUrl, $step + 1]); + OutPushJob::dispatchSecs(($step + 1) * 5, 'userUpdate', [$data, $pushUrl, $step + 1]); } return true; } diff --git a/crmeb/app/jobs/ProductCopyJob.php b/crmeb/app/jobs/ProductCopyJob.php index dccd9683e..6fa7cb38f 100644 --- a/crmeb/app/jobs/ProductCopyJob.php +++ b/crmeb/app/jobs/ProductCopyJob.php @@ -47,21 +47,21 @@ class ProductCopyJob extends BaseJobs } else { $d_image = 'http://' . ltrim($image, '\//'); } - $description_cache = CacheService::getTokenBucket('desc_images_' . $id); + $description_cache = CacheService::get('desc_images_' . $id); if ($description_cache === null) { $description_cache = $description; - CacheService::setTokenBucket('desc_images_count' . $id, 0); + CacheService::set('desc_images_count' . $id, 0); } $res = $copyTaobao->downloadCopyImage($d_image); $description_cache = str_replace($image, $res, $description_cache); - $desc_count = CacheService::getTokenBucket('desc_images_count' . $id) + 1; + $desc_count = CacheService::get('desc_images_count' . $id) + 1; if ($desc_count == $count) { - CacheService::clearToken('desc_images_' . $id); - CacheService::clearToken('desc_images_count' . $id); + CacheService::delete('desc_images_' . $id); + CacheService::delete('desc_images_count' . $id); $storeDescriptionServices->saveDescription((int)$id, $description_cache); } else { - CacheService::setTokenBucket('desc_images_' . $id, $description_cache); - CacheService::setTokenBucket('desc_images_count' . $id, $desc_count); + CacheService::set('desc_images_' . $id, $description_cache); + CacheService::set('desc_images_count' . $id, $desc_count); } } catch (\Throwable $e) { Log::error('下载商品详情图片失败,失败原因:' . $e->getMessage()); @@ -86,20 +86,20 @@ class ProductCopyJob extends BaseJobs //下载图片 $res = $copyTaobao->downloadCopyImage($image); //获取缓存中的轮播图 - $slider_images = CacheService::getTokenBucket('slider_images_' . $id); + $slider_images = CacheService::get('slider_images_' . $id); //缓存为null则赋值[] if ($slider_images === null) $slider_images = []; //将下载的图片插入数组 array_push($slider_images, $res); //如果$slider_images中图片数量和传入的$count相等,说明已经下载完成,写入商品表,如果不等则继续插入缓存 if (count($slider_images) == $count) { - CacheService::clearToken('slider_images_' . $id); + CacheService::delete('slider_images_' . $id); $image = $slider_images[0]; $slider_images = $slider_images ? json_encode($slider_images) : ''; $StoreProductServices->update($id, ['slider_image' => $slider_images, 'image' => $image]); $StoreProductAttrValueServices->update(['product_id' => $id], ['image' => $image]); } else { - CacheService::setTokenBucket('slider_images_' . $id, $slider_images); + CacheService::set('slider_images_' . $id, $slider_images); } } catch (\Throwable $e) { Log::error('下载商品轮播图片失败,失败原因:' . $e->getMessage()); diff --git a/crmeb/app/jobs/ProductStockJob.php b/crmeb/app/jobs/ProductStockJob.php index 0b3b9a4f9..d228f2ad9 100644 --- a/crmeb/app/jobs/ProductStockJob.php +++ b/crmeb/app/jobs/ProductStockJob.php @@ -29,7 +29,7 @@ class ProductStockJob extends BaseJobs { try { foreach ($data as $key => $item) { - ProductStockJob::dispatchDo('calcValueStock', [$key]); + ProductStockJob::dispatch('calcValueStock', [$key]); } } catch (\Exception $e) { Log::error(['msg' => '拆分计算失败,错误原因:' . $e->getMessage(), 'data' => $data]); diff --git a/crmeb/app/jobs/TaskJob.php b/crmeb/app/jobs/TaskJob.php index 88a174069..2ba94a84a 100644 --- a/crmeb/app/jobs/TaskJob.php +++ b/crmeb/app/jobs/TaskJob.php @@ -25,25 +25,16 @@ class TaskJob extends BaseJobs { use QueueTrait; - /** - * 修改短信发送记录短信状态 - */ - public function modifyResultCode() - { - /** @var SmsRecordServices $smsRecord */ - $smsRecord = app()->make(SmsRecordServices::class); - return $smsRecord->modifyResultCode(); - } - /** * 清除昨日海报 * @return bool * @throws \Exception */ - public function emptyYesterdayAttachment() + public function emptyYesterdayAttachment(): bool { /** @var SystemAttachmentServices $attach */ $attach = app()->make(SystemAttachmentServices::class); - return $attach->emptyYesterdayAttachment(); + $attach->emptyYesterdayAttachment(); + return true; } } diff --git a/crmeb/app/jobs/TemplateJob.php b/crmeb/app/jobs/TemplateJob.php index f546f65f2..1539864ab 100644 --- a/crmeb/app/jobs/TemplateJob.php +++ b/crmeb/app/jobs/TemplateJob.php @@ -59,7 +59,7 @@ class TemplateJob extends BaseJobs //判断小程序还是公众号,获取数据id $is_type = $type == 'wechat' ? 'is_wechat' : 'is_routine'; $key = $is_type == 'is_wechat' ? 'wechat_' . $tempCode : 'routine_' . $tempCode; - $tempid = CacheService::get($key, function () use ($type, $tempCode, $is_type) { + $tempid = CacheService::remember($key, function () use ($type, $tempCode, $is_type) { /** @var SystemNotificationServices $notifyServices */ $notifyServices = app()->make(SystemNotificationServices::class); return $notifyServices->getNotInfo(['type' => $is_type, 'mark' => $tempCode])['tempid']; diff --git a/crmeb/app/jobs/notice/EnterpriseWechatJob.php b/crmeb/app/jobs/notice/EnterpriseWechatJob.php index a5d55e4d2..a23407633 100644 --- a/crmeb/app/jobs/notice/EnterpriseWechatJob.php +++ b/crmeb/app/jobs/notice/EnterpriseWechatJob.php @@ -11,8 +11,8 @@ namespace app\jobs\notice; +use app\services\message\notice\EnterpriseWechatService; use crmeb\basic\BaseJobs; -use crmeb\services\HttpService; use crmeb\traits\QueueTrait; use think\facade\Log; @@ -20,45 +20,20 @@ class EnterpriseWechatJob extends BaseJobs { use QueueTrait; - /** * 给企业微信群发送消息 + * @param $data + * @return bool */ - public function doJob($data, $url, $ent_wechat_text) + public function doJob($data): bool { try { - $str = $ent_wechat_text; - foreach ($data as $key => $item) { - $str = str_replace('{' . $key . '}', $item, $str); - } - $s = explode('\n', $str); - $d = ''; - foreach ($s as $item) { - $d .= $item . "\n>"; - } - $d = substr($d, 0, strlen($d) - 2); - $datas = [ - 'msgtype' => 'markdown', - 'markdown' => ['content' => $d] - ]; - HttpService::postRequest($url, json_encode($datas)); + /** @var EnterpriseWechatService $enterpriseWechatService */ + $enterpriseWechatService = app()->make(EnterpriseWechatService::class); + $enterpriseWechatService->weComSend($data); return true; - } catch (\Throwable $e) { + } catch (\Exception $e) { Log::error('发送企业群消息失败,失败原因:' . $e->getMessage()); } - - } - /** - * 给企业微信群发送消息 - */ - public function ceshi($data,$url, $ent_wechat_text = '') - { - $wdata = [ - 'msgtype' => 'markdown', - 'markdown' => ['content' => '你好啊,测试队列消息'.$url.$ent_wechat_text] - ]; - HttpService::postRequest('https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=4d92900f-dc4a-4b2b-8d37-5ce2784dd618', json_encode($wdata)); - - return true; } } diff --git a/crmeb/app/jobs/notice/PrintJob.php b/crmeb/app/jobs/notice/PrintJob.php index 3c776c288..c4c1af771 100644 --- a/crmeb/app/jobs/notice/PrintJob.php +++ b/crmeb/app/jobs/notice/PrintJob.php @@ -11,13 +11,11 @@ namespace app\jobs\notice; - +use app\services\order\StoreOrderServices; use crmeb\basic\BaseJobs; -use crmeb\services\printer\Printer; use crmeb\traits\QueueTrait; use think\facade\Log; - /** * 小票打印 * Class PrintJob @@ -29,28 +27,18 @@ class PrintJob extends BaseJobs /** * 小票打印 - * @param $type - * @param $configData - * @param $order - * @param $product + * @param $id * @return bool|void */ - public function doJob($type, $configData, $order, $product) + public function doJob($id) { - try { - $printer = new Printer($type, $configData); - $printer->setPrinterContent([ - 'name' => sys_config('site_name'), - 'url' => sys_config('site_url'), - 'orderInfo' => is_object($order) ? $order->toArray() : $order, - 'product' => $product - ])->startPrinter(); + /** @var StoreOrderServices $orderServices */ + $orderServices = app()->make(StoreOrderServices::class); + $orderServices->orderPrintTicket((int)$id); return true; } catch (\Throwable $e) { Log::error('小票打印失败失败,失败原因:' . $e->getMessage()); } - } - } diff --git a/crmeb/app/jobs/notice/SmsJob.php b/crmeb/app/jobs/notice/SmsJob.php index 31ccf4b39..e635bf3ad 100644 --- a/crmeb/app/jobs/notice/SmsJob.php +++ b/crmeb/app/jobs/notice/SmsJob.php @@ -37,7 +37,7 @@ class SmsJob extends BaseJobs $smsServices->send(true, $phone, $data, $template); return true; }catch (\Throwable $e) { - Log::error('发送企业群消息失败,失败原因:' . $e->getMessage()); + Log::error('发送短信失败,失败原因:' . $e->getMessage()); } } diff --git a/crmeb/app/jobs/notice/SyncMessageJob.php b/crmeb/app/jobs/notice/SyncMessageJob.php index 031e76998..f9e784199 100644 --- a/crmeb/app/jobs/notice/SyncMessageJob.php +++ b/crmeb/app/jobs/notice/SyncMessageJob.php @@ -94,6 +94,7 @@ class SyncMessageJob extends BaseJobs /** * 同步公众号模版消息 * @param $template + * @return bool */ public function syncWechat($template) { diff --git a/crmeb/app/kefuapi/KefuApiExceptionHandle.php b/crmeb/app/kefuapi/KefuApiExceptionHandle.php index 047e4e4ca..eac1ae303 100644 --- a/crmeb/app/kefuapi/KefuApiExceptionHandle.php +++ b/crmeb/app/kefuapi/KefuApiExceptionHandle.php @@ -84,9 +84,9 @@ class KefuApiExceptionHandle extends Handle 'trace' => $e->getTrace(), 'previous' => $e->getPrevious(), ] : []; - $message = Env::get('app_debug', false) ? '接口报错:' . $e->getMessage() : '很抱歉,系统开小差了'; + $message = Env::get('app_debug', false) ? $e->getMessage() : '很抱歉,系统开小差了'; // 添加自定义异常处理机制 - if ($e instanceof AuthException || $e instanceof AdminException || $e instanceof ApiException) { + if ($e instanceof AuthException || $e instanceof AdminException || $e instanceof ApiException || $e instanceof ValidateException) { return app('json')->make($e->getCode() ?: 400, $message, $massageData); } else { return app('json')->fail($message, $massageData); diff --git a/crmeb/app/kefuapi/controller/User.php b/crmeb/app/kefuapi/controller/User.php index be70f1ea3..0c6694a2f 100644 --- a/crmeb/app/kefuapi/controller/User.php +++ b/crmeb/app/kefuapi/controller/User.php @@ -147,7 +147,7 @@ class User extends AuthController public function logout() { $key = trim(ltrim($this->request->header(Config::get('cookie.token_name')), 'Bearer')); - CacheService::redisHandler()->delete(md5($key)); + CacheService::delete(md5($key)); return app('json')->success(); } diff --git a/crmeb/app/listener/admin/AdminInfo.php b/crmeb/app/listener/admin/AdminInfo.php deleted file mode 100644 index f96925fe5..000000000 --- a/crmeb/app/listener/admin/AdminInfo.php +++ /dev/null @@ -1,32 +0,0 @@ - - * +---------------------------------------------------------------------- - */ - -namespace app\listener\admin; - - -use app\jobs\CheckQueueJob; -use crmeb\interfaces\ListenerInterface; - -/** - * 登录前获取信息 - * Class AdminInfo - * @package app\listener\admin - */ -class AdminInfo implements ListenerInterface -{ - - public function handle($event): void - { - CheckQueueJob::dispatch($event); - } -} diff --git a/crmeb/app/listener/notice/Notice.php b/crmeb/app/listener/notice/Notice.php index 45795a10f..4be63a125 100644 --- a/crmeb/app/listener/notice/Notice.php +++ b/crmeb/app/listener/notice/Notice.php @@ -11,6 +11,9 @@ namespace app\listener\notice; +use app\jobs\notice\EnterpriseWechatJob; +use app\jobs\notice\PrintJob; +use app\services\order\StoreOrderServices; use app\services\message\notice\{ EnterpriseWechatService, RoutineTemplateListService, @@ -18,7 +21,6 @@ use app\services\message\notice\{ SystemMsgService, WechatTemplateListService }; -use app\services\message\NoticeService; use app\services\order\StoreOrderCartInfoServices; use app\services\user\UserServices; use crmeb\interfaces\ListenerInterface; @@ -36,9 +38,6 @@ class Notice implements ListenerInterface try { [$data, $mark] = $event; - /** @var NoticeService $NoticeService */ - $NoticeService = app()->make(NoticeService::class); - /** @var WechatTemplateListService $WechatTemplateList */ $WechatTemplateList = app()->make(WechatTemplateListService::class); @@ -51,7 +50,7 @@ class Notice implements ListenerInterface /** @var EnterpriseWechatService $EnterpriseWechat */ $EnterpriseWechat = app()->make(EnterpriseWechatService::class); - /** @var SmsService $NoticeSms */ + /** @var SmsService $NoticeSms */ $NoticeSms = app()->make(SmsService::class); /** @var StoreOrderCartInfoServices $orderInfoServices */ @@ -93,7 +92,7 @@ class Notice implements ListenerInterface $RoutineTemplateList->sendOrderSuccess($data['uid'], $data['pay_price'], $data['order_id']); //小票打印 if (isset($data['cart_id']) && $data['cart_id']) { - $NoticeService->orderPrint($data); + PrintJob::dispatch([$data['id']]); } break; //发货给用户 @@ -355,7 +354,7 @@ class Notice implements ListenerInterface $link = '/pages/admin/orderDetail/index?id=' . $order['order_id']; $WechatTemplateList->sendAdminOrder($order['order_id'], $storeName, $title, $status, $link); //企业微信通知 - $EnterpriseWechat->sendMsg(['order_id' => $order['order_id']]); + EnterpriseWechatJob::dispatch(['order_id' => $order['order_id']]); break; //确认收货给客服 case 'send_admin_confirm_take_over': @@ -372,7 +371,7 @@ class Notice implements ListenerInterface $link = '/pages/admin/orderDetail/index?id=' . $order['order_id']; $WechatTemplateList->sendAdminOrder($order['order_id'], $storeName, $title, $status, $link); //企业微信通知 - $EnterpriseWechat->sendMsg(['storeTitle' => $storeTitle, 'order_id' => $order['order_id']]); + EnterpriseWechatJob::dispatch(['storeTitle' => $storeTitle, 'order_id' => $order['order_id']]); break; //申请退款给客服发消息 case 'send_order_apply_refund': @@ -382,7 +381,7 @@ class Notice implements ListenerInterface //短信 $NoticeSms->sendAdminRefund($order); //企业微信通知 - $EnterpriseWechat->sendMsg(['order_id' => $order['order_id']]); + EnterpriseWechatJob::dispatch(['order_id' => $order['order_id']]); //公众号 $storeName = $orderInfoServices->getCarIdByProductTitle((int)$order['id']); $title = '亲,您有个退款订单待处理!'; @@ -395,7 +394,7 @@ class Notice implements ListenerInterface //站内信 $SystemMsg->kefuSystemSend($data); //企业微信通知 - $EnterpriseWechat->sendMsg($data); + EnterpriseWechatJob::dispatch($data); break; } diff --git a/crmeb/app/listener/order/OrderCreateAfter.php b/crmeb/app/listener/order/OrderCreateAfter.php index 1a37b89c0..f47b133fa 100644 --- a/crmeb/app/listener/order/OrderCreateAfter.php +++ b/crmeb/app/listener/order/OrderCreateAfter.php @@ -33,7 +33,7 @@ class OrderCreateAfter implements ListenerInterface $orderCreate->orderCreateAfter($order, $group, $combinationId || $seckillId || $bargainId); //清除订单缓存 - CacheService::redisHandler()->delete('user_order_' . $uid . $key); + CacheService::delete('user_order_' . $uid . $key); //写入订单记录表 /** @var StoreOrderStatusServices $statusService */ @@ -81,8 +81,8 @@ class OrderCreateAfter implements ListenerInterface $secs = $systemValue['order_cancel_time']; } //未支付10分钟后发送短信 - UnpaidOrderSend::dispatchSece(600, [$orderId]); + UnpaidOrderSend::dispatchSecs(600, [$orderId]); //未支付根据系统设置事件取消订单 - UnpaidOrderCancelJob::dispatchSece((int)($secs * 3600), [$orderId]); + UnpaidOrderCancelJob::dispatchSecs((int)($secs * 3600), [$orderId]); } } diff --git a/crmeb/app/listener/order/OrderDelivery.php b/crmeb/app/listener/order/OrderDelivery.php index 845971c3f..bb691307d 100644 --- a/crmeb/app/listener/order/OrderDelivery.php +++ b/crmeb/app/listener/order/OrderDelivery.php @@ -22,7 +22,7 @@ class OrderDelivery implements ListenerInterface $time = sys_config('system_delivery_time') ?? 0; if ($time != 0) { $sevenDay = 24 * 3600 * $time; - TakeOrderJob::dispatchSece((int)$sevenDay, [$orderInfo->id]); + TakeOrderJob::dispatchSecs((int)$sevenDay, [$orderInfo->id]); } } } diff --git a/crmeb/app/listener/out/OutPush.php b/crmeb/app/listener/out/OutPush.php index 6b68cd478..b679f58a9 100644 --- a/crmeb/app/listener/out/OutPush.php +++ b/crmeb/app/listener/out/OutPush.php @@ -21,15 +21,15 @@ class OutPush implements ListenerInterface if ($item['push_open'] == 1) { $token = $this->getPushToken($item); if ($type == 'order_create_push') { - OutPushJob::dispatchDo('orderCreate', [$data['order_id'], $item['order_create_push'] . '?pushToken=' . $token]); + OutPushJob::dispatch('orderCreate', [$data['order_id'], $item['order_create_push'] . '?pushToken=' . $token]); } elseif ($type == 'order_pay_push') { - OutPushJob::dispatchDo('paySuccess', [$data['order_id'], $item['order_pay_push'] . '?pushToken=' . $token]); + OutPushJob::dispatch('paySuccess', [$data['order_id'], $item['order_pay_push'] . '?pushToken=' . $token]); } elseif ($type == 'refund_create_push') { - OutPushJob::dispatchDo('refundCreate', [$data['order_id'], $item['refund_create_push'] . '?pushToken=' . $token]); + OutPushJob::dispatch('refundCreate', [$data['order_id'], $item['refund_create_push'] . '?pushToken=' . $token]); } elseif ($type == 'refund_cancel_push') { - OutPushJob::dispatchDo('refundCancel', [$data['order_id'], $item['refund_cancel_push'] . '?pushToken=' . $token]); + OutPushJob::dispatch('refundCancel', [$data['order_id'], $item['refund_cancel_push'] . '?pushToken=' . $token]); } elseif ($type == 'user_update_push') { - OutPushJob::dispatchDo('userUpdate', [$data, $item['user_update_push'] . '?pushToken=' . $token]); + OutPushJob::dispatch('userUpdate', [$data, $item['user_update_push'] . '?pushToken=' . $token]); } } } @@ -42,7 +42,7 @@ class OutPush implements ListenerInterface */ public function getPushToken(array $info) { - $token = CacheService::redisHandler()->get('pushToken' . $info['id']); + $token = CacheService::get('pushToken' . $info['id']); if (!$token) { $param = json_encode(['push_account' => $info['push_account'], 'push_password' => $info['push_password']], JSON_UNESCAPED_UNICODE); $res = HttpService::postRequest($info['push_token_url'], $param, ['Content-Type:application/json', 'Content-Length:' . strlen($param)]); @@ -51,7 +51,7 @@ class OutPush implements ListenerInterface Log::error(['msg' => $info['title'] . ',获取token失败']); return false; } - CacheService::redisHandler()->set('pushToken' . $info['id'], $res['token'], $res['time']); + CacheService::set('pushToken' . $info['id'], $res['token'], $res['time']); return $res['token']; } else { return $token; diff --git a/crmeb/app/listener/timer/SystemTimer.php b/crmeb/app/listener/timer/SystemTimer.php index 16c52daf7..a3c0cb0fe 100644 --- a/crmeb/app/listener/timer/SystemTimer.php +++ b/crmeb/app/listener/timer/SystemTimer.php @@ -30,12 +30,12 @@ class SystemTimer implements ListenerInterface foreach ($list as &$item) { //获取定时任务时间字符串 $timeStr = $this->getTimerStr($item); - Log::error('mark:'.$item['mark']); - Log::error($timeStr); +// Log::error('mark:'.$item['mark']); +// Log::error($timeStr); if ($item['mark'] == 'order_cancel') { new Crontab($timeStr, function () { - Log::error('每隔30秒执行一次自动取消订单 '.date('Y-m-d H:i:s')); +// Log::error('每隔30秒执行一次自动取消订单 '.date('Y-m-d H:i:s')); //未支付自动取消订单 try { /** @var StoreOrderServices $orderServices */ @@ -49,7 +49,7 @@ class SystemTimer implements ListenerInterface if ($item['mark'] == 'pink_expiration') { new Crontab($timeStr, function () { - Log::error('每隔1分钟执行一次拼团到期订单处理 '.date('Y-m-d H:i:s')); +// Log::error('每隔1分钟执行一次拼团到期订单处理 '.date('Y-m-d H:i:s')); //拼团到期订单处理 try { /** @var StorePinkServices $storePinkServices */ @@ -63,7 +63,7 @@ class SystemTimer implements ListenerInterface if ($item['mark'] == 'agent_unbind') { new Crontab($timeStr, function () { - Log::error('每隔1分钟执行一次自动解除上级绑定 '.date('Y-m-d H:i:s')); +// Log::error('每隔1分钟执行一次自动解除上级绑定 '.date('Y-m-d H:i:s')); //自动解绑上级绑定 try { /** @var AgentManageServices $agentManage */ @@ -77,7 +77,7 @@ class SystemTimer implements ListenerInterface if ($item['mark'] == 'live_product_status') { new Crontab($timeStr, function () { - Log::error('每隔3分钟执行一次更新直播商品状态 '.date('Y-m-d H:i:s')); +// Log::error('每隔3分钟执行一次更新直播商品状态 '.date('Y-m-d H:i:s')); //更新直播商品状态 try { /** @var LiveGoodsServices $liveGoods */ @@ -91,7 +91,7 @@ class SystemTimer implements ListenerInterface if ($item['mark'] == 'live_room_status') { new Crontab($timeStr, function () { - Log::error('每隔3分钟执行一次更新直播间状态 '.date('Y-m-d H:i:s')); +// Log::error('每隔3分钟执行一次更新直播间状态 '.date('Y-m-d H:i:s')); //更新直播间状态 try { /** @var LiveRoomServices $liveRoom */ @@ -105,7 +105,7 @@ class SystemTimer implements ListenerInterface if ($item['mark'] == 'take_delivery') { new Crontab($timeStr, function () { - Log::error('每隔5分钟执行一次自动收货 '.date('Y-m-d H:i:s')); +// Log::error('每隔5分钟执行一次自动收货 '.date('Y-m-d H:i:s')); //自动收货 try { /** @var StoreOrderTakeServices $services */ @@ -119,7 +119,7 @@ class SystemTimer implements ListenerInterface if ($item['mark'] == 'advance_off') { new Crontab($timeStr, function () { - Log::error('每隔5分钟执行一次查询预售到期商品自动下架 '.date('Y-m-d H:i:s')); +// Log::error('每隔5分钟执行一次查询预售到期商品自动下架 '.date('Y-m-d H:i:s')); //查询预售到期商品自动下架 try { /** @var StoreProductServices $product */ @@ -133,7 +133,7 @@ class SystemTimer implements ListenerInterface if ($item['mark'] == 'product_replay') { new Crontab($timeStr, function () { - Log::error('每隔5分钟执行一次自动好评 '.date('Y-m-d H:i:s')); +// Log::error('每隔5分钟执行一次自动好评 '.date('Y-m-d H:i:s')); //自动好评 try { /** @var StoreOrderServices $orderServices */ @@ -145,9 +145,9 @@ class SystemTimer implements ListenerInterface }); } - if ($item['mark'] == 'product_replay') { + if ($item['mark'] == 'clear_poster') { new Crontab($timeStr, function () { - Log::error('每天0时30分0秒执行一次清除昨日海报 '.date('Y-m-d H:i:s')); +// Log::error('每天0时30分0秒执行一次清除昨日海报 '.date('Y-m-d H:i:s')); //清除昨日海报 try { /** @var SystemAttachmentServices $attach */ diff --git a/crmeb/app/outapi/OutApiExceptionHandle.php b/crmeb/app/outapi/OutApiExceptionHandle.php index 934247623..50b799e4c 100644 --- a/crmeb/app/outapi/OutApiExceptionHandle.php +++ b/crmeb/app/outapi/OutApiExceptionHandle.php @@ -84,9 +84,9 @@ class OutApiExceptionHandle extends Handle 'trace' => $e->getTrace(), 'previous' => $e->getPrevious(), ] : []; - $message = Env::get('app_debug', false) ? '接口报错:' . $e->getMessage() : '很抱歉,系统开小差了'; + $message = Env::get('app_debug', false) ? $e->getMessage() : '很抱歉,系统开小差了'; // 添加自定义异常处理机制 - if ($e instanceof AuthException || $e instanceof AdminException || $e instanceof ApiException) { + if ($e instanceof AuthException || $e instanceof AdminException || $e instanceof ApiException || $e instanceof ValidateException) { return app('json')->make($e->getCode() ?: 400, $message, $massageData); } else { return app('json')->fail($message, $massageData); diff --git a/crmeb/app/outapi/controller/StoreOrder.php b/crmeb/app/outapi/controller/StoreOrder.php index b868ece4e..d9c0d0ab6 100644 --- a/crmeb/app/outapi/controller/StoreOrder.php +++ b/crmeb/app/outapi/controller/StoreOrder.php @@ -67,7 +67,7 @@ class StoreOrder extends AuthController ], true); if ($status != '') $data['status'] = $status; $data['is_show'] = 1; - $list = CacheService::get('EXPRESS_LIST', function () use ($services, $data) { + $list = CacheService::remember('EXPRESS_LIST', function () use ($services, $data) { return $services->express($data); }, 86400); return app('json')->success($list); diff --git a/crmeb/app/services/BaseServices.php b/crmeb/app/services/BaseServices.php index ee366af72..9e0f603e9 100644 --- a/crmeb/app/services/BaseServices.php +++ b/crmeb/app/services/BaseServices.php @@ -11,6 +11,7 @@ namespace app\services; +use crmeb\traits\ServicesTrait; use crmeb\utils\JwtAuth; use think\facade\Db; use think\facade\Config; @@ -22,6 +23,9 @@ use think\facade\Route as Url; */ abstract class BaseServices { + + use ServicesTrait; + /** * 模型注入 * @var object @@ -64,7 +68,9 @@ abstract class BaseServices * 创建token * @param int $id * @param $type + * @param string $pwd * @return array + * @throws \Psr\SimpleCache\InvalidArgumentException */ public function createToken(int $id, $type, $pwd = '') { diff --git a/crmeb/app/services/activity/bargain/StoreBargainServices.php b/crmeb/app/services/activity/bargain/StoreBargainServices.php index 3d00603c2..83b505dec 100644 --- a/crmeb/app/services/activity/bargain/StoreBargainServices.php +++ b/crmeb/app/services/activity/bargain/StoreBargainServices.php @@ -18,6 +18,7 @@ use app\Request; use app\services\BaseServices; use app\services\order\StoreOrderServices; use app\services\other\PosterServices; +use app\services\other\QrcodeServices; use app\services\product\product\StoreCategoryServices; use app\services\product\product\StoreDescriptionServices; use app\services\product\product\StoreProductServices; @@ -864,6 +865,7 @@ class StoreBargainServices extends BaseServices * 获取砍价海报信息 * @param int $bargainId * @param $user + * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException @@ -938,6 +940,12 @@ class StoreBargainServices extends BaseServices } } catch (\Throwable $e) { } + } else { + if (sys_config('share_qrcode', 0) && request()->isWechat()) { + /** @var QrcodeServices $qrcodeService */ + $qrcodeService = app()->make(QrcodeServices::class); + $data['url'] = $qrcodeService->getTemporaryQrcode('bargain-' . $bargainId . '-' . $user['uid'], $user['uid'])->url; + } } return $data; } diff --git a/crmeb/app/services/activity/bargain/StoreBargainUserHelpServices.php b/crmeb/app/services/activity/bargain/StoreBargainUserHelpServices.php index 4658e8545..d46ec0016 100644 --- a/crmeb/app/services/activity/bargain/StoreBargainUserHelpServices.php +++ b/crmeb/app/services/activity/bargain/StoreBargainUserHelpServices.php @@ -17,7 +17,6 @@ use app\dao\activity\bargain\StoreBargainUserHelpDao; use app\services\user\UserServices; use crmeb\exceptions\AdminException; use crmeb\exceptions\ApiException; -use crmeb\traits\ServicesTrait; /** * @@ -29,8 +28,6 @@ use crmeb\traits\ServicesTrait; class StoreBargainUserHelpServices extends BaseServices { - use ServicesTrait; - /** * StoreBargainUserHelpServices constructor. * @param StoreBargainUserHelpDao $dao diff --git a/crmeb/app/services/activity/combination/StoreCombinationServices.php b/crmeb/app/services/activity/combination/StoreCombinationServices.php index 2737acba6..6c028eb71 100644 --- a/crmeb/app/services/activity/combination/StoreCombinationServices.php +++ b/crmeb/app/services/activity/combination/StoreCombinationServices.php @@ -386,9 +386,14 @@ class StoreCombinationServices extends BaseServices $storeInfo['userLike'] = false; $storeInfo['store_name'] = $storeInfo['title']; - /** @var QrcodeServices $qrcodeService */ - $qrcodeService = app()->make(QrcodeServices::class); - $storeInfo['code_base'] = $qrcodeService->getWechatQrcodePath($id . '_product_combination_detail_wap.jpg', '/pages/activity/goods_combination_details/index?id=' . $id); + if (sys_config('share_qrcode', 0) && request()->isWechat()) { + /** @var QrcodeServices $qrcodeService */ + $qrcodeService = app()->make(QrcodeServices::class); + $storeInfo['wechat_code'] = $qrcodeService->getTemporaryQrcode('combination-' . $id, $uid)->url; + } else { + $storeInfo['wechat_code'] = ''; + } + $data['storeInfo'] = get_thumb_water($storeInfo, 'big', ['image', 'images']); $storeInfoNew = get_thumb_water($storeInfo, 'small'); $data['storeInfo']['small_image'] = $storeInfoNew['image']; diff --git a/crmeb/app/services/activity/combination/StorePinkServices.php b/crmeb/app/services/activity/combination/StorePinkServices.php index f44ea67ec..21e076293 100644 --- a/crmeb/app/services/activity/combination/StorePinkServices.php +++ b/crmeb/app/services/activity/combination/StorePinkServices.php @@ -18,6 +18,7 @@ use app\services\BaseServices; use app\services\order\StoreOrderRefundServices; use app\services\order\StoreOrderServices; use app\services\other\PosterServices; +use app\services\other\QrcodeServices; use app\services\system\attachment\SystemAttachmentServices; use app\services\user\UserServices; use crmeb\exceptions\ApiException; @@ -465,7 +466,7 @@ class StorePinkServices extends BaseServices $number = (int)bcsub((string)$pink['people'], '1', 0); if ($number) CacheService::setStock(md5($pink['id']), $number, 3); - PinkJob::dispatchSece((int)(($product->effective_time * 3600) + 60), [$pink['id']]); + PinkJob::dispatchSecs((int)(($product->effective_time * 3600) + 60), [$pink['id']]); // 开团成功发送模板消息 event('notice.notice', [['orderInfo' => $orderInfo, 'title' => $product['title'], 'pink' => $pink], 'open_pink_success']); @@ -883,6 +884,12 @@ class StorePinkServices extends BaseServices $data['url'] = $url; if ($imageInfo['image_type'] == 1) $data['url'] = $siteUrl . $url; + } else { + if (sys_config('share_qrcode', 0) && request()->isWechat()) { + /** @var QrcodeServices $qrcodeService */ + $qrcodeService = app()->make(QrcodeServices::class); + $data['url'] = $qrcodeService->getTemporaryQrcode('pink-' . $id, $user['uid'])->url; + } } } catch (\Throwable $e) { } diff --git a/crmeb/app/services/activity/integral/StoreIntegralOrderServices.php b/crmeb/app/services/activity/integral/StoreIntegralOrderServices.php index 44670cd99..f34ddaf38 100644 --- a/crmeb/app/services/activity/integral/StoreIntegralOrderServices.php +++ b/crmeb/app/services/activity/integral/StoreIntegralOrderServices.php @@ -23,7 +23,6 @@ use crmeb\exceptions\AdminException; use crmeb\exceptions\ApiException; use crmeb\services\FormBuilder as Form; use crmeb\services\printer\Printer; -use crmeb\traits\ServicesTrait; /** * Class StoreIntegralOrderServices @@ -35,8 +34,6 @@ use crmeb\traits\ServicesTrait; class StoreIntegralOrderServices extends BaseServices { - use ServicesTrait; - /** * 发货类型 * @var string[] diff --git a/crmeb/app/services/activity/integral/StoreIntegralOrderStatusServices.php b/crmeb/app/services/activity/integral/StoreIntegralOrderStatusServices.php index f9295612f..0a22087c0 100644 --- a/crmeb/app/services/activity/integral/StoreIntegralOrderStatusServices.php +++ b/crmeb/app/services/activity/integral/StoreIntegralOrderStatusServices.php @@ -14,7 +14,6 @@ namespace app\services\activity\integral; use app\dao\activity\integral\StoreIntegralOrderStatusDao; use app\services\BaseServices; -use crmeb\traits\ServicesTrait; /** * 订单状态 @@ -23,7 +22,6 @@ use crmeb\traits\ServicesTrait; */ class StoreIntegralOrderStatusServices extends BaseServices { - use ServicesTrait; /** * 构造方法 diff --git a/crmeb/app/services/activity/live/LiveAnchorServices.php b/crmeb/app/services/activity/live/LiveAnchorServices.php index c7018e1ca..49c716732 100644 --- a/crmeb/app/services/activity/live/LiveAnchorServices.php +++ b/crmeb/app/services/activity/live/LiveAnchorServices.php @@ -162,7 +162,7 @@ class LiveAnchorServices extends BaseServices public function syncAnchor($is_job = false) { $key = md5('Live_sync_status'); - $res = CacheService::redisHandler()->get($key); + $res = CacheService::get($key); if (!$res || $is_job) { $start = 0; $limit = 30; @@ -187,8 +187,8 @@ class LiveAnchorServices extends BaseServices $this->dao->saveAll($dataAll); } //支付成功后发送消息 - if (!$is_job) LiveJob::dispatchSece(120); - CacheService::redisHandler()->set($key, 1, 0); + if (!$is_job) LiveJob::dispatchSecs(120); + CacheService::set($key, 1, 0); } return true; } diff --git a/crmeb/app/services/activity/lottery/LuckLotteryServices.php b/crmeb/app/services/activity/lottery/LuckLotteryServices.php index 037a9b98e..79f782bd2 100644 --- a/crmeb/app/services/activity/lottery/LuckLotteryServices.php +++ b/crmeb/app/services/activity/lottery/LuckLotteryServices.php @@ -589,8 +589,7 @@ class LuckLotteryServices extends BaseServices return true; } $key = 'user_' . $type . '_luck_lottery_' . $uid; - $cache = CacheService::redisHandler(); - return $cache->set($key, $lottery['factor_num'], 120); + return CacheService::set($key, $lottery['factor_num'], 120); } /** @@ -603,7 +602,7 @@ class LuckLotteryServices extends BaseServices public function getCacheLotteryNum(int $uid, string $type = 'order') { $key = 'user_' . $type . '_luck_lottery_' . $uid; - $num = CacheService::redisHandler()->get($key); + $num = CacheService::get($key); return empty($num) ? 0 : $num; } @@ -618,11 +617,10 @@ class LuckLotteryServices extends BaseServices { $key = 'user_' . $type . '_luck_lottery_' . $uid; $num = $this->getCacheLotteryNum($uid, $type); - $cache = CacheService::redisHandler(); if ($num > 1) { - $cache->set($key, $num - 1, 120); + CacheService::set($key, $num - 1, 120); } else { - $cache->delete($key); + CacheService::delete($key); } return true; } diff --git a/crmeb/app/services/activity/seckill/StoreSeckillServices.php b/crmeb/app/services/activity/seckill/StoreSeckillServices.php index f6bcc6209..560ea4655 100644 --- a/crmeb/app/services/activity/seckill/StoreSeckillServices.php +++ b/crmeb/app/services/activity/seckill/StoreSeckillServices.php @@ -478,9 +478,13 @@ class StoreSeckillServices extends BaseServices $productInfo = $storeProductService->get($storeInfo['product_id']); $storeInfo['total'] = $productInfo['sales'] + $productInfo['ficti']; - /** @var QrcodeServices $qrcodeService */ - $qrcodeService = app()->make(QrcodeServices::class); - $storeInfo['code_base'] = $qrcodeService->getWechatQrcodePath($id . '_' . $uid . '_product_seckill_detail_wap.jpg', '/pages/activity/goods_seckill_details/index?id=' . $id . '&spread=' . $uid); + if (sys_config('share_qrcode', 0) && request()->isWechat()) { + /** @var QrcodeServices $qrcodeService */ + $qrcodeService = app()->make(QrcodeServices::class); + $storeInfo['wechat_code'] = $qrcodeService->getTemporaryQrcode('seckill-' . $id, $uid)->url; + } else { + $storeInfo['wechat_code'] = ''; + } /** @var StoreOrderServices $storeOrderServices */ $storeOrderServices = app()->make(StoreOrderServices::class); @@ -513,7 +517,7 @@ class StoreSeckillServices extends BaseServices if ($storeInfo['status'] == 1) { if ($storeInfo['start_time'] > time()) { $storeInfo['status'] = 2; - } elseif ($storeInfo['stop_time'] < time()) { + } elseif (($storeInfo['stop_time'] + 86400) < time()) { $storeInfo['status'] = 0; } else { /** @var SystemGroupDataServices $systemGroupDataService */ @@ -612,7 +616,7 @@ class StoreSeckillServices extends BaseServices $cache = app()->make(CacheService::class); $res = true; if (!$isPush) { - $cache->del($name); + $cache->delete($name); } for ($i = 1; $i <= $number; $i++) { $res = $res && $cache->lPush($name, $i); @@ -689,7 +693,7 @@ class StoreSeckillServices extends BaseServices { /** @var CacheService $cache */ $cache = app()->make(CacheService::class); - return $cache->redisHandler()->lLen('seckill_' . $unique . '_' . $type) >= $number; + return $cache->lLen('seckill_' . $unique . '_' . $type) >= $number; } /** diff --git a/crmeb/app/services/agent/DivisionAgentApplyServices.php b/crmeb/app/services/agent/DivisionAgentApplyServices.php index cee03a280..899cfae58 100644 --- a/crmeb/app/services/agent/DivisionAgentApplyServices.php +++ b/crmeb/app/services/agent/DivisionAgentApplyServices.php @@ -14,6 +14,7 @@ use crmeb\exceptions\AdminException; use crmeb\exceptions\ApiException; use crmeb\services\FormBuilder as Form; use app\services\other\UploadService; +use think\facade\Log; use think\facade\Route; class DivisionAgentApplyServices extends BaseServices @@ -202,26 +203,32 @@ class DivisionAgentApplyServices extends BaseServices $item['orderCount'] = $item['pay_count']; $item['numberCount'] = $orderService->sum(['uid' => $item['uid']], 'pay_price'); } - /** @var SystemAttachmentServices $systemAttachment */ - $systemAttachment = app()->make(SystemAttachmentServices::class); - $name = 'agent_' . $where['agent_id'] . '.jpg'; - $siteUrl = sys_config('site_url', ''); - $imageInfo = $systemAttachment->getInfo(['name' => $name]); - if (!$imageInfo) { - /** @var QrcodeServices $qrCode */ - $qrCode = app()->make(QrcodeServices::class); - //公众号 - $resCode = $qrCode->getForeverQrcode('agent', $where['agent_id']); - if ($resCode) { - $res = ['res' => $resCode, 'id' => $resCode['id']]; - } else { - $res = false; + $codeUrl = ''; + try { + /** @var SystemAttachmentServices $systemAttachment */ + $systemAttachment = app()->make(SystemAttachmentServices::class); + $name = 'agent_' . $where['agent_id'] . '.jpg'; + $siteUrl = sys_config('site_url', ''); + $imageInfo = $systemAttachment->getInfo(['name' => $name]); + if (!$imageInfo) { + /** @var QrcodeServices $qrCode */ + $qrCode = app()->make(QrcodeServices::class); + //公众号 + $resCode = $qrCode->getForeverQrcode('agent', $where['agent_id']); + if ($resCode) { + $res = ['res' => $resCode, 'id' => $resCode['id']]; + } else { + $res = false; + } + if (!$res) throw new ApiException(410167); + $imageInfo = $this->downloadImage($resCode['url'], $name); + $systemAttachment->attachmentAdd($name, $imageInfo['size'], $imageInfo['type'], $imageInfo['att_dir'], $imageInfo['att_dir'], 1, $imageInfo['image_type'], time(), 2); } - if (!$res) throw new ApiException(410167); - $imageInfo = $this->downloadImage($resCode['url'], $name); - $systemAttachment->attachmentAdd($name, $imageInfo['size'], $imageInfo['type'], $imageInfo['att_dir'], $imageInfo['att_dir'], 1, $imageInfo['image_type'], time(), 2); + $codeUrl = strpos($imageInfo['att_dir'], 'http') === false ? $siteUrl . $imageInfo['att_dir'] : $imageInfo['att_dir']; + } catch (\Exception $e) { + Log::error('邀请员工二维码生成失败,失败原因' . $e->getMessage()); } - $codeUrl = strpos($imageInfo['att_dir'], 'http') === false ? $siteUrl . $imageInfo['att_dir'] : $imageInfo['att_dir']; + return compact('list', 'count', 'codeUrl'); } diff --git a/crmeb/app/services/diy/DiyServices.php b/crmeb/app/services/diy/DiyServices.php index 662e40d22..ee57e31ad 100644 --- a/crmeb/app/services/diy/DiyServices.php +++ b/crmeb/app/services/diy/DiyServices.php @@ -68,7 +68,7 @@ class DiyServices extends BaseServices * @param int $id * @param array $data */ - public function saveData(int $id = 0, array $data) + public function saveData(int $id = 0, array $data = []) { if ($id) { $data['update_time'] = time(); @@ -81,6 +81,11 @@ class DiyServices extends BaseServices if (!$res) throw new AdminException(100006); $id = $res->id; } + + $this->cacheDriver()->clear(); + $this->cacheDriver()->set('index_diy_' . $id, $data['version']); + $this->updateCacheDiyVersion(); + return $id; } @@ -95,6 +100,8 @@ class DiyServices extends BaseServices if ($count) throw new AdminException(400458); $res = $this->dao->update($id, ['is_del' => 1]); if (!$res) throw new AdminException(100008); + + $this->cacheDriver()->clear(); } /** @@ -106,6 +113,47 @@ class DiyServices extends BaseServices $this->dao->update(['is_diy' => 1], ['is_show' => 1, 'type' => 2]); $this->dao->update([['id', '<>', $id]], ['status' => 0]); $this->dao->update($id, ['status' => 1, 'update_time' => time()]); + + $this->cacheDriver()->clear(); + $this->updateCacheDiyVersion(); + } + + /** + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function updateCacheDiyVersion() + { + $diyInfo = $this->dao->get(['status' => 1, 'is_del' => 0], ['id', 'version']); + if (!$diyInfo) { + $this->cacheDriver()->delete('index_diy_default'); + } else { + $this->cacheDriver()->set('index_diy_default', $diyInfo['version']); + } + } + + /** + * @param int $id + * @return mixed|string|null + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function getDiyVersion(int $id) + { + if ($id) { + return $this->cacheDriver()->remember('index_diy_' . $id, function () use ($id) { + return $this->dao->value(['id' => $id], 'version'); + }); + } else { + return $this->cacheDriver()->remember('index_diy_default', function () { + return $this->dao->value(['status' => 1, 'is_del' => 0], 'version'); + }); + } } /** @@ -119,13 +167,17 @@ class DiyServices extends BaseServices public function getDiy($id = 0) { $field = 'name,value,is_show,is_bg_color,color_picker,bg_pic,bg_tab_val,is_bg_pic,order_status,is_diy,title'; - if ($id) { - $info = $this->dao->getOne(['id' => $id], $field); - } else { - $info = $this->dao->getOne(['status' => 1, 'is_del' => 0], $field); - } + + $info = $this->cacheDriver()->remember('diy_info_' . $id, function () use ($field, $id) { + if ($id) { + $info = $this->dao->getOne(['id' => $id], $field); + } else { + $info = $this->dao->getOne(['status' => 1, 'is_del' => 0], $field); + } + return $info ? $info->toArray() : []; + }); + if ($info) { - $info = $info->toArray(); if ($info['value']) { $info['value'] = json_decode($info['value'], true); if ($info['is_diy']) { @@ -345,10 +397,14 @@ class DiyServices extends BaseServices */ public function getNavigation(string $template_name) { - $value = $this->dao->value(['status' => 1], 'value'); - if (!$value) { - $value = $this->dao->value(['template_name' => 'default'], 'value'); - } + $value = $this->cacheDriver()->remember('navigation', function () { + $value = $this->dao->value(['status' => 1], 'value'); + if (!$value) { + $value = $this->dao->value(['template_name' => 'default'], 'value'); + } + return $value; + }); + $navigation = []; if ($value) { $value = json_decode($value, true); diff --git a/crmeb/app/services/diy/PageCategoryServices.php b/crmeb/app/services/diy/PageCategoryServices.php index 8665d99fc..694e09eb4 100644 --- a/crmeb/app/services/diy/PageCategoryServices.php +++ b/crmeb/app/services/diy/PageCategoryServices.php @@ -41,7 +41,7 @@ class PageCategoryServices extends BaseServices */ public function getCategroyList() { - return CacheService::get($this->tree_page_category_key, function () { + return CacheService::remember($this->tree_page_category_key, function () { return $this->getSonCategoryList(); }, 86400); } diff --git a/crmeb/app/services/kefu/LoginServices.php b/crmeb/app/services/kefu/LoginServices.php index b9c02149b..cab536969 100644 --- a/crmeb/app/services/kefu/LoginServices.php +++ b/crmeb/app/services/kefu/LoginServices.php @@ -88,17 +88,12 @@ class LoginServices extends BaseServices $cacheService = app()->make(CacheService::class); //检测token是否过期 $md5Token = md5($token); - if (!$token || !$cacheService->hasToken($md5Token) || !($cacheToken = $cacheService->getTokenBucket($md5Token))) { + if (!$token || !$cacheService->has($md5Token) || !($cacheService->get($md5Token, '', NULL, 'kefu'))) { throw new AuthException(110005); } if ($token === 'undefined') { throw new AuthException(110005); } - //是否超出有效次数 - if (isset($cacheToken['invalidNum']) && $cacheToken['invalidNum'] >= 3) { - $cacheService->clearToken($md5Token); - throw new AuthException(110006); - } /** @var JwtAuth $jwtAuth */ $jwtAuth = app()->make(JwtAuth::class); @@ -108,19 +103,15 @@ class LoginServices extends BaseServices //验证token try { $jwtAuth->verifyToken(); - $cacheService->setTokenBucket($md5Token, $cacheToken, $cacheToken['exp']); - } catch (ExpiredException $e) { - $cacheToken['invalidNum'] = isset($cacheToken['invalidNum']) ? $cacheToken['invalidNum']++ : 1; - $cacheService->setTokenBucket($md5Token, $cacheToken, $cacheToken['exp']); } catch (\Throwable $e) { - $noCli && $cacheService->clearToken($md5Token); + $noCli && $cacheService->delete($md5Token); throw new AuthException(110006); } //获取管理员信息 $adminInfo = $this->dao->get($id); if (!$adminInfo || !$adminInfo->id) { - $noCli && $cacheService->clearToken($md5Token); + $noCli && $cacheService->delete($md5Token); throw new AuthException(110007); } diff --git a/crmeb/app/services/kefu/UserServices.php b/crmeb/app/services/kefu/UserServices.php index fe98eac0b..d2a1c28c1 100644 --- a/crmeb/app/services/kefu/UserServices.php +++ b/crmeb/app/services/kefu/UserServices.php @@ -15,7 +15,6 @@ namespace app\services\kefu; use app\dao\user\UserDao; use app\services\BaseServices; use crmeb\exceptions\ApiException; -use crmeb\traits\ServicesTrait; use app\services\user\UserLabelServices; use app\services\system\SystemUserLevelServices; use app\services\user\UserLabelRelationServices; @@ -27,7 +26,6 @@ use app\services\kefu\service\StoreServiceRecordServices; */ class UserServices extends BaseServices { - use ServicesTrait; /** * UserServices constructor. diff --git a/crmeb/app/services/kefu/service/StoreServiceFeedbackServices.php b/crmeb/app/services/kefu/service/StoreServiceFeedbackServices.php index 5a1f528e7..23fe73a88 100644 --- a/crmeb/app/services/kefu/service/StoreServiceFeedbackServices.php +++ b/crmeb/app/services/kefu/service/StoreServiceFeedbackServices.php @@ -16,7 +16,6 @@ use app\dao\service\StoreServiceFeedbackDao; use app\services\BaseServices; use crmeb\exceptions\AdminException; use crmeb\services\FormBuilder; -use crmeb\traits\ServicesTrait; /** * 客服反馈 @@ -26,8 +25,6 @@ use crmeb\traits\ServicesTrait; class StoreServiceFeedbackServices extends BaseServices { - use ServicesTrait; - /** * StoreServiceFeedbackServices constructor. * @param StoreServiceFeedbackDao $dao diff --git a/crmeb/app/services/kefu/service/StoreServiceRecordServices.php b/crmeb/app/services/kefu/service/StoreServiceRecordServices.php index 3cbe158c0..b885ad743 100644 --- a/crmeb/app/services/kefu/service/StoreServiceRecordServices.php +++ b/crmeb/app/services/kefu/service/StoreServiceRecordServices.php @@ -14,7 +14,6 @@ namespace app\services\kefu\service; use app\dao\service\StoreServiceRecordDao; use app\services\BaseServices; -use crmeb\traits\ServicesTrait; use crmeb\utils\Str; use think\Model; @@ -26,8 +25,6 @@ use think\Model; class StoreServiceRecordServices extends BaseServices { - use ServicesTrait; - /** * StoreServiceRecordServices constructor. * @param StoreServiceRecordDao $dao diff --git a/crmeb/app/services/kefu/service/StoreServiceServices.php b/crmeb/app/services/kefu/service/StoreServiceServices.php index 6af5290bd..dd61870bd 100644 --- a/crmeb/app/services/kefu/service/StoreServiceServices.php +++ b/crmeb/app/services/kefu/service/StoreServiceServices.php @@ -17,7 +17,6 @@ use app\services\user\UserServices; use crmeb\exceptions\AdminException; use crmeb\exceptions\ApiException; use crmeb\services\FormBuilder; -use crmeb\traits\ServicesTrait; /** * 客服 @@ -27,7 +26,6 @@ use crmeb\traits\ServicesTrait; */ class StoreServiceServices extends BaseServices { - use ServicesTrait; /** * 创建form表单 diff --git a/crmeb/app/services/message/NoticeService.php b/crmeb/app/services/message/NoticeService.php index b3996587b..753ad3fbd 100644 --- a/crmeb/app/services/message/NoticeService.php +++ b/crmeb/app/services/message/NoticeService.php @@ -11,12 +11,7 @@ namespace app\services\message; - -use app\jobs\notice\EnterpriseWechatJob; -use app\jobs\notice\PrintJob; use app\services\BaseServices; -use app\services\order\StoreOrderCartInfoServices; -use crmeb\exceptions\AdminException; use crmeb\services\CacheService; /** @@ -25,31 +20,13 @@ use crmeb\services\CacheService; */ class NoticeService extends BaseServices { - - /** - * 发送消息类型 - * @var array - */ -// protected $type = [ -// 'is_sms' => SmsService::class, -// 'is_system' => SystemSendServices::class, -// 'is_wechat' => WechatTemplateService::class, -// 'is_routine' => RoutineTemplateServices::class, -// 'is_ent_wechat' => EntWechatServices::class, -// ]; - - /** - * @var array - */ - protected $notceinfo; - - /** - * @var string - */ + protected $noticeInfo; protected $event; /** + * 设置 * @param string $event + * @return $this * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException @@ -57,58 +34,16 @@ class NoticeService extends BaseServices public function setEvent(string $event) { if ($this->event != $event) { - $this->notceinfo = CacheService::get('NOTCE_' . $event); - if (!$this->notceinfo) { + $this->noticeInfo = CacheService::get('NOTICE_' . $event); + if (!$this->noticeInfo) { /** @var SystemNotificationServices $services */ $services = app()->make(SystemNotificationServices::class); - $notceinfo = $services->getOneNotce(['mark' => $event]); - $this->notceinfo = $notceinfo ? $notceinfo->toArray() : []; - CacheService::set('NOTCE_' . $event, $this->notceinfo); + $noticeInfo = $services->getOneNotce(['mark' => $event]); + $this->noticeInfo = $noticeInfo ? $noticeInfo->toArray() : []; + CacheService::set('NOTICE_' . $event, $this->noticeInfo); } $this->event = $event; } return $this; } - - /** - * 打印订单 - * @param $order - * @param array $cartId - */ - public function orderPrint($order) - { - /** @var StoreOrderCartInfoServices $cartServices */ - $cartServices = app()->make(StoreOrderCartInfoServices::class); - $product = $cartServices->getCartInfoPrintProduct($order['id']); - if (!$product) { - throw new AdminException(400463); - } - $switch = (bool)sys_config('pay_success_printing_switch'); - if (!$switch) { - throw new AdminException(400464); - } - if (sys_config('print_type', 1) == 1) { - $name = 'yi_lian_yun'; - $configData = [ - 'clientId' => sys_config('printing_client_id', ''), - 'apiKey' => sys_config('printing_api_key', ''), - 'partner' => sys_config('develop_id', ''), - 'terminal' => sys_config('terminal_number', '') - ]; - if (!$configData['clientId'] || !$configData['apiKey'] || !$configData['partner'] || !$configData['terminal']) { - throw new AdminException(400465); - } - } else { - $name = 'fei_e_yun'; - $configData = [ - 'feyUser' => sys_config('fey_user', ''), - 'feyUkey' => sys_config('fey_ukey', ''), - 'feySn' => sys_config('fey_sn', '') - ]; - if (!$configData['feyUser'] || !$configData['feyUkey'] || !$configData['feySn']) { - throw new AdminException(400465); - } - } - PrintJob::dispatch('doJob', [$name, $configData, $order, $product]); - } } diff --git a/crmeb/app/services/message/notice/EnterpriseWechatService.php b/crmeb/app/services/message/notice/EnterpriseWechatService.php index 37a2c62d9..db76734f5 100644 --- a/crmeb/app/services/message/notice/EnterpriseWechatService.php +++ b/crmeb/app/services/message/notice/EnterpriseWechatService.php @@ -11,11 +11,11 @@ namespace app\services\message\notice; -use app\services\message\NoticeService; use app\jobs\notice\EnterpriseWechatJob; +use app\services\message\NoticeService; +use crmeb\services\HttpService; use think\facade\Log; - /** * 企业微信发送消息 * Created by PhpStorm. @@ -24,12 +24,11 @@ use think\facade\Log; */ class EnterpriseWechatService extends NoticeService { - /** * 判断是否开启权限 * @var bool */ - private $isopend = true; + private $isOpen = true; /** * 是否开启权限 @@ -38,30 +37,39 @@ class EnterpriseWechatService extends NoticeService */ public function isOpen(string $mark) { - $this->isopend = $this->notceinfo['is_ent_wechat'] == 1 && $this->notceinfo['url'] !== ''; + $this->isOpen = $this->noticeInfo['is_ent_wechat'] == 1 && $this->noticeInfo['url'] !== ''; return $this; } - /** - * 发送消息 - * @param $uid uid - * @param array $data 模板内容 + * 发送企业微信客服消息 + * @param $data */ - public function sendMsg($data) + public function weComSend($data) { - try { - if ($this->isopend) { - $url = $this->notceinfo['url']; - $ent_wechat_text = $this->notceinfo['ent_wechat_text']; - EnterpriseWechatJob::dispatchDo('doJob', [$data, $url, $ent_wechat_text]); + if ($this->isOpen) { + $url = $this->noticeInfo['url']; + $ent_wechat_text = $this->noticeInfo['ent_wechat_text']; + try { + $str = $ent_wechat_text; + foreach ($data as $key => $item) { + $str = str_replace('{' . $key . '}', $item, $str); + } + $s = explode('\n', $str); + $d = ''; + foreach ($s as $item) { + $d .= $item . "\n>"; + } + $d = substr($d, 0, strlen($d) - 2); + HttpService::postRequest($url, json_encode([ + 'msgtype' => 'markdown', + 'markdown' => ['content' => $d] + ])); + } catch (\Throwable $e) { + Log::error('发送企业群消息失败,失败原因:' . $e->getMessage()); + } - } catch (\Exception $e) { - Log::error($e->getMessage()); - return true; } } - - } diff --git a/crmeb/app/services/message/notice/RoutineTemplateListService.php b/crmeb/app/services/message/notice/RoutineTemplateListService.php index 070161d7f..11ed84e83 100644 --- a/crmeb/app/services/message/notice/RoutineTemplateListService.php +++ b/crmeb/app/services/message/notice/RoutineTemplateListService.php @@ -29,7 +29,7 @@ class RoutineTemplateListService extends NoticeService * 判断是否开启权限 * @var bool */ - private $isopend = true; + private $isOpen = true; /** * 是否开启权限 @@ -38,7 +38,7 @@ class RoutineTemplateListService extends NoticeService */ public function isOpen(string $mark) { - $this->isopend = $this->notceinfo['is_routine'] === 1; + $this->isOpen = $this->noticeInfo['is_routine'] === 1; return $this; } @@ -66,11 +66,11 @@ class RoutineTemplateListService extends NoticeService public function sendTemplate(int $uid, array $data, string $link = null, string $color = null) { try { - $this->isopend = $this->notceinfo['is_routine'] === 1; - if ($this->isopend) { + $this->isOpen = $this->noticeInfo['is_routine'] === 1; + if ($this->isOpen) { $openid = $this->getOpenidByUid($uid); //放入队列执行 - TemplateJob::dispatchDo('doJob', ['subscribe', $openid, $this->notceinfo['mark'], $data, $link, $color]); + TemplateJob::dispatch('doJob', ['subscribe', $openid, $this->noticeInfo['mark'], $data, $link, $color]); } } catch (\Exception $e) { Log::error($e->getMessage()); diff --git a/crmeb/app/services/message/notice/SmsService.php b/crmeb/app/services/message/notice/SmsService.php index c4a24252b..dce309e41 100644 --- a/crmeb/app/services/message/notice/SmsService.php +++ b/crmeb/app/services/message/notice/SmsService.php @@ -34,7 +34,7 @@ class SmsService extends NoticeService * 判断是否开启权限 * @var bool */ - private $isopend = true; + private $isOpen = true; /** * 短信类型 @@ -49,7 +49,7 @@ class SmsService extends NoticeService */ public function isOpen(string $mark) { - $this->isopend = $this->notceinfo['is_sms'] === 1; + $this->isOpen = $this->noticeInfo['is_sms'] === 1; return $this; } @@ -63,10 +63,18 @@ class SmsService extends NoticeService public function sendSms($phone, array $data) { try { - $this->isopend = $this->notceinfo['is_sms'] === 1; - $mark = $this->notceinfo['mark']; - if ($this->isopend) { - SmsJob::dispatch('doJob', [$phone, $data, $mark]); + $this->isOpen = $this->noticeInfo['is_sms'] === 1; + $mark = $this->noticeInfo['mark']; + if ($this->isOpen) { + try{ + /** @var SmsService $smsServices */ + $smsServices = app()->make(SmsService::class); + $smsServices->send(true, $phone, $data, $mark); + return true; + }catch (\Throwable $e) { + Log::error('发送短信失败,失败原因:' . $e->getMessage()); + } + //SmsJob::dispatch('doJob', [$phone, $data, $mark]); } } catch (\Exception $e) { Log::error($e->getMessage()); @@ -107,7 +115,6 @@ class SmsService extends NoticeService if ($res === false) { throw new ApiException($smsMake->getError()); } - TaskJob::dispatchDo('modifyResultCode'); return true; } else { return false; diff --git a/crmeb/app/services/message/notice/SystemMsgService.php b/crmeb/app/services/message/notice/SystemMsgService.php index 9952d783f..44bd907c4 100644 --- a/crmeb/app/services/message/notice/SystemMsgService.php +++ b/crmeb/app/services/message/notice/SystemMsgService.php @@ -29,7 +29,7 @@ class SystemMsgService extends NoticeService * 判断是否开启权限 * @var bool */ - private $isopend = true; + private $isOpen = true; /** * 是否开启权限 @@ -38,7 +38,7 @@ class SystemMsgService extends NoticeService */ public function isOpen(string $mark) { - $this->isopend = $this->notceinfo['is_system'] === 1; + $this->isOpen = $this->noticeInfo['is_system'] === 1; return $this; } @@ -51,17 +51,17 @@ class SystemMsgService extends NoticeService */ public function sendMsg(int $uid, $data) { - $this->isopend = $this->notceinfo['is_system'] === 1; + $this->isOpen = $this->noticeInfo['is_system'] === 1; try { - if ($this->isopend) { - $title = $this->notceinfo['system_title']; - $str = $this->notceinfo['system_text']; + if ($this->isOpen) { + $title = $this->noticeInfo['system_title']; + $str = $this->noticeInfo['system_text']; foreach ($data as $key => $item) { $str = str_replace('{' . $key . '}', $item, $str); $title = str_replace('{' . $key . '}', $item, $title); } $sdata = []; - $sdata['mark'] = $this->notceinfo['mark']; + $sdata['mark'] = $this->noticeInfo['mark']; $sdata['uid'] = $uid; $sdata['content'] = $str; $sdata['title'] = $title; @@ -91,16 +91,16 @@ class SystemMsgService extends NoticeService $StoreServiceServices = app()->make(StoreServiceServices::class); $adminList = $StoreServiceServices->getStoreServiceOrderNotice(); try { - if ($this->isopend) { + if ($this->isOpen) { $save = []; - $title = $this->notceinfo['system_title']; - $str = $this->notceinfo['system_text']; + $title = $this->noticeInfo['system_title']; + $str = $this->noticeInfo['system_text']; foreach ($data as $k => $val) { $str = str_replace('{' . $k . '}', $val, $str); $title = str_replace('{' . $k . '}', $val, $title); } foreach ($adminList as $key => $item) { - $save[$key]['mark'] = $this->notceinfo['mark']; + $save[$key]['mark'] = $this->noticeInfo['mark']; $save[$key]['uid'] = $item['uid']; $save[$key]['content'] = $str; $save[$key]['title'] = $title; diff --git a/crmeb/app/services/message/notice/WechatTemplateListService.php b/crmeb/app/services/message/notice/WechatTemplateListService.php index 8d9449ba5..b5d5e4635 100644 --- a/crmeb/app/services/message/notice/WechatTemplateListService.php +++ b/crmeb/app/services/message/notice/WechatTemplateListService.php @@ -31,7 +31,7 @@ class WechatTemplateListService extends NoticeService * 判断是否开启权限 * @var bool */ - private $isopend = true; + private $isOpen = true; /** * 是否开启权限 @@ -40,7 +40,7 @@ class WechatTemplateListService extends NoticeService */ public function isOpen(string $mark) { - $this->isopend = $this->notceinfo['is_wechat'] === 1; + $this->isOpen = $this->noticeInfo['is_wechat'] === 1; return $this; } @@ -68,11 +68,11 @@ class WechatTemplateListService extends NoticeService public function sendTemplate(int $uid, array $data, string $link = null, string $color = null) { try { - $this->isopend = $this->notceinfo['is_wechat'] === 1; - if ($this->isopend) { + $this->isOpen = $this->noticeInfo['is_wechat'] === 1; + if ($this->isOpen) { $openid = $this->getOpenidByUid($uid); //放入队列执行 - TemplateJob::dispatchDo('doJob', ['wechat', $openid, $this->notceinfo['mark'], $data, $link, $color]); + TemplateJob::dispatch('doJob', ['wechat', $openid, $this->noticeInfo['mark'], $data, $link, $color]); } } catch (\Exception $e) { Log::error($e->getMessage()); diff --git a/crmeb/app/services/message/wechat/MessageServices.php b/crmeb/app/services/message/wechat/MessageServices.php index d4d797d8f..743a6fe05 100644 --- a/crmeb/app/services/message/wechat/MessageServices.php +++ b/crmeb/app/services/message/wechat/MessageServices.php @@ -12,13 +12,19 @@ namespace app\services\message\wechat; +use app\services\activity\bargain\StoreBargainServices; +use app\services\activity\combination\StoreCombinationServices; +use app\services\activity\combination\StorePinkServices; +use app\services\activity\seckill\StoreSeckillServices; use app\services\BaseServices; use app\services\other\QrcodeServices; +use app\services\product\product\StoreProductServices; use app\services\user\LoginServices; use app\services\user\UserServices; use app\services\wechat\WechatQrcodeServices; use app\services\wechat\WechatReplyServices; use app\services\wechat\WechatUserServices; +use crmeb\services\app\WechatService; use think\facade\Log; class MessageServices extends BaseServices @@ -44,73 +50,162 @@ class MessageServices extends BaseServices $response = $wechatReplyService->reply('subscribe'); if ($message->EventKey && ($qrInfo = $qrcodeService->getQrcode($message->Ticket, 'ticket'))) { $qrcodeService->scanQrcode($message->Ticket, 'ticket'); - if (strtolower($qrInfo['third_type']) == 'spread') { - try { - $spreadUid = $qrInfo['third_id']; - $is_new = $wechatUser->saveUser($message->FromUserName); - $uid = $wechatUser->getFieldValue($message->FromUserName, 'openid', 'uid', ['user_type', '<>', 'h5']); - $userInfo = $userService->get($uid); - if ($spreadUid == $uid) { - $response = '自己不能推荐自己'; - } else if (!$userInfo) { - $response = '用户不存在'; - } else if ($userInfo['spread_uid']) { - $response = '已有推荐人!'; - } else if (!$loginService->updateUserInfo(['code' => $spreadUid], $userInfo, $is_new)) { - $response = '绑定推荐人失败!'; + $thirdType = explode('-', $qrInfo['third_type']); + $baseUrl = sys_config('site_url'); + if (in_array(strtolower($thirdType[0]), ['spread', 'agent', 'wechatqrcode', 'product', 'combination', 'seckill', 'bargain', 'pink'])) { + //扫码需要生成用户流程 + $spreadUid = $qrInfo['third_id']; + $spreadInfo = $userService->get($spreadUid); + $is_new = $wechatUser->saveUser($message->FromUserName); + $uid = $wechatUser->getFieldValue($message->FromUserName, 'openid', 'uid', ['user_type', '<>', 'h5']); + $userInfo = $userService->get($uid); + if (strtolower($thirdType[0]) == 'spread') { + try { + if ($spreadUid == $uid) { + $response = '自己不能推荐自己'; + } else if (!$userInfo) { + $response = '用户不存在'; + } else if (!$spreadInfo) { + $response = '上级用户不存在'; + } else if ($userInfo['spread_uid']) { + $response = '已有推荐人!'; + } else if (!$loginService->updateUserInfo(['code' => $spreadUid], $userInfo, $is_new)) { + $response = '绑定推荐人失败!'; + } + $wechatNews['title'] = sys_config('site_name'); + $wechatNews['image'] = sys_config('wap_login_logo'); + $wechatNews['url'] = $baseUrl . '/pages/index/index'; + $loginService->updateUserInfo(['code' => $spreadUid], $userInfo, $is_new); + $messages = WechatService::newsMessage($wechatNews); + WechatService::staffService()->message($messages)->to($message->FromUserName)->send(); + } catch (\Exception $e) { + $response = $e->getMessage(); } - } catch (\Exception $e) { - $response = $e->getMessage(); - } - } elseif (strtolower($qrInfo['third_type']) == 'agent') { - try { - $spreadUid = $qrInfo['third_id']; - $spreadInfo = $userService->get($spreadUid); - $is_new = $wechatUser->saveUser($message->FromUserName); - $uid = $wechatUser->getFieldValue($message->FromUserName, 'openid', 'uid', ['user_type', '<>', 'h5']); - $userInfo = $userService->get($uid); - if ($spreadUid == $uid) { - $response = '自己不能推荐自己'; - } else if (!$userInfo) { - $response = '用户不存在'; - } else if (!$spreadInfo) { - $response = '上级用户不存在'; - } else if ($userInfo->is_division) { - $response = '您是事业部,不能绑定成为别人的员工'; - } else if ($userInfo->is_agent) { - $response = '您是代理商,不能绑定成为别人的员工'; - } else if ($loginService->updateUserInfo(['code' => $spreadUid, 'is_staff' => 1], $userInfo, $is_new)) { - $response = '绑定店员成功!'; + } elseif (strtolower($thirdType[0]) == 'agent') { + try { + if ($spreadUid == $uid) { + $response = '自己不能推荐自己'; + } else if (!$userInfo) { + $response = '用户不存在'; + } else if (!$spreadInfo) { + $response = '上级用户不存在'; + } else if ($userInfo->is_division) { + $response = '您是事业部,不能绑定成为别人的员工'; + } else if ($userInfo->is_agent) { + $response = '您是代理商,不能绑定成为别人的员工'; + } else if ($loginService->updateUserInfo(['code' => $spreadUid, 'is_staff' => 1], $userInfo, $is_new)) { + $response = '绑定店员成功!'; + } + } catch (\Exception $e) { + $response = $e->getMessage(); } - } catch (\Exception $e) { - $response = $e->getMessage(); - } - } elseif (strtolower($qrInfo['third_type']) == 'wechatqrcode') { - /** @var WechatQrcodeServices $wechatQrcodeService */ - $wechatQrcodeService = app()->make(WechatQrcodeServices::class); - try { - //wechatqrcode类型的二维码数据中,third_id为渠道码的id - $qrcodeInfo = $wechatQrcodeService->qrcodeInfo($qrInfo['third_id']); - $spreadUid = $qrcodeInfo['uid']; - $spreadInfo = $userService->get($spreadUid); - $is_new = $wechatUser->saveUser($message->FromUserName); - $uid = $wechatUser->getFieldValue($message->FromUserName, 'openid', 'uid', ['user_type', '<>', 'h5']); - $userInfo = $userService->get($uid); - if ($qrcodeInfo['status'] == 0 || $qrcodeInfo['is_del'] == 1 || ($qrcodeInfo['end_time'] < time() && $qrcodeInfo['end_time'] > 0)) { - $response = '二维码已失效'; - } else if ($spreadUid == $uid) { - $response = '自己不能推荐自己'; - } else if (!$userInfo) { - $response = '用户不存在'; - } else if (!$spreadInfo) { - $response = '上级用户不存在'; - } else if ($loginService->updateUserInfo(['code' => $spreadUid], $userInfo, $is_new)) { - //写入扫码记录,返回内容 - $response = $wechatQrcodeService->wechatQrcodeRecord($qrcodeInfo, $userInfo, $spreadInfo); + } elseif (strtolower($thirdType[0]) == 'wechatqrcode') { + /** @var WechatQrcodeServices $wechatQrcodeService */ + $wechatQrcodeService = app()->make(WechatQrcodeServices::class); + try { + //wechatqrcode类型的二维码数据中,third_id为渠道码的id + $qrcodeInfo = $wechatQrcodeService->qrcodeInfo($qrInfo['third_id']); + $spreadUid = $qrcodeInfo['uid']; + $spreadInfo = $userService->get($spreadUid); + $is_new = $wechatUser->saveUser($message->FromUserName); + $uid = $wechatUser->getFieldValue($message->FromUserName, 'openid', 'uid', ['user_type', '<>', 'h5']); + $userInfo = $userService->get($uid); + if ($qrcodeInfo['status'] == 0 || $qrcodeInfo['is_del'] == 1 || ($qrcodeInfo['end_time'] < time() && $qrcodeInfo['end_time'] > 0)) { + $response = '二维码已失效'; + } else if ($spreadUid == $uid) { + $response = '自己不能推荐自己'; + } else if (!$userInfo) { + $response = '用户不存在'; + } else if (!$spreadInfo) { + $response = '上级用户不存在'; + } else if ($loginService->updateUserInfo(['code' => $spreadUid], $userInfo, $is_new)) { + //写入扫码记录,返回内容 + $response = $wechatQrcodeService->wechatQrcodeRecord($qrcodeInfo, $userInfo, $spreadInfo); + } + } catch (\Exception $e) { + $response = $e->getMessage(); + } + } elseif (strtolower($thirdType[0]) == 'product') { + try { + /** @var StoreProductServices $productService */ + $productService = app()->make(StoreProductServices::class); + $productInfo = $productService->get($thirdType[1] ?? 0); + $wechatNews['title'] = $productInfo->store_name; + $wechatNews['image'] = $productInfo->image; + $wechatNews['description'] = $productInfo->store_info; + $wechatNews['url'] = $baseUrl . '/pages/goods_details/index?id=' . $thirdType[1]; + $loginService->updateUserInfo(['code' => $spreadUid], $userInfo, $is_new); + $messages = WechatService::newsMessage($wechatNews); + WechatService::staffService()->message($messages)->to($message->FromUserName)->send(); + } catch (\Exception $e) { + $response = $e->getMessage(); + } + } elseif (strtolower($thirdType[0]) == 'combination') { + try { + /** @var StoreCombinationServices $combinationService */ + $combinationService = app()->make(StoreCombinationServices::class); + $productInfo = $combinationService->get($thirdType[1] ?? 0); + $wechatNews['title'] = $productInfo->title; + $wechatNews['image'] = $productInfo->image; + $wechatNews['description'] = $productInfo->info; + $wechatNews['url'] = $baseUrl . '/pages/activity/goods_combination_details/index?id=' . $thirdType[1]; + $loginService->updateUserInfo(['code' => $spreadUid], $userInfo, $is_new); + $messages = WechatService::newsMessage($wechatNews); + WechatService::staffService()->message($messages)->to($message->FromUserName)->send(); + } catch (\Exception $e) { + $response = $e->getMessage(); + } + } elseif (strtolower($thirdType[0]) == 'seckill') { + try { + /** @var StoreSeckillServices $seckillService */ + $seckillService = app()->make(StoreSeckillServices::class); + $productInfo = $seckillService->get($thirdType[1] ?? 0); + $wechatNews['title'] = $productInfo->title; + $wechatNews['image'] = $productInfo->image; + $wechatNews['description'] = $productInfo->info; + $wechatNews['url'] = $baseUrl . '/pages/activity/goods_seckill_details/index?id=' . $thirdType[1]; + $loginService->updateUserInfo(['code' => $spreadUid], $userInfo, $is_new); + $messages = WechatService::newsMessage($wechatNews); + WechatService::staffService()->message($messages)->to($message->FromUserName)->send(); + } catch (\Exception $e) { + $response = $e->getMessage(); + } + } elseif (strtolower($thirdType[0]) == 'bargain') { + try { + /** @var StoreBargainServices $bargainService */ + $bargainService = app()->make(StoreBargainServices::class); + $productInfo = $bargainService->get($thirdType[1] ?? 0); + $wechatNews['title'] = $productInfo->title; + $wechatNews['image'] = $productInfo->image; + $wechatNews['description'] = $productInfo->info; + $wechatNews['url'] = $baseUrl . '/pages/activity/goods_bargain_details/index?id=' . $thirdType[1] . '&bargain=' . $thirdType[2]; + $loginService->updateUserInfo(['code' => $spreadUid], $userInfo, $is_new); + $messages = WechatService::newsMessage($wechatNews); + WechatService::staffService()->message($messages)->to($message->FromUserName)->send(); + } catch (\Exception $e) { + $response = $e->getMessage(); + } + } elseif (strtolower($thirdType[0]) == 'pink') { + try { + /** @var StorePinkServices $pinkService */ + $pinkService = app()->make(StorePinkServices::class); + /** @var StoreCombinationServices $combinationService */ + $combinationService = app()->make(StoreCombinationServices::class); + $pinktInfo = $pinkService->get($thirdType[1]); + $productInfo = $combinationService->get($pinktInfo->cid); + $wechatNews['title'] = $productInfo->title; + $wechatNews['image'] = $productInfo->image; + $wechatNews['description'] = $productInfo->info; + $wechatNews['url'] = $baseUrl . '/pages/activity/goods_combination_status/index?id=' . $thirdType[1]; + $loginService->updateUserInfo(['code' => $spreadUid], $userInfo, $is_new); + $messages = WechatService::newsMessage($wechatNews); + WechatService::staffService()->message($messages)->to($message->FromUserName)->send(); + } catch (\Exception $e) { + $response = $e->getMessage(); } - } catch (\Exception $e) { - $response = $e->getMessage(); } + } else { + //扫码不生成用户流程 } } return $response; @@ -185,7 +280,7 @@ class MessageServices extends BaseServices $response = '您是事业部,不能绑定成为别人的员工'; } else if ($userInfo->is_agent) { $response = '您是代理商,不能绑定成为别人的员工'; - } else if ($loginService->updateUserInfo(['code' => $spreadUid, 'is_staff' => 1, ], $userInfo, $is_new)) { + } else if ($loginService->updateUserInfo(['code' => $spreadUid, 'is_staff' => 1], $userInfo, $is_new)) { $response = '绑定店员成功!'; } } catch (\Exception $e) { diff --git a/crmeb/app/services/order/OtherOrderServices.php b/crmeb/app/services/order/OtherOrderServices.php index 6571a1594..7fc53bd0d 100644 --- a/crmeb/app/services/order/OtherOrderServices.php +++ b/crmeb/app/services/order/OtherOrderServices.php @@ -18,6 +18,7 @@ use app\services\pay\PayServices; use app\services\statistic\CapitalFlowServices; use app\services\user\member\MemberShipServices; use app\services\user\UserBillServices; +use app\services\user\UserBrokerageServices; use app\services\user\UserServices; use app\services\user\member\MemberCardServices; use crmeb\exceptions\ApiException; @@ -335,9 +336,52 @@ class OtherOrderServices extends BaseServices $capitalFlowServices->setFlow($orderInfo, $type); } $res = $res1 && $res2 && $res3 && $res4; + + //购买付费会员返佣设置 + if (sys_config('member_brokerage', 0) == 1 && sys_config('brokerage_func_status', 0) == 1) { + $spread_one = sys_config('is_self_brokerage') ? $orderInfo['uid'] : $userServices->getSpreadUid($orderInfo['uid']); + $spread_two = sys_config('brokerage_level', 2) == 2 ? $userServices->getSpreadUid($spread_one) : 0; + $spread_one_price = bcmul((string)$orderInfo['pay_price'], (string)bcdiv((string)sys_config('store_brokerage_ratio', 0), '100', 4), 2); + $spread_two_price = bcmul((string)$orderInfo['pay_price'], (string)bcdiv((string)sys_config('store_brokerage_two', 0), '100', 4), 2); + if ($spread_one && $spread_one_price > 0) $this->memberBrokerage($spread_one, $spread_one_price, sys_config('is_self_brokerage') ? 'get_self_brokerage' : 'get_brokerage', $orderInfo); + if ($spread_two && $spread_two_price > 0) $this->memberBrokerage($spread_two, $spread_two_price, 'get_two_brokerage', $orderInfo); + } + return false !== $res; } + /** + * 购买付费会员返佣 + * @param $uid + * @param $price + * @param $type + * @param $orderInfo + */ + public function memberBrokerage($uid, $price, $type, $orderInfo) + { + /** @var UserServices $userServices */ + $userServices = app()->make(UserServices::class); + $userInfo = $userServices->get($uid); + // 上级推广员返佣之后的金额 + $balance = bcadd($userInfo['brokerage_price'], $price, 2); + // 添加用户佣金 + $res1 = $userServices->bcInc($uid, 'brokerage_price', $price, 'uid'); + if ($res1) { + //冻结时间 + $broken_time = intval(sys_config('extract_time')); + $frozen_time = time() + $broken_time * 86400; + // 添加佣金记录 + /** @var UserBrokerageServices $userBrokerageServices */ + $userBrokerageServices = app()->make(UserBrokerageServices::class); + $userBrokerageServices->income($type, $uid, [ + 'nickname' => $userInfo['nickname'], + 'pay_price' => floatval($price), + 'number' => floatval($userInfo['brokerage_price']), + 'frozen_time' => $frozen_time + ], $balance, $orderInfo['id']); + } + } + /** * 修改 * @param $where @@ -372,7 +416,7 @@ class OtherOrderServices extends BaseServices $newMemberRight = $memberCardService->getMemberTypeValue(); if (!array_key_exists($mcId, $newMemberRight)) throw new ApiException(410230); $price = $newMemberRight[$mcId]['pre_price']; - if ($payPrice != $price || ($memberType != 'free' && $payPrice <= 0))throw new ApiException(100100); + if ($payPrice != $price || ($memberType != 'free' && $payPrice <= 0)) throw new ApiException(100100); if ($memberType == 'free' && $newMemberRight[$mcId]['vip_day'] <= 0) throw new ApiException(100100); switch ($memberType) { case "free"://免费会员 diff --git a/crmeb/app/services/order/OutStoreOrderServices.php b/crmeb/app/services/order/OutStoreOrderServices.php index 73414625b..0ab674eb3 100644 --- a/crmeb/app/services/order/OutStoreOrderServices.php +++ b/crmeb/app/services/order/OutStoreOrderServices.php @@ -17,10 +17,6 @@ use app\services\BaseServices; use app\services\pay\PayServices; use crmeb\exceptions\AdminException; use crmeb\exceptions\ApiException; -use crmeb\services\HttpService; -use crmeb\services\UtilService; -use crmeb\traits\ServicesTrait; -use think\facade\Log; /** * Class OutStoreOrderServices @@ -39,8 +35,6 @@ use think\facade\Log; class OutStoreOrderServices extends BaseServices { - use ServicesTrait; - /** * 发货类型 * @var string[] diff --git a/crmeb/app/services/order/StoreCartServices.php b/crmeb/app/services/order/StoreCartServices.php index 3ed64076f..60bb504f4 100644 --- a/crmeb/app/services/order/StoreCartServices.php +++ b/crmeb/app/services/order/StoreCartServices.php @@ -87,9 +87,8 @@ class StoreCartServices extends BaseServices if ($new) { $cartIds = explode(',', $cartIds); $cartInfo = []; - $redis = CacheService::redisHandler(); foreach ($cartIds as $key) { - $info = $redis->get($key); + $info = CacheService::get($key); if ($info) { $cartInfo[] = $info; } @@ -272,7 +271,7 @@ class StoreCartServices extends BaseServices $info['trueStock'] = $info['productInfo']['attrInfo']['stock']; $info['costPrice'] = $info['productInfo']['attrInfo']['cost']; try { - CacheService::redisHandler()->set($key, $info, 3600); + CacheService::set($key, $info, 3600); } catch (\Throwable $e) { throw new ApiException($e->getMessage()); } diff --git a/crmeb/app/services/order/StoreOrderCreateServices.php b/crmeb/app/services/order/StoreOrderCreateServices.php index b44e59b3e..db2782720 100644 --- a/crmeb/app/services/order/StoreOrderCreateServices.php +++ b/crmeb/app/services/order/StoreOrderCreateServices.php @@ -355,7 +355,7 @@ class StoreOrderCreateServices extends BaseServices //删除购物车 if ($group['news']) { array_map(function ($key) { - CacheService::redisHandler()->delete($key); + CacheService::delete($key); }, $group['cartIds']); } else { /** @var StoreCartServices $cartServices */ diff --git a/crmeb/app/services/order/StoreOrderRefundServices.php b/crmeb/app/services/order/StoreOrderRefundServices.php index 7c8115bbe..8fc6a108c 100644 --- a/crmeb/app/services/order/StoreOrderRefundServices.php +++ b/crmeb/app/services/order/StoreOrderRefundServices.php @@ -220,6 +220,17 @@ class StoreOrderRefundServices extends BaseServices //支付宝退款 AliPayService::instance()->refund(strpos($refundOrder['trade_no'], '_') !== false ? $refundOrder['trade_no'] : $refundOrder['order_id'], floatval($refundData['refund_price']), $refund_id); break; + case PayServices::ALLIN_PAY: + /** @var Pay $pay */ + $pay = app()->make(Pay::class, ['allin_pay']); + /** @var StoreOrderServices $orderServices */ + $orderServices = app()->make(StoreOrderServices::class); + $trade_no = $orderServices->value(['id' => $orderRefundInfo['store_order_id']], 'trade_no'); + $pay->refund($trade_no, [ + 'order_id' => $refundOrder['order_id'], + 'refund_price' => $refundData['refund_price'] + ]); + break; } } //订单记录 @@ -1249,6 +1260,17 @@ class StoreOrderRefundServices extends BaseServices $storeOrderCartInfoServices->update(['oid' => $oid, 'cart_id' => $cart['id']], ['refund_num' => $refund_num]); } $storeOrderCartInfoServices->clearOrderCartInfo($oid); + + //写入订单记录表 + /** @var StoreOrderStatusServices $statusService */ + $statusService = app()->make(StoreOrderStatusServices::class); + $statusService->save([ + 'oid' => $oid, + 'change_type' => 'cancel_refund_order', + 'change_message' => '取消退款', + 'change_time' => time() + ]); + //售后订单取消后置事件 event('order.orderRefundCancelAfter', [$orderRefundInfo]); // 推送订单 diff --git a/crmeb/app/services/order/StoreOrderServices.php b/crmeb/app/services/order/StoreOrderServices.php index 4941e9008..4f072dc54 100644 --- a/crmeb/app/services/order/StoreOrderServices.php +++ b/crmeb/app/services/order/StoreOrderServices.php @@ -35,7 +35,6 @@ use crmeb\services\CacheService; use crmeb\services\FormBuilder as Form; use crmeb\services\printer\Printer; use crmeb\services\SystemConfigService; -use crmeb\traits\ServicesTrait; use crmeb\utils\Arr; use think\facade\Log; @@ -56,8 +55,6 @@ use think\facade\Log; class StoreOrderServices extends BaseServices { - use ServicesTrait; - /** * 发货类型 * @var string[] @@ -140,13 +137,12 @@ class StoreOrderServices extends BaseServices /** * 获取订单数量 * @param int $uid - * @return mixed + * @return array + * @throws \ReflectionException */ - public function getOrderData(int $uid = 0, $del = true, $isPid = false) + public function getOrderData(int $uid = 0) { - $where = ['uid' => $uid, 'paid' => 1, 'refund_status' => [0, 3], 'pid' => 0]; - if (!$del) $where = $where + ['is_del' => 0, 'is_system_del' => 0]; - $data['order_count'] = (string)$this->dao->count($where); + $data['order_count'] = (string)$this->dao->count(['uid' => $uid, 'refund_status' => [0, 3], 'pid' => 0, 'is_del' => 0, 'is_system_del' => 0]); $data['sum_price'] = (string)$this->dao->sum([ ['uid', '=', $uid], ['paid', '=', 1], @@ -162,7 +158,6 @@ class StoreOrderServices extends BaseServices $data['received_count'] = (string)$this->dao->count(['status' => 2] + $countWhere + ['pid' => 0]); $data['evaluated_count'] = (string)$this->dao->count(['status' => 3] + $countWhere + ['pid' => 0]); $data['complete_count'] = (string)$this->dao->count(['status' => 4] + $countWhere + ['pid' => 0]); - if (!$isPid) $countWhere = $countWhere + ['pid' => 0]; /** @var StoreOrderRefundServices $storeOrderRefundServices */ $storeOrderRefundServices = app()->make(StoreOrderRefundServices::class); @@ -173,8 +168,8 @@ class StoreOrderServices extends BaseServices $data['refunded_count'] = (string)$storeOrderRefundServices->count($refund_where + ['refund_type' => 6]); $data['refund_count'] = bcadd(bcadd($data['refunding_count'], $data['refunded_count'], 0), $data['no_refund_count'], 0); $data['yue_pay_status'] = (int)sys_config('balance_func_status') && (int)sys_config('yue_pay_status') == 1 ? (int)1 : (int)2;//余额支付 1 开启 2 关闭 - $data['pay_weixin_open'] = (int)sys_config('pay_weixin_open') ?? 0;//微信支付 1 开启 0 关闭 - $data['ali_pay_status'] = (bool)sys_config('ali_pay_status');//支付包支付 1 开启 0 关闭 + $data['pay_weixin_open'] = is_wecaht_pay();//微信支付 1 开启 0 关闭 + $data['ali_pay_status'] = is_ali_pay();//支付包支付 1 开启 0 关闭 $data['friend_pay_status'] = (int)sys_config('friend_pay_status') ?? 0;//好友代付 1 开启 0 关闭 return $data; } @@ -508,18 +503,12 @@ class StoreOrderServices extends BaseServices } } else { switch ($item['pay_type']) { - case PayServices::WEIXIN_PAY: - $item['pay_type_name'] = '微信未支付'; - break; - case PayServices::ALIAPY_PAY: - $item['pay_type_name'] = '支付宝未支付'; - break; case 'offline': $item['pay_type_name'] = '线下支付'; $item['pay_type_info'] = 1; break; default: - $item['pay_type_name'] = '未支付'; + $item['pay_type_name'] = ''; break; } } @@ -1432,27 +1421,32 @@ HTML; $info[3]['total_name'] = '本月新增用户'; return $info; } - //TODO /** - * 打印订单 + * 订单小票打印 * @param int $id + * @param bool $start + * @return bool|void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException + * @throws \Exception */ - public function orderPrint(int $id) + public function orderPrintTicket(int $id) { $order = $this->get($id); if (!$order) { throw new AdminException(400118); } - /** @var StoreOrderCartInfoServices $cartServices */ $cartServices = app()->make(StoreOrderCartInfoServices::class); - $product = $cartServices->getCartInfoPrintProduct($order->id); + $product = $cartServices->getCartInfoPrintProduct($order['id']); if (!$product) { - throw new AdminException(400533); + throw new AdminException(400463); + } + $switch = (bool)sys_config('pay_success_printing_switch'); + if (!$switch) { + throw new AdminException(400464); } if (sys_config('print_type', 1) == 1) { $name = 'yi_lian_yun'; @@ -1479,20 +1473,28 @@ HTML; $printer = new Printer($name, $configData); $res = $printer->setPrinterContent([ 'name' => sys_config('site_name'), + 'url' => sys_config('site_url'), 'orderInfo' => is_object($order) ? $order->toArray() : $order, 'product' => $product ])->startPrinter(); if (!$res) { throw new AdminException($printer->getError()); } - return $res; + return true; } /** * 获取订单确认数据 * @param array $user * @param $cartId - * @return mixed + * @param bool $new + * @param int $addressId + * @param int $shipping_type + * @return array + * @throws \Psr\SimpleCache\InvalidArgumentException + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException */ public function getOrderConfirmData(array $user, $cartId, bool $new, int $addressId, int $shipping_type = 1) { @@ -1575,7 +1577,7 @@ HTML; $data['integralRatio'] = $other['integralRatio']; $data['offline_pay_status'] = (int)sys_config('offline_pay_status') ?? (int)2; $data['yue_pay_status'] = (int)sys_config('balance_func_status') && (int)sys_config('yue_pay_status') == 1 ? (int)1 : (int)2;//余额支付 1 开启 2 关闭 - $data['pay_weixin_open'] = (int)sys_config('pay_weixin_open') ?? 0;//微信支付 1 开启 0 关闭 + $data['pay_weixin_open'] = is_wecaht_pay();//微信支付 1 开启 0 关闭 $data['friend_pay_status'] = (int)sys_config('friend_pay_status') ?? 0;//好友代付 1 开启 0 关闭 $data['store_self_mention'] = (int)sys_config('store_self_mention') ?? 0;//门店自提是否开启 /** @var SystemStoreServices $systemStoreServices */ @@ -1583,7 +1585,7 @@ HTML; $store_count = $systemStoreServices->count(['type' => 0]); $data['store_self_mention'] = $data['store_self_mention'] && $store_count; - $data['ali_pay_status'] = (bool)sys_config('ali_pay_status');//支付包支付 1 开启 0 关闭 + $data['ali_pay_status'] = is_ali_pay();//支付包支付 1 开启 0 关闭 $data['system_store'] = [];//门店信息 /** @var UserInvoiceServices $userInvoice */ $userInvoice = app()->make(UserInvoiceServices::class); @@ -1611,7 +1613,7 @@ HTML; public function cacheOrderInfo($uid, $cartInfo, $priceGroup, $other = [], $cacheTime = 600) { $key = $this->getCacheKey(); - CacheService::redisHandler()->set('user_order_' . $uid . $key, compact('cartInfo', 'priceGroup', 'other'), $cacheTime); + CacheService::set('user_order_' . $uid . $key, compact('cartInfo', 'priceGroup', 'other'), $cacheTime); return $key; } @@ -1651,8 +1653,8 @@ HTML; public function getCacheOrderInfo(int $uid, string $key) { $cacheName = 'user_order_' . $uid . $key; - if (!CacheService::redisHandler()->has($cacheName)) return null; - return CacheService::redisHandler()->get($cacheName); + if (!CacheService::has($cacheName)) return null; + return CacheService::get($cacheName); } /** @@ -1701,6 +1703,8 @@ HTML; case PayServices::FRIEND: $res = sys_config('friend_pay_status', 1) == 1; break; + case PayServices::ALLIN_PAY: + $res = sys_config('allin_pay_status') == 1; } return $res; } @@ -2412,9 +2416,8 @@ HTML; if ($new) { $cartIds = explode(',', $cartIds); $cartInfo = []; - $redis = CacheService::redisHandler(); foreach ($cartIds as $key) { - $info = $redis->get($key); + $info = CacheService::get($key); if ($info) { $cartInfo[] = $info; } diff --git a/crmeb/app/services/order/StoreOrderStatusServices.php b/crmeb/app/services/order/StoreOrderStatusServices.php index fc2d16628..1e5cb42ff 100644 --- a/crmeb/app/services/order/StoreOrderStatusServices.php +++ b/crmeb/app/services/order/StoreOrderStatusServices.php @@ -14,7 +14,6 @@ namespace app\services\order; use app\dao\order\StoreOrderStatusDao; use app\services\BaseServices; -use crmeb\traits\ServicesTrait; /** * 订单状态 @@ -23,7 +22,6 @@ use crmeb\traits\ServicesTrait; */ class StoreOrderStatusServices extends BaseServices { - use ServicesTrait; /** * 构造方法 diff --git a/crmeb/app/services/other/CategoryServices.php b/crmeb/app/services/other/CategoryServices.php index fbfe11b09..4e324c95d 100644 --- a/crmeb/app/services/other/CategoryServices.php +++ b/crmeb/app/services/other/CategoryServices.php @@ -14,7 +14,6 @@ namespace app\services\other; use app\dao\other\CategoryDao; use app\services\BaseServices; -use crmeb\traits\ServicesTrait; /** * Class CategoryServices @@ -23,8 +22,6 @@ use crmeb\traits\ServicesTrait; class CategoryServices extends BaseServices { - use ServicesTrait; - protected $cacheName = 'crmeb_cate'; /** diff --git a/crmeb/app/services/other/QrcodeServices.php b/crmeb/app/services/other/QrcodeServices.php index b8f61e2ac..4701ca124 100644 --- a/crmeb/app/services/other/QrcodeServices.php +++ b/crmeb/app/services/other/QrcodeServices.php @@ -223,10 +223,12 @@ class QrcodeServices extends BaseServices * 获取小程序分享二维码 * @param int $id * @param int $uid - * @param int $type 1 = 拼团,2 = 秒杀 - * @return bool|string + * @param int $type + * @param array $param + * @param bool $isSaveAttach + * @return false|mixed|string */ - public function getRoutineQrcodePath(int $id, int $uid, int $type, array $parame = [], bool $isSaveAttach = true) + public function getRoutineQrcodePath(int $id, int $uid, int $type, array $param = [], bool $isSaveAttach = true) { /** @var SystemAttachmentServices $systemAttachmentService */ $systemAttachmentService = app()->make(SystemAttachmentServices::class); @@ -236,7 +238,7 @@ class QrcodeServices extends BaseServices switch ($type) { case 0: $page = 'pages/goods_details/index'; - $namePath = $id . '_' . $uid . '_' . $parame['is_promoter'] . '_product.jpg'; + $namePath = $id . '_' . $uid . '_' . $param['is_promoter'] . '_product.jpg'; break; case 1: $page = 'pages/activity/goods_combination_details/index'; @@ -245,10 +247,6 @@ class QrcodeServices extends BaseServices case 2: $page = 'pages/activity/goods_seckill_details/index'; $namePath = 'seckill_' . $id . '_' . $uid . '.jpg'; - if (isset($parame['stop_time']) && $parame['stop_time']) { - $data .= '&time=' . $parame['stop_time']; - $namePath = $parame['stop_time'] . $namePath; - } break; case 3: $page = 'pages/annex/offline_pay/index'; diff --git a/crmeb/app/services/other/export/ExportServices.php b/crmeb/app/services/other/export/ExportServices.php index 8a6d40503..fe5ceddf7 100644 --- a/crmeb/app/services/other/export/ExportServices.php +++ b/crmeb/app/services/other/export/ExportServices.php @@ -11,12 +11,350 @@ namespace app\services\other\export; - +use app\services\activity\bargain\StoreBargainServices; +use app\services\activity\combination\StoreCombinationServices; +use app\services\activity\seckill\StoreSeckillServices; use app\services\BaseServices; +use app\services\order\StoreOrderServices; +use app\services\product\product\StoreProductServices; +use app\services\user\member\MemberCardServices; +use app\services\user\UserServices; use crmeb\services\SpreadsheetExcelService; class ExportServices extends BaseServices { + /** + * 用户导出 + * @param $where + * @return array + */ + public function exportUserList($where) + { + /** @var UserServices $userServices */ + $userServices = app()->make(UserServices::class); + $data = $userServices->index($where)['list']; + $header = ['用户ID', '昵称', '真实姓名', '性别', '电话', '用户等级', '用户分组', '用户标签', '用户类型', '用户余额', '最后登录时间', '注册时间']; + $filename = '用户列表_' . date('YmdHis', time()); + $export = $fileKey = []; + if (!empty($data)) { + $i = 0; + foreach ($data as $item) { + $one_data = [ + 'uid' => $item['uid'], + 'nickname' => $item['nickname'], + 'real_name' => $item['real_name'], + 'sex' => $item['sex'], + 'phone' => $item['phone'], + 'level' => $item['level'], + 'group_id' => $item['group_id'], + 'labels' => $item['labels'], + 'user_type' => $item['user_type'], + 'now_money' => $item['now_money'], + 'last_time' => date('Y-m-d H:i:s', $item['last_time']), + 'add_time' => date('Y-m-d H:i:s', $item['add_time']) + ]; + $export[] = $one_data; + if ($i == 0) { + $fileKey = array_keys($one_data); + } + $i++; + } + } + return compact('header', 'fileKey', 'export', 'filename'); + } + + /** + * 订单导出 + * @param $where + * @return array + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function exportOrderList($where) + { + $header = ['订单号', '收货人姓名', '收货人电话', '收货地址', '商品信息', '总价格', '实际支付', '支付状态', '支付时间', '订单状态', '下单时间', '用户备注']; + $filename = '订单列表_' . date('YmdHis', time()); + $export = $fileKey = []; + /** @var StoreOrderServices $orderServices */ + $orderServices = app()->make(StoreOrderServices::class); + $data = $orderServices->getOrderList($where)['data']; + if (!empty($data)) { + $i = 0; + foreach ($data as $item) { + if ($item['paid'] == 1) { + switch ($item['pay_type']) { + case 'weixin': + $item['pay_type_name'] = '微信支付'; + break; + case 'yue': + $item['pay_type_name'] = '余额支付'; + break; + case 'offline': + $item['pay_type_name'] = '线下支付'; + break; + default: + $item['pay_type_name'] = '其他支付'; + break; + } + } else { + switch ($item['pay_type']) { + default: + $item['pay_type_name'] = '未支付'; + break; + case 'offline': + $item['pay_type_name'] = '线下支付'; + break; + } + } + if ($item['paid'] == 0 && $item['status'] == 0) { + $item['status_name'] = '未支付'; + } else if ($item['paid'] == 1 && $item['status'] == 0 && $item['shipping_type'] == 1 && $item['refund_status'] == 0) { + $item['status_name'] = '未发货'; + } else if ($item['paid'] == 1 && $item['status'] == 0 && $item['shipping_type'] == 2 && $item['refund_status'] == 0) { + $item['status_name'] = '未核销'; + } else if ($item['paid'] == 1 && $item['status'] == 1 && $item['shipping_type'] == 1 && $item['refund_status'] == 0) { + $item['status_name'] = '待收货'; + } else if ($item['paid'] == 1 && $item['status'] == 1 && $item['shipping_type'] == 2 && $item['refund_status'] == 0) { + $item['status_name'] = '未核销'; + } else if ($item['paid'] == 1 && $item['status'] == 2 && $item['refund_status'] == 0) { + $item['status_name'] = '待评价'; + } else if ($item['paid'] == 1 && $item['status'] == 3 && $item['refund_status'] == 0) { + $item['status_name'] = '已完成'; + } else if ($item['paid'] == 1 && $item['refund_status'] == 1) { + $item['status_name'] = '正在退款'; + } else if ($item['paid'] == 1 && $item['refund_status'] == 2) { + $item['status_name'] = '已退款'; + } + $goodsName = []; + foreach ($item['_info'] as $value) { + $_info = $value['cart_info']; + $sku = ''; + if (isset($_info['productInfo']['attrInfo'])) { + if (isset($_info['productInfo']['attrInfo']['suk'])) { + $sku = '(' . $_info['productInfo']['attrInfo']['suk'] . ')'; + } + } + if (isset($_info['productInfo']['store_name'])) { + $goodsName[] = implode(' ', + [$_info['productInfo']['store_name'], + $sku, + "[{$_info['cart_num']} * {$_info['truePrice']}]" + ]); + } + } + $one_data = [ + 'order_id' => $item['order_id'], + 'real_name' => $item['real_name'], + 'user_phone' => $item['user_phone'], + 'user_address' => $item['user_address'], + 'goods_name' => $goodsName ? implode("\n", $goodsName) : '', + 'total_price' => $item['total_price'], + 'pay_price' => $item['pay_price'], + 'pay_type_name' => $item['pay_type_name'], + 'pay_time' => $item['pay_time'] > 0 ? date('Y-m-d H:i', (int)$item['pay_time']) : '暂无', + 'status_name' => $item['status_name'] ?? '未知状态', + 'add_time' => $item['add_time'], + 'mark' => $item['mark'], + ]; + $export[] = $one_data; + if ($i == 0) { + $fileKey = array_keys($one_data); + } + $i++; + } + } + return compact('header', 'fileKey', 'export', 'filename'); + } + + /** + * 商品导出 + * @param $where + * @return array + */ + public function exportProductList($where) + { + $header = ['商品名称', '商品类型', '商品分类', '售价', '销量', '库存', '添加时间']; + $filename = '商品列表_' . date('YmdHis', time()); + $export = $fileKey = []; + /** @var StoreProductServices $productServices */ + $productServices = app()->make(StoreProductServices::class); + $data = $productServices->getList($where)['list']; + if (!empty($data)) { + $i = 0; + foreach ($data as $item) { + $one_data = [ + 'store_name' => $item['store_name'], + 'product_type' => $item['product_type'], + 'cate_name' => $item['cate_name'], + 'price' => $item['price'], + 'sales' => $item['sales'], + 'stock' => $item['stock'], + 'add_time' => date('Y-m-d H:i:s', $item['add_time']) + ]; + $export[] = $one_data; + if ($i == 0) { + $fileKey = array_keys($one_data); + } + $i++; + } + } + return compact('header', 'fileKey', 'export', 'filename'); + } + + /** + * 砍价商品导出 + * @param $where + * @return array + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function exportBargainList($where) + { + $header = ['砍价名称', '起始价格', '最低价', '参与人数', '成功人数', '剩余库存', '活动状态', '活动时间', '添加时间']; + $filename = '砍价列表_' . date('YmdHis', time()); + $export = $fileKey = []; + /** @var StoreBargainServices $bargainServices */ + $bargainServices = app()->make(StoreBargainServices::class); + $data = $bargainServices->getStoreBargainList($where)['list']; + if (!empty($data)) { + $i = 0; + foreach ($data as $item) { + $one_data = [ + 'title' => $item['title'], + 'price' => $item['price'], + 'min_price' => $item['min_price'], + 'count_people_all' => $item['count_people_all'], + 'count_people_success' => $item['count_people_success'], + 'quota' => $item['quota'], + 'start_name' => $item['start_name'], + 'activity_time' => date('Y-m-d H:i:s', $item['start_time']) . '至' . date('Y-m-d H:i:s', $item['stop_time']), + 'add_time' => $item['add_time'] + ]; + $export[] = $one_data; + if ($i == 0) { + $fileKey = array_keys($one_data); + } + $i++; + } + } + return compact('header', 'fileKey', 'export', 'filename'); + } + + /** + * 拼团商品导出 + * @param $where + * @return array + */ + public function exportCombinationList($where) + { + $header = ['拼团名称', '拼团价', '原价', '拼团人数', '参与人数', '成团数量', '剩余库存', '活动状态', '活动时间', '添加时间']; + $filename = '拼团列表_' . date('YmdHis', time()); + $export = $fileKey = []; + /** @var StoreCombinationServices $combinationServices */ + $combinationServices = app()->make(StoreCombinationServices::class); + $data = $combinationServices->systemPage($where)['list']; + if (!empty($data)) { + $i = 0; + foreach ($data as $item) { + $one_data = [ + 'title' => $item['title'], + 'price' => $item['price'], + 'ot_price' => $item['ot_price'], + 'count_people' => $item['count_people'], + 'count_people_all' => $item['count_people_all'], + 'count_people_pink' => $item['count_people_pink'], + 'quota' => $item['quota'], + 'start_name' => $item['start_name'], + 'activity_time' => date('Y-m-d H:i:s', $item['start_time']) . '至' . date('Y-m-d H:i:s', $item['stop_time']), + 'add_time' => $item['add_time'] + ]; + $export[] = $one_data; + if ($i == 0) { + $fileKey = array_keys($one_data); + } + $i++; + } + } + return compact('header', 'fileKey', 'export', 'filename'); + } + + /** + * 秒杀导出 + * @param $where + * @return array + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function exportSeckillList($where) + { + $header = ['秒杀名称', '秒杀价', '原价', '剩余库存', '活动状态', '活动时间', '添加时间']; + $filename = '秒杀列表_' . date('YmdHis', time()); + $export = $fileKey = []; + /** @var StoreSeckillServices $seckillServices */ + $seckillServices = app()->make(StoreSeckillServices::class); + $data = $seckillServices->systemPage($where)['list']; + if (!empty($data)) { + $i = 0; + foreach ($data as $item) { + $one_data = [ + 'title' => $item['title'], + 'price' => $item['price'], + 'ot_price' => $item['ot_price'], + 'quota' => $item['quota'], + 'start_name' => $item['start_name'], + 'activity_time' => date('Y-m-d H:i:s', $item['start_time']) . '至' . date('Y-m-d H:i:s', $item['stop_time']), + 'add_time' => $item['add_time'] + ]; + $export[] = $one_data; + if ($i == 0) { + $fileKey = array_keys($one_data); + } + $i++; + } + } + return compact('header', 'fileKey', 'export', 'filename'); + } + + /** + * 会员卡导出 + * @param $id + * @return array + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException + */ + public function exportMemberCard($id) + { + /** @var MemberCardServices $memberCardServices */ + $memberCardServices = app()->make(MemberCardServices::class); + $data = $memberCardServices->getExportData(['batch_card_id' => $id]); + $header = ['会员卡号', '密码', '领取人', '领取人手机号', '领取时间', '是否使用']; + $filename = $data['title'] . '批次列表_' . date('YmdHis', time()); + $export = $fileKey = []; + if (!empty($data['data'])) { + $i = 0; + foreach ($data['data'] as $item) { + $one_data = [ + 'card_number' => $item['card_number'], + 'card_password' => $item['card_password'], + 'user_name' => $item['user_name'], + 'user_phone' => $item['user_phone'], + 'use_time' => $item['use_time'], + 'use_uid' => $item['use_uid'] ? '已领取' : '未领取' + ]; + $export[] = $one_data; + if ($i == 0) { + $fileKey = array_keys($one_data); + } + $i++; + } + } + return compact('header', 'fileKey', 'export', 'filename'); + } + /** * 真实请求导出 * @param $header excel表头 @@ -52,6 +390,7 @@ class ExportServices extends BaseServices return $protocol . $domainName; } + /** * 用户资金导出 * @param $data 导出数据 @@ -392,126 +731,6 @@ class ExportServices extends BaseServices return $this->export($header, $title, $export, $filename, $suffix, $is_save); } - /** - * 商铺订单导出 - * @param $data 导出数据 - */ - public function storeOrder($data = []) - { - $export = []; - if (!empty($data)) { - foreach ($data as $item) { - if ($item['paid'] == 1) { - switch ($item['pay_type']) { - case 'weixin': - $item['pay_type_name'] = '微信支付'; - break; - case 'yue': - $item['pay_type_name'] = '余额支付'; - break; - case 'offline': - $item['pay_type_name'] = '线下支付'; - break; - default: - $item['pay_type_name'] = '其他支付'; - break; - } - } else { - switch ($item['pay_type']) { - default: - $item['pay_type_name'] = '未支付'; - break; - case 'offline': - $item['pay_type_name'] = '线下支付'; - $item['pay_type_info'] = 1; - break; - } - } - if ($item['paid'] == 0 && $item['status'] == 0) { - $item['status_name'] = '未支付'; - } else if ($item['paid'] == 1 && $item['status'] == 0 && $item['shipping_type'] == 1 && $item['refund_status'] == 0) { - $item['status_name'] = '未发货'; - } else if ($item['paid'] == 1 && $item['status'] == 0 && $item['shipping_type'] == 2 && $item['refund_status'] == 0) { - $item['status_name'] = '未核销'; - } else if ($item['paid'] == 1 && $item['status'] == 1 && $item['shipping_type'] == 1 && $item['refund_status'] == 0) { - $item['status_name'] = '待收货'; - } else if ($item['paid'] == 1 && $item['status'] == 1 && $item['shipping_type'] == 2 && $item['refund_status'] == 0) { - $item['status_name'] = '未核销'; - } else if ($item['paid'] == 1 && $item['status'] == 2 && $item['refund_status'] == 0) { - $item['status_name'] = '待评价'; - } else if ($item['paid'] == 1 && $item['status'] == 3 && $item['refund_status'] == 0) { - $item['status_name'] = '已完成'; - } else if ($item['paid'] == 1 && $item['refund_status'] == 1) { - $refundReasonTime = date('Y-m-d H:i', $item['refund_reason_time']); - $refundReasonWapImg = json_decode($item['refund_reason_wap_img'], true); - $refundReasonWapImg = $refundReasonWapImg ?: []; - $img = ''; - if (count($refundReasonWapImg)) { - foreach ($refundReasonWapImg as $itemImg) { - if (strlen(trim($itemImg))) - $img .= ''; - } - } - if (!strlen(trim($img))) $img = '无'; - $item['status_name'] = <<申请退款
-退款原因:{$item['refund_reason_wap']}
-备注说明:{$item['refund_reason_wap_explain']}
-退款时间:{$refundReasonTime}
-退款凭证:{$img} -HTML; - } else if ($item['paid'] == 1 && $item['refund_status'] == 2) { - $item['status_name'] = '已退款'; - } - - $goodsName = []; - foreach ($item['_info'] as $k => $v) { - - $suk = ''; - if (isset($v['productInfo']['attrInfo'])) { - if (isset($v['productInfo']['attrInfo']['suk'])) { - $suk = '(' . $v['productInfo']['attrInfo']['suk'] . ')'; - } - } - if (isset($v['productInfo']['store_name'])) { - $goodsName[] = implode(' ', - [$v['productInfo']['store_name'], - $suk, - "[{$v['cart_num']} * {$v['truePrice']}]" - ]); - } - } - if ($item['sex'] == 1) $sex_name = '男'; - else if ($item['sex'] == 2) $sex_name = '女'; - else $sex_name = '未知'; - $export[] = [ - $item['order_id'], - $sex_name, - $item['user_phone'], - $item['real_name'], - $item['user_phone'], - $item['user_address'], - $goodsName ? implode("\n", $goodsName) : '', - $item['total_price'], - $item['pay_price'], - $item['pay_postage'], - $item['coupon_price'], - $item['pay_type_name'], - $item['pay_time'] > 0 ? date('Y/m-d H:i', (int)$item['pay_time']) : '暂无', - $item['status_name'] ?? '未知状态', - empty($item['add_time']) ? 0 : date('Y-m-d H:i:s', (int)$item['add_time']), - $item['mark'] - ]; - } - } - $header = ['订单号', '性别', '电话', '收货人姓名', '收货人电话', '收货地址', '商品信息', - '总价格', '实际支付', '邮费', '优惠金额', '支付状态', '支付时间', '订单状态', '下单时间', '用户备注']; - $title = ['订单导出', '订单信息' . time(), ' 生成时间:' . date('Y-m-d H:i:s', time())]; - $filename = '订单导出_' . date('YmdHis', time()); - $suffix = 'xlsx'; - $is_save = true; - return $this->export($header, $title, $export, $filename, $suffix, $is_save); - } /** * 商铺自提点导出 diff --git a/crmeb/app/services/out/OutAccountServices.php b/crmeb/app/services/out/OutAccountServices.php index 6326b77fe..81b3ad73d 100644 --- a/crmeb/app/services/out/OutAccountServices.php +++ b/crmeb/app/services/out/OutAccountServices.php @@ -159,7 +159,7 @@ class OutAccountServices extends BaseServices $authInfo = $this->dao->getOne(['id' => $id, 'is_del' => 0]); $this->checkAuth($authInfo, $md5Token, $cacheService); - $cacheService->clearToken($md5Token); + $cacheService->delete($md5Token); $token = $jwtAuth->createToken($id, $type); $data['last_time'] = time(); @@ -182,14 +182,14 @@ class OutAccountServices extends BaseServices { if (!$authInfo) { if (!request()->isCli()) { - $cacheService->clearToken($md5Token); + $cacheService->delete($md5Token); } throw new AuthException(110003); } if ($authInfo->status == 2) { if (!request()->isCli()) { - $cacheService->clearToken($md5Token); + $cacheService->delete($md5Token); } throw new AuthException(400595); } @@ -212,15 +212,7 @@ class OutAccountServices extends BaseServices $md5Token = md5($token); - if (!$cacheService->hasToken($md5Token) || !($cacheToken = $cacheService->getTokenBucket($md5Token))) { - throw new AuthException(110006); - } - - //是否超出有效次数 - if (isset($cacheToken['invalidNum']) && $cacheToken['invalidNum'] >= 3) { - if (!request()->isCli()) { - $cacheService->clearToken($md5Token); - } + if (!$cacheService->has($md5Token) || !($cacheToken = $cacheService->get($md5Token, '', NULL, 'out'))) { throw new AuthException(110006); } @@ -232,13 +224,9 @@ class OutAccountServices extends BaseServices try { $jwtAuth->verifyToken(); - $cacheService->setTokenBucket($md5Token, $cacheToken, $cacheToken['exp']); - } catch (ExpiredException $e) { - $cacheToken['invalidNum'] = isset($cacheToken['invalidNum']) ? $cacheToken['invalidNum']++ : 1; - $cacheService->setTokenBucket($md5Token, $cacheToken, $cacheToken['exp']); } catch (\Throwable $e) { if (!request()->isCli()) { - $cacheService->clearToken($md5Token); + $cacheService->delete($md5Token); } throw new AuthException(400172); } diff --git a/crmeb/app/services/pay/OrderPayServices.php b/crmeb/app/services/pay/OrderPayServices.php index 9c9ba251c..0148c87b5 100644 --- a/crmeb/app/services/pay/OrderPayServices.php +++ b/crmeb/app/services/pay/OrderPayServices.php @@ -46,7 +46,7 @@ class OrderPayServices * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ - public function orderPay(array $orderInfo, string $payType) + public function orderPay(array $orderInfo, string $payType, array $options = []) { if ($orderInfo['paid']) { throw new ApiException(410174); @@ -54,8 +54,9 @@ class OrderPayServices if ($orderInfo['pay_price'] <= 0) { throw new ApiException(410274); } + $openid = ''; - if (!in_array($payType, ['weixinh5', 'pc']) && !request()->isApp()) { + if (!in_array($payType, ['weixinh5', 'pc', 'allinpay']) && !request()->isApp()) { if ($payType === 'weixin') { $userType = 'wechat'; } else { @@ -90,7 +91,7 @@ class OrderPayServices throw new ApiException(410276); } - return $this->payServices->pay($payType, $openid, $orderInfo['order_id'], $orderInfo['pay_price'], $successAction, $body); + return $this->payServices->setOptions($options)->pay($payType, $openid, $orderInfo['order_id'], $orderInfo['pay_price'], $successAction, $body); } /** @@ -129,8 +130,6 @@ class OrderPayServices throw new ApiException(410276); } - - return $this->payServices->pay('alipay', $quitUrl, $orderInfo['order_id'], $orderInfo['pay_price'], $successAction, $body, $isCode); } } diff --git a/crmeb/app/services/pay/PayNotifyServices.php b/crmeb/app/services/pay/PayNotifyServices.php index 14afcc18e..6e2521835 100644 --- a/crmeb/app/services/pay/PayNotifyServices.php +++ b/crmeb/app/services/pay/PayNotifyServices.php @@ -24,7 +24,7 @@ class PayNotifyServices { /** - * 订单支付成功之后 + * 微信支付-订单支付成功之后 * @param string|null $order_id 订单id * @return bool */ @@ -43,7 +43,7 @@ class PayNotifyServices } /** - * 充值成功后 + * 微信支付-充值成功后 * @param string|null $order_id 订单id * @return bool */ @@ -53,14 +53,14 @@ class PayNotifyServices /** @var UserRechargeServices $userRecharge */ $userRecharge = app()->make(UserRechargeServices::class); if ($userRecharge->be(['order_id' => $order_id, 'paid' => 1])) return true; - return $userRecharge->rechargeSuccess($order_id,['trade_no' => $trade_no]); + return $userRecharge->rechargeSuccess($order_id, ['trade_no' => $trade_no]); } catch (\Exception $e) { return false; } } /** - * 购买会员 + * 微信支付-购买会员 * @param string|null $order_id * @return bool */ @@ -72,14 +72,14 @@ class PayNotifyServices $orderInfo = $services->getOne(['order_id' => $order_id]); if (!$orderInfo) return true; if ($orderInfo->paid) return true; - return $services->paySuccess($orderInfo->toArray(), PayServices::WEIXIN_PAY); + return $services->paySuccess($orderInfo->toArray()); } catch (\Exception $e) { return false; } } /** - * 支付宝支付异步回调处理事件 + * 支付宝支付-异步回调处理事件 * @param string|null $order_id * @param string|null $trade_no * @return bool @@ -102,7 +102,7 @@ class PayNotifyServices } /** - * 购买会员卡支付宝异步回调 + * 支付宝支付-购买会员卡 * @param string|null $order_id * @param string|null $trade_no * @return bool @@ -123,4 +123,59 @@ class PayNotifyServices return false; } } + + /** + * 通联支付-订单支付成功之后 + * @param string|null $order_id 订单id + * @return bool + */ + public function allinProduct(string $order_id = null, string $trade_no = null) + { + try { + /** @var StoreOrderSuccessServices $services */ + $services = app()->make(StoreOrderSuccessServices::class); + $orderInfo = $services->getOne(['order_id' => $order_id]); + if (!$orderInfo) return true; + if ($orderInfo->paid) return true; + return $services->paySuccess($orderInfo->toArray(), PayServices::ALLIN_PAY, ['trade_no' => $trade_no]); + } catch (\Exception $e) { + return false; + } + } + + /** + * 通联支付-充值成功后 + * @param string|null $order_id 订单id + * @return bool + */ + public function allinUserRecharge(string $order_id = null, string $trade_no = null) + { + try { + /** @var UserRechargeServices $userRecharge */ + $userRecharge = app()->make(UserRechargeServices::class); + if ($userRecharge->be(['order_id' => $order_id, 'paid' => 1])) return true; + return $userRecharge->rechargeSuccess($order_id, ['trade_no' => $trade_no]); + } catch (\Exception $e) { + return false; + } + } + + /** + * 通联支付-购买会员 + * @param string|null $order_id + * @return bool + */ + public function allinMember(string $order_id = null, string $trade_no = null) + { + try { + /** @var OtherOrderServices $services */ + $services = app()->make(OtherOrderServices::class); + $orderInfo = $services->getOne(['order_id' => $order_id]); + if (!$orderInfo) return true; + if ($orderInfo->paid) return true; + return $services->paySuccess($orderInfo->toArray(), PayServices::ALLIN_PAY); + } catch (\Exception $e) { + return false; + } + } } diff --git a/crmeb/app/services/pay/PayServices.php b/crmeb/app/services/pay/PayServices.php index d9b67663b..8812b50d1 100644 --- a/crmeb/app/services/pay/PayServices.php +++ b/crmeb/app/services/pay/PayServices.php @@ -22,43 +22,79 @@ use crmeb\services\pay\Pay; */ class PayServices { - /** - * 微信支付类型 - */ + //微信支付类型 const WEIXIN_PAY = 'weixin'; - /** - * 余额支付 - */ + //余额支付 const YUE_PAY = 'yue'; - /** - * 线下支付 - */ + //线下支付 const OFFLINE_PAY = 'offline'; - /** - * 支付宝 - */ + //支付宝 const ALIAPY_PAY = 'alipay'; - /** - * 好友代付 - */ + //通联支付 + const ALLIN_PAY = 'allinpay'; + + //好友代付 const FRIEND = 'friend'; - /** - * 支付方式 - * @var string[] - */ + //支付方式 const PAY_TYPE = [ PayServices::WEIXIN_PAY => '微信支付', PayServices::YUE_PAY => '余额支付', PayServices::OFFLINE_PAY => '线下支付', PayServices::ALIAPY_PAY => '支付宝', PayServices::FRIEND => '好友代付', + PayServices::ALLIN_PAY => '通联支付' ]; + /** + * @var array + */ + protected $options = []; + + /** + * @param string $key + * @param $value + * @return $this + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/16 + */ + public function setOption(string $key, $value) + { + $this->options[$key] = $value; + return $this; + } + + /** + * @param array $value + * @return $this + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/16 + */ + public function setOptions(array $value) + { + $this->options = $value; + return $this; + } + + /** + * @param string $key + * @param null $default + * @return mixed|null + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/16 + */ + protected function getOption(string $key, $default = null) + { + return $this->options[$key] ?? $default; + } + /** * 发起支付 * @param string $payType @@ -86,10 +122,23 @@ class PayServices $payType = 'ali_pay'; } + + $options = []; + if (self::ALLIN_PAY === $payType) { + $options['returl'] = $this->getOption('returl'); + if ($options['returl']) { + $options['returl'] = str_replace('http://', 'https://', $options['returl']); + } + $options['is_wechat'] = $this->getOption('is_wechat', false); + $options['appid'] = sys_config('routine_appId'); + $payType = 'allin_pay'; + } + /** @var Pay $pay */ $pay = app()->make(Pay::class, [$payType]); - return $pay->create($orderId, $price, $successAction, $body, '', ['openid' => $openid, 'isCode' => $isCode, 'pay_new_weixin_open' => (bool)sys_config('pay_new_weixin_open')]); + + return $pay->create($orderId, $price, $successAction, $body, '', ['openid' => $openid, 'isCode' => $isCode, 'pay_new_weixin_open' => (bool)sys_config('pay_new_weixin_open')] + $options); } catch (\Exception $e) { if (strpos($e->getMessage(), 'api unauthorized rid') !== false) { diff --git a/crmeb/app/services/pay/RechargeServices.php b/crmeb/app/services/pay/RechargeServices.php index 01b19d8fb..59bc5a9b8 100644 --- a/crmeb/app/services/pay/RechargeServices.php +++ b/crmeb/app/services/pay/RechargeServices.php @@ -57,6 +57,9 @@ class RechargeServices $userType = PayServices::ALIAPY_PAY; break; } + + $userType = get_pay_type($userType); + if (!$userType) { throw new ApiException(410278); } @@ -70,7 +73,14 @@ class RechargeServices } else { $openid = ''; } - return $this->pay->pay($recharge['recharge_type'], $openid, $recharge['order_id'], $recharge['price'], 'user_recharge', '用户充值'); + + $res = $this->pay->pay($recharge['recharge_type'], $openid, $recharge['order_id'], $recharge['price'], 'user_recharge', '用户充值'); + + if ($userType === PayServices::ALLIN_PAY) { + $res['pay_type'] = $userType; + } + + return $res; } } diff --git a/crmeb/app/services/pc/ProductServices.php b/crmeb/app/services/pc/ProductServices.php index e18dbdb2d..6cde88a39 100644 --- a/crmeb/app/services/pc/ProductServices.php +++ b/crmeb/app/services/pc/ProductServices.php @@ -56,19 +56,21 @@ class ProductServices extends BaseServices /** * PC端商品详情小程序码 * @param int $product_id - * @return bool|int|mixed|string + * @param string $type + * @return false|mixed|string */ - public function getProductRoutineCode(int $product_id) + public function getProductRoutineCode(int $product_id, string $type = 'product') { try { - $namePath = 'routine_product_' . $product_id . '.jpg'; + $namePath = $type == 'product' ? 'routine_product_' . $product_id . '.jpg' : 'routine_seckill_product_' . $product_id . '.jpg'; $data = 'id=' . $product_id; /** @var SystemAttachmentServices $systemAttachmentService */ $systemAttachmentService = app()->make(SystemAttachmentServices::class); $imageInfo = $systemAttachmentService->getOne(['name' => $namePath]); $siteUrl = sys_config('site_url'); if (!$imageInfo) { - $res = MiniProgramService::appCodeUnlimitService($data, 'pages/goods_details/index', 280); + $page = $type == 'product' ? 'pages/goods_details/index' : 'pages/activity/goods_seckill_details/index'; + $res = MiniProgramService::appCodeUnlimitService($data, $page, 280); if (!$res) return false; $uploadType = (int)sys_config('upload_type', 1); $upload = UploadService::init(); diff --git a/crmeb/app/services/product/product/OutStoreProductServices.php b/crmeb/app/services/product/product/OutStoreProductServices.php index 84297f4c3..d37292d3c 100644 --- a/crmeb/app/services/product/product/OutStoreProductServices.php +++ b/crmeb/app/services/product/product/OutStoreProductServices.php @@ -465,7 +465,7 @@ class OutStoreProductServices extends BaseServices } if ($goods) { - ProductStockJob::dispatchDo('distribute', [$goods]); + ProductStockJob::dispatch('distribute', [$goods]); } return true; }); diff --git a/crmeb/app/services/product/product/StoreCategoryServices.php b/crmeb/app/services/product/product/StoreCategoryServices.php index 5c09bb9ed..a6827ae35 100644 --- a/crmeb/app/services/product/product/StoreCategoryServices.php +++ b/crmeb/app/services/product/product/StoreCategoryServices.php @@ -116,7 +116,8 @@ class StoreCategoryServices extends BaseServices if (!$res) { throw new AdminException(100005); } else { - CacheService::delete('CATEGORY'); + $this->cacheDriver()->clear(); + $this->cacheDriver()->set('category_version', uniqid()); } } @@ -155,7 +156,7 @@ class StoreCategoryServices extends BaseServices } else { $f[] = Form::select('pid', '上级分类', (int)($info['pid'] ?? ''))->setOptions($this->menus())->filterable(1); } - $f[] = Form::input('cate_name', '分类名称', $info['cate_name'] ?? '')->maxlength(30)->required(); + $f[] = Form::input('cate_name', '分类名称', $info['cate_name'] ?? '')->maxlength(8)->required(); $f[] = Form::frameImage('pic', '分类图标(180*180)', Url::buildUrl('admin/widget.images/index', array('fodder' => 'pic')), $info['pic'] ?? '')->icon('ios-add')->width('950px')->height('505px')->modal(['footer-hide' => true]); $f[] = Form::frameImage('big_pic', '分类大图(468*340)', Url::buildUrl('admin/widget.images/index', array('fodder' => 'big_pic')), $info['big_pic'] ?? '')->icon('ios-add')->width('950px')->height('505px')->modal(['footer-hide' => true]); $f[] = Form::number('sort', '排序', (int)($info['sort'] ?? 0))->min(0)->precision(0); @@ -202,8 +203,10 @@ class StoreCategoryServices extends BaseServices $data['add_time'] = time(); $res = $this->dao->save($data); if (!$res) throw new AdminException(100006); - CacheService::delete('CATEGORY'); - CacheService::delete('CATEGORY_LIST'); + + $this->cacheDriver()->clear(); + $this->cacheDriver()->set('category_version', uniqid()); + return (int)$res->id; } @@ -234,8 +237,9 @@ class StoreCategoryServices extends BaseServices $res = $res && $productCate->update(['cate_id' => $id], ['cate_pid' => $data['pid']]); if (!$res) throw new AdminException(100007); }); - CacheService::delete('CATEGORY'); - CacheService::delete('CATEGORY_LIST'); + + $this->cacheDriver()->clear(); + $this->cacheDriver()->set('category_version', uniqid()); } /** @@ -249,8 +253,22 @@ class StoreCategoryServices extends BaseServices } $res = $this->dao->delete($id); if (!$res) throw new AdminException(100008); - CacheService::delete('CATEGORY'); - CacheService::delete('CATEGORY_LIST'); + + $this->cacheDriver()->clear(); + $this->cacheDriver()->set('category_version', uniqid()); + } + + /** + * @return mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function getCategoryVersion() + { + return $this->cacheDriver()->remember('category_version', function () { + return uniqid(); + }); } /** @@ -273,7 +291,7 @@ class StoreCategoryServices extends BaseServices if ($limit) { return $this->dao->getALlByIndex($where, 'id,cate_name,pid,pic', $limit); } else { - return CacheService::get('CATEGORY', function () { + return $this->cacheDriver()->remember('CATEGORY', function () { return $this->dao->getCategory(); }); } @@ -302,7 +320,7 @@ class StoreCategoryServices extends BaseServices */ public function getCategoryList(array $where) { - return CacheService::get('CATEGORY_LIST', function () use ($where) { + return $this->cacheDriver()->remember('CATEGORY_LIST', function () use ($where) { return $this->dao->getALlByIndex($where, 'id, cate_name, pid, pic, big_pic, sort, is_show, add_time'); }, 86400); } diff --git a/crmeb/app/services/product/product/StoreProductCouponServices.php b/crmeb/app/services/product/product/StoreProductCouponServices.php index 4731a4136..eeb943853 100644 --- a/crmeb/app/services/product/product/StoreProductCouponServices.php +++ b/crmeb/app/services/product/product/StoreProductCouponServices.php @@ -84,7 +84,7 @@ class StoreProductCouponServices extends BaseServices throw new ApiException(410173); } $key = 'order_product_coupon_' . $uid . '_' . $order['id']; - return CacheService::redisHandler()->get($key, []); + return CacheService::get($key, []); } /** @@ -124,7 +124,7 @@ class StoreProductCouponServices extends BaseServices } } $key = 'order_product_coupon_' . $uid . '_' . $orderId; - CacheService::redisHandler()->set($key, $list, 7200); + CacheService::set($key, $list, 7200); return true; } } diff --git a/crmeb/app/services/product/product/StoreProductServices.php b/crmeb/app/services/product/product/StoreProductServices.php index 6c7442b18..0409c9e7a 100644 --- a/crmeb/app/services/product/product/StoreProductServices.php +++ b/crmeb/app/services/product/product/StoreProductServices.php @@ -650,11 +650,11 @@ class StoreProductServices extends BaseServices if ($type == -1) { //下载商品轮播图 foreach ($slider_image as $s_image) { - ProductCopyJob::dispatchDo('copySliderImage', [$res->id, $s_image, count($slider_image)]); + ProductCopyJob::dispatch('copySliderImage', [$res->id, $s_image, count($slider_image)]); } preg_match_all('#]*>#i', $description, $match); foreach ($match[1] as $d_image) { - ProductCopyJob::dispatchDo('copyDescriptionImage', [$res->id, $description, $d_image, count($match[1])]); + ProductCopyJob::dispatch('copyDescriptionImage', [$res->id, $description, $d_image, count($match[1])]); } } @@ -1268,9 +1268,14 @@ class StoreProductServices extends BaseServices $storeInfo['fsales'] = $storeInfo['ficti'] + $storeInfo['sales']; $storeInfo['custom_form'] = json_decode($storeInfo['custom_form'], true); $storeInfo['slider_image'] = set_file_url($storeInfo['slider_image'], $siteUrl); - /** @var QrcodeServices $qrcodeService */ - $qrcodeService = app()->make(QrcodeServices::class); - $storeInfo['code_base'] = $qrcodeService->getWechatQrcodePath($id . '_product_detail_wap.jpg', '/pages/goods_details/index?id=' . $id); + + if (sys_config('share_qrcode', 0) && request()->isWechat()) { + /** @var QrcodeServices $qrcodeService */ + $qrcodeService = app()->make(QrcodeServices::class); + $storeInfo['wechat_code'] = $qrcodeService->getTemporaryQrcode('product-' . $id, $uid)->url; + } else { + $storeInfo['wechat_code'] = ''; + } /** @var StoreProductRelationServices $storeProductRelationServices */ $storeProductRelationServices = app()->make(StoreProductRelationServices::class); @@ -1917,42 +1922,30 @@ class StoreProductServices extends BaseServices return $data; } - /** * 商品分享二维码 推广员 * @param int $id * @param string $userType - * @param array $user - * @return void + * @param $user + * @return mixed|string */ public function getCode(int $id, string $userType, $user) { if (!$id || !$this->isValidProduct($id)) { throw new ApiException(410294); } - switch ($userType) { - case 'wechat': - //公众号 - $name = $id . '_product_detail_' . $user['uid'] . '_is_promoter_' . $user['is_promoter'] . '_wap.jpg'; - /** @var QrcodeServices $qrcodeService */ - $qrcodeService = app()->make(QrcodeServices::class); - $url = $qrcodeService->getWechatQrcodePath($name, '/pages/goods_details/index?id=' . $id . '&spread=' . $user['uid']); - if ($url === false) { - throw new ApiException(410167); - } - return image_to_base64($url); - case 'routine': - /** @var QrcodeServices $qrcodeService */ - $qrcodeService = app()->make(QrcodeServices::class); - $url = $qrcodeService->getRoutineQrcodePath($id, $user['uid'], 0, ['is_promoter' => $user['is_promoter']]); - if (!$url) { - throw new ApiException(410167); - } else { - if ($url == 'unpublished') throw new ApiException('小程序尚未发布,无法生成商品海报'); - return $url; - } - + if ($userType == 'routine') { + /** @var QrcodeServices $qrcodeService */ + $qrcodeService = app()->make(QrcodeServices::class); + $url = $qrcodeService->getRoutineQrcodePath($id, $user['uid'], 0, ['is_promoter' => $user['is_promoter']]); + if (!$url) { + throw new ApiException(410167); + } else { + if ($url == 'unpublished') throw new ApiException('小程序尚未发布,无法生成商品海报'); + return $url; + } } + return ''; } /** @@ -2035,11 +2028,11 @@ class StoreProductServices extends BaseServices foreach ($ids as $product_id) { $batchData[] = [ 'id' => $product_id, - 'is_hot' => in_array('is_hot',$data['recommend']) ? 1 : 0, - 'is_benefit' => in_array('is_benefit',$data['recommend']) ? 1 : 0, - 'is_new' => in_array('is_new',$data['recommend']) ? 1 : 0, - 'is_good' => in_array('is_good',$data['recommend']) ? 1 : 0, - 'is_best' => in_array('is_best',$data['recommend']) ? 1 : 0 + 'is_hot' => in_array('is_hot', $data['recommend']) ? 1 : 0, + 'is_benefit' => in_array('is_benefit', $data['recommend']) ? 1 : 0, + 'is_new' => in_array('is_new', $data['recommend']) ? 1 : 0, + 'is_good' => in_array('is_good', $data['recommend']) ? 1 : 0, + 'is_best' => in_array('is_best', $data['recommend']) ? 1 : 0 ]; } if (count($batchData)) $this->dao->saveAll($batchData); diff --git a/crmeb/app/services/product/sku/StoreProductAttrValueServices.php b/crmeb/app/services/product/sku/StoreProductAttrValueServices.php index d5f51bccc..f9c23092f 100644 --- a/crmeb/app/services/product/sku/StoreProductAttrValueServices.php +++ b/crmeb/app/services/product/sku/StoreProductAttrValueServices.php @@ -205,11 +205,11 @@ class StoreProductAttrValueServices extends BaseServices public function getSeckillAttrStock(int $productId, string $unique, bool $isNew = false) { $key = md5('seclkill_attr_stock_' . $productId . '_' . $unique); - $stock = CacheService::redisHandler()->get($key); + $stock = CacheService::get($key); if (!$stock || $isNew) { $stock = $this->dao->getOne(['product_id' => $productId, 'unique' => $unique, 'type' => 1], 'suk,quota'); if ($stock) { - CacheService::redisHandler()->set($key, $stock, 60); + CacheService::set($key, $stock, 60); } } return $stock; @@ -227,7 +227,7 @@ class StoreProductAttrValueServices extends BaseServices { if (!$suk && !$unique) return 0; $key = md5('product_attr_stock_' . $productId . '_' . $suk . '_' . $unique); - $stock = CacheService::redisHandler()->get($key); + $stock = CacheService::get($key); if (!$stock || $isNew) { $where = ['product_id' => $productId, 'type' => 0]; if ($suk) { @@ -237,7 +237,7 @@ class StoreProductAttrValueServices extends BaseServices $where['unique'] = $unique; } $stock = $this->dao->value($where, 'stock'); - CacheService::redisHandler()->set($key, $stock, 60); + CacheService::set($key, $stock, 60); } return $stock; } diff --git a/crmeb/app/services/shipping/SystemCityServices.php b/crmeb/app/services/shipping/SystemCityServices.php index 099b09634..f08aff12a 100644 --- a/crmeb/app/services/shipping/SystemCityServices.php +++ b/crmeb/app/services/shipping/SystemCityServices.php @@ -146,7 +146,7 @@ class SystemCityServices extends BaseServices */ public function cityList() { - return CacheService::get('CITY_LIST', function () { + return CacheService::remember('CITY_LIST', function () { $allCity = $this->dao->getCityList([], 'city_id as v,name as n,parent_id'); return sort_city_tier($allCity, 0); }, 0); diff --git a/crmeb/app/services/system/UpgradeServices.php b/crmeb/app/services/system/UpgradeServices.php index 59a8ec9d8..1a519815e 100644 --- a/crmeb/app/services/system/UpgradeServices.php +++ b/crmeb/app/services/system/UpgradeServices.php @@ -287,10 +287,10 @@ class UpgradeServices extends BaseServices } CacheService::set($token . '_database_backup', 1, 86400); - UpgradeJob::dispatchDo('databaseBackup', [$token]); + UpgradeJob::dispatch('databaseBackup', [$token]); CacheService::set($token . '_project_backup', 1, 86400); - UpgradeJob::dispatchDo('projectBackup', [$token]); + UpgradeJob::dispatch('projectBackup', [$token]); CacheService::set('upgrade_token', $token, 86400); CacheService::set($token . '_upgrade_data', $data, 86400); @@ -347,7 +347,7 @@ class UpgradeServices extends BaseServices $fileName = substr($packageLink, strrpos($packageLink, '/') + 1); $filePath = app()->getRootPath() . 'upgrade' . DS . date('Y-m-d');; if (!is_dir($filePath)) mkdir($filePath, 0755, true); - UpgradeJob::dispatchDo('download', [$seq, $packageLink, $filePath, $fileName, 300]); + UpgradeJob::dispatch('download', [$seq, $packageLink, $filePath, $fileName, 300]); CacheService::set($seq, 1, 86400); } diff --git a/crmeb/app/services/system/admin/AdminAuthServices.php b/crmeb/app/services/system/admin/AdminAuthServices.php index 1c0e447f3..facd66d5e 100644 --- a/crmeb/app/services/system/admin/AdminAuthServices.php +++ b/crmeb/app/services/system/admin/AdminAuthServices.php @@ -40,8 +40,11 @@ class AdminAuthServices extends BaseServices /** * 获取Admin授权信息 * @param string $token + * @param int $code * @return array - * @throws \Psr\SimpleCache\InvalidArgumentException + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException */ public function parseToken(string $token, int $code = 110003): array { @@ -58,30 +61,17 @@ class AdminAuthServices extends BaseServices //检测token是否过期 $md5Token = md5($token); - if (!$cacheService->hasToken($md5Token) || !($cacheToken = $cacheService->getTokenBucket($md5Token))) { + if (!$cacheService->has($md5Token) || !$cacheService->get($md5Token, '', NULL, 'admin')) { $this->authFailAfter($id, $type); throw new AuthException($code); } - //是否超出有效次数 - if (isset($cacheToken['invalidNum']) && $cacheToken['invalidNum'] >= 3) { - if (!request()->isCli()) { - $cacheService->clearToken($md5Token); - } - $this->authFailAfter($id, $type); - throw new AuthException($code); - } - //验证token try { $jwtAuth->verifyToken(); - $cacheService->setTokenBucket($md5Token, $cacheToken, $cacheToken['exp']); - } catch (ExpiredException $e) { - $cacheToken['invalidNum'] = isset($cacheToken['invalidNum']) ? $cacheToken['invalidNum']++ : 1; - $cacheService->setTokenBucket($md5Token, $cacheToken, $cacheToken['exp']); } catch (\Throwable $e) { if (!request()->isCli()) { - $cacheService->clearToken($md5Token); + $cacheService->delete($md5Token); } $this->authFailAfter($id, $type); throw new AuthException($code); @@ -91,7 +81,7 @@ class AdminAuthServices extends BaseServices $adminInfo = $this->dao->get($id); if (!$adminInfo || !$adminInfo->id) { if (!request()->isCli()) { - $cacheService->clearToken($md5Token); + $cacheService->delete($md5Token); } $this->authFailAfter($id, $type); throw new AuthException($code); diff --git a/crmeb/app/services/system/admin/SystemAdminServices.php b/crmeb/app/services/system/admin/SystemAdminServices.php index 36707c66d..5c970dac7 100644 --- a/crmeb/app/services/system/admin/SystemAdminServices.php +++ b/crmeb/app/services/system/admin/SystemAdminServices.php @@ -11,6 +11,7 @@ namespace app\services\system\admin; +use app\jobs\CheckQueueJob; use app\services\BaseServices; use app\services\order\StoreOrderServices; use app\services\product\product\StoreProductReplyServices; @@ -154,7 +155,7 @@ class SystemAdminServices extends BaseServices public function getLoginInfo() { $key = uniqid(); - event('admin.info', [$key]); + CheckQueueJob::dispatch([$key]); $data = [ 'slide' => sys_data('admin_login_slide') ?? [], 'logo_square' => sys_config('site_logo_square'),//透明 @@ -166,7 +167,7 @@ class SystemAdminServices extends BaseServices 'key' => $key, 'login_captcha' => 0 ]; - if (CacheService::redisHandler()->get('login_captcha', 1) > 1) { + if (CacheService::get('login_captcha', 1) > 1) { $data['login_captcha'] = 1; } return $data; diff --git a/crmeb/app/services/system/admin/SystemRoleServices.php b/crmeb/app/services/system/admin/SystemRoleServices.php index 01c7d033d..f6575b95c 100644 --- a/crmeb/app/services/system/admin/SystemRoleServices.php +++ b/crmeb/app/services/system/admin/SystemRoleServices.php @@ -105,7 +105,7 @@ class SystemRoleServices extends BaseServices } // 获取所有接口类型以及对应的接口 - $allAuth = Cache::remember('all_auth', function () { + $allAuth = Cache::get('all_auth', function () { /** @var SystemMenusServices $menusService */ $menusService = app()->make(SystemMenusServices::class); $allList = $menusService->getColumn([['api_url', '<>', ''], ['auth_type', '=', 2]], 'api_url,methods'); @@ -140,7 +140,7 @@ class SystemRoleServices extends BaseServices { if (empty($rules)) return []; $cacheName = md5($cachePrefix . '_' . $type . '_' . implode('_', $rules)); - return Cache::remember($cacheName, function () use ($rules, $type) { + return Cache::get($cacheName, function () use ($rules, $type) { /** @var SystemMenusServices $menusService */ $menusService = app()->make(SystemMenusServices::class); $authList = $menusService->getColumn([['id', 'IN', $this->getRoleIds($rules)], ['auth_type', '=', $type]], 'api_url,methods'); diff --git a/crmeb/app/services/system/attachment/SystemAttachmentServices.php b/crmeb/app/services/system/attachment/SystemAttachmentServices.php index 5a47d4a04..92c86542d 100644 --- a/crmeb/app/services/system/attachment/SystemAttachmentServices.php +++ b/crmeb/app/services/system/attachment/SystemAttachmentServices.php @@ -18,7 +18,6 @@ use crmeb\exceptions\AdminException; use crmeb\exceptions\ApiException; use crmeb\exceptions\UploadException; use app\services\other\UploadService; -use crmeb\traits\ServicesTrait; /** * @@ -30,8 +29,6 @@ use crmeb\traits\ServicesTrait; class SystemAttachmentServices extends BaseServices { - use ServicesTrait; - /** * SystemAttachmentServices constructor. * @param SystemAttachmentDao $dao @@ -213,7 +210,7 @@ class SystemAttachmentServices extends BaseServices * @return bool * @throws \Exception */ - public function emptyYesterdayAttachment() + public function emptyYesterdayAttachment(): bool { try { $list = $this->dao->getYesterday(); @@ -249,6 +246,10 @@ class SystemAttachmentServices extends BaseServices */ public function videoUpload($data, $file) { + $pathinfo = pathinfo($data['filename']); + if (isset($pathinfo['extension']) && !in_array($pathinfo['extension'], ['avi', 'mp4', 'wmv', 'rm', 'mpg', 'mpeg', 'mov', 'flv', 'swf'])) { + throw new AdminException(400558); + } $public_dir = app()->getRootPath() . 'public'; $dir = '/uploads/attach/' . date('Y') . DIRECTORY_SEPARATOR . date('m') . DIRECTORY_SEPARATOR . date('d'); $all_dir = $public_dir . $dir; diff --git a/crmeb/app/services/system/config/SystemConfigServices.php b/crmeb/app/services/system/config/SystemConfigServices.php index d9f5f9180..6677bf544 100644 --- a/crmeb/app/services/system/config/SystemConfigServices.php +++ b/crmeb/app/services/system/config/SystemConfigServices.php @@ -89,6 +89,9 @@ class SystemConfigServices extends BaseServices 'show_value' => 2 ], 'spread_banner' => '', + 'brokerage_level' => '', + 'division_status' => '', + 'member_brokerage' => '', ], 'show_value' => 1 ], @@ -354,24 +357,36 @@ class SystemConfigServices extends BaseServices { $formbuider = []; switch ($type) { - case 'input': - $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : ''; - $formbuider[] = $this->builder->input($data['menu_name'], $data['info'], $data['value'])->info($data['desc'])->placeholder($data['desc'])->col(13); - break; case 'number': $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : 0; - $formbuider[] = $this->builder->number($data['menu_name'], $data['info'], (float)$data['value'])->info($data['desc']); + $formbuider[] = $this->builder->number($data['menu_name'], $data['info'], (float)$data['value'])->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ]); break; case 'dateTime': - $formbuider[] = $this->builder->dateTime($data['menu_name'], $data['info'], $data['value'])->info($data['desc']); + $formbuider[] = $this->builder->dateTime($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ]); break; case 'color': $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : ''; - $formbuider[] = $this->builder->color($data['menu_name'], $data['info'], $data['value'])->info($data['desc']); + $formbuider[] = $this->builder->color($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ]); break; default: $data['value'] = isset($data['value']) ? json_decode($data['value'], true) : ''; - $formbuider[] = $this->builder->input($data['menu_name'], $data['info'], $data['value'])->info($data['desc'])->placeholder($data['desc'])->col(13); + $formbuider[] = $this->builder->input($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ])->col(13); break; } return $formbuider; @@ -385,7 +400,11 @@ class SystemConfigServices extends BaseServices public function createTextareaForm(array $data) { $data['value'] = json_decode($data['value'], true) ?: ''; - $formbuider[] = $this->builder->textarea($data['menu_name'], $data['info'], $data['value'])->placeholder($data['desc'])->info($data['desc'])->rows(6)->col(13); + $formbuider[] = $this->builder->textarea($data['menu_name'], $data['info'], $data['value'])->placeholder($data['desc'])->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ])->rows(6)->col(13); return $formbuider; } @@ -409,7 +428,11 @@ class SystemConfigServices extends BaseServices $options[] = ['label' => $pdata[1], 'value' => (int)$pdata[0]]; } } - $formbuider[] = $radio = $this->builder->radio($data['menu_name'], $data['info'], (int)$data['value'])->options($options)->info($data['desc'])->col(13); + $formbuider[] = $radio = $this->builder->radio($data['menu_name'], $data['info'], (int)$data['value'])->options($options)->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ])->col(13); if ($control) { $radio->appendControl($data['show_value'] ?? 1, is_array($control) ? $control : [$control]); } @@ -434,7 +457,11 @@ class SystemConfigServices extends BaseServices $data['value'] = json_decode($data['value'], true) ?: ''; if ($data['value'] != '') $data['value'] = set_file_url($data['value']); $formbuider[] = $this->builder->frameImage($data['menu_name'], $data['info'], $this->url('admin/widget.images/index', ['fodder' => $data['menu_name']], true), $data['value']) - ->icon('ios-image')->width('950px')->height('505px')->modal(['footer-hide' => true])->info($data['desc'])->col(13); + ->icon('ios-image')->width('950px')->height('505px')->modal(['footer-hide' => true])->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ])->col(13); break; case 2: $data['value'] = json_decode($data['value'], true) ?: []; @@ -442,13 +469,21 @@ class SystemConfigServices extends BaseServices $data['value'] = set_file_url($data['value']); $formbuider[] = $this->builder->frameImages($data['menu_name'], $data['info'], $this->url('admin/widget.images/index', ['fodder' => $data['menu_name'], 'type' => 'many', 'maxLength' => 5], true), $data['value']) ->maxLength(5)->icon('ios-images')->width('950px')->height('505px')->modal(['footer-hide' => true]) - ->info($data['desc'])->col(13); + ->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ])->col(13); break; case 3: $data['value'] = json_decode($data['value'], true) ?: ''; if ($data['value'] != '') $data['value'] = set_file_url($data['value']); $formbuider[] = $this->builder->uploadFile($data['menu_name'], $data['info'], $this->url('/adminapi/file/upload/1', ['type' => 1], false, true), $data['value']) - ->name('file')->info($data['desc'])->col(13)->data(['menu_name' => $data['menu_name']])->headers([ + ->name('file')->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ])->col(13)->data(['menu_name' => $data['menu_name']])->headers([ 'Authori-zation' => app()->request->header('Authori-zation'), ]); break; @@ -475,7 +510,11 @@ class SystemConfigServices extends BaseServices $options[] = ['label' => $pdata[1], 'value' => $pdata[0]]; } } - $formbuider[] = $this->builder->checkbox($data['menu_name'], $data['info'], $data['value'])->options($options)->info($data['desc'])->col(13); + $formbuider[] = $this->builder->checkbox($data['menu_name'], $data['info'], $data['value'])->options($options)->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ])->col(13); } return $formbuider; } @@ -499,7 +538,11 @@ class SystemConfigServices extends BaseServices $options[] = ['label' => $pdata[1], 'value' => $pdata[0]]; } } - $formbuider[] = $this->builder->select($data['menu_name'], $data['info'], $data['value'])->options($options)->info($data['desc'])->col(13); + $formbuider[] = $this->builder->select($data['menu_name'], $data['info'], $data['value'])->options($options)->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ])->col(13); } return $formbuider; } @@ -512,7 +555,11 @@ class SystemConfigServices extends BaseServices public function createColorForm(array $data) { $data['value'] = json_decode($data['value'], true) ?: ''; - $formbuider[] = $this->builder->color($data['menu_name'], $data['info'], $data['value'])->info($data['desc'])->col(13); + $formbuider[] = $this->builder->color($data['menu_name'], $data['info'], $data['value'])->appendRule('suffix', [ + 'type' => 'div', + 'class' => 'tips-info', + 'domProps' => ['innerHTML' => $data['desc']] + ])->col(13); return $formbuider; } @@ -904,7 +951,7 @@ class SystemConfigServices extends BaseServices break; } $formbuider[] = $this->builder->number('sort', '排序', (int)$menu['sort']); - $formbuider[] = $this->builder->radio('status', '状态', $menu['status'])->options([['value' => 1, 'label' => '显示'], ['value' => 2, 'label' => '隐藏']]); + $formbuider[] = $this->builder->radio('status', '状态', $menu['status'])->options([['value' => 1, 'label' => '显示'], ['value' => 0, 'label' => '隐藏']]); return create_form('编辑字段', $formbuider, $this->url('/setting/config/' . $id), 'PUT'); } @@ -914,7 +961,7 @@ class SystemConfigServices extends BaseServices */ public function formStatus(): array { - return [['value' => 1, 'label' => '显示'], ['value' => 2, 'label' => '隐藏']]; + return [['value' => 1, 'label' => '显示'], ['value' => 0, 'label' => '隐藏']]; } /** diff --git a/crmeb/app/services/system/config/SystemStorageServices.php b/crmeb/app/services/system/config/SystemStorageServices.php index 1c46cf62c..1c4a85e58 100644 --- a/crmeb/app/services/system/config/SystemStorageServices.php +++ b/crmeb/app/services/system/config/SystemStorageServices.php @@ -17,7 +17,6 @@ use app\services\BaseServices; use crmeb\exceptions\AdminException; use crmeb\services\FormBuilder; use app\services\other\UploadService; -use crmeb\traits\ServicesTrait; /** * Class SystemStorageServices @@ -25,7 +24,6 @@ use crmeb\traits\ServicesTrait; */ class SystemStorageServices extends BaseServices { - use ServicesTrait; /** * SystemStorageServices constructor. diff --git a/crmeb/app/services/system/lang/LangCodeServices.php b/crmeb/app/services/system/lang/LangCodeServices.php index 9144b2d8c..60bea4419 100644 --- a/crmeb/app/services/system/lang/LangCodeServices.php +++ b/crmeb/app/services/system/lang/LangCodeServices.php @@ -136,7 +136,7 @@ class LangCodeServices extends BaseServices $typeList = $langTypeServices->getColumn(['status' => 1, 'is_del' => 0], 'file_name'); foreach ($typeList as $value) { $langStr = 'api_lang_' . str_replace('-', '_', $value); - CacheService::redisHandler()->delete($langStr); + CacheService::delete($langStr); } return true; } diff --git a/crmeb/app/services/system/log/SystemFileServices.php b/crmeb/app/services/system/log/SystemFileServices.php index b142ace44..23af549aa 100644 --- a/crmeb/app/services/system/log/SystemFileServices.php +++ b/crmeb/app/services/system/log/SystemFileServices.php @@ -91,30 +91,17 @@ class SystemFileServices extends BaseServices //检测token是否过期 $md5Token = md5($token); - if (!$cacheService->hasToken($md5Token) || !($cacheToken = $cacheService->getTokenBucket($md5Token))) { - throw new AuthException(110008); - } - - //是否超出有效次数 - if (isset($cacheToken['invalidNum']) && $cacheToken['invalidNum'] >= 3) { - if (!request()->isCli()) { - $cacheService->clearToken($md5Token); - } + if (!$cacheService->has($md5Token) || !($cacheService->get($md5Token))) { throw new AuthException(110008); } //验证token try { $jwtAuth->verifyToken(); - $cacheService->setTokenBucket($md5Token, $cacheToken, $cacheToken['exp']); - } catch (ExpiredException $e) { - $cacheToken['invalidNum'] = isset($cacheToken['invalidNum']) ? $cacheToken['invalidNum']++ : 1; - $cacheService->setTokenBucket($md5Token, $cacheToken, $cacheToken['exp']); } catch (\Throwable $e) { if (!request()->isCli()) { - $cacheService->clearToken($md5Token); + $cacheService->delete($md5Token); } - throw new AuthException(110008); } diff --git a/crmeb/app/services/user/LoginServices.php b/crmeb/app/services/user/LoginServices.php index b3b0e52ed..f06a9001f 100644 --- a/crmeb/app/services/user/LoginServices.php +++ b/crmeb/app/services/user/LoginServices.php @@ -349,7 +349,7 @@ class LoginServices extends BaseServices if (!$key) { throw new ApiException(410037); } - [$openid, $wechatInfo, $spreadId, $login_type, $userType] = $createData = CacheService::getTokenBucket($key); + [$openid, $wechatInfo, $spreadId, $login_type, $userType] = $createData = CacheService::get($key); if (!$createData) { throw new ApiException(410037); } diff --git a/crmeb/app/services/user/UserAuthServices.php b/crmeb/app/services/user/UserAuthServices.php index 8d1688da5..e8989af66 100644 --- a/crmeb/app/services/user/UserAuthServices.php +++ b/crmeb/app/services/user/UserAuthServices.php @@ -39,7 +39,9 @@ class UserAuthServices extends BaseServices * 获取授权信息 * @param $token * @return array - * @throws \Psr\SimpleCache\InvalidArgumentException\ + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException */ public function parseToken($token): array { @@ -48,7 +50,7 @@ class UserAuthServices extends BaseServices if ($token === 'undefined') { throw new AuthException(110002); } - if (!$token || !$tokenData = CacheService::getTokenBucket($md5Token)) + if (!$token || !$tokenData = CacheService::get($md5Token, '', NULL, 'api')) throw new AuthException(110002); if (!is_array($tokenData) || empty($tokenData) || !isset($tokenData['uid'])) { @@ -64,14 +66,14 @@ class UserAuthServices extends BaseServices try { $jwtAuth->verifyToken(); } catch (\Throwable $e) { - if (!request()->isCli()) CacheService::clearToken($md5Token); + if (!request()->isCli()) CacheService::delete($md5Token); throw new AuthException(110003); } $user = $this->dao->get(['uid' => $id, 'is_del' => 0]); if (!$user || $user->uid != $tokenData['uid']) { - if (!request()->isCli()) CacheService::clearToken($md5Token); + if (!request()->isCli()) CacheService::delete($md5Token); throw new AuthException(110004); } $tokenData['type'] = $type; diff --git a/crmeb/app/services/user/UserBillServices.php b/crmeb/app/services/user/UserBillServices.php index f37324e06..6fca001ea 100644 --- a/crmeb/app/services/user/UserBillServices.php +++ b/crmeb/app/services/user/UserBillServices.php @@ -692,7 +692,7 @@ class UserBillServices extends BaseServices $where = []; $where['not_type'] = ['gain', 'system_sub', 'deduction', 'sign']; $where['not_category'] = ['exp', 'integral']; - return Cache::remember('user_type_list', function () use ($where) { + return Cache::get('user_type_list', function () use ($where) { return ['list' => $this->getBillType($where)]; }, 600); } diff --git a/crmeb/app/services/user/UserGroupServices.php b/crmeb/app/services/user/UserGroupServices.php index 8a5a6b010..a535b5516 100644 --- a/crmeb/app/services/user/UserGroupServices.php +++ b/crmeb/app/services/user/UserGroupServices.php @@ -16,7 +16,6 @@ use app\services\BaseServices; use app\dao\user\UserGroupDao; use crmeb\exceptions\AdminException; use crmeb\services\FormBuilder as Form; -use crmeb\traits\ServicesTrait; use think\facade\Route as Url; /** @@ -26,7 +25,6 @@ use think\facade\Route as Url; */ class UserGroupServices extends BaseServices { - use ServicesTrait; /** * UserGroupServices constructor. diff --git a/crmeb/app/services/user/UserLabelCateServices.php b/crmeb/app/services/user/UserLabelCateServices.php index d6103a010..1ccecd5f5 100644 --- a/crmeb/app/services/user/UserLabelCateServices.php +++ b/crmeb/app/services/user/UserLabelCateServices.php @@ -77,7 +77,7 @@ class UserLabelCateServices extends BaseServices */ public function getLabelCateAll() { - return CacheService::get($this->cacheName, function () { + return CacheService::remember($this->cacheName, function () { return $this->dao->getCateList(['type' => 0]); }); } diff --git a/crmeb/app/services/user/UserServices.php b/crmeb/app/services/user/UserServices.php index fe8663478..a8f493376 100644 --- a/crmeb/app/services/user/UserServices.php +++ b/crmeb/app/services/user/UserServices.php @@ -1426,7 +1426,7 @@ class UserServices extends BaseServices $user['is_complete'] = $wechatUserInfo['is_complete'] ?? 0; $user['couponCount'] = $storeCoupon->getUserValidCouponCount((int)$uid); $user['like'] = app()->make(StoreProductRelationServices::class)->getUserCollectCount($user['uid']); - $user['orderStatusNum'] = $storeOrder->getOrderData($uid, true, true); + $user['orderStatusNum'] = $storeOrder->getOrderData($uid); $user['notice'] = 0; /** @var UserMoneyServices $userMoney */ $userMoney = app()->make(UserMoneyServices::class); diff --git a/crmeb/app/services/wechat/RoutineServices.php b/crmeb/app/services/wechat/RoutineServices.php index 73aac6686..e4681a808 100644 --- a/crmeb/app/services/wechat/RoutineServices.php +++ b/crmeb/app/services/wechat/RoutineServices.php @@ -81,7 +81,7 @@ class RoutineServices extends BaseServices //更新用户信息 $wechatUserServices->wechatUpdata([$user['uid'], $createData[1]]); } - $token = $this->createToken((int)$user['uid'], 'routine'); + $token = $this->createToken((int)$user['uid'], 'api'); if ($token) { /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); @@ -131,7 +131,7 @@ class RoutineServices extends BaseServices $storeUserMobile = sys_config('store_user_mobile'); if ($storeUserMobile && !$user) { $userInfoKey = md5($openid . '_' . time() . '_rouine'); - CacheService::setTokenBucket($userInfoKey, $createData, 7200); + CacheService::set($userInfoKey, $createData, 7200); return ['key' => $userInfoKey]; } else if (!$user) { $user = $wechatUserServices->wechatOauthAfter($createData); @@ -139,7 +139,7 @@ class RoutineServices extends BaseServices //更新用户信息 $wechatUserServices->wechatUpdata([$user['uid'], $createData[1]]); } - $token = $this->createToken((int)$user['uid'], 'routine'); + $token = $this->createToken((int)$user['uid'], 'api'); if ($token) { /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); @@ -195,7 +195,7 @@ class RoutineServices extends BaseServices */ public function tempIds() { - return CacheService::get('TEMP_IDS_LIST', function () { + return CacheService::remember('TEMP_IDS_LIST', function () { /** @var SystemNotificationServices $sysNotify */ $sysNotify = app()->make(SystemNotificationServices::class); $marks = $sysNotify->getColumn([['routine_id', '>', 0]], 'routine_id', 'mark'); @@ -220,7 +220,7 @@ class RoutineServices extends BaseServices */ public function live($page, $limit) { - $list = CacheService::get('WECHAT_LIVE_LIST_' . $page . '_' . $limit, function () use ($page, $limit) { + $list = CacheService::remember('WECHAT_LIVE_LIST_' . $page . '_' . $limit, function () use ($page, $limit) { $list = MiniProgramService::getLiveInfo((int)$page, (int)$limit); foreach ($list as &$item) { $item['_start_time'] = date('m-d H:i', $item['start_time']); @@ -269,14 +269,14 @@ class RoutineServices extends BaseServices $storeUserMobile = sys_config('store_user_mobile'); if ($storeUserMobile && !$user) { $userInfoKey = md5($openid . '_' . time() . '_routine'); - CacheService::setTokenBucket($userInfoKey, $createData, 7200); + CacheService::set($userInfoKey, $createData, 7200); return ['key' => $userInfoKey]; } else if (!$user) { //写入用户信息 $user = $wechatUserServices->wechatOauthAfter($createData); - $token = $this->createToken((int)$user['uid'], 'routine'); + $token = $this->createToken((int)$user['uid'], 'api'); if ($token) { - $token['new_user'] = 1; + $token['new_user'] = (int)sys_config('get_avatar', 0); return $token; } else throw new ApiException(410019); @@ -284,7 +284,7 @@ class RoutineServices extends BaseServices if (!$user['status']) throw new ApiException(410027); //更新用户信息 $wechatUserServices->wechatUpdata([$user['uid'], ['code' => $spid]]); - $token = $this->createToken((int)$user['uid'], 'routine'); + $token = $this->createToken((int)$user['uid'], 'api'); /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); $visitServices->loginSaveVisit($user); @@ -332,12 +332,12 @@ class RoutineServices extends BaseServices if (!$user) { $userInfoKey = md5($openid . '_' . time() . '_routine'); - CacheService::setTokenBucket($userInfoKey, $createData, 7200); + CacheService::set($userInfoKey, $createData, 7200); return ['auth_login' => 1, 'key' => $userInfoKey]; } else { //更新用户信息 $wechatUserServices->wechatUpdata([$user['uid'], ['code' => $spid]]); - $token = $this->createToken((int)$user['uid'], 'routine'); + $token = $this->createToken((int)$user['uid'], 'api'); /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); $visitServices->loginSaveVisit($user); @@ -386,7 +386,7 @@ class RoutineServices extends BaseServices $createData = [$openid, $routineInfo, $spid, '', 'routine']; //写入用户信息 $user = $wechatUserServices->wechatOauthAfter($createData); - $token = $this->createToken((int)$user['uid'], 'routine'); + $token = $this->createToken((int)$user['uid'], 'api'); /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); $visitServices->loginSaveVisit($user); @@ -416,7 +416,7 @@ class RoutineServices extends BaseServices $userInfo = []; $userType = $login_type = 'routine'; if ($key) { - [$openid, $wechatInfo, $spreadId, $login_type, $userType] = $createData = CacheService::getTokenBucket($key); + [$openid, $wechatInfo, $spreadId, $login_type, $userType] = $createData = CacheService::get($key); } /** @var OAuth $oauth */ @@ -447,7 +447,7 @@ class RoutineServices extends BaseServices $wechatUserServices = app()->make(WechatUserServices::class); //写入用户信息 $user = $wechatUserServices->wechatOauthAfter([$openid, $wechatInfo, $spreadId, $login_type, $userType]); - $token = $this->createToken((int)$user['uid'], 'routine'); + $token = $this->createToken((int)$user['uid'], 'api'); if ($token) { /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); diff --git a/crmeb/app/services/wechat/WechatMessageServices.php b/crmeb/app/services/wechat/WechatMessageServices.php index 2d8d6b7bb..69e550f9c 100644 --- a/crmeb/app/services/wechat/WechatMessageServices.php +++ b/crmeb/app/services/wechat/WechatMessageServices.php @@ -54,7 +54,11 @@ class WechatMessageServices extends BaseServices /** * 微信消息前置操作 - * @param $event + * @param $message + * @return bool + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException */ public function wechatMessageBefore($message) { diff --git a/crmeb/app/services/wechat/WechatQrcodeServices.php b/crmeb/app/services/wechat/WechatQrcodeServices.php index dec065bfe..2cf187f4d 100644 --- a/crmeb/app/services/wechat/WechatQrcodeServices.php +++ b/crmeb/app/services/wechat/WechatQrcodeServices.php @@ -34,6 +34,9 @@ class WechatQrcodeServices extends BaseServices * 获取渠道码列表 * @param $where * @return array + * @throws \think\db\exception\DataNotFoundException + * @throws \think\db\exception\DbException + * @throws \think\db\exception\ModelNotFoundException */ public function qrcodeList($where) { diff --git a/crmeb/app/services/wechat/WechatServices.php b/crmeb/app/services/wechat/WechatServices.php index de2081a78..440148f6f 100644 --- a/crmeb/app/services/wechat/WechatServices.php +++ b/crmeb/app/services/wechat/WechatServices.php @@ -129,7 +129,7 @@ class WechatServices extends BaseServices //更新用户信息 $wechatUserServices->wechatUpdata([$user['uid'], $wechatInfo]); } - $token = $this->createToken((int)$user['uid'], 'wechat'); + $token = $this->createToken((int)$user['uid'], 'api'); if ($token) { /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); @@ -171,7 +171,7 @@ class WechatServices extends BaseServices $storeUserMobile = sys_config('store_user_mobile'); if ($storeUserMobile && !$user) { $userInfoKey = md5($openid . '_' . time() . '_wechat'); - Cache::setTokenBucket($userInfoKey, $createData, 7200); + Cache::set($userInfoKey, $createData, 7200); return ['key' => $userInfoKey]; } else if (!$user) { $user = $wechatUserServices->wechatOauthAfter($createData); @@ -180,7 +180,7 @@ class WechatServices extends BaseServices //更新用户信息 $wechatUserServices->wechatUpdata([$user['uid'], $wechatInfo]); } - $token = $this->createToken((int)$user['uid'], 'wechat'); + $token = $this->createToken((int)$user['uid'], 'api'); if ($token) { /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); @@ -239,12 +239,12 @@ class WechatServices extends BaseServices $storeUserMobile = sys_config('store_user_mobile'); if ($storeUserMobile && !$user) { $userInfoKey = md5($openid . '_' . time() . '_wechat'); - Cache::setTokenBucket($userInfoKey, $createData, 7200); + Cache::set($userInfoKey, $createData, 7200); return ['key' => $userInfoKey]; } else if (!$user) { //写入用户信息 $user = $wechatUserServices->wechatOauthAfter($createData); - $token = $this->createToken((int)$user['uid'], 'wechat'); + $token = $this->createToken((int)$user['uid'], 'api'); if ($token) { /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); @@ -255,7 +255,7 @@ class WechatServices extends BaseServices } else { //更新用户信息 $wechatUserServices->wechatUpdata([$user['uid'], ['code' => $spread]]); - $token = $this->createToken((int)$user['uid'], 'wechat'); + $token = $this->createToken((int)$user['uid'], 'api'); if ($token) { /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); @@ -284,7 +284,7 @@ class WechatServices extends BaseServices } catch (\Throwable $e) { $createData = [$openid, [], $spread, '', 'wechat']; $userInfoKey = md5($openid . '_' . time() . '_wechat'); - Cache::setTokenBucket($userInfoKey, $createData, 7200); + Cache::set($userInfoKey, $createData, 7200); return ['auth_login' => 1, 'key' => $userInfoKey]; } /** @var WechatUserServices $wechatUserServices */ @@ -292,7 +292,7 @@ class WechatServices extends BaseServices $user = $wechatUserServices->getAuthUserInfo($openid, 'wechat'); $createData = [$openid, $wechatInfo, $spread, '', 'wechat']; $userInfoKey = md5($openid . '_' . time() . '_wechat'); - Cache::setTokenBucket($userInfoKey, $createData, 7200); + Cache::set($userInfoKey, $createData, 7200); return ['auth_login' => 1, 'key' => $userInfoKey]; } @@ -310,7 +310,7 @@ class WechatServices extends BaseServices if (!$key) { throw new ApiException(410037); } - [$openid, $wechatInfo, $spreadId, $login_type, $userType] = $createData = CacheService::getTokenBucket($key); + [$openid, $wechatInfo, $spreadId, $login_type, $userType] = $createData = CacheService::get($key); if (!$createData) { throw new ApiException(410037); } @@ -319,7 +319,7 @@ class WechatServices extends BaseServices $wechatUser = app()->make(WechatUserServices::class); //更新用户信息 $user = $wechatUser->wechatOauthAfter([$openid, $wechatInfo, $spreadId, $login_type, $userType]); - $token = $this->createToken((int)$user['uid'], 'wechat'); + $token = $this->createToken((int)$user['uid'], 'api'); if ($token) { /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); @@ -398,7 +398,7 @@ class WechatServices extends BaseServices $wechatUser = app()->make(WechatUserServices::class); //更新用户信息 $user = $wechatUser->wechatOauthAfter([$openid, $userInfo, $spreadId, $login_type, $userType]); - $token = $this->createToken((int)$user['uid'], 'wechat'); + $token = $this->createToken((int)$user['uid'], 'api'); if ($token) { /** @var UserVisitServices $visitServices */ $visitServices = app()->make(UserVisitServices::class); diff --git a/crmeb/app/services/wechat/WechatUserServices.php b/crmeb/app/services/wechat/WechatUserServices.php index 9aa74730d..4b5922655 100644 --- a/crmeb/app/services/wechat/WechatUserServices.php +++ b/crmeb/app/services/wechat/WechatUserServices.php @@ -355,7 +355,7 @@ class WechatUserServices extends BaseServices if (!$this->dao->save($wechatInfo)) { throw new AuthException(410083); } - $userInfo['new_user'] = 1; + $userInfo['new_user'] = (int)sys_config('get_avatar', 0); return $userInfo; }); } diff --git a/crmeb/app/services/yihaotong/SmsAdminServices.php b/crmeb/app/services/yihaotong/SmsAdminServices.php index 520a5c805..440c413f1 100644 --- a/crmeb/app/services/yihaotong/SmsAdminServices.php +++ b/crmeb/app/services/yihaotong/SmsAdminServices.php @@ -121,7 +121,7 @@ class SmsAdminServices extends BaseServices } } CacheService::clear(); - CacheService::redisHandler()->set('sms_account', $account); + CacheService::set('sms_account', $account); return true; } else { return false; diff --git a/crmeb/app/services/yihaotong/SmsRecordServices.php b/crmeb/app/services/yihaotong/SmsRecordServices.php index a8312d958..ac62af244 100644 --- a/crmeb/app/services/yihaotong/SmsRecordServices.php +++ b/crmeb/app/services/yihaotong/SmsRecordServices.php @@ -14,8 +14,6 @@ namespace app\services\yihaotong; use app\dao\sms\SmsRecordDao; use app\services\BaseServices; -use app\services\serve\ServeServices; - /** * 短信发送记录 * Class SmsRecordServices @@ -36,41 +34,4 @@ class SmsRecordServices extends BaseServices { $this->dao = $dao; } - - /** - * 获取短信发送列表 - * @param array $where - * @return array - * @throws \think\db\exception\DataNotFoundException - * @throws \think\db\exception\DbException - * @throws \think\db\exception\ModelNotFoundException - */ - public function getRecordList(array $where) - { - [$page, $limit] = $this->getPageValue(); - $data = $this->dao->getRecordList($where, $page, $limit); - $count = $this->dao->count($where); - return compact('data', 'count'); - } - - /** - * 修改短信发送记录短信状态 - */ - public function modifyResultCode() - { - $recordIds = $this->dao->getCodeNull(); - if (count($recordIds)) { - /** @var ServeServices $smsHandle */ - $smsHandle = app()->make(ServeServices::class); - $codeLists = $smsHandle->sms()->getStatus($recordIds); - foreach ($codeLists as $item) { - if (isset($item['id']) && isset($item['resultcode'])) { - if ($item['resultcode'] == '' || $item['resultcode'] == null) $item['resultcode'] = 134; - $this->dao->update($item['id'], ['resultcode' => $item['resultcode']], 'record_id'); - } - } - return true; - } - return true; - } } diff --git a/crmeb/baota.sh b/crmeb/baota.sh deleted file mode 100644 index 7f73dbcd3..000000000 --- a/crmeb/baota.sh +++ /dev/null @@ -1,147 +0,0 @@ -#!/bin/bash -PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin -export PATH - -php_version='74' -mysql_version='5.7' -redis_version='6.2' -action_type='install' -root_path=$(cat /var/bt_setupPath.conf) -setup_path=$root_path/server - -#宝塔是否已安装 -if [ -z "$root_path" ]; then - echo "请先安装宝塔" - exit 1 -fi - -#nginx是否已安装 -if [ ! -f "${setup_path}/nginx/sbin/nginx" ]; then - echo "请先安装nginx并配置网站" - exit 1 -fi - -#安装php -php_install=1 -for phpVer in 71 72 73 74; do - if [ -d "${setup_path}/php/${phpVer}/bin" ]; then - php_version=${phpVer} - php_install=0 - fi -done -if [ $php_install == 1 ]; then -. ${setup_path}/panel/install/install_soft.sh 1 $action_type php $php_version -fi -case "${php_version}" in - '71') - extFile="${setup_path}/php/71/lib/php/extensions/no-debug-non-zts-20160303" - ;; - '72') - extFile="${setup_path}/php/72/lib/php/extensions/no-debug-non-zts-20170718" - ;; - '73') - extFile="${setup_path}/php/73/lib/php/extensions/no-debug-non-zts-20180731" - ;; - '74') - extFile="${setup_path}/php/74/lib/php/extensions/no-debug-non-zts-20190902" - ;; -esac - -#安装mysql -if [ ! -d "${setup_path}/mysql" ]; then -. ${setup_path}/panel/install/install_soft.sh 1 $action_type mysql $mysql_version -fi - -#安装redis -if [ ! -d "${setup_path}/redis" ]; then -. ${setup_path}/panel/install/install_soft.sh 0 $action_type redis $redis_version -fi - -#安装php-redis 插件 -if [ ! -e "${extFile}/redis.so" ]; then -. ${setup_path}/panel/install/install_soft.sh 1 $action_type redis $php_version -fi - -#安装php-swoole 插件 -if [ ! -e "${extFile}/swoole.so" ]; then -. ${setup_path}/panel/install/install_soft.sh 1 $action_type swoole4 $php_version -fi -#pcntl_signal pcntl_signal_dispatch pcntl_fork pcntl_wait pcntl_alarm 禁用函数删除 -sed -i 's/,proc_open//' ${setup_path}/php/$php_version/etc/php.ini - -#安装php-fileinfo 插件 -if [ ! -e "${extFile}/fileinfo.so" ]; then -. ${setup_path}/panel/install/install_soft.sh 1 $action_type fileinfo $php_version -fi - -#修改nginx配置 -project_path=$(cd `dirname $0`; pwd) -project_name="${project_path##*/}" -if [ -e "${setup_path}/panel/vhost/nginx/${project_name}.conf" ]; then -echo -e " -server -{ - listen 80; - server_name ${project_name}; - index index.php index.html index.htm default.php default.htm default.html; - root /www/wwwroot/${project_name}/public; - - #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则 - #error_page 404/404.html; - #SSL-END - - #ERROR-PAGE-START 错误页配置,可以注释、删除或修改 - #error_page 404 /404.html; - #error_page 502 /502.html; - #ERROR-PAGE-END - - #PHP-INFO-START PHP引用配置,可以注释或修改 - #清理缓存规则 - - location ~ /purge(/.*) { - proxy_cache_purge cache_one \$host\$1\$is_args\$args; - } - #引用反向代理规则,注释后配置的反向代理将无效 - location /notice { - proxy_pass http://127.0.0.1:20002/; - proxy_http_version 1.1; - proxy_set_header Upgrade \$http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header X-real-ip \$remote_addr; - proxy_set_header X-Forwarded-For \$remote_addr; - } - #提示:v4.3.0 以前版本,可不用配置一下代码 - location /msg { - proxy_pass http://127.0.0.1:20003/; - proxy_http_version 1.1; - proxy_set_header Upgrade \$http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header X-real-ip \$remote_addr; - proxy_set_header X-Forwarded-For \$remote_addr; - } - - include enable-php-00.conf; - #PHP-INFO-END - - #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效 - include ${setup_path}/panel/vhost/rewrite/${project_name}.conf; - #REWRITE-END - - #禁止访问的文件或目录 - location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) - { - return 404; - } - - #一键申请SSL证书验证目录相关设置 - location ~ \.well-known{ - allow all; - } - - access_log /www/wwwlogs/${project_name}.log; - error_log /www/wwwlogs/${project_name}.error.log; -} -" > ${setup_path}/panel/vhost/nginx/${project_name}.conf -fi -echo '' -# 操作说明,进入程序根目录运行 /bin/bash baota.sh diff --git a/crmeb/composer.json b/crmeb/composer.json index bb9d44240..f76c75341 100644 --- a/crmeb/composer.json +++ b/crmeb/composer.json @@ -47,7 +47,8 @@ "lizhichao/word": "^2.1", "alibabacloud/dysmsapi-20170525": "2.0.16", "fastknife/ajcaptcha": "^1.1", - "volcengine/volc-sdk-php": "^1.0" + "volcengine/volc-sdk-php": "^1.0", + "workerman/crontab": "^1.0" }, "autoload": { "psr-4": { diff --git a/crmeb/composer.lock b/crmeb/composer.lock index 12188c1b7..2537a4eee 100644 --- a/crmeb/composer.lock +++ b/crmeb/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ed7eebc8a056a7e32a6817940c48882c", + "content-hash": "7c5a944e11d96dd74471efbeddebdae8", "packages": [ { "name": "adbario/php-dot-notation", @@ -5113,6 +5113,62 @@ "homepage": "http://www.workerman.net", "time": "2018-07-02T02:42:37+00:00" }, + { + "name": "workerman/crontab", + "version": "v1.0.2", + "source": { + "type": "git", + "url": "https://github.com/walkor/crontab.git", + "reference": "28106241415049ee340a8a7cd9b640165240a2fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/walkor/crontab/zipball/28106241415049ee340a8a7cd9b640165240a2fa", + "reference": "28106241415049ee340a8a7cd9b640165240a2fa", + "shasum": "", + "mirrors": [ + { + "url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%", + "preferred": true + } + ] + }, + "require": { + "php": ">=7.0", + "workerman/workerman": ">=3.5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Workerman\\Crontab\\": "./src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "walkor", + "email": "walkor@workerman.net", + "homepage": "http://www.workerman.net", + "role": "Developer" + } + ], + "description": "A crontab written in PHP based on workerman", + "homepage": "http://www.workerman.net", + "keywords": [ + "crontab" + ], + "support": { + "email": "walkor@workerman.net", + "forum": "http://wenda.workerman.net/", + "issues": "https://github.com/walkor/workerman/issues", + "source": "https://github.com/walkor/crontab", + "wiki": "http://doc.workerman.net/" + }, + "time": "2021-10-06T14:18:14+00:00" + }, { "name": "workerman/workerman", "version": "v3.5.19", diff --git a/crmeb/config/cache.php b/crmeb/config/cache.php index 820546898..7c50b9d97 100644 --- a/crmeb/config/cache.php +++ b/crmeb/config/cache.php @@ -28,7 +28,7 @@ return [ // 缓存前缀 'prefix' => '', // 缓存有效期 0表示永久缓存 - 'expire' => 1800, + 'expire' => 0, // 缓存标签前缀 'tag_prefix' => 'tag:', // 序列化机制 例如 ['serialize', 'unserialize'] @@ -48,9 +48,9 @@ return [ // 缓存有效期 0表示永久缓存 'expire' => 0 , // 缓存前缀 - 'prefix' => 'c:', + 'prefix' => Env::get('cache.cache_prefix', 'c:'), // 缓存标签前缀 - 'tag_prefix' => 'CRMEB:', + 'tag_prefix' => Env::get('cache.cache_tag_prefix', 'CRMEB:'), // 数据库 0号数据库 'select' => intval(Env::get('redis.select', 0)), // 序列化机制 例如 ['serialize', 'unserialize'] diff --git a/crmeb/config/printer.php b/crmeb/config/printer.php index a1aee173b..0eb37aace 100644 --- a/crmeb/config/printer.php +++ b/crmeb/config/printer.php @@ -10,5 +10,7 @@ return [ 'stores' => [ //易联云 'yi_lian_yun' => [], + //飞鹅云 + 'fei_e_yun' => [], ] ]; \ No newline at end of file diff --git a/crmeb/config/upload.php b/crmeb/config/upload.php index 5f8f1bad9..5512b5966 100644 --- a/crmeb/config/upload.php +++ b/crmeb/config/upload.php @@ -34,6 +34,7 @@ return [ 'text/xml', 'image/x-icon', 'image/vnd.microsoft.icon', + 'application/x-x509-ca-cert', ], //驱动模式,此配置优先与后台配置,后台添加配置请加前缀,例如添加七牛云配置:accessKey 后台添加变量名 qiniu_accessKey 'stores' => [ diff --git a/crmeb/crmeb/services/CacheService.php b/crmeb/crmeb/services/CacheService.php index 36d8b936f..cf85c6cd8 100644 --- a/crmeb/crmeb/services/CacheService.php +++ b/crmeb/crmeb/services/CacheService.php @@ -11,23 +11,19 @@ namespace crmeb\services; +use think\cache\Driver; +use think\cache\TagSet; +use think\facade\Cache; use think\facade\Cache as CacheStatic; use think\facade\Config; /** - * crmeb 缓存类 + * CRMEB 缓存类 * Class CacheService * @package crmeb\services - * @mixin \Redis */ class CacheService { - /** - * 标签名 - * @var string - */ - protected static $globalCacheName = '_cached_1515146130'; - /** * 缓存队列key * @var string[] @@ -53,14 +49,16 @@ class CacheService */ protected static function getExpire(int $expire = null): int { - if (self::$expire) { - return (int)self::$expire; + if ($expire == null) { + if (self::$expire) { + return (int)self::$expire; + } + $default = Config::get('cache.default'); + $expire = Config::get('cache.stores.' . $default . '.expire'); + if (!is_int($expire)) { + $expire = (int)$expire; + } } - $default = Config::get('cache.default'); - $expire = Config::get('cache.stores.' . $default . '.expire'); - if (!is_int($expire)) - $expire = (int)$expire; - return self::$expire = $expire; } @@ -68,13 +66,12 @@ class CacheService * 写入缓存 * @param string $name 缓存名称 * @param mixed $value 缓存值 - * @param int $expire 缓存时间,为0读取系统缓存时间 - * @return bool + * @param int|null $expire 缓存时间,为0读取系统缓存时间 */ - public static function set(string $name, $value, int $expire = null): bool + public static function set(string $name, $value, int $expire = null, string $tag = 'crmeb') { try { - return self::handler()->set($name, $value, $expire ?? self::getExpire($expire)); + return Cache::tag($tag)->set($name, $value, $expire ?? self::getExpire($expire)); } catch (\Throwable $e) { return false; } @@ -83,14 +80,15 @@ class CacheService /** * 如果不存在则写入缓存 * @param string $name - * @param bool $default + * @param mixed $default * @param int|null $expire - * @return mixed + * @param string $tag + * @return mixed|string|null */ - public static function get(string $name, $default = false, int $expire = null) + public static function remember(string $name, $default = '', int $expire = null, string $tag = 'crmeb') { try { - return self::handler()->remember($name, $default, $expire ?? self::getExpire($expire)); + return Cache::tag($tag)->remember($name, $default, $expire ?? self::getExpire($expire)); } catch (\Throwable $e) { try { if (is_callable($default)) { @@ -105,184 +103,72 @@ class CacheService } /** - * 删除缓存 + * 读取缓存 * @param string $name - * @return bool - * @throws \Psr\SimpleCache\InvalidArgumentException + * @param mixed $default + * @return mixed|string */ - public static function delete(string $name) + public static function get(string $name, $default = '') { - return CacheStatic::delete($name); + return Cache::get($name) ?? $default; } /** - * 缓存句柄 - * - * @return \think\cache\TagSet|CacheStatic + * 删除缓存 + * @param string $name + * @return bool */ - public static function handler() + public static function delete(string $name) { - return CacheStatic::tag(self::$globalCacheName); + return Cache::delete($name); } /** * 清空缓存池 * @return bool */ - public static function clear() + public static function clear(string $tag = 'crmeb') { - return self::handler()->clear(); + return Cache::tag($tag)->clear(); } /** - * Redis缓存句柄 - * - * @return \think\cache\TagSet|CacheStatic - */ - public static function redisHandler(string $type = null) - { - if ($type) { - return CacheStatic::store('redis')->tag($type); - } else { - return CacheStatic::store('redis'); - } - } - - /** - * 放入令牌桶 - * @param string $key - * @param array $value - * @param null $expire - * @param string $type - * @return bool - * @throws \Psr\SimpleCache\InvalidArgumentException - */ - public static function setTokenBucket(string $key, $value, $expire = null, string $type = 'admin') - { - try { - $redisCahce = self::redisHandler($type); - return $redisCahce->set($key, $value, $expire); - } catch (\Throwable $e) { - return false; - } - } - - /** - * 清除所有令牌桶 - * @param string $type - * @return bool - */ - public static function clearTokenAll(string $type = 'admin') - { - try { - return self::redisHandler($type)->clear(); - } catch (\Throwable $e) { - return false; - } - } - - /** - * 清除令牌桶 - * @param string $type - * @return bool - */ - public static function clearToken(string $key) - { - try { - return self::redisHandler()->delete($key); - } catch (\Throwable $e) { - return false; - } - } - - /** - * 查看令牌是否存在 + * 检查缓存是否存在 * @param string $key * @return bool */ - public static function hasToken(string $key) + public static function has(string $key) { try { - return self::redisHandler()->has($key); + return Cache::has($key); } catch (\Throwable $e) { return false; } } - /** - * 获取token令牌桶 - * @param string $key - * @return mixed|null - * @throws \Psr\SimpleCache\InvalidArgumentException - */ - public static function getTokenBucket(string $key) - { - try { - return self::redisHandler()->get($key, null); - } catch (\Throwable $e) { - return null; - } - } - - /** - * 获取指定分数区间的成员 - * @param $key - * @param int $start - * @param int $end - * @param array $options - * @return mixed - */ - public static function zRangeByScore($key, $start = '-inf', $end = '+inf', array $options = []) - { - return self::redisHandler()->zRangeByScore($key, $start, $end, $options); - } - - - /** - * 魔术方法 - * @param $name - * @param $arguments - * @return mixed - */ - public static function __callStatic($name, $arguments) - { - return self::redisHandler()->{$name}(...$arguments); - } - - /** - * 魔术方法 - * @param $name - * @param $arguments - * @return mixed - */ - public function __call($name, $arguments) - { - return self::redisHandler()->{$name}(...$arguments); - } - + /** 以下三个方法仅开启redis之后才使用 */ /** * 设置redis入库队列 * @param string $unique * @param int $number * @param int $type - * @param bool $isPush true :重置 false:累加 - * @return bool + * @param bool $isPush + * @return false + * @throws \Psr\SimpleCache\InvalidArgumentException */ public static function setStock(string $unique, int $number, int $type = 1, bool $isPush = true) { + if (Config::get('cache.default') == 'file') return true; if (!$unique || !$number) return false; $name = (self::$redisQueueKey[$type] ?? '') . '_' . $type . '_' . $unique; - /** @var self $cache */ - $cache = self::redisHandler(); - $res = true; if ($isPush) { - $cache->del($name); + Cache::store('redis')->delete($name); } $data = []; for ($i = 1; $i <= $number; $i++) { $data[] = $i; } - return $res && $cache->lPush($name, ...$data); + return Cache::store('redis')->lPush($name, ...$data); } /** @@ -294,11 +180,12 @@ class CacheService */ public static function checkStock(string $unique, int $number = 0, int $type = 1) { + if (Config::get('cache.default') == 'file') return true; $name = (self::$redisQueueKey[$type] ?? '') . '_' . $type . '_' . $unique; if ($number) { - return self::redisHandler()->lLen($name) >= $number; + return Cache::store('redis')->lLen($name) >= $number; } else { - return self::redisHandler()->lLen($name); + return Cache::store('redis')->lLen($name); } } @@ -311,18 +198,102 @@ class CacheService */ public static function popStock(string $unique, int $number, int $type = 1) { + if (Config::get('cache.default') == 'file') return true; if (!$unique || !$number) return false; $name = (self::$redisQueueKey[$type] ?? '') . '_' . $type . '_' . $unique; - /** @var self $cache */ - $cache = self::redisHandler(); $res = true; - if ($number > $cache->lLen($name)) { + if ($number > Cache::store('redis')->lLen($name)) { return false; } for ($i = 1; $i <= $number; $i++) { - $res = $res && $cache->lPop($name); + $res = $res && Cache::store('redis')->lPop($name); } - return $res; } + + /** + * 存入当前秒杀商品属性有序集合 + * @param $set_key + * @param $score + * @param $value + * @return false + */ + public static function zAdd($set_key, $score, $value) + { + if (Config::get('cache.default') == 'file') return true; + try { + return Cache::store('redis')->zAdd($set_key, $score, $value); + } catch (\Throwable $e) { + return false; + } + } + + /** + * 取消集合中的秒杀商品 + * @param $set_key + * @param $value + * @return false + */ + public static function zRem($set_key, $value) + { + if (Config::get('cache.default') == 'file') return true; + try { + return Cache::store('redis')->zRem($set_key, $value); + } catch (\Throwable $e) { + return false; + } + } + + /** + * 检查锁 + * @param int $uid + * @param int $timeout + * @return bool + * @author 等风来 + * @email 136327134@qq.com + * @date 2022/11/22 + */ + public static function setMutex(string $key, int $timeout = 10) + { + $curTime = time(); + $readMutexKey = "redis:mutex:{$key}"; + $mutexRes = self::redisHandler()->handler()->setnx($readMutexKey, $curTime + $timeout); + if ($mutexRes) { + return true; + } + //就算意外退出,下次进来也会检查key,防止死锁 + $time = self::redisHandler()->handler()->get($readMutexKey); + if ($curTime > $time) { + self::redisHandler()->handler()->del($readMutexKey); + return self::redisHandler()->handler()->setnx($readMutexKey, $curTime + $timeout); + } + return false; + } + + /** + * Redis缓存句柄 + * + * @return Driver|TagSet + */ + public static function redisHandler($type = null) + { + if ($type) { + return CacheStatic::store('redis')->tag($type); + } else { + return CacheStatic::store('redis'); + } + } + + /** + * 删除锁 + * @param $uid + * @author 等风来 + * @email 136327134@qq.com + * @date 2022/11/22 + */ + public static function delMutex(string $key) + { + $readMutexKey = "redis:mutex:{$key}"; + self::redisHandler()->handler()->del($readMutexKey); + } } diff --git a/crmeb/crmeb/services/GroupDataService.php b/crmeb/crmeb/services/GroupDataService.php index 481a372e7..398c7c725 100644 --- a/crmeb/crmeb/services/GroupDataService.php +++ b/crmeb/crmeb/services/GroupDataService.php @@ -44,7 +44,7 @@ class GroupDataService if ($isCaChe) return $callable(); - return CacheService::get($cacheName, $callable); + return CacheService::remember($cacheName, $callable); } catch (\Throwable $e) { return $callable(); @@ -78,7 +78,7 @@ class GroupDataService if ($isCaChe) return $callable(); - return CacheService::get($cacheName, $callable); + return CacheService::remember($cacheName, $callable); } catch (\Throwable $e) { return $callable(); diff --git a/crmeb/crmeb/services/SystemConfigService.php b/crmeb/crmeb/services/SystemConfigService.php index 6f3e4a086..f2c2f9abf 100644 --- a/crmeb/crmeb/services/SystemConfigService.php +++ b/crmeb/crmeb/services/SystemConfigService.php @@ -41,7 +41,7 @@ class SystemConfigService if ($isCaChe) { return $callable(); } - return CacheService::get(self::CACHE_SYSTEM . ':' . $key, $callable); + return CacheService::remember(self::CACHE_SYSTEM . ':' . $key, $callable); } catch (\Throwable $e) { return $default; } @@ -64,7 +64,7 @@ class SystemConfigService if ($isCaChe) return $callable(); - return CacheService::get(self::CACHE_SYSTEM . ':' . md5(implode(',', $keys)), $callable); + return CacheService::remember(self::CACHE_SYSTEM . ':' . md5(implode(',', $keys)), $callable); } catch (\Throwable $e) { return Arr::getDefaultValue($keys); } diff --git a/crmeb/crmeb/services/app/WechatService.php b/crmeb/crmeb/services/app/WechatService.php index d75a5d780..0d9af5f2e 100644 --- a/crmeb/crmeb/services/app/WechatService.php +++ b/crmeb/crmeb/services/app/WechatService.php @@ -146,7 +146,12 @@ class WechatService $response = $messageService->wechatEventView($message); break; case 'funds_order_pay': - $prefix = substr($message['order_info']['trade_no'], 0, 2); + if (($count = strpos($message['order_info']['trade_no'], '_')) !== false) { + $trade_no = substr($message['order_info']['trade_no'], $count + 1); + } else { + $trade_no = $message['order_info']['trade_no']; + } + $prefix = substr($trade_no, 0, 2); //处理一下参数 switch ($prefix) { case 'cp': diff --git a/crmeb/crmeb/services/easywechat/Open3rd/AccessToken.php b/crmeb/crmeb/services/easywechat/Open3rd/AccessToken.php index 52a6ba074..e7f0a8df3 100644 --- a/crmeb/crmeb/services/easywechat/Open3rd/AccessToken.php +++ b/crmeb/crmeb/services/easywechat/Open3rd/AccessToken.php @@ -153,10 +153,10 @@ class AccessToken extends HttpService public function getComponentToken() { $accessTokenKey = md5($this->component_appid . '_' . $this->component_appid . '_' . $this->component_verify_ticket . '_' . $this->cacheTokenPrefix); - $component_access_token = $this->cache->redisHandler()->get($accessTokenKey); + $component_access_token = $this->cache->get($accessTokenKey); if (!$component_access_token) { $getToken = $this->getTokenFromServer(); - $this->cache->redisHandler()->set($accessTokenKey, $getToken['component_access_token'], $getToken['expires_in'] ? $getToken['expires_in'] - 200 : 7000); + $this->cache->set($accessTokenKey, $getToken['component_access_token'], $getToken['expires_in'] ? $getToken['expires_in'] - 200 : 7000); $component_access_token = $getToken['component_access_token']; } $this->component_access_token = $component_access_token; @@ -194,16 +194,16 @@ class AccessToken extends HttpService public function getAccessToken($authorizer_appid) { $accessTokenKey = md5('authorizer_access_token' . $authorizer_appid . '_' . $this->cacheTokenPrefix); - $authorizer_access_token = $this->cache->redisHandler()->get($accessTokenKey); + $authorizer_access_token = $this->cache->get($accessTokenKey); if (!$authorizer_access_token) { $refreshTokenKey = md5('authorizer_refresh_token' . $authorizer_appid . '_' . $this->cacheTokenPrefix); - $authorizer_refresh_token = $this->cache->redisHandler()->get($refreshTokenKey); + $authorizer_refresh_token = $this->cache->get($refreshTokenKey); if (!$authorizer_refresh_token) { throw new ApiException('请重新授权'); } $res = $this->freshAuthorizationToken($authorizer_appid, $authorizer_refresh_token); - $this->cache->redisHandler()->set(md5('authorizer_access_token' . $res['authorizer_appid'] . '_' . $this->cacheTokenPrefix), $res['authorizer_access_token'], $res['expires_in'] ? $res['expires_in'] - 200 : 7000); - $this->cache->redisHandler()->set(md5('authorizer_refrssh_token' . $res['authorizer_appid'] . '_' . $this->cacheTokenPrefix), $res['authorizer_refresh_token'], 30 * 24 * 3600); + $this->cache->set(md5('authorizer_access_token' . $res['authorizer_appid'] . '_' . $this->cacheTokenPrefix), $res['authorizer_access_token'], $res['expires_in'] ? $res['expires_in'] - 200 : 7000); + $this->cache->set(md5('authorizer_refrssh_token' . $res['authorizer_appid'] . '_' . $this->cacheTokenPrefix), $res['authorizer_refresh_token'], 30 * 24 * 3600); $authorizer_access_token = $res['authorizer_access_token']; } return $authorizer_access_token; @@ -224,10 +224,10 @@ class AccessToken extends HttpService throw new ApiException('获取authorizer_access_token失败'); } $res = $res['authorization_info']; - $this->cache->redisHandler()->set(md5('authorizer_access_token' . $res['authorizer_appid'] . '_' . $this->cacheTokenPrefix), $res['authorizer_access_token'], $res['expires_in'] ? $res['expires_in'] - 200 : 7000); + $this->cache->set(md5('authorizer_access_token' . $res['authorizer_appid'] . '_' . $this->cacheTokenPrefix), $res['authorizer_access_token'], $res['expires_in'] ? $res['expires_in'] - 200 : 7000); //在授权的公众号具备API权限时,才有此返回值 if (isset($res['authorizer_refrsh_token'])) { - $this->cache->redisHandler()->set(md5('authorizer_refresh_token' . $res['authorizer_appid'] . '_' . $this->cacheTokenPrefix), $res['authorizer_refrsh_token'], 30 * 24 * 3600); + $this->cache->set(md5('authorizer_refresh_token' . $res['authorizer_appid'] . '_' . $this->cacheTokenPrefix), $res['authorizer_refrsh_token'], 30 * 24 * 3600); } return $res; } diff --git a/crmeb/crmeb/services/easywechat/Open3rd/ProgramProvider.php b/crmeb/crmeb/services/easywechat/Open3rd/ProgramProvider.php index 8dd65b26f..98e0f7535 100644 --- a/crmeb/crmeb/services/easywechat/Open3rd/ProgramProvider.php +++ b/crmeb/crmeb/services/easywechat/Open3rd/ProgramProvider.php @@ -8,7 +8,7 @@ // +---------------------------------------------------------------------- // | Author: CRMEB Team // +---------------------------------------------------------------------- -namespace crmeb\services\easywechat\open3rd; +namespace crmeb\services\easywechat\Open3rd; use Pimple\Container; use Pimple\ServiceProviderInterface; diff --git a/crmeb/crmeb/services/pay/Pay.php b/crmeb/crmeb/services/pay/Pay.php index dcc3695af..0df30d650 100644 --- a/crmeb/crmeb/services/pay/Pay.php +++ b/crmeb/crmeb/services/pay/Pay.php @@ -22,9 +22,7 @@ use think\facade\Config; * 第三方支付 * Class AllinPay * @package crmeb\services\pay - * @mixin AliPay * @mixin WechatPay - * @mixin V3WechatPay */ class Pay extends BaseManager { diff --git a/crmeb/crmeb/services/pay/extend/allinpay/AllinPay.php b/crmeb/crmeb/services/pay/extend/allinpay/AllinPay.php new file mode 100644 index 000000000..4a78b3afc --- /dev/null +++ b/crmeb/crmeb/services/pay/extend/allinpay/AllinPay.php @@ -0,0 +1,353 @@ + +// +---------------------------------------------------------------------- +namespace crmeb\services\pay\extend\allinpay; + + +/** + * + * Class AllinPay + * @author 等风来 + * @email 136327134@qq.com + * @date 2022/12/27 + * @package crmeb\services\pay\extend\allinpay + */ +class AllinPay extends Client +{ + + //统一支付接口 + const UNITODER_PAY_API = 'unitorder/pay'; + + //统一扫码接口 + const UNITORDER_SCANQRPAY = 'unitorder/scanqrpay'; + + //退款 + const UNITODER_TRANX_REFUND = 'tranx/refund'; + + //订单查询 + const UNITODER_TRANX_QUERY = 'tranx/query'; + + const UNITODER_QPAY_AGREEAPPLY = 'qpay/agreeapply'; + + //微信公众号内支付请求地址 + const UNITODER_H5UNIONPAY = 'https://vsp.allinpay.com/apiweb/h5unionpay/unionorder'; + + /** + * @var string + */ + protected $api = ''; + + /** + * 支付类型 + * @var string + */ + protected $payType = ''; + + /** + * @var string + */ + protected $version = ''; + + /** + * @var string + */ + protected $orderKey = 'reqsn'; + + /** + * @var int + */ + protected $validtime = 720; + + /** + * 创建支付订单 + * @param string $trxamt + * @param string $orderId + * @param string $body + * @param string|null $openId + * @param string|null $appid + * @param string $frontUrl + * @param string $remark + * @return mixed + */ + public function create(string $trxamt, string $orderId, string $body, string $returl = null, string $openId = null, string $appid = null, string $frontUrl = '', string $remark = '') + { + $totalFee = (int)bcmul($trxamt, '100'); + + $data = [ + 'trxamt' => $totalFee, + $this->orderKey => $orderId, + 'validtime' => $this->validtime, + 'notify_url' => $this->notifyUrl + ]; + + if ($body) { + $data['body'] = $body; + } + + if ($remark) { + $data['remark'] = $remark; + } + + if ($this->payType) { + $data['paytype'] = $this->payType; + } + + if ($returl) { + $data['returl'] = $returl; + } + + if ($openId) { + $data['acct'] = $openId; + } + + if ($appid) { + $data['sub_appid'] = $appid; + } + + if ($frontUrl) { + $data['front_url'] = $frontUrl; + } + + if ($this->version) { + $data['version'] = $this->version; + } + + $form = !$this->api; + $api = $this->api; + + $this->version = ''; + $this->payType = ''; + $this->api = ''; + $this->orderKey = 'reqsn'; + $this->validtime = 720; + + return $this->send($api, ['data' => $data, 'form' => $form]); + } + + /** + * 微信H5支付 + * @param string $trxamt + * @param string $orderId + * @param string $body + * @param string $returl + * @param string $remark + * @return mixed + */ + public function h5Pay(string $trxamt, string $orderId, string $body, string $returl, string $remark = '') + { + $this->version = self::VERSION_NUM_12; + return $this->create($trxamt, $orderId, $body, $returl, null, null, '', $remark); + } + + /** + * 微信js支付 + * @param string $trxamt + * @param string $orderId + * @param string $body + * @param string $openId + * @param string $appId + * @param string $frontUrl + * @param string $remark + * @return mixed + */ + public function wechatPay(string $trxamt, string $orderId, string $body, string $openId, string $appId, string $frontUrl, string $remark = '') + { + $this->api = self::UNITODER_PAY_API; + return $this->create($trxamt, $orderId, $body, null, $openId, $appId, $frontUrl, $remark); + } + + /** + * app支付 微信和支付宝 + * @param string $trxamt + * @param string $orderId + * @param string $body + * @param bool $isWechat + * @param string $remark + * @return mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/14 + */ + public function appPay(string $trxamt, string $orderId, string $body, string $appid, string $openid = null, bool $isWechat = true, string $remark = '') + { + $this->api = self::UNITODER_PAY_API; + $this->payType = $isWechat ? 'A02' : 'A01'; + $this->version = self::VERSION_NUM_11; + return $this->create($trxamt, $orderId, $body, null, $openid, $appid, '', $remark); + } + + /** + * PC 收银台支付 + * @param string $trxamt + * @param string $orderId + * @param string $body + * @return mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/15 + */ + public function pcPay(string $trxamt, string $orderId, string $body, string $returl) + { + $totalFee = (int)bcmul($trxamt, '100'); + + $data = [ + 'paytype' => 'B2C', + 'trxamt' => $totalFee, + 'orderid' => $orderId, + 'notifyurl' => $this->notifyUrl, + 'goodsinf' => $body, + 'validtime' => $this->validtime, + 'returl' => $returl, + 'cusid' => $this->cusid, + 'appid' => $this->appid, + 'signtype' => $this->signType, + 'randomstr' => uniqid(), + 'charset' => 'UTF-8' + ]; + + $data['sign'] = $this->sign($data); + + return $data; + } + + /** + * @param string $trxamt + * @param string $orderId + * @param string $body + * @param string $returl + * @param string $remark + * @return array + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/15 + */ + public function miniproPay(string $trxamt, string $orderId, string $body, string $remark = '') + { + $totalFee = bcmul($trxamt, '100'); + + $data = [ + 'paytype' => 'W06', + 'trxamt' => $totalFee, + 'reqsn' => $orderId, + 'notify_url' => $this->notifyUrl, + 'body' => $body, + 'validtime' => (string)$this->validtime, + 'cusid' => $this->cusid, + 'appid' => $this->appid, + 'signtype' => $this->signType, + 'randomstr' => uniqid(), + 'remark' => $remark, + 'version' => self::VERSION_NUM_12 + ]; + + $data['sign'] = $this->sign($data); + + return $data; + } + + public function agreeapply() + { + $data = [ + 'meruserid' => 'eesssxxx', + 'accttype' => '00', + 'acctno' => '', + 'idtype' => 0, + 'idno' => '', + 'acctname' => '', + 'mobile' => '', + 'cvv2' => '', + 'reqip' => request()->ip(), + 'reqtime' => date('Y-m-d H:i:s'), + 'version' => self::VERSION_NUM_11, + ]; + + $data['cusid'] = $this->cusid; + $data['appid'] = $this->appid; + $data['signtype'] = 'RSA'; + $data['randomstr'] = uniqid(); + $data['sign'] = $this->sign($data); + + return $this->send(self::UNITODER_QPAY_AGREEAPPLY, ['data' => $data]); + } + + + /** + * 查询订单 + * @param string $reqsn + * @return array|mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/15 + */ + public function query(string $reqsn) + { + $data = [ + 'reqsn' => $reqsn + ]; + + return $this->send(self::UNITODER_TRANX_QUERY, ['data' => $data]); + } + + /** + * 发起退款 + * @param string $trxamt + * @param string $reqsn + * @return array|mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/15 + */ + public function refund(string $trxamt, string $orderId, string $reqsn) + { + $totalFee = (int)bcmul($trxamt, '100'); + + $data = [ + 'trxamt' => $totalFee, + 'reqsn' => $orderId, + 'oldtrxid' => $reqsn, + ]; + + return $this->send(self::UNITODER_TRANX_REFUND, ['data' => $data]); + } + + /** + * 异步回调 + * @param callable $callback + * @return string + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/15 + */ + public function handleNotify(callable $callback) + { + $params = []; + foreach (request()->post() as $key => $val) { + $params[$key] = $val; + } + + $this->debugLog('通联支付回调数据' . json_encode($params)); + + if (count($params) < 1) { + //如果参数为空,则不进行处理 + return "error"; + } + + $res = $this->validSign($params); + + $this->debugLog('通联支付回调验证:' . json_encode(['res' => $res])); + + if ($res && isset($params['trxstatus']) && $params['trxstatus'] === '0000') { + //验签成功 + return $callback($params) ? 'success' : 'error'; + } else { + return "error"; + } + } +} diff --git a/crmeb/crmeb/services/pay/extend/allinpay/Client.php b/crmeb/crmeb/services/pay/extend/allinpay/Client.php new file mode 100644 index 000000000..7437726cf --- /dev/null +++ b/crmeb/crmeb/services/pay/extend/allinpay/Client.php @@ -0,0 +1,283 @@ + +// +---------------------------------------------------------------------- +namespace crmeb\services\pay\extend\allinpay; + +use crmeb\exceptions\ApiException; +use crmeb\services\HttpService; +use think\facade\Cache; +use think\facade\Log; + +/** + * Class Client + * @author 等风来 + * @email 136327134@qq.com + * @date 2022/12/27 + * @package crmeb\services\pay\extend\allinpay + */ +class Client +{ + + //生产地址 + const API_URL = 'https://vsp.allinpay.com/apiweb/'; + + //测试接口地址 + const BETA_API_URL = 'https://syb-test.allinpay.com/apiweb/'; + + //版本号 + const VERSION_NUM_11 = '11'; + + //版本号 + const VERSION_NUM_12 = '12'; + + + protected $signType = 'MD5'; + + /** + * @var string + */ + protected $cusid = ''; + + /** + * @var string + */ + protected $appid = ''; + + /** + * @var string + */ + protected $privateKey = ''; + + /** + * @var + */ + protected $publicKey = ''; + + /** + * 回调地址 + * @var string + */ + protected $notifyUrl = ''; + + /** + * 是否测试 + * @var bool + */ + protected $isBeta = true; + + /** + * debug模式 + * @var bool + */ + protected $isDebug = true; + + /** + * Client constructor. + * @param array $config + */ + public function __construct(array $config = []) + { + $this->appid = $config['appid'] ?? ''; + $this->cusid = $config['cusid'] ?? ''; + $this->privateKey = $config['privateKey'] ?? ''; + $this->publicKey = $config['publicKey'] ?? ''; + $this->notifyUrl = $config['notifyUrl'] ?? ''; + $this->isBeta = $config['isBeta'] ?? true; + } + + /** + * 发送请求 + * @param string $url + * @param array $options + * @return mixed + */ + public function send(string $url, array $options = []) + { + $data = $options['data'] ?? []; + $header = $options['header'] ?? []; + + $data['cusid'] = $this->cusid; + $data['appid'] = $this->appid; + if (!isset($data['version'])) { + $data['version'] = self::VERSION_NUM_11; + } + + $data['signtype'] = $this->signType; + $data['randomstr'] = uniqid(); + + if (!empty($options['form'])) { + $data['charset'] = 'UTF-8'; + $data['version'] = self::VERSION_NUM_12; + $data['sign'] = $this->sign($data); + return $data; + } + + $data['sign'] = $this->sign($data); + + $response = $this->request($url, $data, 'post', $header); + + if ('SUCCESS' !== $response['retcode']) { + throw new ApiException($response['retmsg']); + } + + if (!empty($response['trxstatus']) && !in_array($response['trxstatus'], ['0000', '2008', '2000'])) { + throw new ApiException($response['errmsg']); + } + + if ($this->validSign($response)) { + return $response; + } + + throw new ApiException('创建订单成功验签失败'); + } + + /** + * @param string $url + * @param array $data + * @param string $method + * @param array $header + * @param int $timeout + * @return mixed + */ + public function request(string $url, array $data = [], string $method = 'post', array $header = [], int $timeout = 10) + { + $headerData = []; + if ($header) { + foreach ($header as $key => $item) { + $headerData[] = $key . ':' . $item; + } + } + + $content = HttpService::request($this->baseUrl($url), $method, $data, $headerData, $timeout); + + $respones = json_decode($content, true, 512, JSON_BIGINT_AS_STRING); + + $this->debugLog('API response decoded:', ['content' => $respones, 'header' => $header]); + + if (JSON_ERROR_NONE !== json_last_error()) { + throw new ApiException('Failed to parse JSON: ' . json_last_error_msg()); + } + + return $respones; + } + + /** + * @param string $message + * @param array $contents + */ + protected function debugLog(string $message, array $contents = []) + { + $this->isDebug && Log::debug($message, $contents); + } + + /** + * @param string|null $url + * @return string + */ + protected function baseUrl(string $url = null) + { + $baseUrl = $this->isBeta ? self::BETA_API_URL : self::API_URL; + if ($url) { + $baseUrl .= $url; + } + + return $baseUrl; + } + + /** + * @param array $data + * @return string + */ + public function sign(array $data) + { + + $private_key = $this->privateKey; + + if ($this->signType === 'MD5') { + $data['key'] = $private_key; + ksort($data); + + $bufSignSrc = $this->toUrlParams($data); + + return md5($bufSignSrc); + } else { + ksort($data); + + $bufSignSrc = $this->toUrlParams($data); + + $private_key = chunk_split($private_key, 64, "\n"); + + $key = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($private_key) . "-----END RSA PRIVATE KEY-----"; + + openssl_sign($bufSignSrc, $signature, $key); + + $sign = base64_encode($signature);//加密后的内容通常含有特殊字符,需要编码转换下,在网络间通过url传输时要注意base64编码是否是url安全的 + + return $sign; + } + } + + /** + * @param array $data + * @return string + */ + public function toUrlParams(array $data) + { + $buff = ""; + foreach ($data as $k => $v) { + if ($v != "" && !is_array($v)) { + $buff .= $k . "=" . $v . "&"; + } + } + + $buff = trim($buff, "&"); + return $buff; + } + + /** + * @param array $data + * @return false|int + */ + public function validSign(array $data) + { + $sign = $data['sign']; + unset($data['sign']); + + if ($this->signType === 'MD5') { + $data['key'] = $this->privateKey; + ksort($data); + $bufSignSrc = $this->toUrlParams($data); + return strtolower($sign) == strtolower(md5($bufSignSrc)); + } else { + ksort($data); + $bufSignSrc = $this->toUrlParams($data); + $public_key = $this->publicKey; + + $public_key = chunk_split($public_key, 64, "\n"); + + $key = "-----BEGIN PUBLIC KEY-----\n$public_key-----END PUBLIC KEY-----\n"; + + return openssl_verify($bufSignSrc, base64_decode($sign), $key); + } + } + + /** + * @param string $notifyUrl + * @return $this + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/7 + */ + public function setNotifyUrl(string $notifyUrl) + { + $this->notifyUrl = $notifyUrl; + return $this; + } +} diff --git a/crmeb/crmeb/services/pay/storage/AllinPay.php b/crmeb/crmeb/services/pay/storage/AllinPay.php new file mode 100644 index 000000000..a0b684d99 --- /dev/null +++ b/crmeb/crmeb/services/pay/storage/AllinPay.php @@ -0,0 +1,140 @@ + + * +---------------------------------------------------------------------- + */ + +namespace crmeb\services\pay\storage; + + +use app\services\pay\PayNotifyServices; +use crmeb\exceptions\PayException; +use crmeb\services\pay\BasePay; +use crmeb\services\pay\PayInterface; +use crmeb\services\pay\extend\allinpay\AllinPay as AllinPayService; +use crmeb\utils\Hook; +use EasyWeChat\Payment\Order; + +/** + * 通联支付 + * Class AllinPay + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/1 + * @package crmeb\services\pay\storage + */ +class AllinPay extends BasePay implements PayInterface +{ + + /** + * @var AllinPayService + */ + protected $pay; + + /** + * @param array $config + * @return mixed|void + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/15 + */ + protected function initialize(array $config) + { + $this->pay = new AllinPayService([ + 'appid' => sys_config('allin_appid'), + 'cusid' => sys_config('allin_cusid'), + 'privateKey' => sys_config('allin_private_key'), + 'publicKey' => sys_config('allin_public_key'), + 'notifyUrl' => trim(sys_config('site_url')) . '/api/pay/notify/allin', + 'isBeta' => false, + ]); + } + + /** + * 创建支付 + * @param string $orderId + * @param string $totalFee + * @param string $attach + * @param string $body + * @param string $detail + * @param array $options + * @return array|mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/15 + */ + public function create(string $orderId, string $totalFee, string $attach, string $body, string $detail, array $options = []) + { + $this->authSetPayType(); + + $notifyUrl = trim(sys_config('site_url')) . '/api/pay/notify/allin' . $attach; + $this->pay->setNotifyUrl($notifyUrl); + + switch ($this->payType) { + case Order::APP: + return $this->pay->appPay($totalFee, $orderId, $body, '', '', false, $attach); + case Order::JSAPI: + if (request()->isRoutine()) { + return $this->pay->miniproPay($totalFee, $orderId, $body, $attach); + } else { + return $this->pay->h5Pay($totalFee, $orderId, $body, $options['returl'] ?? '', $attach); + } + default: + throw new PayException('通联支付:支付类型错误或者暂不支持此环境下支付'); + } + } + + public function merchantPay(string $openid, string $orderId, string $amount, array $options = []) + { + throw new PayException('通联支付:暂不支持商家转账'); + } + + /** + * 发起退款 + * @param string $outTradeNo + * @param array $options + * @return array|mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/15 + */ + public function refund(string $outTradeNo, array $options = []) + { + return $this->pay->refund($options['refund_price'], $options['order_id'], $outTradeNo); + } + + public function queryRefund(string $outTradeNo, string $outRequestNo, array $other = []) + { + // TODO: Implement queryRefund() method. + } + + /** + * 异步回调 + * @return mixed|string + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/1/15 + */ + public function handleNotify(string $attach = '') + { + $attach = str_replace('allin', '', $attach); + return $this->pay->handleNotify(function ($notify) use ($attach) { + if (isset($notify['cusorderid'])) { + $notify['trade_no'] = $notify['trxid']; + $notify['out_trade_no'] = $notify['cusorderid']; + if (($count = strpos($notify['cusorderid'], '_')) !== false) { + $notify['out_trade_no'] = substr($notify['cusorderid'], $count + 1); + } + return (new Hook(PayNotifyServices::class, 'allin'))->listen($attach, $notify['out_trade_no'], $notify['trade_no']); + } + return false; + }); + } +} diff --git a/crmeb/crmeb/services/printer/storage/FeiEYun.php b/crmeb/crmeb/services/printer/storage/FeiEYun.php index 4ba0a003a..a1858498e 100644 --- a/crmeb/crmeb/services/printer/storage/FeiEYun.php +++ b/crmeb/crmeb/services/printer/storage/FeiEYun.php @@ -126,8 +126,9 @@ class FeiEYun extends BasePrinter break; } else { $next_new = mb_substr($str, $m, $j, 'utf-8'); - if (mb_strwidth($next_new, 'utf-8') < $blankNum) continue; - else { + if (mb_strwidth($next_new, 'utf-8') < $blankNum) { + continue; + } else { $m = $i + 1; $result[] = $new; $j = 1; diff --git a/crmeb/crmeb/services/upload/BaseUpload.php b/crmeb/crmeb/services/upload/BaseUpload.php index 6f1cf7acd..f649a853c 100644 --- a/crmeb/crmeb/services/upload/BaseUpload.php +++ b/crmeb/crmeb/services/upload/BaseUpload.php @@ -198,7 +198,7 @@ abstract class BaseUpload extends BaseStorage if (is_null($validate)) { $validate = $this->getConfig(); } - $this->extractValidate($validate); + $this->validate = $validate; return $this; } @@ -216,19 +216,6 @@ abstract class BaseUpload extends BaseStorage return $path; } - /** - * 提取上传验证 - */ - protected function extractValidate(array $validateArray) - { - $validate = []; - foreach ($validateArray as $key => $value) { - $validate[] = $key . ':' . (is_array($value) ? implode(',', $value) : $value); - } - $this->validate = implode('|', $validate); - unset($validate); - } - /** * 提取文件名 * @param string $path diff --git a/crmeb/crmeb/services/upload/storage/Cos.php b/crmeb/crmeb/services/upload/storage/Cos.php index b71b926d3..9e4e0b8ab 100644 --- a/crmeb/crmeb/services/upload/storage/Cos.php +++ b/crmeb/crmeb/services/upload/storage/Cos.php @@ -129,15 +129,14 @@ class Cos extends BaseUpload return $this->setError('Upload file does not exist'); } if ($this->validate) { - try { - $error = [ - $file . '.filesize' => 'Upload filesize error', - $file . '.fileExt' => 'Upload fileExt error', - $file . '.fileMime' => 'Upload fileMine error' - ]; - validate([$file => $this->validate], $error)->check([$file => $fileHandle]); - } catch (\Exception $e) { - return $this->setError($e->getMessage()); + if (!in_array(pathinfo($fileHandle->getOriginalName(), PATHINFO_EXTENSION), $this->validate['fileExt'])) { + return $this->setError('Upload fileExt error'); + } + if (filesize($fileHandle) > $this->validate['filesize']) { + return $this->setError('Upload filesize error'); + } + if (!in_array($fileHandle->getOriginalMime(), $this->validate['fileMime'])) { + return $this->setError('Upload fileMine error'); } } $key = $this->saveFileName($fileHandle->getRealPath(), $fileHandle->getOriginalExtension()); diff --git a/crmeb/crmeb/services/upload/storage/Local.php b/crmeb/crmeb/services/upload/storage/Local.php index 18d1bef77..c917f59cb 100644 --- a/crmeb/crmeb/services/upload/storage/Local.php +++ b/crmeb/crmeb/services/upload/storage/Local.php @@ -116,15 +116,14 @@ class Local extends BaseUpload return $this->setError('Upload file does not exist'); } if ($this->validate) { - try { - $error = [ - $file . '.filesize' => 'Upload filesize error', - $file . '.fileExt' => 'Upload fileExt error', - $file . '.fileMime' => 'Upload fileMine error' - ]; - validate([$file => $this->validate], $error)->check([$file => $fileHandle]); - } catch (ValidateException $e) { - return $this->setError($e->getMessage()); + if (!in_array(pathinfo($fileHandle->getOriginalName(), PATHINFO_EXTENSION), $this->validate['fileExt'])) { + return $this->setError('Upload fileExt error'); + } + if (filesize($fileHandle) > $this->validate['filesize']) { + return $this->setError('Upload filesize error'); + } + if (!in_array($fileHandle->getOriginalMime(), $this->validate['fileMime'])) { + return $this->setError('Upload fileMine error'); } } if ($realName) { @@ -361,7 +360,7 @@ class Local extends BaseUpload { if (file_exists($filePath)) { try { - $fileArr = explode('/',$filePath); + $fileArr = explode('/', $filePath); $fileName = end($fileArr); unlink($filePath); unlink(str_replace($fileName, 'big_' . $fileName, $filePath)); diff --git a/crmeb/crmeb/services/upload/storage/Oss.php b/crmeb/crmeb/services/upload/storage/Oss.php index cafbe745c..9d6bc140e 100644 --- a/crmeb/crmeb/services/upload/storage/Oss.php +++ b/crmeb/crmeb/services/upload/storage/Oss.php @@ -124,15 +124,14 @@ class Oss extends BaseUpload return $this->setError('Upload file does not exist'); } if ($this->validate) { - try { - $error = [ - $file . '.filesize' => 'Upload filesize error', - $file . '.fileExt' => 'Upload fileExt error', - $file . '.fileMime' => 'Upload fileMine error' - ]; - validate([$file => $this->validate], $error)->check([$file => $fileHandle]); - } catch (\Exception $e) { - return $this->setError($e->getMessage()); + if (!in_array(pathinfo($fileHandle->getOriginalName(), PATHINFO_EXTENSION), $this->validate['fileExt'])) { + return $this->setError('Upload fileExt error'); + } + if (filesize($fileHandle) > $this->validate['filesize']) { + return $this->setError('Upload filesize error'); + } + if (!in_array($fileHandle->getOriginalMime(), $this->validate['fileMime'])) { + return $this->setError('Upload fileMine error'); } } $key = $this->saveFileName($fileHandle->getRealPath(), $fileHandle->getOriginalExtension()); diff --git a/crmeb/crmeb/services/upload/storage/Qiniu.php b/crmeb/crmeb/services/upload/storage/Qiniu.php index 7b4624363..47ab08501 100644 --- a/crmeb/crmeb/services/upload/storage/Qiniu.php +++ b/crmeb/crmeb/services/upload/storage/Qiniu.php @@ -120,15 +120,14 @@ class Qiniu extends BaseUpload return $this->setError('Upload file does not exist'); } if ($this->validate) { - try { - $error = [ - $file . '.filesize' => 'Upload filesize error', - $file . '.fileExt' => 'Upload fileExt error', - $file . '.fileMime' => 'Upload fileMine error' - ]; - validate([$file => $this->validate], $error)->check([$file => $fileHandle]); - } catch (\Exception $e) { - return $this->setError($e->getMessage()); + if (!in_array(pathinfo($fileHandle->getOriginalName(), PATHINFO_EXTENSION), $this->validate['fileExt'])) { + return $this->setError('Upload fileExt error'); + } + if (filesize($fileHandle) > $this->validate['filesize']) { + return $this->setError('Upload filesize error'); + } + if (!in_array($fileHandle->getOriginalMime(), $this->validate['fileMime'])) { + return $this->setError('Upload fileMine error'); } } $key = $this->saveFileName($fileHandle->getRealPath(), $fileHandle->getOriginalExtension()); diff --git a/crmeb/crmeb/traits/QueueTrait.php b/crmeb/crmeb/traits/QueueTrait.php index 0a8c44524..9051d1c4c 100644 --- a/crmeb/crmeb/traits/QueueTrait.php +++ b/crmeb/crmeb/traits/QueueTrait.php @@ -23,7 +23,7 @@ trait QueueTrait { /** * 列名 - * @return string + * @return null */ protected static function queueName() { @@ -32,25 +32,36 @@ trait QueueTrait /** * 加入队列 - * @param array|string|int $action + * @param $action * @param array $data * @param string|null $queueName * @return mixed */ public static function dispatch($action, array $data = [], string $queueName = null) { - $queue = Queue::instance()->job(__CLASS__); - if (is_array($action)) { - $queue->data(...$action); - } else if (is_string($action)) { - $queue->do($action)->data(...$data); + if (sys_config('queue_open', 0) == 1) { + $queue = Queue::instance()->job(__CLASS__); + if (is_array($action)) { + $queue->data(...$action); + } else if (is_string($action)) { + $queue->do($action)->data(...$data); + } + if ($queueName) { + $queue->setQueueName($queueName); + } else if (static::queueName()) { + $queue->setQueueName(static::queueName()); + } + return $queue->push(); + } else { + $className = '\\' . __CLASS__; + $res = new $className(); + if (is_array($action)) { + $res->doJob(...$action); + } else { + $res->$action(...$data); + } + } - if ($queueName) { - $queue->setQueueName($queueName); - } else if (static::queueName()) { - $queue->setQueueName(static::queueName()); - } - return $queue->push(); } /** @@ -61,45 +72,21 @@ trait QueueTrait * @param string|null $queueName * @return mixed */ - public static function dispatchSece(int $secs, $action, array $data = [], string $queueName = null) + public static function dispatchSecs(int $secs, $action, array $data = [], string $queueName = null) { - $queue = Queue::instance()->job(__CLASS__)->secs($secs); - if (is_array($action)) { - $queue->data(...$action); - } else if (is_string($action)) { - $queue->do($action)->data(...$data); + if (sys_config('queue_open', 0) == 1) { + $queue = Queue::instance()->job(__CLASS__)->secs($secs); + if (is_array($action)) { + $queue->data(...$action); + } else if (is_string($action)) { + $queue->do($action)->data(...$data); + } + if ($queueName) { + $queue->setQueueName($queueName); + } else if (static::queueName()) { + $queue->setQueueName(static::queueName()); + } + return $queue->push(); } - if ($queueName) { - $queue->setQueueName($queueName); - } else if (static::queueName()) { - $queue->setQueueName(static::queueName()); - } - return $queue->push(); } - - /** - * 加入小队列 - * @param string $do - * @param array $data - * @param int|null $secs - * @param string|null $queueName - * @return mixed - */ - public static function dispatchDo(string $do, array $data = [], int $secs = null, string $queueName = null) - { - $queue = Queue::instance()->job(__CLASS__)->do($do); - if ($secs) { - $queue->secs($secs); - } - if ($data) { - $queue->data(...$data); - } - if ($queueName) { - $queue->setQueueName($queueName); - } else if (static::queueName()) { - $queue->setQueueName(static::queueName()); - } - return $queue->push(); - } - } diff --git a/crmeb/crmeb/traits/ServicesTrait.php b/crmeb/crmeb/traits/ServicesTrait.php index 72fb25f74..8734531aa 100644 --- a/crmeb/crmeb/traits/ServicesTrait.php +++ b/crmeb/crmeb/traits/ServicesTrait.php @@ -36,4 +36,14 @@ use think\Model; trait ServicesTrait { + /** + * @return \crmeb\utils\Cache + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function cacheDriver() + { + return new \crmeb\utils\Cache($this->dao->getTableName()); + } } diff --git a/crmeb/crmeb/utils/Cache.php b/crmeb/crmeb/utils/Cache.php new file mode 100644 index 000000000..0818f9f55 --- /dev/null +++ b/crmeb/crmeb/utils/Cache.php @@ -0,0 +1,155 @@ + + * +---------------------------------------------------------------------- + */ + +namespace crmeb\utils; + + +use think\cache\TagSet; +use think\facade\Cache as ThinkCache; + +/** + * Class Cache + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + * @package crmeb\utils + */ +class Cache +{ + + protected $key; + + /** + * @var string + */ + protected $origin = 'crmebbz'; + + /** + * Cache constructor. + * @param string $key + */ + public function __construct(string $key) + { + $this->key = $key; + } + + /** + * @return string + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function getTagName() + { + return $this->origin . ':t:' . $this->key; + } + + /** + * @return string + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function getValueName() + { + return $this->origin . ':v:' . $this->key; + } + + /** + * @return TagSet + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + protected function tag() + { + return ThinkCache::tag($this->getTagName()); + } + + /** + * @param string $name + * @param $value + * @param null $expire + * @return mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function remember(string $name, $value, $expire = null) + { + return $this->tag()->remember($this->getValueName() . ':' . $name, $value, $expire); + } + + /** + * @param $name + * @return bool + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function delete($name) + { + return ThinkCache::delete($this->getValueName() . ':' . $name); + } + + /** + * @param $name + * @return bool + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function has($name) + { + return ThinkCache::has($this->getValueName() . ':' . $name); + } + + /** + * @param $name + * @param null $default + * @return mixed + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function get($name, $default = null) + { + return ThinkCache::get($this->getValueName() . ':' . $name, $default); + } + + /** + * @param $name + * @param $value + * @param null $expire + * @return bool + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function set($name, $value, $expire = null) + { + return $this->tag()->set($this->getValueName() . ':' . $name, $value, $expire); + } + + /** + * @return bool + * @author 等风来 + * @email 136327134@qq.com + * @date 2023/2/8 + */ + public function clear() + { + return $this->tag()->clear(); + } + +} diff --git a/crmeb/crmeb/utils/JwtAuth.php b/crmeb/crmeb/utils/JwtAuth.php index b70d47f06..eea624852 100644 --- a/crmeb/crmeb/utils/JwtAuth.php +++ b/crmeb/crmeb/utils/JwtAuth.php @@ -93,7 +93,7 @@ class JwtAuth { $tokenInfo = $this->getToken($id, $type, $params); $exp = $tokenInfo['params']['exp'] - $tokenInfo['params']['iat'] + 60; - $res = CacheService::setTokenBucket(md5($tokenInfo['token']), ['uid' => $id, 'type' => $type, 'token' => $tokenInfo['token'], 'exp' => $exp], (int)$exp, $type); + $res = CacheService::set(md5($tokenInfo['token']), ['uid' => $id, 'type' => $type, 'token' => $tokenInfo['token'], 'exp' => $exp], (int)$exp, $type); if (!$res) { throw new AdminException(100023); } diff --git a/crmeb/index.html b/crmeb/index.html new file mode 100644 index 000000000..dc5110747 --- /dev/null +++ b/crmeb/index.html @@ -0,0 +1,13 @@ + + + + + + +
+ 请将站点运行目录修改至public目录下 + 查看文档 +
+ + + \ No newline at end of file diff --git a/crmeb/public/install/.env b/crmeb/public/install/.env index 739da1d54..0caf75351 100755 --- a/crmeb/public/install/.env +++ b/crmeb/public/install/.env @@ -1 +1 @@ -APP_DEBUG = true [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = mysql HOSTNAME = #DB_HOST# HOSTPORT = #DB_PORT# USERNAME = #DB_USER# PASSWORD = '#DB_PWD#' DATABASE = #DB_NAME# PREFIX = #DB_PREFIX# CHARSET = utf8 DEBUG = true [LANG] default_lang = zh-cn [REDIS] REDIS_HOSTNAME = #RB_HOST# PORT = #RB_PORT# REDIS_PASSWORD = '#RB_PWD#' SELECT = #RB_SELECT# [QUEUE] QUEUE_NAME = #QUEUE_NAME# \ No newline at end of file +APP_DEBUG = true [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = mysql HOSTNAME = #DB_HOST# HOSTPORT = #DB_PORT# USERNAME = #DB_USER# PASSWORD = '#DB_PWD#' DATABASE = #DB_NAME# PREFIX = #DB_PREFIX# CHARSET = utf8 DEBUG = true [LANG] default_lang = zh-cn [CACHE] DRIVER = #CACHE_TYPE# CACHE_PREFIX = #CACHE_PREFIX# CACHE_TAG_PREFIX = #CACHE_TAG_PREFIX# [REDIS] REDIS_HOSTNAME = #RB_HOST# PORT = #RB_PORT# REDIS_PASSWORD = '#RB_PWD#' SELECT = #RB_SELECT# [QUEUE] QUEUE_NAME = #QUEUE_NAME# \ No newline at end of file diff --git a/crmeb/public/install/crmeb.sql b/crmeb/public/install/crmeb.sql index 6ff8cb075..a83383290 100644 --- a/crmeb/public/install/crmeb.sql +++ b/crmeb/public/install/crmeb.sql @@ -33009,7 +33009,7 @@ CREATE TABLE IF NOT EXISTS `eb_system_config` ( `sort` int(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '排序', `status` tinyint(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '是否隐藏', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=418 DEFAULT CHARSET=utf8 COMMENT='配置表'; +) ENGINE=InnoDB AUTO_INCREMENT=428 DEFAULT CHARSET=utf8 COMMENT='配置表'; -- -- 转存表中的数据 `eb_system_config` @@ -33020,13 +33020,13 @@ INSERT INTO `eb_system_config` (`id`, `menu_name`, `type`, `input_type`, `config (2, 'site_url', 'text', 'input', 26, '', 1, 'required:true,url:true', 100, 0, '\"\"', '网站地址', '安装自动配置,不要轻易修改,更换会影响网站访问、接口请求、本地文件储存、支付回调、微信授权、支付、小程序图片访问、部分二维码、官方授权等', 9, 1), (3, 'site_logo', 'upload', '', 26, '', 1, '', 0, 0, '\"\\/statics\\/system_images\\/admin_logo_big.png\"', '后台大LOGO', '菜单展开左上角logo,建议尺寸[170*50]', 3, 1), (4, 'site_phone', 'text', 'input', 1, '', 0, '', 100, 0, '\"\"', '联系电话', '联系电话', 0, 0), -(13, 'wechat_appid', 'text', 'input', 2, '', 1, '', 0, 0, '\"\"', 'AppID', 'AppID', 99, 1), -(14, 'wechat_appsecret', 'text', 'input', 2, '', 1, '', 0, 0, '\"\"', 'AppSecret', 'AppSecret', 95, 1), +(13, 'wechat_appid', 'text', 'input', 2, '', 1, '', 0, 0, '\"\"', 'AppID', '微信公众号的AppID', 99, 1), +(14, 'wechat_appsecret', 'text', 'input', 2, '', 1, '', 0, 0, '\"\"', 'AppSecret', '微信公众号的AppSecret', 95, 1), (15, 'wechat_token', 'text', 'input', 2, '', 1, '', 0, 0, '\"\"', '微信验证TOKEN', '微信验证TOKEN', 88, 1), -(16, 'wechat_encode', 'radio', 'input', 2, '0=>明文模式\n1=>兼容模式\n2=>安全模式', 1, '', 0, 0, '0', '消息加解密方式', '如需使用安全模式请在管理中心修改,仅限服务号和认证订阅号', 84, 1), -(17, 'wechat_encodingaeskey', 'text', 'input', 2, '', 1, '', 0, 0, '\"\"', 'EncodingAESKey', '公众号消息加解密Key,在使用安全模式情况下要填写该值,请先在管理中心修改,然后填写该值,仅限服务号和认证订阅号', 80, 1), +(16, 'wechat_encode', 'radio', 'input', 2, '0=>明文模式\n1=>兼容模式\n2=>安全模式', 1, '', 0, 0, '0', '消息加解密方式', '如需使用安全模式请在管理中心修改,仅限服务号和认证订阅号', 84, 0), +(17, 'wechat_encodingaeskey', 'text', 'input', 2, '', 1, '', 0, 0, '\"\"', 'EncodingAESKey', '公众号消息加解密Key,在使用安全模式情况下要填写该值,请先在管理中心修改,然后填写该值,仅支持认证服务号', 80, 1), (18, 'wechat_share_img', 'upload', '', 70, '', 1, '', 0, 0, '\"\\/statics\\/system_images\\/share_image.jpeg\"', '微信分享图片', '若填写此图片地址,则分享网页出去时会分享此图片。可有效防止分享图片变形', 0, 1), -(19, 'wechat_qrcode', 'upload', 'input', 2, '', 1, '', 0, 0, '\"\"', '公众号关注二维码', '公众号关注二维码', 76, 1), +(19, 'wechat_qrcode', 'upload', 'input', 2, '', 1, '', 0, 0, '\"\"', '公众号关注二维码', '引导关注公众号显示的公众号关注二维码', 76, 1), (21, 'wechat_share_title', 'text', 'input', 70, '', 0, 'required:true', 100, 0, '\"CRMEB v4\\u6807\\u51c6\\u7248\"', '微信分享标题', '微信分享标题', 0, 1), (22, 'wechat_share_synopsis', 'textarea', '', 70, '', 0, '', 100, 5, '\"\\u5b8c\\u5584\\u7684\\u6587\\u6863 \\u5168\\u201c\\u5fc3\\u201d\\u800c\\u6765\\uff01\"', '微信分享简介', '微信分享简介', 0, 1), (25, 'pay_weixin_mchid', 'text', 'input', 4, '', 0, '', 100, 0, '\"\"', 'Mchid', '受理商ID,身份标识', 0, 1), @@ -33034,7 +33034,7 @@ INSERT INTO `eb_system_config` (`id`, `menu_name`, `type`, `input_type`, `config (27, 'pay_weixin_client_key', 'upload', 'input', 4, '', 3, '', 0, 0, '\"\"', '微信支付证书密钥', '微信支付证书密钥,在微信商家平台中可以下载!文件名一般为apiclient_key.pem', 0, 1), (28, 'pay_weixin_key', 'text', 'input', 4, '', 0, '', 100, 0, '\"\"', 'Key', '商户支付密钥Key。审核通过后,在微信发送的邮件中查看。', 0, 1), (29, 'pay_weixin_open', 'radio', 'input', 4, '1=>开启\n0=>关闭', 0, '', 0, 0, '1', '开启', '是否启用微信支付', 0, 1), -(32, 'store_free_postage', 'text', 'number', 27, '', 0, 'number:true,min:-1', 100, 0, '1000000', '满额包邮', '商城商品满多少金额即可包邮', 100, 1), +(32, 'store_free_postage', 'text', 'number', 27, '', 0, 'number:true,min:-1', 100, 0, '1000000', '满额包邮', '商城商品满多少金额即可包邮,此项优先于其他的运费设置', 100, 1), (33, 'offline_postage', 'radio', 'input', 27, '1=>包邮\n0=>不包邮', 1, '', 0, 0, '0', '线下支付是否包邮', '用户选择线下支付时是否包邮', 97, 1), (34, 'integral_ratio', 'text', 'input', 11, '', 0, 'number:true', 100, 0, '\"0.1\"', '积分抵用', '积分抵用比例(1积分抵多少金额)单位:元', 10, 1), (44, 'store_user_min_recharge', 'text', 'number', 28, '', 1, 'required:true,number:true,min:0', 100, 0, '0.01', '用户最低充值金额', '用户单次最低充值金额', 3, 1), @@ -33044,14 +33044,14 @@ INSERT INTO `eb_system_config` (`id`, `menu_name`, `type`, `input_type`, `config (58, 'replenishment_num', 'text', 'number', 27, '', 0, 'required:true,number:true,min:0', 100, 0, '5', '待补货数量', '商品待补货数量低于多少时,提示补货', 0, 1), (59, 'routine_appId', 'text', 'input', 7, '', 0, '', 100, 0, '\"\"', 'appId', '小程序appID', 0, 1), (60, 'routine_appsecret', 'text', 'input', 7, '', 0, '', 100, 0, '\"\"', 'AppSecret', '小程序AppSecret', 0, 1), -(61, 'api', 'text', 'input', 2, '', 1, '', 0, 0, '\"\\/api\\/wechat\\/serve\"', '接口地址', '微信接口例如:http://www.abc.com/api/wechat/serve', 92, 1), +(61, 'api', 'text', 'input', 2, '', 1, '', 0, 0, '\"\\/api\\/wechat\\/serve\"', '接口地址', '配置服务器域名使用的接口地址,填入https://您的域名/api/wechat/serve', 92, 1), (74, 'routine_name', 'text', 'input', 7, '', 0, '', 100, 0, '\"\"', '小程序名称', '小程序名称', 0, 1), -(77, 'store_stock', 'text', 'number', 27, '', 0, '', 100, 0, '2', '警戒库存', '警戒库存提醒值', 0, 1), -(85, 'stor_reason', 'textarea', '', 69, '', 0, '', 100, 8, '\"\\u6536\\u8d27\\u5730\\u5740\\u586b\\u9519\\u4e86\\n\\u4e0e\\u63cf\\u8ff0\\u4e0d\\u7b26\\n\\u4fe1\\u606f\\u586b\\u9519\\u4e86\\uff0c\\u91cd\\u65b0\\u62cd\\n\\u6536\\u5230\\u5546\\u54c1\\u635f\\u574f\\u4e86\\n\\u672a\\u6309\\u9884\\u5b9a\\u65f6\\u95f4\\u53d1\\u8d27\\n\\u5176\\u5b83\\u539f\\u56e0\"', '退货理由', '配置退货理由,一行一个理由', 0, 1), +(77, 'store_stock', 'text', 'number', 27, '', 1, '', 0, 0, '\"2\"', '警戒库存', '商品待补货数量低于多少时,提示库存不足', 0, 1), +(85, 'stor_reason', 'textarea', 'input', 71, '', 1, '', 100, 8, '\"\\u6536\\u8d27\\u5730\\u5740\\u586b\\u9519\\u4e86\\n\\u4e0e\\u63cf\\u8ff0\\u4e0d\\u7b26\\n\\u4fe1\\u606f\\u586b\\u9519\\u4e86\\uff0c\\u91cd\\u65b0\\u62cd\\n\\u6536\\u5230\\u5546\\u54c1\\u635f\\u574f\\u4e86\\n\\u672a\\u6309\\u9884\\u5b9a\\u65f6\\u95f4\\u53d1\\u8d27\\n\\u5176\\u5b83\\u539f\\u56e0\"', '退货理由', '配置退货理由,一行一个理由', 0, 1), (87, 'store_brokerage_two', 'text', 'input', 73, '', 0, 'required:true,min:0,max:100,number:true', 100, 0, '\"5\"', '二级返佣比例', '订单交易成功后给上级返佣的比例0 - 100,例:5 = 反订单商品金额的5%', 4, 1), (88, 'store_brokerage_statu', 'radio', '', 72, '1=>指定分销\n2=>人人分销\n3=>满额分销', 0, '', 0, 0, '1', '分销模式', '人人分销”默认每个人都可以分销,“指定分销”仅可后台手动设置推广员,“满额分销”指用户购买商品满足消费金额后自动开启分销', 95, 1), (99, 'user_extract_bank', 'textarea', '', 74, '', 0, '', 100, 5, '\"\\u4e2d\\u56fd\\u94f6\\u884c\"', '提现银行卡', '配置提现银行卡类型,每个银行换行', 0, 1), -(108, 'upload_type', 'radio', '', 31, '1=>本地存储\n2=>七牛云存储\n3=>阿里云OSS\n4=>腾讯COS', 1, '', 0, 0, '1', '上传类型', '文件储存配置,注意:一旦配置就不要轻易修改,会导致文件不能使用', 100, 1), +(108, 'upload_type', 'radio', '', 31, '1=>本地存储\n2=>七牛云存储\n3=>阿里云OSS\n4=>腾讯COS', 1, '', 0, 0, '\"1\"', '上传类型', '文件储存配置,注意:一旦配置就不要轻易修改,会导致文件不能使用', 100, 1), (110, 'accessKey', 'text', 'input', 32, '', 0, '', 100, 0, '\"\"', '阿里云云存储accessKey', 'accessKey', 0, 1), (111, 'secretKey', 'text', 'input', 32, '', 0, '', 100, 0, '\"\"', '阿里云云存储secretKey', 'secretKey', 0, 1), (113, 'order_cancel_time', 'text', 'number', 27, '', 0, '', 100, 0, '2', '普通商品未支付取消订单时间', '普通商品未支付取消订单时间,单位(小时)', 0, 1), @@ -33062,16 +33062,16 @@ INSERT INTO `eb_system_config` (`id`, `menu_name`, `type`, `input_type`, `config (122, 'system_delivery_time', 'text', 'number', 27, '', 0, 'required:true,digits:true,min:0', 100, 0, '7', '自动收货时间', '系统自动收货时间,单位(天),0为不设置自动收货', 80, 1), (123, 'sms_account', 'text', 'input', 18, '', 0, '', 100, 0, '\"\"', '一号通账号', '短信后台的登录账号', 0, 1), (137, 'sms_token', 'text', 'input', 18, '', 0, '', 100, 0, '\"\"', '一号通密码', '短信后台的登录密码)', 0, 1), -(138, 'h5_avatar', 'upload', 'input', 101, '', 1, '', 0, 0, '\"\\/statics\\/system_images\\/default_avatar.jpeg\"', '用户H5默认头像', '用户H5默认头像尺寸(80*80)', 3, 1), +(138, 'h5_avatar', 'upload', 'input', 101, '', 1, '', 0, 0, '\"\\/statics\\/system_images\\/default_avatar.jpeg\"', '用户默认头像', '用户默认头像,后台添加用户以及用户登录的默认头像显示,尺寸(80*80)', 3, 1), (139, 'offline_pay_status', 'radio', '', 29, '1=>开启\n2=>关闭', 0, '', 0, 0, '1', '线下支付状态', '线下支付请选择开启或关闭', 0, 1), -(141, 'recharge_switch', 'radio', 'input', 28, '1=>开启\n0=>关闭', 1, '', 0, 0, '0', '小程序充值开关', '小程序提交审核前,需要关闭此功能', 4, 1), +(141, 'recharge_switch', 'radio', 'input', 28, '1=>开启\n0=>关闭', 1, '', 0, 0, '0', '小程序充值开关', '仅小程序端的充值开关,小程序提交审核前,需要关闭此功能', 4, 1), (142, 'tengxun_map_key', 'text', 'input', 26, '', 1, '', 0, 0, '\"SMJBZ-WCHK4-ZPZUA-DSIXI-XDDVQ-XWFX7\"', '腾讯地图KEY', '腾讯地图KEY,申请地址:https://lbs.qq.com', 0, 1), (143, 'store_self_mention', 'radio', 'input', 27, '1=>开启\n0=>关闭', 1, '', 0, 0, '1', '是否开启到店自提', '开启后下单页面支持到店自提,需要在设置->发货设置->提货点设置中添加提货点,关闭则隐藏此功能', 95, 1), -(145, 'pay_success_printing_switch', 'radio', 'input', 86, '1=>开\n0=>关', 1, '', 0, 0, '0', '小票打印开关', '支付成功自动小票打印功能,需要购买易联云K4无线打印机', 10, 1), -(146, 'develop_id', 'text', 'input', 87, '', 1, '', 0, 0, '\"\"', '开发者ID', '易联云开发者ID', 0, 1), -(147, 'printing_api_key', 'text', 'input', 87, '', 1, '', 0, 0, '\"\"', '应用密钥', '易联应用密钥', 0, 1), -(148, 'printing_client_id', 'text', 'input', 87, '', 1, '', 0, 0, '\"\"', '应用ID', '易联应用ID', 0, 1), -(149, 'terminal_number', 'text', 'input', 87, '', 1, '', 0, 0, '\"\"', '终端号', '易联云打印机终端号', 0, 1), +(145, 'pay_success_printing_switch', 'radio', 'input', 86, '1=>开\n0=>关', 1, '', 0, 0, '0', '小票打印开关', '支付成功自动小票打印功能,需要购买易联云K4或者K6无线打印机,或者购买飞鹅云V58系列', 10, 1), +(146, 'develop_id', 'text', 'input', 87, '', 1, '', 0, 0, '\"\"', '开发者ID', '易联云申请应用后页面开发者信息中的用户ID', 0, 1), +(147, 'printing_api_key', 'text', 'input', 87, '', 1, '', 0, 0, '\"\"', '应用密钥', '易联云申请应用后页面开发者信息中的应用密钥', 0, 1), +(148, 'printing_client_id', 'text', 'input', 87, '', 1, '', 0, 0, '\"\"', '应用ID', '易联云申请应用后页面开发者信息中的应用ID', 0, 1), +(149, 'terminal_number', 'text', 'input', 87, '', 1, '', 0, 0, '\"\"', '终端号', '易联云打印机标签上的终端号', 0, 1), (150, 'lower_order_switch', 'radio', '', 20, '0=>关闭\n1=>开启', 0, '', 0, 0, '0', '支付成功提醒开关', '支付成功提醒开关', 0, 1), (151, 'deliver_goods_switch', 'radio', '', 20, '0=>关闭\n1=>开启', 0, '', 0, 0, '0', '发货提醒开关', '发货提醒开关', 0, 1), (152, 'confirm_take_over_switch', 'radio', '', 20, '0=>关闭\n1=>开启', 0, '', 0, 0, '0', '确认收货提醒开关', '确认收货提醒开关', 0, 1), @@ -33090,13 +33090,13 @@ INSERT INTO `eb_system_config` (`id`, `menu_name`, `type`, `input_type`, `config (174, 'qiniu_secretKey', 'text', 'input', 80, '', 0, '', 100, 0, '\"\"', 'secretKey', '七牛云secretKey', 0, 1), (178, 'tengxun_accessKey', 'text', 'input', 82, '', 0, '', 100, 0, '\"\"', 'accessKey', '腾讯云accessKey', 0, 1), (179, 'tengxun_secretKey', 'text', '', 82, '', 0, '', 100, 0, '\"\"', 'secretKey', '腾讯云secretKey', 0, 1), -(187, 'copy_product_apikey', 'text', 'input', 90, '', 1, '', 0, 0, '\"\"', '99Api apiKey', '复制商品第三方平台接口秘钥', 0, 1), +(187, 'copy_product_apikey', 'text', 'input', 90, '', 1, '', 0, 0, '\"\"', '99Api apiKey', '注册99api采集接口在个人中心复制key', 0, 1), (189, 'balance_func_status', 'radio', 'input', 28, '1=>开启\n0=>关闭\n', 1, '', 0, 0, '1', '余额功能启用', '商城余额功能启用或者关闭', 5, 1), (190, 'brokerage_func_status', 'radio', '', 72, '1=>开启\n0=>关闭', 0, '', 0, 0, '1', '分销启用', '商城分销功能开启|关闭', 100, 1), (191, 'order_give_integral', 'text', 'input', 11, '', 0, '', 100, 0, '\"1\"', '下单赠送积分', '下单支付金额按比例赠送积分(实际支付1元赠送多少积分)', 0, 1), (193, 'member_func_status', 'radio', '', 45, '1=>开启\n0=>关闭', 0, '', 0, 0, '1', '用户等级启用', '商城用户等级功能开启|关闭', 0, 1), (194, 'member_price_status', 'radio', '', 67, '1=>开启\n0=>关闭', 0, '', 0, 0, '1', '商品会员折扣价展示启用', '商城商城会员折扣价格展示', 0, 1), -(195, 'store_user_mobile', 'radio', '', 101, '1=>强制\n0=>不强制', 0, '', 0, 0, '0', '强制手机号登录', '商城用户强制手机号登录', 0, 1), +(195, 'store_user_mobile', 'radio', '', 101, '1=>强制\n0=>不强制', 1, '', 0, 0, '0', '强制手机号登录', '用户在授权之后强制绑定手机号,可以实现用户多端统一', 0, 1), (196, 'order_give_exp', 'text', 'input', 45, '', 0, '', 100, 0, '\"1\"', '下单赠送用户经验比例(实际支付1元赠送多少经验)', '下单赠送用户经验比例(实际支付1元赠送多少经验)', 0, 1), (198, 'sign_give_exp', 'text', 'input', 45, '', 0, '', 100, 0, '\"20\"', '签到赠送用户经验值', '签到赠送用户经验值', 0, 1), (199, 'invite_user_exp', 'text', 'input', 45, '', 0, '', 100, 0, '\"50\"', '邀请新用户赠送用户经验值', '邀请一个新用户赠送用户经验值', 0, 1), @@ -33106,7 +33106,7 @@ INSERT INTO `eb_system_config` (`id`, `menu_name`, `type`, `input_type`, `config (246, 'invoice_func_status', 'radio', '', 50, '1=>开启\n0=>关闭', 0, '', 0, 0, '1', '发票功能启用', '发票功能开启|关闭', 0, 1), (247, 'special_invoice_status', 'radio', '', 50, '1=>开启\n0=>关闭', 0, '', 0, 0, '1', '专用发票启用', '专用发票功能开启|关闭', 0, 1), (287, 'ali_pay_status', 'radio', '', 63, '1=>开启\n0=>关闭', 0, '', 0, 0, '1', '支付宝支付状态', '支付宝支付请选择开启(启用)或关闭(不启用)', 100, 1), -(288, 'alipay_public_key', 'textarea', '', 63, '', 0, '', 100, 5, '\"\"', '支付应用公钥', '支付应用公钥', 0, 1), +(288, 'alipay_public_key', 'textarea', '', 63, '', 1, '', 100, 5, '\"\"', '支付应用公钥', '支付宝加签完成后申城的支付宝公钥', 0, 1), (289, 'alipay_merchant_private_key', 'textarea', '', 63, '', 0, '', 100, 5, '\"\"', '支付应用私钥', '支付应用私钥', 0, 1), (290, 'ali_pay_appid', 'text', 'input', 63, '', 0, '', 100, 0, '\"\"', '支付应用Appid', '支付应用Appid', 91, 1), (291, 'logistics_type', 'radio', 'input', 91, '1=>一号通\n2=>阿里云物流查询', 1, '', 0, 0, '1', '接口选择', '建议使用一号通更方便不用配置密钥,阿里云云市场购买链接:https://0x9.me/w9vnq', 0, 1), @@ -33116,46 +33116,44 @@ INSERT INTO `eb_system_config` (`id`, `menu_name`, `type`, `input_type`, `config (301, 'config_export_to_name', 'text', 'input', 94, '', 1, '', 0, 0, '\"\"', '发货人姓名', '快递面单发货人姓名', 0, 1), (302, 'config_export_to_tel', 'text', 'input', 94, '', 1, '', 0, 0, '\"\"', '发货人电话', '快递面单发货人电话', 0, 1), (303, 'config_export_to_address', 'text', 'input', 94, '', 1, '', 0, 0, '\"\"', '发货人详细地址', '快递面单发货人详细地址', 0, 1), -(304, 'config_export_siid', 'text', 'input', 94, '', 1, '', 0, 0, '\"\"', '电子面单打印机编号', '请购买快递100电子面单打印机,淘宝地址:https://m.tb.cn/h.437NvI0 官网:https://www.kuaidi100.com/cloud/print/cloudprinterSecond.shtml', 0, 1), -(305, 'service_feedback', 'textarea', '', 69, '', 0, '', 100, 7, '\"\\u5c0a\\u656c\\u7684\\u7528\\u6237\\uff0c\\u5ba2\\u670d\\u5f53\\u524d\\u4e0d\\u5728\\u7ebf\\uff0c\\u6709\\u95ee\\u9898\\u8bf7\\u7559\\u8a00\\uff0c\\u6211\\u4eec\\u4f1a\\u7b2c\\u4e00\\u65f6\\u95f4\\u8fdb\\u884c\\u5904\\u7406\\uff01\\uff01\\uff01\"', '客服反馈', '客服反馈头部文字', 0, 1), +(304, 'config_export_siid', 'text', 'input', 94, '', 1, '', 0, 0, '\"\"', '电子面单打印机编号', '请购买快递100二代云打印机(KX100L3),官网:https://www.kuaidi100.com/cloud/print/cloudprinterSecond.shtml', 0, 1), +(305, 'service_feedback', 'textarea', 'input', 69, '', 1, '', 100, 7, '\"\\u5c0a\\u656c\\u7684\\u7528\\u6237\\uff0c\\u5ba2\\u670d\\u5f53\\u524d\\u4e0d\\u5728\\u7ebf\\uff0c\\u6709\\u95ee\\u9898\\u8bf7\\u7559\\u8a00\\uff0c\\u6211\\u4eec\\u4f1a\\u7b2c\\u4e00\\u65f6\\u95f4\\u8fdb\\u884c\\u5904\\u7406\\uff01\\uff01\\uff01\"', '客服反馈', '暂无客服在线是,联系客服跳转的客服反馈页面的显示文字', 0, 1), (307, 'integral_max_num', 'text', 'input', 11, '', 0, '', 100, 0, '\"100\"', '积分抵扣上限', '单次下单积分使用上限,0不限制', 0, 1), (308, 'brokerage_type', 'radio', 'input', 74, '0=>线下手动转账\n1=>自动到微信零钱', 1, '', 0, 0, '0', '佣金到账方式', '佣金到账方式支持线下转账和微信零钱自动转账,手动转账更安全,自动转账更方便', 0, 1), (309, 'bargain_subscribe', 'radio', '', 27, '1=>是\n0=>否', 0, '', 0, 0, '0', '砍价是否需要关注公众号', '砍价是否需要关注公众号', 50, 0), (310, 'member_card_status', 'radio', 'input', 67, '1=>开启\n0=>关闭', 1, '', 0, 0, '1', '是否开启付费会员', '付费会员开关', 0, 1), -(323, 'tourist_avatar', 'upload', '', 69, '', 2, '', 0, 0, '[\"\\/statics\\/system_images\\/customer_1.png\",\"\\/statics\\/system_images\\/customer_2.png\",\"\\/statics\\/system_images\\/customer_3.png\",\"\\/statics\\/system_images\\/customer_4.png\"]', '客服游客头像', '客服游客头像', 0, 1), (324, 'spread_banner', 'upload', '', 72, '', 2, '', 0, 0, '[\"\\/statics\\/system_images\\/spread_1.jpeg\",\"\\/statics\\/system_images\\/spread_2.jpeg\"]', '分销海报图', '个人中心分销海报图片,建议尺寸600x1000', 0, 1), (325, 'config_export_open', 'radio', 'input', 93, '1=>打开\n0=>关闭', 1, '', 0, 0, '0', '电子面单是否开启', '电子面单是否开启', 111, 1), (326, 'wap_login_logo', 'upload', 'input', 26, '', 1, '', 0, 0, '\"\\/statics\\/system_images\\/login_logo.jpeg\"', '移动端登录logo', '移动端登录logo,建议尺寸86x86,建议png格式', 3, 1), -(327, 'pc_logo', 'upload', '', 75, '', 1, '', 0, 0, '\"\\/statics\\/system_images\\/pc_logo.png\"', 'PC端LOGO', 'PC端LOGO', 0, 1), -(328, 'record_No', 'text', 'input', 26, '', 0, '', 100, 0, '\"\"', '备案号', '备案号', 0, 1), -(329, 'routine_contact_type', 'radio', '', 7, '1=>小程序客服\n0=>跟随系统', 0, '', 0, 0, '0', '小程序客服类型', '小程序客服类型', 0, 1), -(330, 'station_open', 'radio', '', 26, '1=>开启\n0=>关闭', 0, '', 0, 0, '1', '站点开启', '站点开始|关闭(用于升级等临时关闭)', 11, 1), +(327, 'pc_logo', 'upload', '', 75, '', 1, '', 0, 0, '\"\\/statics\\/system_images\\/pc_logo.png\"', 'PC端LOGO', 'PC端LOGO', 0, 0), +(328, 'record_No', 'text', 'input', 26, '', 1, '', 0, 0, '\"\"', '备案号', '网站的备案号,显示在H5和PC端底部', 0, 1), +(329, 'routine_contact_type', 'radio', 'input', 7, '0=>跟随系统\n1=>小程序客服', 1, '', 0, 0, '0', '小程序客服类型', '跟随系统:跟随系统使用默认客服、电话或者跳转链接;小程序客服:需要在小程序后台配置客服用户;', 0, 1), +(330, 'station_open', 'radio', 'input', 26, '1=>开启\n0=>关闭', 1, '', 0, 0, '\"1\"', '站点开启', '站点开始|关闭(用于升级等临时关闭),关闭后前端会弹窗显示站点升级中,请稍后访问', 11, 1), (331, 'uni_brokerage_price', 'text', 'input', 73, '', 0, '', 100, 0, '\"2\"', '推广佣金单价(每推广一个用户)', '分销推广佣金单价(每推广一个用户)', 93, 1), (332, 'day_brokerage_price_upper', 'text', 'input', 73, '', 0, '', 100, 0, '\"-1\"', '每日推广佣金上限', '每日推广佣金上限(0:不发佣金-1:不限制;注最好是推广佣金单价的整数倍)', 92, 1), (333, 'is_self_brokerage', 'radio', '', 73, '0=>关闭\n1=>开启', 0, '', 0, 0, '0', '自购返佣', '是否开启自购返佣(开启:分销员自己购买商品,享受一级返佣,上级享受二级返佣; 关闭:分销员自己购买商品没有返佣)', 94, 1), (334, 'store_brokerage_binding_status', 'radio', '', 72, '1=>永久\n2=>有效期\n3=>临时', 0, '', 0, 0, '1', '绑定模式', '永久”一次绑定永久有效,“有效期”绑定后一段时间内有效,“临时” 临时有效', 91, 1), (335, 'store_brokerage_binding_time', 'text', 'input', 72, '', 0, '', 100, 0, '\"1\"', '绑定有效期', '绑定有效期(绑定后N天内有效)', 90, 1), -(336, 'refund_name', 'text', 'input', 71, '', 0, '', 100, 0, '\"\"', '退货收货人姓名', '退货收货人姓名', 90, 1), -(337, 'refund_phone', 'text', 'input', 71, '', 0, '', 100, 0, '\"\"', '退货收货人电话', '退货收货人电话', 90, 1), -(338, 'refund_address', 'text', 'input', 71, '', 0, '', 100, 0, '\"\"', '退货收货人地址', '退货收货人地址', 90, 1), -(339, 'brokerage_user_status', 'radio', '', 73, '0=>关闭\n1=>开启', 0, '', 100, 0, '0', '推广用户返佣', '分销推广用户获取佣金', 94, 1), -(340, 'wechat_open_app_id', 'text', 'input', 75, '', 0, '', 100, 0, '\"\"', '开放平台appid', '开放平台appid', 0, 1), -(341, 'wechat_open_app_secret', 'text', 'input', 75, '', 0, '', 100, 0, '\"\"', '开放平台secret', '开放平台secret', 0, 1), -(342, 'contact_number', 'text', 'input', 75, '', 0, '', 100, 0, '\"\"', '联系电话', '联系电话', 0, 1), -(343, 'company_address', 'text', 'input', 75, '', 0, '', 100, 0, '\"\"', '公司地址', '公司地址', 0, 1), -(344, 'copyright', 'text', 'input', 75, '', 0, '', 100, 0, '\"\"', '版权信息', '版权信息', 0, 1), -(345, 'site_keywords', 'text', 'input', 75, '', 0, '', 100, 0, '\"\"', '关键词', '网站关键词', 0, 1), -(346, 'site_description', 'textarea', '', 75, '', 0, '', 100, 5, '\"\"', '网站描述', '网站描述', 0, 1), -(347, 'product_phone_buy_url', 'radio', '', 75, '1=>公众号\n2=>小程序', 0, '', 0, 0, '1', '商品手机购买跳转地址', '商品手机购买跳转地址(小程序|公众号)', 0, 1), +(336, 'refund_name', 'text', 'input', 71, '', 1, '', 0, 0, '\"\"', '退货收货人姓名', '用户退货退款后台同意之后,显示在退货订单详情显示的接受退货的人员姓名', 90, 1), +(337, 'refund_phone', 'text', 'input', 71, '', 1, '', 0, 0, '\"\"', '退货收货人电话', '用户退货退款后台同意之后,显示在退货订单详情显示的接受退货的人员电话', 90, 1), +(338, 'refund_address', 'text', 'input', 71, '', 1, '', 0, 0, '\"\"', '退货收货人地址', '用户退货退款后台同意之后,显示在退货订单详情显示的接受退货的地址信息', 90, 1), +(339, 'brokerage_user_status', 'radio', '', 73, '0=>关闭\n1=>开启', 0, '', 100, 0, '1', '推广用户返佣', '分销推广用户获取佣金', 94, 1), +(340, 'wechat_open_app_id', 'text', 'input', 75, '', 1, '', 0, 0, '\"\"', '开放平台AppID', '微信开放平台申请网页应用后给予的AppID', 0, 1), +(341, 'wechat_open_app_secret', 'text', 'input', 75, '', 1, '', 0, 0, '\"\"', '开放平台AppSecret', '微信开放平台申请网页应用后给予的AppSecret', 0, 1), +(342, 'contact_number', 'text', 'input', 75, '', 1, '', 0, 0, '\"\"', '联系电话', 'PC底部显示的联系电话', 0, 1), +(343, 'company_address', 'text', 'input', 75, '', 1, '', 0, 0, '\"\"', '公司地址', 'PC底部显示的公司地址', 0, 1), +(345, 'site_keywords', 'text', 'input', 75, '', 0, '', 100, 0, '\"\"', '关键词', '网站关键词', 0, 0), +(346, 'site_description', 'textarea', '', 75, '', 0, '', 100, 5, '\"\"', '网站描述', '网站描述', 0, 0), +(347, 'product_phone_buy_url', 'radio', 'input', 75, '1=>公众号\n2=>小程序', 1, '', 0, 0, '\"1\"', '商品手机购买跳转地址', '商品详情手机购买显示公众号码或者小程序码', 0, 1), (348, 'bast_number', 'text', 'number', 75, '', 0, 'required:true,digits:true,min:1', 100, 0, '0', '精品推荐个数', '首页配置精品推荐个数', 0, 1), (349, 'first_number', 'text', 'number', 75, '', 0, 'required:true,digits:true,min:1', 100, 0, '0', '首发新品个数', '首页配置首发新品个数', 0, 1), -(350, 'customer_type', 'radio', 'radio', 69, '0=>系统客服\n1=>拨打电话\n2=>跳转链接', 0, '', 0, 0, '0', '客服类型', '客服类型', 0, 1), -(351, 'customer_url', 'text', 'input', 69, '', 0, '', 100, 0, '\"\"', '客服链接', '客服链接', 0, 1), -(352, 'customer_phone', 'text', 'input', 69, '', 0, '', 100, 0, '\"\"', '客服电话', '客服电话', 0, 1), -(353, 'wechat_app_appid', 'text', 'input', 77, '', 0, '', 100, 0, '\"\"', '公众平台开放应用APPID', '公众平台开放应用APPID', 0, 1), -(354, 'wechat_app_appsecret', 'text', 'input', 77, '', 0, '', 100, 0, '\"\"', '公众平台开放应用AppSecret', '公众平台开放应用AppSecret', 0, 1), -(355, 'statistic_script', 'textarea', 'input', 26, '', 1, '', 100, 10, '\"\"', '统计代码', '统计代码', 0, 1), -(359, 'weixin_ckeck_file', 'upload', 'input', 2, '', 3, '', 0, 0, '\"\"', '微信校验文件', '微信校验文件', 72, 1), +(350, 'customer_type', 'radio', 'input', 69, '0=>系统客服\n1=>拨打电话\n2=>跳转链接', 0, '', 0, 0, '0', '客服类型', '系统客服:点击联系客服使用系统的自带客服;拨打电话:点击联系客服拨打客服电话;跳转链接:跳转外部链接联系客服', 0, 1), +(351, 'customer_url', 'text', 'input', 69, '', 1, '', 0, 0, '\"\"', '客服链接', '客服类型选择跳转链接时,跳转的链接地址', 0, 1), +(352, 'customer_phone', 'text', 'input', 69, '', 1, '', 0, 0, '\"\"', '客服电话', '客服类型选择不打电话是,用户点击联系客服的联系电话', 0, 1), +(353, 'wechat_app_appid', 'text', 'input', 77, '', 1, '', 0, 0, '\"\"', '公众平台开放应用APPID', '微信开放平台申请移动应用后给予的APPID', 0, 1), +(354, 'wechat_app_appsecret', 'text', 'input', 77, '', 1, '', 0, 0, '\"\"', '公众平台开放应用AppSecret', '微信开放平台申请移动应用后给予的AppSecret', 0, 1), +(355, 'statistic_script', 'textarea', 'input', 26, '', 1, '', 100, 10, '\"\"', '统计代码', '程序访问统计代码,填写script标签内的内容', 0, 1), +(359, 'weixin_ckeck_file', 'upload', 'input', 2, '', 3, '', 0, 0, '\"\"', '微信校验文件', '配置微信网页授权域名时候下载的微信校验文件,在此处上传', 72, 1), (360, 'thumb_big_width', 'text', 'input', 31, '', 0, '', 100, 0, '\"800\"', '缩略大图(单位:px):宽', '缩略大图(单位:px):宽', 99, 1), (361, 'thumb_big_height', 'text', 'input', 31, '', 0, '', 100, 0, '\"800\"', '缩略大图(单位:px):高', '缩略大图(单位:px):高', 98, 1), (362, 'thumb_mid_width', 'text', 'input', 31, '', 0, '', 50, 0, '\"300\"', '缩略中图(单位:px):宽', '缩略中图(单位:px):宽', 97, 1), @@ -33174,20 +33172,20 @@ INSERT INTO `eb_system_config` (`id`, `menu_name`, `type`, `input_type`, `config (375, 'watermark_text_angle', 'text', 'input', 31, '', 0, '', 100, 0, '\"\"', '水印字体旋转角度', '水印字体旋转角度', 24, 1), (376, 'watermark_x', 'text', 'input', 31, '', 0, '', 100, 0, '\"\"', '水印横坐标偏移量(单位:px)', '水印横坐标偏移量(单位:px)', 23, 1), (377, 'watermark_y', 'text', 'input', 31, '', 0, '', 100, 0, '\"\"', '水印纵坐标偏移量(单位:px)', '水印纵坐标偏移量(单位:px)', 22, 1), -(379, 'ico_path', 'upload', 'input', 26, '', 3, '', 0, 0, '\"\"', 'ICO图标', 'ICO图标', 1, 1), -(383, 'tengxun_appid', 'text', 'input', 82, '', 0, '', 0, 0, '\"\"', '腾讯云APPID', '腾讯云APPID', 0, 1), +(379, 'ico_path', 'upload', 'input', 26, '', 3, '', 0, 0, '\"\"', 'ICO图标', '程序ICO图标,更换后需要清除浏览器缓存', 1, 1), +(383, 'tengxun_appid', 'text', 'input', 82, '', 0, '', 0, 0, '\"100012434764\"', '腾讯云APPID', '腾讯云APPID', 0, 1), (384, 'extract_type', 'checkbox', 'input', 74, '0=>银行卡\n1=>微信\n2=>支付宝', 1, '', 0, 0, '[\"0\",\"1\",\"2\"]', '提现方式', '提现方式', 0, 1), (385, 'integral_frozen', 'text', 'input', 11, '', 1, '', 100, 0, '\"0\"', '积分冻结(天)', '积分冻结(天)', 0, 1), -(386, 'print_type', 'radio', 'input', 86, '1=>易联云\n2=>飞鹅云', 1, '', 0, 0, '1', '平台选择', '平台选择', 0, 1), -(387, 'config_export_type', 'radio', 'input', 93, '1=>一号通', 1, '', 0, 0, '\"1\"', '电子面单类型', '电子面单类型', 0, 1), -(388, 'customer_corpId', 'text', 'input', 69, '', 1, '', 100, 0, '\"\"', '企业ID', '小程序需要跳转企业微信客服的话需要配置此项', 0, 1), +(386, 'print_type', 'radio', 'input', 86, '1=>易联云\n2=>飞鹅云', 1, '', 0, 0, '\"1\"', '平台选择', '打印平台选择', 0, 1), +(387, 'config_export_type', 'radio', 'input', 93, '1=>一号通', 1, '', 0, 0, '1', '电子面单类型', '电子面单类型', 0, 1), +(388, 'customer_corpId', 'text', 'input', 69, '', 1, '', 0, 0, '\"\"', '企业ID', '如果客服链接填写企业微信客服,小程序需要跳转企业微信客服的话需要配置此项,并且在小程序客服中绑定企业ID', 0, 1), (389, 'create_wechat_user', 'radio', 'input', 2, '1=>开启\r\n0=>关闭', 1, '', 0, 0, '0', '关注公众号是否生成用户', '关注公众号是否生成用户', 0, 1), (390, 'friend_pay_status', 'radio', 'input', 95, '1=>开启\r\n0=>关闭', 1, '', 0, 0, '0', '好友代付开关', '好友代付开关,关闭后付款类型不显示好友代付', 0, 1), (392, 'brokerage_level', 'radio', 'input', 72, '1=>一级分销\r\n2=>二级分销', 1, '', 0, 0, '2', '分销层级', '分销层级,一级是只返上级一层的佣金,二级是返上级和上上级的佣金', 98, 1), (393, 'sms_type', 'radio', 'input', 97, '0=>一号通\r\n1=>阿里云\r\n2=>腾讯云', 1, '', 0, 0, '0', '短信类型', '短信类型,选择发送的短信类型', 0, 1), (394, 'aliyun_AccessKeyId', 'text', 'input', 98, '', 1, '', 0, 0, '\"\"', '阿里云AccessKeyId', '阿里云AccessKeyId', 100, 1), (395, 'aliyun_AccessKeySecret', 'text', 'input', 98, '', 1, '', 100, 0, '\"\"', '阿里云AccessKeySecret', '阿里云AccessKeySecret', 99, 1), -(396, 'aliyun_RegionId', 'text', 'input', 98, '', 1, '', 100, 0, '\"\"', '阿里云RegionId', '阿里云RegionId', 98, 1), +(396, 'aliyun_RegionId', 'text', 'input', 98, '', 1, '', 100, 0, '\"\"', '阿里云RegionId', '阿里云RegionId', 98, 0), (397, 'aliyun_SignName', 'text', 'input', 98, '', 1, '', 100, 0, '\"\"', '短信签名', '短信签名', 97, 1), (398, 'tencent_sms_app_id', 'text', 'input', 99, '', 1, '', 100, 0, '\"\"', 'SKD AppID', '腾讯云短信应用SKD APPID', 0, 1), (399, 'tencent_sms_secret_id', 'text', 'input', 99, '', 1, '', 100, 0, '\"\"', 'AccessKeyId', '腾讯云AccessKeyId', 0, 1), @@ -33207,7 +33205,14 @@ INSERT INTO `eb_system_config` (`id`, `menu_name`, `type`, `input_type`, `config (419, 'hs_secretkey', 'text', 'input', 106, '', 1, '', 0, 0, '\"TVRneU16STFOVFV4WVRkbE5ERTJaV0pqWm1aaU1UaGlNVFppWldZeE1HUQ==\"', '火山翻译SecretKey', '机器翻译仅支持火山翻译', 0, 1), (420, 'fey_user', 'text', 'input', 107, '', 1, '', 0, 0, '\"\"', '飞鹅云USER', '飞鹅云后台注册账号', 10, 1), (421, 'fey_ukey', 'text', 'input', 107, '', 1, '', 0, 0, '\"\"', '飞鹅云UYEK', '飞鹅云后台注册账号后生成的UKEY 【备注:这不是填打印机的KEY】', 7, 1), -(422, 'fey_sn', 'text', 'input', 107, '', 1, '', 100, 0, '\"\"', '飞鹅云SN', '打印机标签上的编号,必须要在管理后台里添加打印机或调用API接口添加之后,才能调用API', 0, 1); +(422, 'fey_sn', 'text', 'input', 107, '', 1, '', 100, 0, '\"\"', '飞鹅云SN', '打印机标签上的编号,必须要在管理后台里添加打印机或调用API接口添加之后,才能调用API', 0, 1), +(423, 'allin_private_key', 'textarea', 'input', 108, '', 1, '', 100, 5, '\"\"', '通联RSA私钥', '通联支付的RSA私钥,可以在商户后台设置中进行配置', 96, 1), +(424, 'allin_public_key', 'textarea', 'input', 108, '', 1, '', 100, 5, '\"\"', '通联RSA公钥', '通联支付的RSA公钥,可以在商户后台的设置中进行配置', 97, 1), +(425, 'allin_cusid', 'text', '', 108, '', 1, '', 100, 0, '\"\"', '通联商户号', '通联支付商户号,由贵公司申请获得', 99, 1), +(426, 'allin_appid', 'text', '', 108, '', 1, '', 100, 0, '\"\"', '通联支付Appid', '通联商户后台的设置-》对接设置中查看', 98, 1), +(427, 'allin_pay_status', 'radio', 'input', 108, '0=>关闭\n1=>开启', 1, '', 0, 0, '1', '开关', '开启可以在微信公众号和微信小程序中使用通联支付', 100, 1), +(428, 'queue_open', 'radio', 'input', 26, '0=>关闭\n1=>开启', 1, '', 0, 0, '\"0\"', '消息队列', '是否启用消息队列,启用后提升程序运行速度,启用前必须配置Redis缓存', 0, 1), +(429, 'get_avatar', 'radio', 'input', 7, '0=>关闭\n1=>开启', 1, '', 0, 0, '\"0\"', '强制获取昵称头像', '是否在小程序用户授权之后,弹窗获取用户的昵称和头像', 0, 1); -- -------------------------------------------------------- @@ -33226,7 +33231,7 @@ CREATE TABLE IF NOT EXISTS `eb_system_config_tab` ( `type` int(2) NOT NULL DEFAULT '0' COMMENT '配置类型', `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', PRIMARY KEY (`id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=106 DEFAULT CHARSET=utf8 COMMENT='配置分类表'; +) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8 COMMENT='配置分类表'; -- -- 转存表中的数据 `eb_system_config_tab` @@ -33290,7 +33295,8 @@ INSERT INTO `eb_system_config_tab` (`id`, `pid`, `title`, `eng_title`, `status`, (104, 102, '推送配置', 'out_push', 1, 0, '', 3, 0), (105, 100, '新用户设置', 'new_user_setting', 1, 0, '', 0, 0), (106, 5, '机器翻译配置', 'online_translation', 1, 0, '', 0, 0), -(107, 21, '飞鹅云配置', 'fey_config', 1, 0, '', 0, 0); +(107, 21, '飞鹅云配置', 'fey_config', 1, 0, '', 3, 0), +(108, 23, '通联支付', 'allinpay', 1, 0, '', 3, 0); -- -------------------------------------------------------- @@ -33512,7 +33518,7 @@ CREATE TABLE IF NOT EXISTS `eb_system_menus` ( KEY `pid` (`pid`) USING BTREE, KEY `is_show` (`is_show`) USING BTREE, KEY `access` (`access`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=1076 DEFAULT CHARSET=utf8 COMMENT='菜单表'; +) ENGINE=InnoDB AUTO_INCREMENT=1077 DEFAULT CHARSET=utf8 COMMENT='菜单表'; -- -- 转存表中的数据 `eb_system_menus` @@ -33523,7 +33529,7 @@ INSERT INTO `eb_system_menus` (`id`, `pid`, `icon`, `menu_name`, `module`, `cont (2, 1, '', '商品管理', 'admin', 'product.product', 'index', '', '', '[]', 1, 1, 0, 1, '/admin/product/product_list', '', 1, '', 0, 'admin-store-storeProuduct-index', 0), (3, 1, '', '商品分类', 'admin', 'product.storeCategory', 'index', '', '', '[]', 1, 1, 0, 1, '/admin/product/product_classify', '', 1, 'product', 0, 'admin-store-storeCategory-index', 0), (4, 0, 'md-cart', '订单', 'admin', 'order', 'index', '', '', '[]', 120, 1, 0, 1, '/admin/order', '', 1, 'home', 1, 'admin-order', 0), -(5, 4, '', '订单管理', 'admin', 'order.store_order', 'index', '', '', '[]', 1, 1, 0, 1, '/admin/order/list', '', 1, 'order', 0, 'admin-order-storeOrder-index', 0), +(5, 4, '', '订单管理', 'admin', 'order.store_order', 'index', '', '', '[]', 10, 1, 0, 1, '/admin/order/list', '4', 1, 'order', 1, 'admin-order-storeOrder-index', 0), (6, 1, '', '商品评论', 'admin', 'store.store_product_reply', 'index', '', '', '[]', 0, 1, 0, 1, '/admin/product/product_reply', '', 1, 'product', 0, 'product-product-reply', 0), (7, 0, 'md-home', '主页', 'admin', 'index', '', '', '', '[]', 127, 1, 0, 1, '/admin/home/', '', 1, 'home', 1, 'admin-index-index', 0), (9, 0, 'md-person', '用户', 'admin', 'user.user', '', '', '', '[]', 125, 1, 0, 1, '/admin/user', '', 1, 'user', 1, 'admin-user', 0), @@ -33735,7 +33741,7 @@ INSERT INTO `eb_system_menus` (`id`, `pid`, `icon`, `menu_name`, `module`, `cont (299, 297, '', '保存退款', 'admin', '', '', 'finance/recharge/', 'PUT', '[]', 0, 0, 0, 1, '', '', 2, '', 0, '', 0), (300, 144, '', '提货点', 'admin', 'merchant.system_store', 'index', '', '', '[]', 0, 1, 0, 1, '/admin/setting/merchant/system_store/list', '', 1, 'setting', 1, 'setting-merchant-system-store', 0), (301, 144, '', '核销员', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/setting/merchant/system_store_staff/index', '', 1, 'setting', 1, 'setting-merchant-system-store-staff', 0), -(302, 144, '', '核销订单', 'admin', '', 'index', '', '', '[]', 0, 1, 0, 1, '/admin/setting/merchant/system_verify_order/index', '', 1, 'setting', 1, 'setting-merchant-system-verify-order', 0), +(302, 4, '', '核销订单', 'admin', '', 'index', '', '', '[]', 0, 1, 0, 1, '/admin/setting/merchant/system_verify_order/index', '4', 1, 'setting', 1, 'setting-merchant-system-verify-order', 0), (303, 12, '', '发货设置', 'admin', 'setting', 'index', '', '', '[]', 0, 1, 0, 1, '/admin/setting/freight', '', 1, '', 0, '', 0), (304, 303, '', '物流配置', 'admin', 'setting.systemConfig', 'index', '', '', '[]', 0, 0, 0, 1, '/admin/setting/system_config_logistics/3/10', '', 1, '', 0, 'setting-system-config-logistics', 0), (305, 44, '', '文章列表', 'admin', '', '', 'cms/cms', 'GET', '[]', 0, 0, 0, 1, '', '', 2, '', 0, '', 0), @@ -34199,7 +34205,7 @@ INSERT INTO `eb_system_menus` (`id`, `pid`, `icon`, `menu_name`, `module`, `cont (894, 589, '', '会员标签列表', 'admin', '', '', 'user/user_label', 'GET', '[]', 0, 0, 0, 1, '', '9/589', 2, '', 0, '', 0), (895, 585, '', '新增客服选择用户列表', 'admin', '', '', 'app/wechat/kefu/create', 'GET', '[]', 0, 0, 0, 1, '', '9/10/585', 2, '', 0, '', 0), (896, 26, '', '分销等级', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/setting/membership_level/index', '26', 1, '', 0, '', 0), -(897, 4, '', '售后订单', 'admin', '', '', '', '', '[]', 0, 1, 0, 1, '/admin/order/refund', '4', 1, '', 0, 'admin-order-refund', 0), +(897, 4, '', '售后订单', 'admin', '', '', '', '', '[]', 9, 1, 0, 1, '/admin/order/refund', '4', 1, '', 0, 'admin-order-refund', 0), (898, 12, '', '消息管理', 'admin', '', '', '', '', '[]', 9, 1, 0, 1, '/admin/setting/notification/index', '12', 1, '', 0, 'setting-notification', 0), (902, 656, '', '主题风格', 'admin', '', '', '', '', '[]', 2, 1, 0, 1, '/admin/setting/theme_style', '12/656', 1, '', 0, 'admin-setting-theme_style', 0), (903, 656, '', 'PC商城', 'admin', '', '', '', '', '[]', 2, 1, 0, 1, '/admin/setting/pc_group_data', '12/656', 1, '', 0, 'setting-system-pc_data', 0), diff --git a/crmeb/public/install/css/install.css b/crmeb/public/install/css/install.css old mode 100644 new mode 100755 index aba0137c3..eff3c91c7 --- a/crmeb/public/install/css/install.css +++ b/crmeb/public/install/css/install.css @@ -200,26 +200,43 @@ body{ color:#333; background:url(../images/install/bg.png); } +a{ + text-decoration:none; +} a:link{ - color:#246EA5; text-decoration:none; } a:hover{ - text-decoration:underline; + text-decoration:none; } -a:visited{ - color:#762e9c; + +.p8{ + color: rgba(255,255,255,0.8) } +.df{ + display: flex; + align-items: center; +} +.mid{ + display: flex; + justify-content: center; + align-items: center; +} + /* =================== 包裹 =================== */ .wrap{ - margin:0px auto 0; - box-shadow:0 0 10px #ccc; width:800px; - background:#fff; + height: 640px; + margin:0px auto 0; + background: linear-gradient(180deg, #134392 0%, #363A8A 100%); + box-shadow: 0px 6px 20px 10px rgba(48,114,229,0.15); + border-radius: 36px 36px 36px 36px; + font-family: PingFang SC, serif; + position: relative; } /* =================== @@ -233,15 +250,25 @@ a:visited{ color:#fff; background:#246fa6 url(../images/install/header.png) 0 0 repeat-x; } +.wrap > .title{ + text-align: center; + padding: 23px 0 52px 0; + color: rgba(255,255,255,0.8); + font-size: 14px; +} /* =================== 主体 =================== */ .main{ - padding-top:35px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; } + /* =================== 底部 @@ -249,15 +276,39 @@ a:visited{ */ .footer{ text-align:center; - padding:15px 0 50px; + /*padding:15px 0 50px;*/ color:#999999; + margin-top: calc(100vh - 50px); + position: absolute; } .footer a{ - color:#999; + color:#999!important; text-decoration:none; } -.bottom{ - padding:0 0 25px; + +input[type=checkbox] { + position: relative; + cursor: pointer; +} + +input[type=checkbox]:after { + display: inline-block; + content: ""; + width: 14px; + height: 14px; + border-radius: 3px; + background: #fff; + border: 1px solid #fff; +} + +input[type=checkbox]:checked:after { + content: "✓"; + font-size: 12px; + font-weight: bold; + color: #fff; + background-color: #37CA71; + border: 1px solid #37CA71; + text-align: center; } /* @@ -265,20 +316,27 @@ a:visited{ 协议 =================== */ +.pact::-webkit-scrollbar { width: 0 !important } + +/*IE 10+*/ + +.pact { -ms-overflow-style: none; } + +/*Firefox*/ + +.pact { overflow: -moz-scrollbars-none; } .pact{ - box-shadow:5px 5px 5px #f7f7f7 inset; - border:1px solid #bdbcbc; - width:730px; - height:500px; - padding:10px; + width:700px; + height:480px; overflow:hidden; display:block; overflow-y:scroll; - margin:0 auto; + padding: 20px 50px; + margin:20px auto; font-size:12px; line-height:1.5; - margin-bottom:22px; outline:none; + color: #EEEEEE; } pre{ white-space: pre-wrap; @@ -288,6 +346,38 @@ pre{ word-wrap: break-word; word-break : normal; } +.section .title{ + margin-bottom: 27px; + text-align: center; +} +/*step1*/ +#step1 .title{ + display: flex; + flex-direction: column; + align-items: center; +} +.title h1{ + color: #FFFFFF; + font-size: 32px; + letter-spacing:1px; +} +.title .radio{ + font-size: 14px; + font-weight: normal; + color: rgba(255,255,255,0.8); + margin: 15px 0; + line-height: 16px; +} +.el-radio{ + line-height: 16px; + margin-right: 4px; +} +.el-radio__input.is-checked+.el-radio__label{ + color: rgba(255,255,255,0.8) !important; +} + +/* step2 */ + /* =================== 版本号 @@ -303,15 +393,32 @@ pre{ LOGO =================== */ -.logo{ - float:left; - width:230px; - height:80px; - background:url(../images/install/logo.png) no-repeat center; - overflow:hidden; - text-indent:-2000em; +/*.logo{*/ +/* float:left;*/ +/* width:230px;*/ +/* height:80px;*/ +/* background:url(../images/install/logo.png) no-repeat center;*/ +/* overflow:hidden;*/ +/* text-indent:-2000em;*/ +/*}*/ +.upload{ + width: 12px; + height: 10px; +} +.yes{ + width: 13px; + height: 11px; + margin-right: 5px; +} +.no{ + width: 14px; + height: 14px; + margin-right: 5px; +} +.ls-td{ + display: flex; + align-items: center; } - /* =================== 安装类型文案 @@ -338,37 +445,6 @@ LOGO 按钮 =================== */ -.btn, -.btn_old{ - display:inline-block; - width:100px; - height:30px; - background:url(../images/install/btn.png) no-repeat; - font:bold 14px/30px Arial,"Microsoft Yahei",Simsun; - text-decoration:none; - color:#fff !important; - margin:0 5px; - border:0 none; - cursor:pointer; - vertical-align:top; -} -.btn:hover{ - background-position:0 -30px; - text-decoration:none; -} -a.btn:visited{ - color:#ffffff; -} -.btn_old, -.btn_old:hover{ - background-position:0 -60px; - color:#999 !important; - cursor:default; - text-decoration:none; -} -a.btn_old:visited{ - color:#999 !important; -} /* =================== @@ -424,84 +500,28 @@ a.btn_old:visited{ background-position:-70px -70px; } -/* -=================== -服务器检测/信息输入 -=================== -*/ -.server{ - padding:20px 20px 20px 35px; -} -.server table{ - margin-bottom:20px; -} -.server td{ - padding:3px 5px; -} -.server .td1{ - color:#417b9d; - font-weight:700; -} -.server .input{ - border:1px solid; - border-color:#e3e9ef; - padding:3px; - width:200px; -} -.server .input:hover, -.server .input:focus{ - border:1px solid #0e85d5; - outline:none; -} -.gray{ - color:#bbb; -} -.server tr:hover .gray{ - color:#333; -} - -/* -=================== -正确错误 -=================== -*/ -.correct_span, -.error_span{ - display:block; - float:left; - width:20px; - height:16px; - text-indent:-2000em; - overflow:hidden; - background:url(../images/install/icon.png) no-repeat; - margin-right:5px; -} -.error_span{ - background-position:0 -23px; -} - /* =================== 数据表写入 =================== */ -.install{ - box-shadow:5px 5px 5px #f7f7f7 inset; - border:1px solid #bdbcbc; - width:670px; - height:350px; - padding:10px; - overflow:hidden; - display:block; - overflow-y:scroll; - margin:25px auto; - font-size:12px; - margin-bottom:22px; - outline:none; -} -.install ul{ - line-height:1.8; -} +/*.install{*/ +/* box-shadow:5px 5px 5px #f7f7f7 inset;*/ +/* border:1px solid #bdbcbc;*/ +/* width:670px;*/ +/* height:350px;*/ +/* padding:10px;*/ +/* overflow:hidden;*/ +/* display:block;*/ +/* overflow-y:scroll;*/ +/* margin:25px auto;*/ +/* font-size:12px;*/ +/* margin-bottom:22px;*/ +/* outline:none;*/ +/*}*/ +/*.install ul{*/ +/* line-height:1.8;*/ +/*}*/ /* =================== @@ -518,9 +538,6 @@ a.btn_old:visited{ color:#0166a5; text-decoration:none; } -.success_tip a:hover{ - text-decoration:underline; -} .error_tip{ background:url(../images/install/ignore.png) 130px 45px no-repeat; padding:50px 80px 60px 230px; @@ -559,19 +576,25 @@ a.btn_old:visited{ } .tips_error, .tips_success{ - color:#cc3333; + font-size: 12px; padding-left:16px; - background:url(../images/install/tips_system.png) -20px 2px no-repeat; display:inline-block; line-height:18px; } -.tips_success{ - color:#008800; - background-position:0 -19px; +.tips_error{ + background:url(../images/install/warring.png) 0px 3px no-repeat; + color: #fff; + background-size: 12px 12px; + } +.tips_success{ + color: #37CA71; + background:url(../images/install/success.png) 0px 3px no-repeat; + background-size: 12px 12px; +} + .tips_loading{ - color:#cc3333; - color:#333333; + color:#37CA71; display:inline-block; line-height:20px; } @@ -708,3 +731,16 @@ loading letter-spacing:2px; } +.bottom{ + width: 110px; + height: 32px; + background: #FFFFFF; + border-radius: 137px 137px 137px 137px; + font-size: 14px; + line-height: 32px; + margin: 0 auto; + margin-top: 20px; + cursor: pointer; + text-align: center; +} + diff --git a/crmeb/public/install/css/step1.css b/crmeb/public/install/css/step1.css new file mode 100755 index 000000000..f2bb0a985 --- /dev/null +++ b/crmeb/public/install/css/step1.css @@ -0,0 +1,124 @@ +.wrap{ + display: flex; + justify-content: center; + align-items: center; + position: relative; +} +.section{ + height: 100%; + z-index: 11; + position: absolute; + background: rgba(34, 34, 34,0.6); + border-radius: 36px 36px 36px 36px; + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); +} +.logo{ + width: 186px; + height: 70px; + margin-bottom: 20px; +} +.bottom{ + color: #5A487D; + width: 110px; + height: 32px; + background: #FFFFFF; + border-radius: 137px 137px 137px 137px; + font-size: 14px; + line-height: 32px; + margin: 0 auto; + margin-top: 20px; + cursor: pointer; + text-align: center; + /*font-size: 400px;*/ + transition: all 0.3s; +} +.bottom:hover{ + box-shadow: 0 2px 25px rgba(0, 234, 250, 0.5); +} +.bottom .btn{ + display:block; + width: 100%; + height: 100%; + font-weight: 600; +} +.more-text{ + background: linear-gradient(to right, #134392 0%, #363A8A 100%); + -webkit-background-clip: text; + color: transparent; +} +.agreement{ + height: 21px; + margin: 6px 0 10px 0; +} +.agreements{ + color: #A8CDE7; +} +.solgen{ + position: absolute; + width: 364px; + height: 16px; + bottom: 45px; + left: 218px; +} +.radio-box{ + border: 1px solid #fff; + border-radius: 50%; + width: 14px; + height: 14px; + position: relative; + margin-right: 10px; + font-size: 14px; +} +.is-shock{ + animation: shock 0.5s infinite; +} +.agreement span{ + line-height: 14px; +} +.radio-box img{ + position: absolute; + left: -1px; + top: -1px; + width: 16px; + height: 16px; + animation: show 0.3s; +} +@keyframes show { + 0% { + transform:scale(0); + -moz-transform:scale(0); + -webkit-transform:scale(0); + } + + 100% { + transform:scale(1); + -moz-transform:scale(1); + -webkit-transform:scale(1); + } +} + +@keyframes shock { + 0% { + margin-top: 0px; + } + 20% { + margin-bottom: 10px; + } + 40% { + margin-bottom: 0px; + } + 60% { + margin-bottom: 8px; + } + 70% { + margin-bottom: 0px; + } + 90% { + margin-bottom: 4px; + } + 100% { + margin-bottom: 0px; + + } +} \ No newline at end of file diff --git a/crmeb/public/install/css/step2.css b/crmeb/public/install/css/step2.css new file mode 100755 index 000000000..2c9470cb0 --- /dev/null +++ b/crmeb/public/install/css/step2.css @@ -0,0 +1,170 @@ +.wrap{ + display: flex; + flex-direction: column; + align-items: center; +} +.content{ + display: flex; +} + +.menu { + color: #fff; + width: 210px; +} +.menu .again{ + padding-bottom: 4px; + padding-left: 9px; + color: #37CA71; + text-decoration:none; +} +.menu .head{ + display: flex; + align-items: flex-end; +} +.menu .p8{ + color: rgba(255,255,255,0.8) +} +.menu .tab{ + margin-top: 25px; + padding: 18px 19px; + cursor: pointer; + display: flex; + align-items: center; +} +.left-img{ + position: relative; + margin-right: 20px; +} +.warring{ + position: absolute; + width: 12px; + height: 12px; + right: -6px; + bottom: 0px; +} +.btn-warning{ + bottom: 2px; + +} + +.env{ + width: 25px; + height: 25px; +} +.jur{ + width: 25px; + height: 28px; +} +.menu .tab{ + transition: all 0.1s; +} +.menu .tab.on{ + background: rgba(0,0,0,0.2); + border-radius: 13px 13px 13px 13px; +} +.config-list{ + width: 485px; +} +/* +=================== +服务器检测/信息输入 +=================== +*/ +.server{ + height: 430px; + padding:0px 20px 3px 35px; +} +.server table{ + margin-bottom:20px; +} +.server td{ + padding:6px 5px; + color: #fff; + font-size: 12px; + align-items: center; +} +.server .td1{ + color:rgba(255,255,255, 0.6); + font-size: 12px; +} +.server .input{ + border:none; + border-radius: 30px; + padding:3px; + width:200px; +} +.server .input:hover, +.server .input:focus{ + outline:none; +} +.gray{ + color:#bbb; +} +.server tr:hover .gray{ + color:#333; +} + +.trip{ + color: #EDB90F; + font-size: 12px; + height: 17px; +} +.trip img{ + width: 14px; + height: 14px; + margin-right: 5px; +} +/* +=================== +正确错误 +=================== +*/ +.correct_span, +.error_span{ + display:block; + float:left; + width:20px; + height:16px; + text-indent:-2000em; + overflow:hidden; + background:url(../images/install/icon.png) no-repeat; + margin-right:5px; +} +.error_span{ + background-position:0 -23px; +} +.bottom{ + width: 110px; + height: 32px; + background: #FFFFFF; + border-radius: 137px 137px 137px 137px; + font-size: 14px; + line-height: 32px; + margin: 0 auto; + margin-top: 20px; + cursor: pointer; + text-align: center; +} +.bottom a{ + display:block; + width: 100%; + height: 100%; +} +.bottom-btn{ + display: flex; +} +.bottom-btn .up-btn{ + color: rgba(255,255,255,0.6); + margin-right: 10px; + background-color: rgba(255,255,255,0.1); +} +.bottom-btn .next{ + color: #5A487D; +} +.bottom-btn .up-btn a{ + color: rgba(255,255,255,0.6); +} +.bottom-btn .up-btn a:link,a:visited{ + color: rgba(255,255,255,0.6); + text-decoration: none; +} \ No newline at end of file diff --git a/crmeb/public/install/css/step3.css b/crmeb/public/install/css/step3.css new file mode 100755 index 000000000..e786687a4 --- /dev/null +++ b/crmeb/public/install/css/step3.css @@ -0,0 +1,157 @@ +.wrap{ + display: flex; + flex-direction: column; + align-items: center; +} +.wrap > .title{ + text-align: center; + padding: 23px 0 27px 0; + color: rgba(255,255,255,0.8); + font-size: 14px; +} +.content{ + display: flex; +} + +.menu { + color: #fff; + width: 210px; +} +.menu .again{ + padding-bottom: 4px; + padding-left: 9px; + color: #37CA71; +} +.menu .head{ + display: flex; + align-items: flex-end; +} +.menu .p8{ + color: rgba(255,255,255,0.8) +} +.menu .tab{ + margin-top: 25px; + padding: 18px 19px; + cursor: pointer; +} +.menu .tab.on{ + background: rgba(0,0,0,0.2); + border-radius: 13px 13px 13px 13px; +} +.config-list{ + width: 485px; +} + +/* +=================== +服务器检测/信息输入 +=================== +*/ +.server::-webkit-scrollbar { width: 0 !important; + height: 0 !important; } + +/*IE 10+*/ + +.server { -ms-overflow-style: none; } + +/*Firefox*/ + +.server { overflow: -moz-scrollbars-none; } + +.server{ + padding:0px 20px 20px 35px; + width: 560px; + height: 475px; + overflow: scroll; +} +.server table{ + margin-bottom:20px; +} +.server td{ + padding:6px 5px; + color: #fff; + font-size: 12px; +} +.server .td1{ + font-weight: normal; + color: #FFFFFF; + font-size: 14px; + text-align: right; + padding-right: 12px +} +.server .el-radio{ + color: rgba(255,255,255,0.8); +} +.server .el-radio__label{ + font-size: 12px; + +} +.server .input{ + border:none; + border-radius: 20px; + background-color: rgba(0,0,0,0.1); + padding:0px 15px; + width: 186px; + height: 30px; + color: #fff; +} +.server .input:hover, +.server .input:focus{ + outline:none; +} +.server input::placeholder { + color: rgba(255,255,255,0.2); +} +.gray{ + color:#bbb; +} +.server tr:hover .gray{ + /*color:#333;*/ +} +.server .el-radio__input.is-checked .el-radio__inner { + border-color: #37CA71; + background: #37CA71; +} +/* +=================== +正确错误 +=================== +*/ +.correct_span, +.error_span{ + display:block; + float:left; + width:20px; + height:16px; + text-indent:-2000em; + overflow:hidden; + background:url(../images/install/icon.png) no-repeat; + margin-right:5px; +} +.error_span{ + background-position:0 -23px; +} +.section .bottom{ + margin: 0; +} +.bottom a{ + display:block; + width: 100%; + height: 100%; + +} +.bottom-btn{ + display: flex; + justify-content: center; +} +.next{ + color: #5A487D; +} +.bottom-btn .up-btn{ + margin-right: 10px; + background-color: rgba(255,255,255,0.1); +} +.bottom-btn .up-btn a:link,a:visited{ + color: rgba(255,255,255,0.6); + text-decoration: none; +} \ No newline at end of file diff --git a/crmeb/public/install/css/step4.css b/crmeb/public/install/css/step4.css new file mode 100755 index 000000000..efd63e16e --- /dev/null +++ b/crmeb/public/install/css/step4.css @@ -0,0 +1,127 @@ +.wrap{ + display: flex; + flex-direction: column; + align-items: center; +} +.title { + text-align: center; + padding: 23px 0 30px 0; + color: rgba(255, 255, 255, 0.8); + font-size: 14px; +} + +.section .title { + margin-bottom: 0; +} + +.section { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 60%; + height: 60%; + max-height: 60%; +} + +.section .progress { + width: 100%; +} + +.section .el-progress-bar { + padding-right: 0px; +} + +.msg { + width: 300px; + font-size: 12px; + color: rgba(255, 255, 255, 0.8); + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.msg li { + width: 350px; + display: flex; + flex-wrap: nowrap; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.open { + font-size: 12px; + color: #fff; + cursor: pointer; +} + +.btn_old { + color: #5A487D; +} + +.section .bottom { + width: 120px; + margin: 0; +} + +.progress-msg { + display: flex; + justify-content: center; + align-items: center; + padding: 14px 0 30px 0; +} +.install { + display: flex; + flex-direction: column; + width: 96%; + max-height: 550px; + color: #fff; + overflow-y: scroll; + margin: 25px auto; + font-size: 12px; + background-color: rgba(255,255,255,0.1); + padding: 0 2%; + border-radius: 6px; +} +.shuaxin{ + -webkit-animation:changeright 1s linear infinite; + width: 16px; + height: 16px; +} +@-webkit-keyframes changeright{ + 0%{-webkit-transform:rotate(0deg);} + 50%{-webkit-transform:rotate(180deg);} + 100%{-webkit-transform:rotate(360deg);} +} +.install::-webkit-scrollbar { width: 0 !important } +.item{ + display: flex; + justify-content: space-between; +} +/*IE 10+*/ + +.install { -ms-overflow-style: none; } + +/*Firefox*/ + +.install { overflow: -moz-scrollbars-none; } +.bottom-btn { + display: flex; + justify-content: center; +} + +.bottom-btn .up-btn { + color: #FFFFFF; + margin-right: 10px; + background-color: rgba(255, 255, 255, 0.1); +} + +.bottom-btn .up-btn a:link, a:visited { + color: #fff; +} + +.trip { + +} \ No newline at end of file diff --git a/crmeb/public/install/css/step5.css b/crmeb/public/install/css/step5.css new file mode 100755 index 000000000..4c6b7555c --- /dev/null +++ b/crmeb/public/install/css/step5.css @@ -0,0 +1,59 @@ +.wrap{ + display: flex; + flex-direction: column; + align-items: center; +} +.title{ + text-align: center; + padding: 23px 0 30px 0; + color: rgba(255,255,255,0.8); + font-size: 14px; + display: flex; + align-items: center; +} +.title img{ + width: 30px; + height: 30px; + margin-right: 17px; +} +.section .title{ + margin-bottom: 0; +} +.section{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + width: 90%; + height: 60%; +} +.bottom-btn{ + display: flex; + justify-content: center; + margin-top: 36px; +} +.bottom-btn .btn{ + width: 98px; + height: 32px; + font-size: 14px; + font-weight: 600; + border-radius: 30px; +} +.bottom-btn .pre{ + color: #FFFFFF; + margin-right: 20px; + border: 1px solid #FFFFFF; +} +.bottom-btn .admin{ + background: #FFFFFF; + border: 1px solid #FFFFFF; +} +.bottom-btn .pre a{ + color: #fff; +} +.bottom-btn .admin a{ + color: #5A487D; +} +.trip{ + font-size: 12px; +} \ No newline at end of file diff --git a/crmeb/public/install/css/theme-chalk.css b/crmeb/public/install/css/theme-chalk.css new file mode 100755 index 000000000..619b14062 --- /dev/null +++ b/crmeb/public/install/css/theme-chalk.css @@ -0,0 +1 @@ +@charset "UTF-8";@font-face{font-family:element-icons;src:url(fonts/element-icons.woff) format("woff"),url(fonts/element-icons.ttf) format("truetype");font-weight:400;font-display:"auto";font-style:normal}[class*=" el-icon-"],[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}.el-icon-ice-cream-round:before{content:"\e6a0"}.el-icon-ice-cream-square:before{content:"\e6a3"}.el-icon-lollipop:before{content:"\e6a4"}.el-icon-potato-strips:before{content:"\e6a5"}.el-icon-milk-tea:before{content:"\e6a6"}.el-icon-ice-drink:before{content:"\e6a7"}.el-icon-ice-tea:before{content:"\e6a9"}.el-icon-coffee:before{content:"\e6aa"}.el-icon-orange:before{content:"\e6ab"}.el-icon-pear:before{content:"\e6ac"}.el-icon-apple:before{content:"\e6ad"}.el-icon-cherry:before{content:"\e6ae"}.el-icon-watermelon:before{content:"\e6af"}.el-icon-grape:before{content:"\e6b0"}.el-icon-refrigerator:before{content:"\e6b1"}.el-icon-goblet-square-full:before{content:"\e6b2"}.el-icon-goblet-square:before{content:"\e6b3"}.el-icon-goblet-full:before{content:"\e6b4"}.el-icon-goblet:before{content:"\e6b5"}.el-icon-cold-drink:before{content:"\e6b6"}.el-icon-coffee-cup:before{content:"\e6b8"}.el-icon-water-cup:before{content:"\e6b9"}.el-icon-hot-water:before{content:"\e6ba"}.el-icon-ice-cream:before{content:"\e6bb"}.el-icon-dessert:before{content:"\e6bc"}.el-icon-sugar:before{content:"\e6bd"}.el-icon-tableware:before{content:"\e6be"}.el-icon-burger:before{content:"\e6bf"}.el-icon-knife-fork:before{content:"\e6c1"}.el-icon-fork-spoon:before{content:"\e6c2"}.el-icon-chicken:before{content:"\e6c3"}.el-icon-food:before{content:"\e6c4"}.el-icon-dish-1:before{content:"\e6c5"}.el-icon-dish:before{content:"\e6c6"}.el-icon-moon-night:before{content:"\e6ee"}.el-icon-moon:before{content:"\e6f0"}.el-icon-cloudy-and-sunny:before{content:"\e6f1"}.el-icon-partly-cloudy:before{content:"\e6f2"}.el-icon-cloudy:before{content:"\e6f3"}.el-icon-sunny:before{content:"\e6f6"}.el-icon-sunset:before{content:"\e6f7"}.el-icon-sunrise-1:before{content:"\e6f8"}.el-icon-sunrise:before{content:"\e6f9"}.el-icon-heavy-rain:before{content:"\e6fa"}.el-icon-lightning:before{content:"\e6fb"}.el-icon-light-rain:before{content:"\e6fc"}.el-icon-wind-power:before{content:"\e6fd"}.el-icon-baseball:before{content:"\e712"}.el-icon-soccer:before{content:"\e713"}.el-icon-football:before{content:"\e715"}.el-icon-basketball:before{content:"\e716"}.el-icon-ship:before{content:"\e73f"}.el-icon-truck:before{content:"\e740"}.el-icon-bicycle:before{content:"\e741"}.el-icon-mobile-phone:before{content:"\e6d3"}.el-icon-service:before{content:"\e6d4"}.el-icon-key:before{content:"\e6e2"}.el-icon-unlock:before{content:"\e6e4"}.el-icon-lock:before{content:"\e6e5"}.el-icon-watch:before{content:"\e6fe"}.el-icon-watch-1:before{content:"\e6ff"}.el-icon-timer:before{content:"\e702"}.el-icon-alarm-clock:before{content:"\e703"}.el-icon-map-location:before{content:"\e704"}.el-icon-delete-location:before{content:"\e705"}.el-icon-add-location:before{content:"\e706"}.el-icon-location-information:before{content:"\e707"}.el-icon-location-outline:before{content:"\e708"}.el-icon-location:before{content:"\e79e"}.el-icon-place:before{content:"\e709"}.el-icon-discover:before{content:"\e70a"}.el-icon-first-aid-kit:before{content:"\e70b"}.el-icon-trophy-1:before{content:"\e70c"}.el-icon-trophy:before{content:"\e70d"}.el-icon-medal:before{content:"\e70e"}.el-icon-medal-1:before{content:"\e70f"}.el-icon-stopwatch:before{content:"\e710"}.el-icon-mic:before{content:"\e711"}.el-icon-copy-document:before{content:"\e718"}.el-icon-full-screen:before{content:"\e719"}.el-icon-switch-button:before{content:"\e71b"}.el-icon-aim:before{content:"\e71c"}.el-icon-crop:before{content:"\e71d"}.el-icon-odometer:before{content:"\e71e"}.el-icon-time:before{content:"\e71f"}.el-icon-bangzhu:before{content:"\e724"}.el-icon-close-notification:before{content:"\e726"}.el-icon-microphone:before{content:"\e727"}.el-icon-turn-off-microphone:before{content:"\e728"}.el-icon-position:before{content:"\e729"}.el-icon-postcard:before{content:"\e72a"}.el-icon-message:before{content:"\e72b"}.el-icon-chat-line-square:before{content:"\e72d"}.el-icon-chat-dot-square:before{content:"\e72e"}.el-icon-chat-dot-round:before{content:"\e72f"}.el-icon-chat-square:before{content:"\e730"}.el-icon-chat-line-round:before{content:"\e731"}.el-icon-chat-round:before{content:"\e732"}.el-icon-set-up:before{content:"\e733"}.el-icon-turn-off:before{content:"\e734"}.el-icon-open:before{content:"\e735"}.el-icon-connection:before{content:"\e736"}.el-icon-link:before{content:"\e737"}.el-icon-cpu:before{content:"\e738"}.el-icon-thumb:before{content:"\e739"}.el-icon-female:before{content:"\e73a"}.el-icon-male:before{content:"\e73b"}.el-icon-guide:before{content:"\e73c"}.el-icon-news:before{content:"\e73e"}.el-icon-price-tag:before{content:"\e744"}.el-icon-discount:before{content:"\e745"}.el-icon-wallet:before{content:"\e747"}.el-icon-coin:before{content:"\e748"}.el-icon-money:before{content:"\e749"}.el-icon-bank-card:before{content:"\e74a"}.el-icon-box:before{content:"\e74b"}.el-icon-present:before{content:"\e74c"}.el-icon-sell:before{content:"\e6d5"}.el-icon-sold-out:before{content:"\e6d6"}.el-icon-shopping-bag-2:before{content:"\e74d"}.el-icon-shopping-bag-1:before{content:"\e74e"}.el-icon-shopping-cart-2:before{content:"\e74f"}.el-icon-shopping-cart-1:before{content:"\e750"}.el-icon-shopping-cart-full:before{content:"\e751"}.el-icon-smoking:before{content:"\e752"}.el-icon-no-smoking:before{content:"\e753"}.el-icon-house:before{content:"\e754"}.el-icon-table-lamp:before{content:"\e755"}.el-icon-school:before{content:"\e756"}.el-icon-office-building:before{content:"\e757"}.el-icon-toilet-paper:before{content:"\e758"}.el-icon-notebook-2:before{content:"\e759"}.el-icon-notebook-1:before{content:"\e75a"}.el-icon-files:before{content:"\e75b"}.el-icon-collection:before{content:"\e75c"}.el-icon-receiving:before{content:"\e75d"}.el-icon-suitcase-1:before{content:"\e760"}.el-icon-suitcase:before{content:"\e761"}.el-icon-film:before{content:"\e763"}.el-icon-collection-tag:before{content:"\e765"}.el-icon-data-analysis:before{content:"\e766"}.el-icon-pie-chart:before{content:"\e767"}.el-icon-data-board:before{content:"\e768"}.el-icon-data-line:before{content:"\e76d"}.el-icon-reading:before{content:"\e769"}.el-icon-magic-stick:before{content:"\e76a"}.el-icon-coordinate:before{content:"\e76b"}.el-icon-mouse:before{content:"\e76c"}.el-icon-brush:before{content:"\e76e"}.el-icon-headset:before{content:"\e76f"}.el-icon-umbrella:before{content:"\e770"}.el-icon-scissors:before{content:"\e771"}.el-icon-mobile:before{content:"\e773"}.el-icon-attract:before{content:"\e774"}.el-icon-monitor:before{content:"\e775"}.el-icon-search:before{content:"\e778"}.el-icon-takeaway-box:before{content:"\e77a"}.el-icon-paperclip:before{content:"\e77d"}.el-icon-printer:before{content:"\e77e"}.el-icon-document-add:before{content:"\e782"}.el-icon-document:before{content:"\e785"}.el-icon-document-checked:before{content:"\e786"}.el-icon-document-copy:before{content:"\e787"}.el-icon-document-delete:before{content:"\e788"}.el-icon-document-remove:before{content:"\e789"}.el-icon-tickets:before{content:"\e78b"}.el-icon-folder-checked:before{content:"\e77f"}.el-icon-folder-delete:before{content:"\e780"}.el-icon-folder-remove:before{content:"\e781"}.el-icon-folder-add:before{content:"\e783"}.el-icon-folder-opened:before{content:"\e784"}.el-icon-folder:before{content:"\e78a"}.el-icon-edit-outline:before{content:"\e764"}.el-icon-edit:before{content:"\e78c"}.el-icon-date:before{content:"\e78e"}.el-icon-c-scale-to-original:before{content:"\e7c6"}.el-icon-view:before{content:"\e6ce"}.el-icon-loading:before{content:"\e6cf"}.el-icon-rank:before{content:"\e6d1"}.el-icon-sort-down:before{content:"\e7c4"}.el-icon-sort-up:before{content:"\e7c5"}.el-icon-sort:before{content:"\e6d2"}.el-icon-finished:before{content:"\e6cd"}.el-icon-refresh-left:before{content:"\e6c7"}.el-icon-refresh-right:before{content:"\e6c8"}.el-icon-refresh:before{content:"\e6d0"}.el-icon-video-play:before{content:"\e7c0"}.el-icon-video-pause:before{content:"\e7c1"}.el-icon-d-arrow-right:before{content:"\e6dc"}.el-icon-d-arrow-left:before{content:"\e6dd"}.el-icon-arrow-up:before{content:"\e6e1"}.el-icon-arrow-down:before{content:"\e6df"}.el-icon-arrow-right:before{content:"\e6e0"}.el-icon-arrow-left:before{content:"\e6de"}.el-icon-top-right:before{content:"\e6e7"}.el-icon-top-left:before{content:"\e6e8"}.el-icon-top:before{content:"\e6e6"}.el-icon-bottom:before{content:"\e6eb"}.el-icon-right:before{content:"\e6e9"}.el-icon-back:before{content:"\e6ea"}.el-icon-bottom-right:before{content:"\e6ec"}.el-icon-bottom-left:before{content:"\e6ed"}.el-icon-caret-top:before{content:"\e78f"}.el-icon-caret-bottom:before{content:"\e790"}.el-icon-caret-right:before{content:"\e791"}.el-icon-caret-left:before{content:"\e792"}.el-icon-d-caret:before{content:"\e79a"}.el-icon-share:before{content:"\e793"}.el-icon-menu:before{content:"\e798"}.el-icon-s-grid:before{content:"\e7a6"}.el-icon-s-check:before{content:"\e7a7"}.el-icon-s-data:before{content:"\e7a8"}.el-icon-s-opportunity:before{content:"\e7aa"}.el-icon-s-custom:before{content:"\e7ab"}.el-icon-s-claim:before{content:"\e7ad"}.el-icon-s-finance:before{content:"\e7ae"}.el-icon-s-comment:before{content:"\e7af"}.el-icon-s-flag:before{content:"\e7b0"}.el-icon-s-marketing:before{content:"\e7b1"}.el-icon-s-shop:before{content:"\e7b4"}.el-icon-s-open:before{content:"\e7b5"}.el-icon-s-management:before{content:"\e7b6"}.el-icon-s-ticket:before{content:"\e7b7"}.el-icon-s-release:before{content:"\e7b8"}.el-icon-s-home:before{content:"\e7b9"}.el-icon-s-promotion:before{content:"\e7ba"}.el-icon-s-operation:before{content:"\e7bb"}.el-icon-s-unfold:before{content:"\e7bc"}.el-icon-s-fold:before{content:"\e7a9"}.el-icon-s-platform:before{content:"\e7bd"}.el-icon-s-order:before{content:"\e7be"}.el-icon-s-cooperation:before{content:"\e7bf"}.el-icon-bell:before{content:"\e725"}.el-icon-message-solid:before{content:"\e799"}.el-icon-video-camera:before{content:"\e772"}.el-icon-video-camera-solid:before{content:"\e796"}.el-icon-camera:before{content:"\e779"}.el-icon-camera-solid:before{content:"\e79b"}.el-icon-download:before{content:"\e77c"}.el-icon-upload2:before{content:"\e77b"}.el-icon-upload:before{content:"\e7c3"}.el-icon-picture-outline-round:before{content:"\e75f"}.el-icon-picture-outline:before{content:"\e75e"}.el-icon-picture:before{content:"\e79f"}.el-icon-close:before{content:"\e6db"}.el-icon-check:before{content:"\e6da"}.el-icon-plus:before{content:"\e6d9"}.el-icon-minus:before{content:"\e6d8"}.el-icon-help:before{content:"\e73d"}.el-icon-s-help:before{content:"\e7b3"}.el-icon-circle-close:before{content:"\e78d"}.el-icon-circle-check:before{content:"\e720"}.el-icon-circle-plus-outline:before{content:"\e723"}.el-icon-remove-outline:before{content:"\e722"}.el-icon-zoom-out:before{content:"\e776"}.el-icon-zoom-in:before{content:"\e777"}.el-icon-error:before{content:"\e79d"}.el-icon-success:before{content:"\e79c"}.el-icon-circle-plus:before{content:"\e7a0"}.el-icon-remove:before{content:"\e7a2"}.el-icon-info:before{content:"\e7a1"}.el-icon-question:before{content:"\e7a4"}.el-icon-warning-outline:before{content:"\e6c9"}.el-icon-warning:before{content:"\e7a3"}.el-icon-goods:before{content:"\e7c2"}.el-icon-s-goods:before{content:"\e7b2"}.el-icon-star-off:before{content:"\e717"}.el-icon-star-on:before{content:"\e797"}.el-icon-more-outline:before{content:"\e6cc"}.el-icon-more:before{content:"\e794"}.el-icon-phone-outline:before{content:"\e6cb"}.el-icon-phone:before{content:"\e795"}.el-icon-user:before{content:"\e6e3"}.el-icon-user-solid:before{content:"\e7a5"}.el-icon-setting:before{content:"\e6ca"}.el-icon-s-tools:before{content:"\e7ac"}.el-icon-delete:before{content:"\e6d7"}.el-icon-delete-solid:before{content:"\e7c9"}.el-icon-eleme:before{content:"\e7c7"}.el-icon-platform-eleme:before{content:"\e7ca"}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.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)}}.el-pagination{white-space:nowrap;padding:2px 5px;color:#303133;font-weight:700}.el-pagination::after,.el-pagination::before{display:table;content:""}.el-pagination::after{clear:both}.el-pagination button,.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}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-input__suffix{right:0;-webkit-transform:scale(.8);transform:scale(.8)}.el-pagination .el-select .el-input{width:100px;margin:0 5px}.el-pagination .el-select .el-input .el-input__inner{padding-right:25px;border-radius:3px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:#409EFF}.el-pagination button:disabled{color:#C0C4CC;background-color:#FFF;cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:center center no-repeat #FFF;background-size:16px;cursor:pointer;margin:0;color:#303133}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700}.el-pagination .btn-prev{padding-right:12px}.el-pagination .btn-next{padding-left:12px}.el-pagination .el-pager li.disabled{color:#C0C4CC;cursor:not-allowed}.el-pager li,.el-pager li.btn-quicknext:hover,.el-pager li.btn-quickprev:hover{cursor:pointer}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:12px;line-height:22px;height:22px;min-width:22px}.el-pagination--small .arrow.disabled{visibility:hidden}.el-pagination--small .more::before,.el-pagination--small li.more::before{line-height:24px}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:22px;line-height:22px}.el-pagination--small .el-pagination__editor,.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:22px}.el-pagination__sizes{margin:0 10px 0 0;font-weight:400;color:#606266}.el-pagination__sizes .el-input .el-input__inner{font-size:13px;padding-left:8px}.el-pagination__sizes .el-input .el-input__inner:hover{border-color:#409EFF}.el-pagination__total{margin-right:10px;font-weight:400;color:#606266}.el-pagination__jump{margin-left:24px;font-weight:400;color:#606266}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__rightwrapper{float:right}.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}.el-pager,.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-dialog,.el-pager li{-webkit-box-sizing:border-box}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:28px}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 5px;background-color:#f4f4f5;color:#606266;min-width:30px;border-radius:2px}.el-pagination.is-background .btn-next.disabled,.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev.disabled,.el-pagination.is-background .btn-prev:disabled,.el-pagination.is-background .el-pager li.disabled{color:#C0C4CC}.el-pagination.is-background .el-pager li:not(.disabled):hover{color:#409EFF}.el-pagination.is-background .el-pager li:not(.disabled).active{background-color:#409EFF;color:#FFF}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{margin:0 3px;min-width:22px}.el-pager,.el-pager li{vertical-align:top;margin:0;display:inline-block}.el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;font-size:0}.el-pager .more::before{line-height:30px}.el-pager li{padding:0 4px;background:#FFF;font-size:13px;min-width:35.5px;height:28px;line-height:28px;box-sizing:border-box;text-align:center}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:28px;color:#303133}.el-pager li.btn-quicknext.disabled,.el-pager li.btn-quickprev.disabled{color:#C0C4CC}.el-pager li.active+li{border-left:0}.el-pager li:hover{color:#409EFF}.el-pager li.active{color:#409EFF;cursor:default}@-webkit-keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{100%{opacity:0}}.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);box-sizing:border-box;width:50%}.el-dialog.is-fullscreen{width:100%;margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog__header{padding:20px 20px 10px}.el-dialog__headerbtn{position:absolute;top:20px;right:20px;padding:0;background:0 0;border:none;outline:0;cursor:pointer;font-size:16px}.el-dialog__headerbtn .el-dialog__close{color:#909399}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:#409EFF}.el-dialog__title{line-height:24px;font-size:18px;color:#303133}.el-dialog__body{padding:30px 20px;color:#606266;font-size:14px;word-break:break-all}.el-dialog__footer{padding:10px 20px 20px;text-align:right;-webkit-box-sizing:border-box;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px 25px 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.dialog-fade-enter-active{-webkit-animation:dialog-fade-in .3s;animation:dialog-fade-in .3s}.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}}.el-autocomplete{position:relative;display:inline-block}.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;border:1px solid #E4E7ED;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:#FFF}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:#606266;font-size:14px;list-style:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li.highlighted,.el-autocomplete-suggestion li:hover{background-color:#F5F7FA}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid #000}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:#999}.el-autocomplete-suggestion.is-loading li::after{display:inline-block;content:"";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:#FFF}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-dropdown{display:inline-block;position:relative;color:#606266;font-size:14px}.el-dropdown .el-button-group{display:block}.el-dropdown .el-button-group .el-button{float:none}.el-dropdown .el-dropdown__caret-button{padding-left:5px;padding-right:5px;position:relative;border-left:none}.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)}.el-dropdown .el-dropdown__caret-button.el-button--default::before{background:rgba(220,223,230,.5)}.el-dropdown .el-dropdown__caret-button:hover:not(.is-disabled)::before{top:0;bottom:0}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{padding-left:0}.el-dropdown__icon{font-size:12px;margin:0 3px}.el-dropdown .el-dropdown-selfdefine:focus:active,.el-dropdown .el-dropdown-selfdefine:focus:not(.focusing){outline-width:0}.el-dropdown [disabled]{cursor:not-allowed;color:#bbb}.el-dropdown-menu{position:absolute;top:0;left:0;z-index:10;padding:10px 0;margin:5px 0;background-color:#FFF;border:1px solid #EBEEF5;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)}.el-dropdown-menu__item,.el-menu-item{font-size:14px;padding:0 20px;cursor:pointer}.el-dropdown-menu__item{list-style:none;line-height:36px;margin:0;color:#606266;outline:0}.el-dropdown-menu__item:focus,.el-dropdown-menu__item:not(.is-disabled):hover{background-color:#ecf5ff;color:#66b1ff}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{position:relative;margin-top:6px;border-top:1px solid #EBEEF5}.el-dropdown-menu__item--divided:before{content:'';height:6px;display:block;margin:0 -20px;background-color:#FFF}.el-dropdown-menu__item.is-disabled{cursor:default;color:#bbb;pointer-events:none}.el-dropdown-menu--medium{padding:6px 0}.el-dropdown-menu--medium .el-dropdown-menu__item{line-height:30px;padding:0 17px;font-size:14px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:6px}.el-dropdown-menu--medium .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:6px;margin:0 -17px}.el-dropdown-menu--small{padding:6px 0}.el-dropdown-menu--small .el-dropdown-menu__item{line-height:27px;padding:0 15px;font-size:13px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:4px}.el-dropdown-menu--small .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:4px;margin:0 -15px}.el-dropdown-menu--mini{padding:3px 0}.el-dropdown-menu--mini .el-dropdown-menu__item{line-height:24px;padding:0 10px;font-size:12px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided{margin-top:3px}.el-dropdown-menu--mini .el-dropdown-menu__item.el-dropdown-menu__item--divided:before{height:3px;margin:0 -10px}.el-menu{border-right:solid 1px #e6e6e6;list-style:none;position:relative;margin:0;padding-left:0;background-color:#FFF}.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover,.el-menu--horizontal>.el-submenu .el-submenu__title:hover{background-color:#fff}.el-menu::after,.el-menu::before{display:table;content:""}.el-breadcrumb__item:last-child .el-breadcrumb__separator,.el-menu--collapse>.el-menu-item .el-submenu__icon-arrow,.el-menu--collapse>.el-submenu>.el-submenu__title .el-submenu__icon-arrow{display:none}.el-menu::after{clear:both}.el-menu.el-menu--horizontal{border-bottom:solid 1px #e6e6e6}.el-menu--horizontal{border-right:none}.el-menu--horizontal>.el-menu-item{float:left;height:60px;line-height:60px;margin:0;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-submenu{float:left}.el-menu--horizontal>.el-submenu:focus,.el-menu--horizontal>.el-submenu:hover{outline:0}.el-menu--horizontal>.el-submenu:focus .el-submenu__title,.el-menu--horizontal>.el-submenu:hover .el-submenu__title{color:#303133}.el-menu--horizontal>.el-submenu.is-active .el-submenu__title{border-bottom:2px solid #409EFF;color:#303133}.el-menu--horizontal>.el-submenu .el-submenu__title{height:60px;line-height:60px;border-bottom:2px solid transparent;color:#909399}.el-menu--horizontal>.el-submenu .el-submenu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--collapse .el-submenu,.el-menu-item{position:relative}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-submenu__title{background-color:#FFF;float:none;height:36px;line-height:36px;padding:0 10px;color:#909399}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-submenu.is-active>.el-submenu__title{color:#303133}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:#303133}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid #409EFF;color:#303133}.el-menu--collapse{width:64px}.el-menu--collapse>.el-menu-item [class^=el-icon-],.el-menu--collapse>.el-submenu>.el-submenu__title [class^=el-icon-]{margin:0;vertical-align:middle;width:24px;text-align:center}.el-menu--collapse>.el-menu-item span,.el-menu--collapse>.el-submenu>.el-submenu__title span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu-item,.el-submenu__title{height:56px;line-height:56px;list-style:none}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-menu .el-submenu{min-width:200px}.el-menu--collapse .el-submenu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;z-index:10;border:1px solid #E4E7ED;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)}.el-menu--collapse .el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:none;transform:none}.el-menu--popup{z-index:100;min-width:200px;border:none;padding:5px 0;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)}.el-menu--popup-bottom-start{margin-top:5px}.el-menu--popup-right-start{margin-left:5px;margin-right:5px}.el-menu-item{color:#303133;-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}.el-radio-button__inner,.el-submenu__title{-webkit-box-sizing:border-box;position:relative;white-space:nowrap}.el-menu-item *{vertical-align:middle}.el-menu-item i{color:#909399}.el-menu-item:focus,.el-menu-item:hover{outline:0;background-color:#ecf5ff}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon-]{margin-right:5px;width:24px;text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:#409EFF}.el-menu-item.is-active i{color:inherit}.el-submenu{list-style:none;margin:0;padding-left:0}.el-submenu__title{font-size:14px;color:#303133;padding:0 20px;cursor:pointer;-webkit-transition:border-color .3s,background-color .3s,color .3s;transition:border-color .3s,background-color .3s,color .3s;box-sizing:border-box}.el-submenu__title *{vertical-align:middle}.el-submenu__title i{color:#909399}.el-submenu__title:focus,.el-submenu__title:hover{outline:0;background-color:#ecf5ff}.el-submenu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu__title:hover{background-color:#ecf5ff}.el-submenu .el-menu{border:none}.el-submenu .el-menu-item{height:50px;line-height:50px;padding:0 45px;min-width:200px}.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}.el-submenu.is-active .el-submenu__title{border-bottom-color:#409EFF}.el-submenu.is-opened>.el-submenu__title .el-submenu__icon-arrow{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-submenu.is-disabled .el-menu-item,.el-submenu.is-disabled .el-submenu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-submenu [class^=el-icon-]{vertical-align:middle;margin-right:5px;width:24px;text-align:center;font-size:18px}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px 20px;line-height:normal;font-size:12px;color:#909399}.el-radio-button__inner,.el-radio-group{display:inline-block;line-height:1;vertical-align:middle}.horizontal-collapse-transition .el-submenu__title .el-submenu__icon-arrow{-webkit-transition:.2s;transition:.2s;opacity:0}.el-radio-group{font-size:0}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{background:#FFF;border:1px solid #DCDFE6;font-weight:500;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:0;margin:0;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}.el-radio-button__inner.is-round{padding:12px 20px}.el-radio-button__inner:hover{color:#409EFF}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-radio-button__orig-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__orig-radio:checked+.el-radio-button__inner{color:#FFF;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #409EFF;box-shadow:-1px 0 0 0 #409EFF}.el-radio-button__orig-radio:disabled+.el-radio-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-radio-button__orig-radio:disabled:checked+.el-radio-button__inner{background-color:#F2F6FC}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 4px 4px 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:4px}.el-radio-button--medium .el-radio-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-radio-button--medium .el-radio-button__inner.is-round{padding:10px 20px}.el-radio-button--small .el-radio-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:9px 15px}.el-radio-button--mini .el-radio-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-radio-button--mini .el-radio-button__inner.is-round{padding:7px 15px}.el-radio-button:focus:not(.is-focus):not(:active):not(.is-disabled){-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-picker-panel,.el-popover,.el-select-dropdown,.el-table-filter,.el-time-panel{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-switch{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;position:relative;font-size:14px;line-height:20px;height:20px;vertical-align:middle}.el-switch__core,.el-switch__label{display:inline-block;cursor:pointer}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{-webkit-transition:.2s;transition:.2s;height:20px;font-size:14px;font-weight:500;vertical-align:middle;color:#303133}.el-switch__label.is-active{color:#409EFF}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__core{margin:0;position:relative;width:40px;height:20px;border:1px solid #DCDFE6;outline:0;border-radius:10px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#DCDFE6;-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s;vertical-align:middle}.el-input__prefix,.el-input__suffix{-webkit-transition:all .3s;color:#C0C4CC}.el-switch__core:after{content:"";position:absolute;top:1px;left:1px;border-radius:100%;-webkit-transition:all .3s;transition:all .3s;width:16px;height:16px;background-color:#FFF}.el-switch.is-checked .el-switch__core{border-color:#409EFF;background-color:#409EFF}.el-switch.is-checked .el-switch__core::after{left:100%;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter,.el-switch .label-fade-leave-active{opacity:0}.el-select-dropdown{position:absolute;z-index:1001;border:1px solid #E4E7ED;border-radius:4px;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);-webkit-box-sizing:border-box;box-sizing:border-box;margin:5px 0}.el-select-dropdown.is-multiple .el-select-dropdown__item{padding-right:40px}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:#409EFF;background-color:#FFF}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:#F5F7FA}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected::after{position:absolute;right:20px;font-family:element-icons;content:"\e6da";font-size:12px;font-weight:700;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:#999;font-size:14px}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-select-dropdown__item{font-size:14px;padding:0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#606266;height:34px;line-height:34px;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-select-dropdown__item.is-disabled:hover{background-color:#FFF}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:#F5F7FA}.el-select-dropdown__item.selected{color:#409EFF;font-weight:700}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type)::after{content:'';position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:#E4E7ED}.el-select-group__title{padding-left:20px;font-size:12px;color:#909399;line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{display:inline-block;position:relative}.el-select .el-select__tags>span{display:contents}.el-select:hover .el-input__inner{border-color:#C0C4CC}.el-select .el-input__inner{cursor:pointer;padding-right:35px}.el-select .el-input__inner:focus{border-color:#409EFF}.el-select .el-input .el-select__caret{color:#C0C4CC;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);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{-webkit-transform:rotateZ(0);transform:rotateZ(0)}.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:#C0C4CC;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-select .el-input .el-select__caret.is-show-close:hover{color:#909399}.el-select .el-input.is-disabled .el-input__inner{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__inner:hover{border-color:#E4E7ED}.el-range-editor.is-active,.el-range-editor.is-active:hover,.el-select .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-select>.el-input{display:block}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:#666;font-size:14px;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-mini{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:1000;right:25px;color:#C0C4CC;line-height:18px;font-size:14px}.el-select__close:hover{color:#909399}.el-select__tags{position:absolute;line-height:normal;white-space:normal;z-index:1;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-select__tags-text{overflow:hidden;text-overflow:ellipsis}.el-select .el-tag{-webkit-box-sizing:border-box;box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:#f0f2f5;display:-webkit-box;display:-ms-flexbox;display:flex;max-width:100%;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-select .el-tag__close.el-icon-close{background-color:#C0C4CC;top:0;color:#FFF;-ms-flex-negative:0;flex-shrink:0}.el-select .el-tag__close.el-icon-close:hover{background-color:#909399}.el-table,.el-table__expanded-cell{background-color:#FFF}.el-select .el-tag__close.el-icon-close::before{display:block;-webkit-transform:translate(0,.5px);transform:translate(0,.5px)}.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%;font-size:14px;color:#606266}.el-table__empty-block{min-height:60px;text-align:center;width:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:#909399}.el-table__expand-column .cell{padding:0;text-align:center}.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}.el-table__expand-icon--expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-table__expand-icon>.el-icon{position:absolute;left:50%;top:50%;margin-left:-5px;margin-top:-5px}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table--scrollable-x .el-table__body-wrapper{overflow-x:auto}.el-table--scrollable-y .el-table__body-wrapper{overflow-y:auto}.el-table thead{color:#909399;font-weight:500}.el-table thead.is-group th.el-table__cell{background:#F5F7FA}.el-table .el-table__cell{padding:12px 0;min-width:0;-webkit-box-sizing:border-box;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table--medium .el-table__cell{padding:10px 0}.el-table--small{font-size:12px}.el-table--small .el-table__cell{padding:8px 0}.el-table--mini{font-size:12px}.el-table--mini .el-table__cell{padding:6px 0}.el-table tr{background-color:#FFF}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:1px solid #EBEEF5}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#FFF}.el-table th.el-table__cell>.cell{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;position:relative;vertical-align:middle;padding-left:10px;padding-right:10px;width:100%}.el-table th.el-table__cell>.cell.highlight{color:#409EFF}.el-table th.el-table__cell.required>div::before{display:inline-block;content:"";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td.el-table__cell div{-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-table td,.el-table .cell,.el-table-filter{-webkit-box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table .cell{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}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--border,.el-table--group{border:1px solid #EBEEF5}.el-table--border::after,.el-table--group::after,.el-table::before{content:'';position:absolute;background-color:#EBEEF5;z-index:1}.el-table--border::after,.el-table--group::after{top:0;right:0;width:1px;height:100%}.el-table::before{left:0;bottom:0;width:100%;height:1px}.el-table--border{border-right:none;border-bottom:none}.el-table--border.el-loading-parent--relative{border-color:transparent}.el-table--border .el-table__cell,.el-table__body-wrapper .el-table--border.is-scrolling-left~.el-table__fixed{border-right:1px solid #EBEEF5}.el-table--border .el-table__cell:first-child .cell{padding-left:10px}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:1px solid #EBEEF5;border-bottom-width:1px}.el-table--border th.el-table__cell,.el-table__fixed-right-patch{border-bottom:1px solid #EBEEF5}.el-table--hidden{visibility:hidden}.el-table__fixed,.el-table__fixed-right{position:absolute;top:0;left:0;overflow-x:hidden;overflow-y:hidden;-webkit-box-shadow:0 0 10px rgba(0,0,0,.12);box-shadow:0 0 10px rgba(0,0,0,.12)}.el-table__fixed-right::before,.el-table__fixed::before{content:'';position:absolute;left:0;bottom:0;width:100%;height:1px;background-color:#EBEEF5;z-index:4}.el-table__fixed-right-patch{position:absolute;top:-1px;right:0;background-color:#FFF}.el-table__fixed-right{top:0;left:auto;right:0}.el-table__fixed-right .el-table__fixed-body-wrapper,.el-table__fixed-right .el-table__fixed-footer-wrapper,.el-table__fixed-right .el-table__fixed-header-wrapper{left:auto;right:0}.el-table__fixed-header-wrapper{position:absolute;left:0;top:0;z-index:3}.el-table__fixed-footer-wrapper{position:absolute;left:0;bottom:0;z-index:3}.el-table__fixed-footer-wrapper tbody td.el-table__cell{border-top:1px solid #EBEEF5;background-color:#F5F7FA;color:#606266}.el-table__fixed-body-wrapper{position:absolute;left:0;top:37px;overflow:hidden;z-index:3}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__footer-wrapper{margin-top:-1px}.el-table__footer-wrapper td.el-table__cell{border-top:1px solid #EBEEF5}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td.el-table__cell,.el-table__header-wrapper tbody td.el-table__cell{background-color:#F5F7FA;color:#606266}.el-table__body-wrapper{overflow:hidden;position:relative}.el-table__body-wrapper.is-scrolling-left~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed,.el-table__body-wrapper.is-scrolling-none~.el-table__fixed-right,.el-table__body-wrapper.is-scrolling-right~.el-table__fixed-right{-webkit-box-shadow:none;box-shadow:none}.el-table__body-wrapper .el-table--border.is-scrolling-right~.el-table__fixed-right{border-left:1px solid #EBEEF5}.el-table .caret-wrapper{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:5px solid transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:#C0C4CC;top:5px}.el-table .sort-caret.descending{border-top-color:#C0C4CC;bottom:7px}.el-table .ascending .sort-caret.ascending{border-bottom-color:#409EFF}.el-table .descending .sort-caret.descending{border-top-color:#409EFF}.el-table .hidden-columns{visibility:hidden;position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:#FAFAFA}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:#ecf5ff}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell{background-color:#F5F7FA}.el-table__body tr.current-row>td.el-table__cell{background-color:#ecf5ff}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:1px solid #EBEEF5;z-index:10}.el-table__column-filter-trigger{display:inline-block;line-height:34px;cursor:pointer}.el-table__column-filter-trigger i{color:#909399;font-size:12px;-webkit-transform:scale(.75);transform:scale(.75)}.el-table--enable-row-transition .el-table__body td.el-table__cell{-webkit-transition:background-color .25s ease;transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:#F5F7FA}.el-table--fluid-height .el-table__fixed,.el-table--fluid-height .el-table__fixed-right{bottom:0;overflow:hidden}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:20px;line-height:20px;height:20px;text-align:center;margin-right:3px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:1px solid #EBEEF5;border-radius:2px;background-color:#FFF;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);box-sizing:border-box;margin:2px 0}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:14px}.el-table-filter__list-item:hover{background-color:#ecf5ff;color:#66b1ff}.el-table-filter__list-item.is-active{background-color:#409EFF;color:#FFF}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid #EBEEF5;padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:#606266;cursor:pointer;font-size:13px;padding:0 3px}.el-date-table td.in-range div,.el-date-table td.in-range div:hover,.el-date-table.is-week-mode .el-date-table__row.current div,.el-date-table.is-week-mode .el-date-table__row:hover div{background-color:#F2F6FC}.el-table-filter__bottom button:hover{color:#409EFF}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:block;margin-right:5px;margin-bottom:8px;margin-left:5px}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-date-table{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:#606266}.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}.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}.el-date-table td{width:32px;height:30px;padding:4px 0;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.el-date-table td div{height:30px;padding:3px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.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%}.el-date-table td.next-month,.el-date-table td.prev-month{color:#C0C4CC}.el-date-table td.today{position:relative}.el-date-table td.today span{color:#409EFF;font-weight:700}.el-date-table td.today.end-date span,.el-date-table td.today.start-date span{color:#FFF}.el-date-table td.available:hover{color:#409EFF}.el-date-table td.current:not(.disabled) span{color:#FFF;background-color:#409EFF}.el-date-table td.end-date div,.el-date-table td.start-date div{color:#FFF}.el-date-table td.end-date span,.el-date-table td.start-date span{background-color:#409EFF}.el-date-table td.start-date div{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date div{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled div{background-color:#F5F7FA;opacity:1;cursor:not-allowed;color:#C0C4CC}.el-date-table td.selected div{margin-left:5px;margin-right:5px;background-color:#F2F6FC;border-radius:15px}.el-date-table td.selected div:hover{background-color:#F2F6FC}.el-date-table td.selected span{background-color:#409EFF;color:#FFF;border-radius:15px}.el-date-table td.week{font-size:80%;color:#606266}.el-month-table,.el-year-table{font-size:12px;border-collapse:collapse}.el-date-table th{padding:5px;color:#606266;font-weight:400;border-bottom:solid 1px #EBEEF5}.el-month-table{margin:-1px}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-month-table td.today .cell{color:#409EFF;font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#FFF}.el-month-table td.disabled .cell{background-color:#F5F7FA;cursor:not-allowed;color:#C0C4CC}.el-month-table td.disabled .cell:hover{color:#C0C4CC}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:#606266;margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:#409EFF}.el-month-table td.in-range div,.el-month-table td.in-range div:hover{background-color:#F2F6FC}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#FFF}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#FFF;background-color:#409EFF}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:#409EFF}.el-year-table{margin:-1px}.el-year-table .el-icon{color:#303133}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:#409EFF;font-weight:700}.el-year-table td.disabled .cell{background-color:#F5F7FA;cursor:not-allowed;color:#C0C4CC}.el-year-table td.disabled .cell:hover{color:#C0C4CC}.el-year-table td .cell{width:48px;height:32px;display:block;line-height:32px;color:#606266;margin:0 auto}.el-year-table td .cell:hover,.el-year-table td.current:not(.disabled) .cell{color:#409EFF}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid #e4e4e4}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{-webkit-box-sizing:border-box;box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:#303133}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#FFF}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid #e4e4e4;font-size:12px;padding:8px 5px 5px;display:table;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px #EBEEF5}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:#606266}.el-date-picker__header-label.active,.el-date-picker__header-label:hover{color:#409EFF}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.selected:not(.disabled){color:#409EFF;font-weight:700}.time-select-item.disabled{color:#E4E7ED;cursor:not-allowed}.time-select-item:hover{background-color:#F5F7FA;font-weight:700;cursor:pointer}.el-date-editor{position:relative;display:inline-block;text-align:left}.el-date-editor.el-input,.el-date-editor.el-input__inner{width:220px}.el-date-editor--monthrange.el-input,.el-date-editor--monthrange.el-input__inner{width:300px}.el-date-editor--daterange.el-input,.el-date-editor--daterange.el-input__inner,.el-date-editor--timerange.el-input,.el-date-editor--timerange.el-input__inner{width:350px}.el-date-editor--datetimerange.el-input,.el-date-editor--datetimerange.el-input__inner{width:400px}.el-date-editor--dates .el-input__inner{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .el-icon-circle-close{cursor:pointer}.el-date-editor .el-range__icon{font-size:14px;margin-left:-5px;color:#C0C4CC;float:left;line-height:32px}.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:#606266}.el-date-editor .el-range-input::-webkit-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input:-ms-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input::-ms-input-placeholder{color:#C0C4CC}.el-date-editor .el-range-input::placeholder{color:#C0C4CC}.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:#303133}.el-date-editor .el-range__close-icon{font-size:14px;color:#C0C4CC;width:25px;display:inline-block;float:right;line-height:32px}.el-range-editor.el-input__inner{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:3px 10px}.el-range-editor .el-range-input{line-height:1}.el-range-editor--medium.el-input__inner{height:36px}.el-range-editor--medium .el-range-separator{line-height:28px;font-size:14px}.el-range-editor--medium .el-range-input{font-size:14px}.el-range-editor--medium .el-range__close-icon,.el-range-editor--medium .el-range__icon{line-height:28px}.el-range-editor--small.el-input__inner{height:32px}.el-range-editor--small .el-range-separator{line-height:24px;font-size:13px}.el-range-editor--small .el-range-input{font-size:13px}.el-range-editor--small .el-range__close-icon,.el-range-editor--small .el-range__icon{line-height:24px}.el-range-editor--mini.el-input__inner{height:28px}.el-range-editor--mini .el-range-separator{line-height:20px;font-size:12px}.el-range-editor--mini .el-range-input{font-size:12px}.el-range-editor--mini .el-range__close-icon,.el-range-editor--mini .el-range__icon{line-height:20px}.el-range-editor.is-disabled{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:#E4E7ED}.el-range-editor.is-disabled input{background-color:#F5F7FA;color:#C0C4CC;cursor:not-allowed}.el-range-editor.is-disabled input::-webkit-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input:-ms-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input::-ms-input-placeholder{color:#C0C4CC}.el-range-editor.is-disabled input::placeholder{color:#C0C4CC}.el-range-editor.is-disabled .el-range-separator{color:#C0C4CC}.el-picker-panel{color:#606266;border:1px solid #E4E7ED;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);background:#FFF;border-radius:4px;line-height:30px;margin:5px 0}.el-picker-panel__body-wrapper::after,.el-picker-panel__body::after{content:"";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid #e4e4e4;padding:4px;text-align:right;background-color:#FFF;position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:#606266;padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:#409EFF}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:#409EFF}.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}.el-picker-panel__btn[disabled]{color:#ccc;cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:#303133;border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:#409EFF}.el-picker-panel__icon-btn.is-disabled{color:#bbb}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.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}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:190px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper .el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__input.el-input .el-input__inner,.el-time-spinner__list{padding:0;text-align:center}.el-time-spinner__wrapper.is-arrow{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{-webkit-transform:translateY(-32px);transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.disabled):not(.active){background:#FFF;cursor:default}.el-time-spinner__arrow{font-size:12px;color:#909399;position:absolute;left:0;width:100%;z-index:1;text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:#409EFF}.el-time-spinner__arrow.el-icon-arrow-up{top:10px}.el-time-spinner__arrow.el-icon-arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__list{margin:0;list-style:none}.el-time-spinner__list::after,.el-time-spinner__list::before{content:'';display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:#606266}.el-time-spinner__item:hover:not(.disabled):not(.active){background:#F5F7FA;cursor:pointer}.el-time-spinner__item.active:not(.disabled){color:#303133;font-weight:700}.el-time-spinner__item.disabled{color:#C0C4CC;cursor:not-allowed}.el-time-panel{margin:5px 0;border:1px solid #E4E7ED;background-color:#FFF;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;-webkit-box-sizing:content-box;box-sizing:content-box}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content::after,.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 #E4E7ED;border-bottom:1px solid #E4E7ED}.el-time-panel__content::after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content::before{padding-left:50%;margin-right:12%;margin-left:12%}.el-time-panel__content.has-seconds::after{left:calc(100% / 3 * 2)}.el-time-panel__content.has-seconds::before{padding-left:calc(100% / 3)}.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}.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:#303133}.el-time-panel__btn.confirm{font-weight:800;color:#409EFF}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px}.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}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid #E4E7ED}.el-popover{position:absolute;background:#FFF;min-width:150px;border-radius:4px;border:1px solid #EBEEF5;padding:12px;z-index:2000;color:#606266;line-height:1.4;text-align:justify;font-size:14px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);word-break:break-all}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover,.el-cascader__dropdown,.el-color-picker__panel,.el-message-box,.el-notification{-webkit-box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-popover--plain{padding:18px 20px}.el-popover__title{color:#303133;font-size:16px;line-height:1;margin-bottom:12px}.el-popover:focus,.el-popover:focus:active,.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0}.v-modal-enter{-webkit-animation:v-modal-in .2s ease;animation:v-modal-in .2s ease}.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}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:.5;background:#000}.el-popup-parent--hidden{overflow:hidden}.el-message-box{display:inline-block;width:420px;padding-bottom:10px;vertical-align:middle;background-color:#FFF;border-radius:4px;border:1px solid #EBEEF5;font-size:18px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box__wrapper{position:fixed;top:0;bottom:0;left:0;right:0;text-align:center}.el-message-box__wrapper::after{content:"";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box__header{position:relative;padding:15px 15px 10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:18px;line-height:1;color:#303133}.el-message-box__headerbtn{position:absolute;top:15px;right:15px;padding:0;border:none;outline:0;background:0 0;font-size:16px;cursor:pointer}.el-form-item.is-error .el-input__inner,.el-form-item.is-error .el-input__inner:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus,.el-message-box__input input.invalid,.el-message-box__input input.invalid:focus{border-color:#F56C6C}.el-message-box__headerbtn .el-message-box__close{color:#909399}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:#409EFF}.el-message-box__content{padding:10px 15px;color:#606266;font-size:14px}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__status{position:absolute;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size:24px!important}.el-message-box__status::before{padding-left:1px}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px}.el-message-box__status.el-icon-success{color:#67C23A}.el-message-box__status.el-icon-info{color:#909399}.el-message-box__status.el-icon-warning{color:#E6A23C}.el-message-box__status.el-icon-error{color:#F56C6C}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:#F56C6C;font-size:12px;min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;text-align:right}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.el-message-box--center{padding-bottom:30px}.el-message-box--center .el-message-box__header{padding-top:30px}.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}.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)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns,.el-message-box--center .el-message-box__content{text-align:center}.el-message-box--center .el-message-box__content{padding-left:27px;padding-right:27px}.msgbox-fade-enter-active{-webkit-animation:msgbox-fade-in .3s;animation:msgbox-fade-in .3s}.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}}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb::after,.el-breadcrumb::before{display:table;content:""}.el-breadcrumb::after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:#C0C4CC}.el-breadcrumb__separator[class*=icon]{margin:0 6px;font-weight:400}.el-breadcrumb__item{float:left}.el-breadcrumb__inner{color:#606266}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1);color:#303133}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:#409EFF;cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:#606266;cursor:text}.el-form--label-left .el-form-item__label{text-align:left}.el-form--label-top .el-form-item__label{float:none;display:inline-block;text-align:left;padding:0 0 10px}.el-form--inline .el-form-item{display:inline-block;margin-right:10px;vertical-align:top}.el-form--inline .el-form-item__label{float:none;display:inline-block}.el-form--inline .el-form-item__content{display:inline-block;vertical-align:top}.el-form--inline.el-form--label-top .el-form-item__content{display:block}.el-form-item{margin-bottom:22px}.el-form-item::after,.el-form-item::before{display:table;content:""}.el-form-item::after{clear:both}.el-form-item .el-form-item{margin-bottom:0}.el-form-item--mini.el-form-item,.el-form-item--small.el-form-item{margin-bottom:18px}.el-form-item .el-input__validateIcon{display:none}.el-form-item--medium .el-form-item__content,.el-form-item--medium .el-form-item__label{line-height:36px}.el-form-item--small .el-form-item__content,.el-form-item--small .el-form-item__label{line-height:32px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--mini .el-form-item__content,.el-form-item--mini .el-form-item__label{line-height:28px}.el-form-item--mini .el-form-item__error{padding-top:1px}.el-form-item__label-wrap{float:left}.el-form-item__label-wrap .el-form-item__label{display:inline-block;float:none}.el-form-item__label{text-align:right;vertical-align:middle;float:left;font-size:14px;color:#606266;line-height:40px;padding:0 12px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.el-form-item__content{line-height:40px;position:relative;font-size:14px}.el-form-item__content::after,.el-form-item__content::before{display:table;content:""}.el-form-item__content::after{clear:both}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:#F56C6C;font-size:12px;line-height:1;padding-top:4px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk) .el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before{content:'*';color:#F56C6C;margin-right:4px}.el-form-item.is-error .el-input-group__append .el-input__inner,.el-form-item.is-error .el-input-group__prepend .el-input__inner{border-color:transparent}.el-form-item.is-error .el-input__validateIcon{color:#F56C6C}.el-form-item--feedback .el-input__validateIcon{display:inline-block}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:#409EFF;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}.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}.el-tabs__new-tab .el-icon-plus{-webkit-transform:scale(.8,.8);transform:scale(.8,.8)}.el-tabs__new-tab:hover{color:#409EFF}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap::after{content:"";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:#E4E7ED;z-index:1}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:#909399}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.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}.el-tabs__nav.is-stretch{min-width:100%;display:-webkit-box;display:-ms-flexbox;display:flex}.el-tabs__nav.is-stretch>*{-webkit-box-flex:1;-ms-flex:1;flex:1;text-align:center}.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:#303133;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus.is-active.is-focus:not(:active){-webkit-box-shadow:0 0 2px 2px #409EFF inset;box-shadow:0 0 2px 2px #409EFF inset;border-radius:3px}.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}.el-tabs__item .el-icon-close:before{-webkit-transform:scale(.9);transform:scale(.9);display:inline-block}.el-tabs--card>.el-tabs__header .el-tabs__active-bar,.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left,.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs__item .el-icon-close:hover{background-color:#C0C4CC;color:#FFF}.el-tabs__item.is-active{color:#409EFF}.el-tabs__item:hover{color:#409EFF;cursor:pointer}.el-tabs__item.is-disabled{color:#C0C4CC;cursor:default}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid #E4E7ED}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid #E4E7ED;border-bottom:none;border-radius:4px 4px 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}.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%}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid #E4E7ED;-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)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .el-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:#FFF}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .el-icon-close{width:14px}.el-tabs--border-card{background:#FFF;border:1px solid #DCDFE6;-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)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:#F5F7FA;border-bottom:1px solid #E4E7ED;margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap::after{content:none}.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-top:-1px;color:#909399}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-col-offset-0,.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:#409EFF;background-color:#FFF;border-right-color:#DCDFE6;border-left-color:#DCDFE6}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:#409EFF}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:#C0C4CC}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-cascader-menu:last-child .el-cascader-node,.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid #DCDFE6}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{-webkit-transform:rotateZ(90deg);transform:rotateZ(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left::after{right:0;left:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left::after,.el-tabs--left .el-tabs__nav-wrap.is-right::after,.el-tabs--right .el-tabs__nav-wrap.is-left::after,.el-tabs--right .el-tabs__nav-wrap.is-right::after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-button-group>.el-button:not(:last-child),.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid #E4E7ED;border-bottom:none;border-top:1px solid #E4E7ED;text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid #E4E7ED;border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid #E4E7ED;border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid #E4E7ED;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid #dfe4ed}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:#d1dbe5 transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right::after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid #E4E7ED}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid #E4E7ED;border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid #E4E7ED;border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid #E4E7ED;border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid #dfe4ed}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:#d1dbe5 transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter .3s;animation:slideInRight-enter .3s}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave .3s;animation:slideInRight-leave .3s}.slideInLeft-enter{-webkit-animation:slideInLeft-enter .3s;animation:slideInLeft-enter .3s}.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}}.el-tree{position:relative;cursor:default;background:#FFF;color:#606266}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);color:#909399;font-size:14px}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:#409EFF}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:#F5F7FA}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:#409EFF;color:#fff}.el-tree-node__content:hover,.el-upload-list__item:hover{background-color:#F5F7FA}.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}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:#C0C4CC;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}.el-tree-node__expand-icon.expanded{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__label{font-size:14px}.el-tree-node__loading-icon{margin-right:8px;font-size:14px;color:#C0C4CC}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:#f0f7ff}.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}.el-alert.is-light .el-alert__closebtn{color:#C0C4CC}.el-alert.is-dark .el-alert__closebtn,.el-alert.is-dark .el-alert__description{color:#FFF}.el-alert.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-alert--success.is-light{background-color:#f0f9eb;color:#67C23A}.el-alert--success.is-light .el-alert__description{color:#67C23A}.el-alert--success.is-dark{background-color:#67C23A;color:#FFF}.el-alert--info.is-light{background-color:#f4f4f5;color:#909399}.el-alert--info.is-dark{background-color:#909399;color:#FFF}.el-alert--info .el-alert__description{color:#909399}.el-alert--warning.is-light{background-color:#fdf6ec;color:#E6A23C}.el-alert--warning.is-light .el-alert__description{color:#E6A23C}.el-alert--warning.is-dark{background-color:#E6A23C;color:#FFF}.el-alert--error.is-light{background-color:#fef0f0;color:#F56C6C}.el-alert--error.is-light .el-alert__description{color:#F56C6C}.el-alert--error.is-dark{background-color:#F56C6C;color:#FFF}.el-alert__content{display:table-cell;padding:0 8px}.el-alert__icon{font-size:16px;width:16px}.el-alert__icon.is-big{font-size:28px;width:28px}.el-alert__title{font-size:13px;line-height:18px}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:12px;margin:5px 0 0}.el-alert__closebtn{font-size:12px;opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert-fade-enter,.el-alert-fade-leave-active,.el-loading-fade-enter,.el-loading-fade-leave-active,.el-notification-fade-leave-active,.el-upload iframe{opacity:0}.el-carousel__arrow--right,.el-notification.right{right:16px}.el-alert__closebtn.is-customed{font-style:normal;font-size:13px;top:9px}.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 #EBEEF5;position:fixed;background-color:#FFF;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}.el-notification.left{left:16px}.el-notification__group{margin-left:13px;margin-right:8px}.el-notification__title{font-weight:700;font-size:16px;color:#303133;margin:0}.el-notification__content{font-size:14px;line-height:21px;margin:6px 0 0;color:#606266;text-align:justify}.el-notification__content p{margin:0}.el-notification__icon{height:24px;width:24px;font-size:24px}.el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:#909399;font-size:16px}.el-notification__closeBtn:hover{color:#606266}.el-notification .el-icon-success{color:#67C23A}.el-notification .el-icon-error{color:#F56C6C}.el-notification .el-icon-info{color:#909399}.el-notification .el-icon-warning{color:#E6A23C}.el-notification-fade-enter.right{right:0;-webkit-transform:translateX(100%);transform:translateX(100%)}.el-notification-fade-enter.left{left:0;-webkit-transform:translateX(-100%);transform:translateX(-100%)}.el-input-number{position:relative;display:inline-block;width:180px;line-height:38px}.el-input-number .el-input{display:block}.el-input-number .el-input__inner{-webkit-appearance:none;padding-left:50px;padding-right:50px;text-align:center}.el-input-number__decrease,.el-input-number__increase{position:absolute;z-index:1;top:1px;width:40px;height:auto;text-align:center;background:#F5F7FA;color:#606266;cursor:pointer;font-size:13px}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:#409EFF}.el-input-number__decrease:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled),.el-input-number__increase:hover:not(.is-disabled)~.el-input .el-input__inner:not(.is-disabled){border-color:#409EFF}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 4px 4px 0;border-left:1px solid #DCDFE6}.el-input-number__decrease{left:1px;border-radius:4px 0 0 4px;border-right:1px solid #DCDFE6}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:#E4E7ED;color:#E4E7ED}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:#E4E7ED;cursor:not-allowed}.el-input-number--medium{width:200px;line-height:34px}.el-input-number--medium .el-input-number__decrease,.el-input-number--medium .el-input-number__increase{width:36px;font-size:14px}.el-input-number--medium .el-input__inner{padding-left:43px;padding-right:43px}.el-input-number--small{width:130px;line-height:30px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:32px;font-size:13px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.9);transform:scale(.9)}.el-input-number--small .el-input__inner{padding-left:39px;padding-right:39px}.el-input-number--mini{width:130px;line-height:26px}.el-input-number--mini .el-input-number__decrease,.el-input-number--mini .el-input-number__increase{width:28px;font-size:12px}.el-input-number--mini .el-input-number__decrease [class*=el-icon],.el-input-number--mini .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number--mini .el-input__inner{padding-left:35px;padding-right:35px}.el-input-number.is-without-controls .el-input__inner{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__inner{padding-left:15px;padding-right:50px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{height:auto;line-height:19px}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{-webkit-transform:scale(.8);transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-radius:0 4px 0 0;border-bottom:1px solid #DCDFE6}.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 #DCDFE6;border-radius:0 0 4px}.el-input-number.is-controls-right[class*=medium] [class*=decrease],.el-input-number.is-controls-right[class*=medium] [class*=increase]{line-height:17px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{line-height:15px}.el-input-number.is-controls-right[class*=mini] [class*=decrease],.el-input-number.is-controls-right[class*=mini] [class*=increase]{line-height:13px}.el-tooltip:focus:hover,.el-tooltip:focus:not(.focusing){outline-width:0}.el-tooltip__popper{position:absolute;border-radius:4px;padding:10px;z-index:2000;font-size:12px;line-height:1.2;min-width:10px;word-wrap:break-word}.el-tooltip__popper .popper__arrow,.el-tooltip__popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-tooltip__popper .popper__arrow{border-width:6px}.el-tooltip__popper .popper__arrow::after{content:" ";border-width:5px}.el-button-group::after,.el-button-group::before,.el-color-dropdown__main-wrapper::after,.el-link.is-underline:hover:after,.el-page-header__left::after,.el-progress-bar__inner::after,.el-row::after,.el-row::before,.el-slider::after,.el-slider::before,.el-slider__button-wrapper::after,.el-transfer-panel .el-transfer-panel__footer::after,.el-upload-cover::after,.el-upload-list--picture-card .el-upload-list__item-actions::after{content:""}.el-tooltip__popper[x-placement^=top]{margin-bottom:12px}.el-tooltip__popper[x-placement^=top] .popper__arrow{bottom:-6px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-5px;border-top-color:#303133;border-bottom-width:0}.el-tooltip__popper[x-placement^=bottom]{margin-top:12px}.el-tooltip__popper[x-placement^=bottom] .popper__arrow{top:-6px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-5px;border-top-width:0;border-bottom-color:#303133}.el-tooltip__popper[x-placement^=right]{margin-left:12px}.el-tooltip__popper[x-placement^=right] .popper__arrow{left:-6px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=right] .popper__arrow::after{bottom:-5px;left:1px;border-right-color:#303133;border-left-width:0}.el-tooltip__popper[x-placement^=left]{margin-right:12px}.el-tooltip__popper[x-placement^=left] .popper__arrow{right:-6px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-5px;margin-left:-5px;border-right-width:0;border-left-color:#303133}.el-tooltip__popper.is-dark{background:#303133;color:#FFF}.el-tooltip__popper.is-light{background:#FFF;border:1px solid #303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow{border-top-color:#303133}.el-tooltip__popper.is-light[x-placement^=top] .popper__arrow::after{border-top-color:#FFF}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow{border-bottom-color:#303133}.el-tooltip__popper.is-light[x-placement^=bottom] .popper__arrow::after{border-bottom-color:#FFF}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow{border-left-color:#303133}.el-tooltip__popper.is-light[x-placement^=left] .popper__arrow::after{border-left-color:#FFF}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow{border-right-color:#303133}.el-tooltip__popper.is-light[x-placement^=right] .popper__arrow::after{border-right-color:#FFF}.el-slider::after,.el-slider::before{display:table}.el-slider__button-wrapper .el-tooltip,.el-slider__button-wrapper::after{display:inline-block;vertical-align:middle}.el-slider::after{clear:both}.el-slider__runway{width:100%;height:6px;margin:16px 0;background-color:#E4E7ED;border-radius:3px;position:relative;cursor:pointer;vertical-align:middle}.el-slider__runway.show-input{margin-right:160px;width:auto}.el-slider__runway.disabled{cursor:default}.el-slider__runway.disabled .el-slider__bar{background-color:#C0C4CC}.el-slider__runway.disabled .el-slider__button{border-color:#C0C4CC}.el-slider__runway.disabled .el-slider__button-wrapper.dragging,.el-slider__runway.disabled .el-slider__button-wrapper.hover,.el-slider__runway.disabled .el-slider__button-wrapper:hover{cursor:not-allowed}.el-slider__runway.disabled .el-slider__button.dragging,.el-slider__runway.disabled .el-slider__button.hover,.el-slider__runway.disabled .el-slider__button:hover{-webkit-transform:scale(1);transform:scale(1);cursor:not-allowed}.el-slider__button-wrapper,.el-slider__stop{-webkit-transform:translateX(-50%);position:absolute}.el-slider__input{float:right;margin-top:3px;width:130px}.el-slider__input.el-input-number--mini{margin-top:5px}.el-slider__input.el-input-number--medium{margin-top:0}.el-slider__input.el-input-number--large{margin-top:-2px}.el-slider__bar{height:6px;background-color:#409EFF;border-top-left-radius:3px;border-bottom-left-radius:3px;position:absolute}.el-slider__button-wrapper{height:36px;width:36px;z-index:1001;top:-15px;transform:translateX(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:normal}.el-image-viewer__btn,.el-slider__button,.el-step__icon-inner{-moz-user-select:none;-ms-user-select:none}.el-slider__button-wrapper::after{height:100%}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{width:16px;height:16px;border:2px solid #409EFF;background-color:#FFF;border-radius:50%;-webkit-transition:.2s;transition:.2s;-webkit-user-select:none;user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{height:6px;width:6px;border-radius:100%;background-color:#FFF;transform:translateX(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;-webkit-transform:translateX(-50%);transform:translateX(-50%);font-size:14px;color:#909399;margin-top:15px}.el-slider.is-vertical{position:relative}.el-slider.is-vertical .el-slider__runway{width:6px;height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:6px;height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:-15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{-webkit-transform:translateY(50%);transform:translateY(50%)}.el-slider.is-vertical.el-slider--with-input{padding-bottom:58px}.el-slider.is-vertical.el-slider--with-input .el-slider__input{overflow:visible;float:none;position:absolute;bottom:22px;width:36px;margin-top:15px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input__inner{text-align:center;padding-left:5px;padding-right:5px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{top:32px;margin-top:-1px;border:1px solid #DCDFE6;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)}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__decrease{width:18px;right:18px;border-bottom-left-radius:4px}.el-slider.is-vertical.el-slider--with-input .el-slider__input .el-input-number__increase{width:19px;border-bottom-right-radius:4px}.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}.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:hover .el-input-number__increase{border-color:#C0C4CC}.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__decrease,.el-slider.is-vertical.el-slider--with-input .el-slider__input:active .el-input-number__increase{border-color:#409EFF}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;-webkit-transform:translateY(50%);transform:translateY(50%)}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:rgba(255,255,255,.9);margin:0;top:0;right:0;bottom:0;left:0;-webkit-transition:opacity .3s;transition:opacity .3s}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:-25px}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:50px;width:50px}.el-loading-spinner{top:50%;margin-top:-21px;width:100%;text-align:center;position:absolute}.el-col-pull-0,.el-col-pull-1,.el-col-pull-10,.el-col-pull-11,.el-col-pull-12,.el-col-pull-13,.el-col-pull-14,.el-col-pull-15,.el-col-pull-16,.el-col-pull-17,.el-col-pull-18,.el-col-pull-19,.el-col-pull-2,.el-col-pull-20,.el-col-pull-21,.el-col-pull-22,.el-col-pull-23,.el-col-pull-24,.el-col-pull-3,.el-col-pull-4,.el-col-pull-5,.el-col-pull-6,.el-col-pull-7,.el-col-pull-8,.el-col-pull-9,.el-col-push-0,.el-col-push-1,.el-col-push-10,.el-col-push-11,.el-col-push-12,.el-col-push-13,.el-col-push-14,.el-col-push-15,.el-col-push-16,.el-col-push-17,.el-col-push-18,.el-col-push-19,.el-col-push-2,.el-col-push-20,.el-col-push-21,.el-col-push-22,.el-col-push-23,.el-col-push-24,.el-col-push-3,.el-col-push-4,.el-col-push-5,.el-col-push-6,.el-col-push-7,.el-col-push-8,.el-col-push-9,.el-row,.el-upload-dragger,.el-upload-list__item{position:relative}.el-loading-spinner .el-loading-text{color:#409EFF;margin:3px 0;font-size:14px}.el-loading-spinner .circular{height:42px;width:42px;-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.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:#409EFF;stroke-linecap:round}.el-loading-spinner i{color:#409EFF}@-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}}.el-row{-webkit-box-sizing:border-box;box-sizing:border-box}.el-row::after,.el-row::before{display:table}.el-row::after{clear:both}.el-row--flex{display:-webkit-box;display:-ms-flexbox;display:flex}.el-col-0,.el-row--flex:after,.el-row--flex:before{display:none}.el-row--flex.is-justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-row--flex.is-justify-end{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.el-row--flex.is-justify-space-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.el-row--flex.is-justify-space-around{-ms-flex-pack:distribute;justify-content:space-around}.el-row--flex.is-align-top{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.el-row--flex.is-align-middle{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-row--flex.is-align-bottom{-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}[class*=el-col-]{float:left;-webkit-box-sizing:border-box;box-sizing:border-box}.el-col-0{width:0%}.el-col-pull-0{right:0}.el-col-push-0{left:0}.el-col-1{width:4.16667%}.el-col-offset-1{margin-left:4.16667%}.el-col-pull-1{right:4.16667%}.el-col-push-1{left:4.16667%}.el-col-2{width:8.33333%}.el-col-offset-2{margin-left:8.33333%}.el-col-pull-2{right:8.33333%}.el-col-push-2{left:8.33333%}.el-col-3{width:12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{right:12.5%}.el-col-push-3{left:12.5%}.el-col-4{width:16.66667%}.el-col-offset-4{margin-left:16.66667%}.el-col-pull-4{right:16.66667%}.el-col-push-4{left:16.66667%}.el-col-5{width:20.83333%}.el-col-offset-5{margin-left:20.83333%}.el-col-pull-5{right:20.83333%}.el-col-push-5{left:20.83333%}.el-col-6{width:25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{right:25%}.el-col-push-6{left:25%}.el-col-7{width:29.16667%}.el-col-offset-7{margin-left:29.16667%}.el-col-pull-7{right:29.16667%}.el-col-push-7{left:29.16667%}.el-col-8{width:33.33333%}.el-col-offset-8{margin-left:33.33333%}.el-col-pull-8{right:33.33333%}.el-col-push-8{left:33.33333%}.el-col-9{width:37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{right:37.5%}.el-col-push-9{left:37.5%}.el-col-10{width:41.66667%}.el-col-offset-10{margin-left:41.66667%}.el-col-pull-10{right:41.66667%}.el-col-push-10{left:41.66667%}.el-col-11{width:45.83333%}.el-col-offset-11{margin-left:45.83333%}.el-col-pull-11{right:45.83333%}.el-col-push-11{left:45.83333%}.el-col-12{width:50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{right:50%}.el-col-push-12{left:50%}.el-col-13{width:54.16667%}.el-col-offset-13{margin-left:54.16667%}.el-col-pull-13{right:54.16667%}.el-col-push-13{left:54.16667%}.el-col-14{width:58.33333%}.el-col-offset-14{margin-left:58.33333%}.el-col-pull-14{right:58.33333%}.el-col-push-14{left:58.33333%}.el-col-15{width:62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{right:62.5%}.el-col-push-15{left:62.5%}.el-col-16{width:66.66667%}.el-col-offset-16{margin-left:66.66667%}.el-col-pull-16{right:66.66667%}.el-col-push-16{left:66.66667%}.el-col-17{width:70.83333%}.el-col-offset-17{margin-left:70.83333%}.el-col-pull-17{right:70.83333%}.el-col-push-17{left:70.83333%}.el-col-18{width:75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{right:75%}.el-col-push-18{left:75%}.el-col-19{width:79.16667%}.el-col-offset-19{margin-left:79.16667%}.el-col-pull-19{right:79.16667%}.el-col-push-19{left:79.16667%}.el-col-20{width:83.33333%}.el-col-offset-20{margin-left:83.33333%}.el-col-pull-20{right:83.33333%}.el-col-push-20{left:83.33333%}.el-col-21{width:87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{right:87.5%}.el-col-push-21{left:87.5%}.el-col-22{width:91.66667%}.el-col-offset-22{margin-left:91.66667%}.el-col-pull-22{right:91.66667%}.el-col-push-22{left:91.66667%}.el-col-23{width:95.83333%}.el-col-offset-23{margin-left:95.83333%}.el-col-pull-23{right:95.83333%}.el-col-push-23{left:95.83333%}.el-col-24{width:100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{right:100%}.el-col-push-24{left:100%}@media only screen and (max-width:767px){.el-col-xs-0{display:none;width:0%}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{width:4.16667%}.el-col-xs-offset-1{margin-left:4.16667%}.el-col-xs-pull-1{position:relative;right:4.16667%}.el-col-xs-push-1{position:relative;left:4.16667%}.el-col-xs-2{width:8.33333%}.el-col-xs-offset-2{margin-left:8.33333%}.el-col-xs-pull-2{position:relative;right:8.33333%}.el-col-xs-push-2{position:relative;left:8.33333%}.el-col-xs-3{width:12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{width:16.66667%}.el-col-xs-offset-4{margin-left:16.66667%}.el-col-xs-pull-4{position:relative;right:16.66667%}.el-col-xs-push-4{position:relative;left:16.66667%}.el-col-xs-5{width:20.83333%}.el-col-xs-offset-5{margin-left:20.83333%}.el-col-xs-pull-5{position:relative;right:20.83333%}.el-col-xs-push-5{position:relative;left:20.83333%}.el-col-xs-6{width:25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{width:29.16667%}.el-col-xs-offset-7{margin-left:29.16667%}.el-col-xs-pull-7{position:relative;right:29.16667%}.el-col-xs-push-7{position:relative;left:29.16667%}.el-col-xs-8{width:33.33333%}.el-col-xs-offset-8{margin-left:33.33333%}.el-col-xs-pull-8{position:relative;right:33.33333%}.el-col-xs-push-8{position:relative;left:33.33333%}.el-col-xs-9{width:37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{width:41.66667%}.el-col-xs-offset-10{margin-left:41.66667%}.el-col-xs-pull-10{position:relative;right:41.66667%}.el-col-xs-push-10{position:relative;left:41.66667%}.el-col-xs-11{width:45.83333%}.el-col-xs-offset-11{margin-left:45.83333%}.el-col-xs-pull-11{position:relative;right:45.83333%}.el-col-xs-push-11{position:relative;left:45.83333%}.el-col-xs-12{width:50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{width:54.16667%}.el-col-xs-offset-13{margin-left:54.16667%}.el-col-xs-pull-13{position:relative;right:54.16667%}.el-col-xs-push-13{position:relative;left:54.16667%}.el-col-xs-14{width:58.33333%}.el-col-xs-offset-14{margin-left:58.33333%}.el-col-xs-pull-14{position:relative;right:58.33333%}.el-col-xs-push-14{position:relative;left:58.33333%}.el-col-xs-15{width:62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{width:66.66667%}.el-col-xs-offset-16{margin-left:66.66667%}.el-col-xs-pull-16{position:relative;right:66.66667%}.el-col-xs-push-16{position:relative;left:66.66667%}.el-col-xs-17{width:70.83333%}.el-col-xs-offset-17{margin-left:70.83333%}.el-col-xs-pull-17{position:relative;right:70.83333%}.el-col-xs-push-17{position:relative;left:70.83333%}.el-col-xs-18{width:75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{width:79.16667%}.el-col-xs-offset-19{margin-left:79.16667%}.el-col-xs-pull-19{position:relative;right:79.16667%}.el-col-xs-push-19{position:relative;left:79.16667%}.el-col-xs-20{width:83.33333%}.el-col-xs-offset-20{margin-left:83.33333%}.el-col-xs-pull-20{position:relative;right:83.33333%}.el-col-xs-push-20{position:relative;left:83.33333%}.el-col-xs-21{width:87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{width:91.66667%}.el-col-xs-offset-22{margin-left:91.66667%}.el-col-xs-pull-22{position:relative;right:91.66667%}.el-col-xs-push-22{position:relative;left:91.66667%}.el-col-xs-23{width:95.83333%}.el-col-xs-offset-23{margin-left:95.83333%}.el-col-xs-pull-23{position:relative;right:95.83333%}.el-col-xs-push-23{position:relative;left:95.83333%}.el-col-xs-24{width:100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0{display:none;width:0%}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{width:4.16667%}.el-col-sm-offset-1{margin-left:4.16667%}.el-col-sm-pull-1{position:relative;right:4.16667%}.el-col-sm-push-1{position:relative;left:4.16667%}.el-col-sm-2{width:8.33333%}.el-col-sm-offset-2{margin-left:8.33333%}.el-col-sm-pull-2{position:relative;right:8.33333%}.el-col-sm-push-2{position:relative;left:8.33333%}.el-col-sm-3{width:12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{width:16.66667%}.el-col-sm-offset-4{margin-left:16.66667%}.el-col-sm-pull-4{position:relative;right:16.66667%}.el-col-sm-push-4{position:relative;left:16.66667%}.el-col-sm-5{width:20.83333%}.el-col-sm-offset-5{margin-left:20.83333%}.el-col-sm-pull-5{position:relative;right:20.83333%}.el-col-sm-push-5{position:relative;left:20.83333%}.el-col-sm-6{width:25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{width:29.16667%}.el-col-sm-offset-7{margin-left:29.16667%}.el-col-sm-pull-7{position:relative;right:29.16667%}.el-col-sm-push-7{position:relative;left:29.16667%}.el-col-sm-8{width:33.33333%}.el-col-sm-offset-8{margin-left:33.33333%}.el-col-sm-pull-8{position:relative;right:33.33333%}.el-col-sm-push-8{position:relative;left:33.33333%}.el-col-sm-9{width:37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{width:41.66667%}.el-col-sm-offset-10{margin-left:41.66667%}.el-col-sm-pull-10{position:relative;right:41.66667%}.el-col-sm-push-10{position:relative;left:41.66667%}.el-col-sm-11{width:45.83333%}.el-col-sm-offset-11{margin-left:45.83333%}.el-col-sm-pull-11{position:relative;right:45.83333%}.el-col-sm-push-11{position:relative;left:45.83333%}.el-col-sm-12{width:50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{width:54.16667%}.el-col-sm-offset-13{margin-left:54.16667%}.el-col-sm-pull-13{position:relative;right:54.16667%}.el-col-sm-push-13{position:relative;left:54.16667%}.el-col-sm-14{width:58.33333%}.el-col-sm-offset-14{margin-left:58.33333%}.el-col-sm-pull-14{position:relative;right:58.33333%}.el-col-sm-push-14{position:relative;left:58.33333%}.el-col-sm-15{width:62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{width:66.66667%}.el-col-sm-offset-16{margin-left:66.66667%}.el-col-sm-pull-16{position:relative;right:66.66667%}.el-col-sm-push-16{position:relative;left:66.66667%}.el-col-sm-17{width:70.83333%}.el-col-sm-offset-17{margin-left:70.83333%}.el-col-sm-pull-17{position:relative;right:70.83333%}.el-col-sm-push-17{position:relative;left:70.83333%}.el-col-sm-18{width:75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{width:79.16667%}.el-col-sm-offset-19{margin-left:79.16667%}.el-col-sm-pull-19{position:relative;right:79.16667%}.el-col-sm-push-19{position:relative;left:79.16667%}.el-col-sm-20{width:83.33333%}.el-col-sm-offset-20{margin-left:83.33333%}.el-col-sm-pull-20{position:relative;right:83.33333%}.el-col-sm-push-20{position:relative;left:83.33333%}.el-col-sm-21{width:87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{width:91.66667%}.el-col-sm-offset-22{margin-left:91.66667%}.el-col-sm-pull-22{position:relative;right:91.66667%}.el-col-sm-push-22{position:relative;left:91.66667%}.el-col-sm-23{width:95.83333%}.el-col-sm-offset-23{margin-left:95.83333%}.el-col-sm-pull-23{position:relative;right:95.83333%}.el-col-sm-push-23{position:relative;left:95.83333%}.el-col-sm-24{width:100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0{display:none;width:0%}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{width:4.16667%}.el-col-md-offset-1{margin-left:4.16667%}.el-col-md-pull-1{position:relative;right:4.16667%}.el-col-md-push-1{position:relative;left:4.16667%}.el-col-md-2{width:8.33333%}.el-col-md-offset-2{margin-left:8.33333%}.el-col-md-pull-2{position:relative;right:8.33333%}.el-col-md-push-2{position:relative;left:8.33333%}.el-col-md-3{width:12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{width:16.66667%}.el-col-md-offset-4{margin-left:16.66667%}.el-col-md-pull-4{position:relative;right:16.66667%}.el-col-md-push-4{position:relative;left:16.66667%}.el-col-md-5{width:20.83333%}.el-col-md-offset-5{margin-left:20.83333%}.el-col-md-pull-5{position:relative;right:20.83333%}.el-col-md-push-5{position:relative;left:20.83333%}.el-col-md-6{width:25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{width:29.16667%}.el-col-md-offset-7{margin-left:29.16667%}.el-col-md-pull-7{position:relative;right:29.16667%}.el-col-md-push-7{position:relative;left:29.16667%}.el-col-md-8{width:33.33333%}.el-col-md-offset-8{margin-left:33.33333%}.el-col-md-pull-8{position:relative;right:33.33333%}.el-col-md-push-8{position:relative;left:33.33333%}.el-col-md-9{width:37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{width:41.66667%}.el-col-md-offset-10{margin-left:41.66667%}.el-col-md-pull-10{position:relative;right:41.66667%}.el-col-md-push-10{position:relative;left:41.66667%}.el-col-md-11{width:45.83333%}.el-col-md-offset-11{margin-left:45.83333%}.el-col-md-pull-11{position:relative;right:45.83333%}.el-col-md-push-11{position:relative;left:45.83333%}.el-col-md-12{width:50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{width:54.16667%}.el-col-md-offset-13{margin-left:54.16667%}.el-col-md-pull-13{position:relative;right:54.16667%}.el-col-md-push-13{position:relative;left:54.16667%}.el-col-md-14{width:58.33333%}.el-col-md-offset-14{margin-left:58.33333%}.el-col-md-pull-14{position:relative;right:58.33333%}.el-col-md-push-14{position:relative;left:58.33333%}.el-col-md-15{width:62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{width:66.66667%}.el-col-md-offset-16{margin-left:66.66667%}.el-col-md-pull-16{position:relative;right:66.66667%}.el-col-md-push-16{position:relative;left:66.66667%}.el-col-md-17{width:70.83333%}.el-col-md-offset-17{margin-left:70.83333%}.el-col-md-pull-17{position:relative;right:70.83333%}.el-col-md-push-17{position:relative;left:70.83333%}.el-col-md-18{width:75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{width:79.16667%}.el-col-md-offset-19{margin-left:79.16667%}.el-col-md-pull-19{position:relative;right:79.16667%}.el-col-md-push-19{position:relative;left:79.16667%}.el-col-md-20{width:83.33333%}.el-col-md-offset-20{margin-left:83.33333%}.el-col-md-pull-20{position:relative;right:83.33333%}.el-col-md-push-20{position:relative;left:83.33333%}.el-col-md-21{width:87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{width:91.66667%}.el-col-md-offset-22{margin-left:91.66667%}.el-col-md-pull-22{position:relative;right:91.66667%}.el-col-md-push-22{position:relative;left:91.66667%}.el-col-md-23{width:95.83333%}.el-col-md-offset-23{margin-left:95.83333%}.el-col-md-pull-23{position:relative;right:95.83333%}.el-col-md-push-23{position:relative;left:95.83333%}.el-col-md-24{width:100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0{display:none;width:0%}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{width:4.16667%}.el-col-lg-offset-1{margin-left:4.16667%}.el-col-lg-pull-1{position:relative;right:4.16667%}.el-col-lg-push-1{position:relative;left:4.16667%}.el-col-lg-2{width:8.33333%}.el-col-lg-offset-2{margin-left:8.33333%}.el-col-lg-pull-2{position:relative;right:8.33333%}.el-col-lg-push-2{position:relative;left:8.33333%}.el-col-lg-3{width:12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{width:16.66667%}.el-col-lg-offset-4{margin-left:16.66667%}.el-col-lg-pull-4{position:relative;right:16.66667%}.el-col-lg-push-4{position:relative;left:16.66667%}.el-col-lg-5{width:20.83333%}.el-col-lg-offset-5{margin-left:20.83333%}.el-col-lg-pull-5{position:relative;right:20.83333%}.el-col-lg-push-5{position:relative;left:20.83333%}.el-col-lg-6{width:25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{width:29.16667%}.el-col-lg-offset-7{margin-left:29.16667%}.el-col-lg-pull-7{position:relative;right:29.16667%}.el-col-lg-push-7{position:relative;left:29.16667%}.el-col-lg-8{width:33.33333%}.el-col-lg-offset-8{margin-left:33.33333%}.el-col-lg-pull-8{position:relative;right:33.33333%}.el-col-lg-push-8{position:relative;left:33.33333%}.el-col-lg-9{width:37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{width:41.66667%}.el-col-lg-offset-10{margin-left:41.66667%}.el-col-lg-pull-10{position:relative;right:41.66667%}.el-col-lg-push-10{position:relative;left:41.66667%}.el-col-lg-11{width:45.83333%}.el-col-lg-offset-11{margin-left:45.83333%}.el-col-lg-pull-11{position:relative;right:45.83333%}.el-col-lg-push-11{position:relative;left:45.83333%}.el-col-lg-12{width:50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{width:54.16667%}.el-col-lg-offset-13{margin-left:54.16667%}.el-col-lg-pull-13{position:relative;right:54.16667%}.el-col-lg-push-13{position:relative;left:54.16667%}.el-col-lg-14{width:58.33333%}.el-col-lg-offset-14{margin-left:58.33333%}.el-col-lg-pull-14{position:relative;right:58.33333%}.el-col-lg-push-14{position:relative;left:58.33333%}.el-col-lg-15{width:62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{width:66.66667%}.el-col-lg-offset-16{margin-left:66.66667%}.el-col-lg-pull-16{position:relative;right:66.66667%}.el-col-lg-push-16{position:relative;left:66.66667%}.el-col-lg-17{width:70.83333%}.el-col-lg-offset-17{margin-left:70.83333%}.el-col-lg-pull-17{position:relative;right:70.83333%}.el-col-lg-push-17{position:relative;left:70.83333%}.el-col-lg-18{width:75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{width:79.16667%}.el-col-lg-offset-19{margin-left:79.16667%}.el-col-lg-pull-19{position:relative;right:79.16667%}.el-col-lg-push-19{position:relative;left:79.16667%}.el-col-lg-20{width:83.33333%}.el-col-lg-offset-20{margin-left:83.33333%}.el-col-lg-pull-20{position:relative;right:83.33333%}.el-col-lg-push-20{position:relative;left:83.33333%}.el-col-lg-21{width:87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{width:91.66667%}.el-col-lg-offset-22{margin-left:91.66667%}.el-col-lg-pull-22{position:relative;right:91.66667%}.el-col-lg-push-22{position:relative;left:91.66667%}.el-col-lg-23{width:95.83333%}.el-col-lg-offset-23{margin-left:95.83333%}.el-col-lg-pull-23{position:relative;right:95.83333%}.el-col-lg-push-23{position:relative;left:95.83333%}.el-col-lg-24{width:100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0{display:none;width:0%}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{width:4.16667%}.el-col-xl-offset-1{margin-left:4.16667%}.el-col-xl-pull-1{position:relative;right:4.16667%}.el-col-xl-push-1{position:relative;left:4.16667%}.el-col-xl-2{width:8.33333%}.el-col-xl-offset-2{margin-left:8.33333%}.el-col-xl-pull-2{position:relative;right:8.33333%}.el-col-xl-push-2{position:relative;left:8.33333%}.el-col-xl-3{width:12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{width:16.66667%}.el-col-xl-offset-4{margin-left:16.66667%}.el-col-xl-pull-4{position:relative;right:16.66667%}.el-col-xl-push-4{position:relative;left:16.66667%}.el-col-xl-5{width:20.83333%}.el-col-xl-offset-5{margin-left:20.83333%}.el-col-xl-pull-5{position:relative;right:20.83333%}.el-col-xl-push-5{position:relative;left:20.83333%}.el-col-xl-6{width:25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{width:29.16667%}.el-col-xl-offset-7{margin-left:29.16667%}.el-col-xl-pull-7{position:relative;right:29.16667%}.el-col-xl-push-7{position:relative;left:29.16667%}.el-col-xl-8{width:33.33333%}.el-col-xl-offset-8{margin-left:33.33333%}.el-col-xl-pull-8{position:relative;right:33.33333%}.el-col-xl-push-8{position:relative;left:33.33333%}.el-col-xl-9{width:37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{width:41.66667%}.el-col-xl-offset-10{margin-left:41.66667%}.el-col-xl-pull-10{position:relative;right:41.66667%}.el-col-xl-push-10{position:relative;left:41.66667%}.el-col-xl-11{width:45.83333%}.el-col-xl-offset-11{margin-left:45.83333%}.el-col-xl-pull-11{position:relative;right:45.83333%}.el-col-xl-push-11{position:relative;left:45.83333%}.el-col-xl-12{width:50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{width:54.16667%}.el-col-xl-offset-13{margin-left:54.16667%}.el-col-xl-pull-13{position:relative;right:54.16667%}.el-col-xl-push-13{position:relative;left:54.16667%}.el-col-xl-14{width:58.33333%}.el-col-xl-offset-14{margin-left:58.33333%}.el-col-xl-pull-14{position:relative;right:58.33333%}.el-col-xl-push-14{position:relative;left:58.33333%}.el-col-xl-15{width:62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{width:66.66667%}.el-col-xl-offset-16{margin-left:66.66667%}.el-col-xl-pull-16{position:relative;right:66.66667%}.el-col-xl-push-16{position:relative;left:66.66667%}.el-col-xl-17{width:70.83333%}.el-col-xl-offset-17{margin-left:70.83333%}.el-col-xl-pull-17{position:relative;right:70.83333%}.el-col-xl-push-17{position:relative;left:70.83333%}.el-col-xl-18{width:75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{width:79.16667%}.el-col-xl-offset-19{margin-left:79.16667%}.el-col-xl-pull-19{position:relative;right:79.16667%}.el-col-xl-push-19{position:relative;left:79.16667%}.el-col-xl-20{width:83.33333%}.el-col-xl-offset-20{margin-left:83.33333%}.el-col-xl-pull-20{position:relative;right:83.33333%}.el-col-xl-push-20{position:relative;left:83.33333%}.el-col-xl-21{width:87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{width:91.66667%}.el-col-xl-offset-22{margin-left:91.66667%}.el-col-xl-pull-22{position:relative;right:91.66667%}.el-col-xl-push-22{position:relative;left:91.66667%}.el-col-xl-23{width:95.83333%}.el-col-xl-offset-23{margin-left:95.83333%}.el-col-xl-pull-23{position:relative;right:95.83333%}.el-col-xl-push-23{position:relative;left:95.83333%}.el-col-xl-24{width:100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}@-webkit-keyframes progress{0%{background-position:0 0}100%{background-position:32px 0}}.el-upload{display:inline-block;text-align:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:#606266;margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;filter:alpha(opacity=0)}.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}.el-upload--picture-card i{font-size:28px;color:#8c939d}.el-upload--picture-card:hover,.el-upload:focus{border-color:#409EFF;color:#409EFF}.el-upload:focus .el-upload-dragger{border-color:#409EFF}.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;overflow:hidden}.el-upload-dragger .el-icon-upload{font-size:67px;color:#C0C4CC;margin:40px 0 16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:1px solid #DCDFE6;margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:#606266;font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:#409EFF;font-style:normal}.el-upload-dragger:hover{border-color:#409EFF}.el-upload-dragger.is-dragover{background-color:rgba(32,159,255,.06);border:2px dashed #409EFF}.el-upload-list{margin:0;padding:0;list-style:none}.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:#606266;line-height:1.8;margin-top:5px;-webkit-box-sizing:border-box;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item:first-child{margin-top:10px}.el-upload-list__item .el-icon-upload-success{color:#67C23A}.el-upload-list__item .el-icon-close{display:none;position:absolute;top:5px;right:5px;cursor:pointer;opacity:.75;color:#606266}.el-upload-list__item .el-icon-close:hover{opacity:1}.el-upload-list__item .el-icon-close-tip{display:none;position:absolute;top:5px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:#409EFF}.el-upload-list__item:hover .el-icon-close{display:inline-block}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:block}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:#409EFF;cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon-close-tip{display:inline-block}.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}.el-upload-list__item.is-success:active .el-icon-close-tip,.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label,.el-upload-list__item.is-success:not(.focusing):focus .el-icon-close-tip{display:none}.el-upload-list.is-disabled .el-upload-list__item:hover .el-upload-list__item-status-label{display:block}.el-upload-list__item-name{color:#606266;display:block;margin-right:40px;overflow:hidden;padding-left:4px;text-overflow:ellipsis;-webkit-transition:color .3s;transition:color .3s;white-space:nowrap}.el-upload-list__item-name [class^=el-icon]{height:100%;margin-right:7px;color:#909399;line-height:inherit}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:#606266;display:none}.el-upload-list__item-delete:hover{color:#409EFF}.el-upload-list--picture-card{margin:0;display:inline;vertical-align:top}.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}.el-upload-list--picture-card .el-upload-list__item .el-icon-check,.el-upload-list--picture-card .el-upload-list__item .el-icon-circle-check{color:#FFF}.el-upload-list--picture-card .el-upload-list__item .el-icon-close,.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%}.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)}.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)}.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}.el-upload-list--picture-card .el-upload-list__item-actions::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:15px}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-block}.el-upload-list--picture-card .el-progress{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;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}.el-upload-list--picture .el-upload-list__item .el-icon-check,.el-upload-list--picture .el-upload-list__item .el-icon-circle-check{color:#FFF}.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}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name{line-height:70px;margin-top:0}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.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;background-color:#FFF}.el-upload-list--picture .el-upload-list__item-name{display:block;margin-top:20px}.el-upload-list--picture .el-upload-list__item-name i{font-size:70px;line-height:1;position:absolute;left:9px;top:10px}.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}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover::after{display:inline-block;height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.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)}.el-upload-cover__label i{font-size:12px;margin-top:11px;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.72);text-align:center}.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),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);margin-top:60px}.el-upload-cover__interact .btn span{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{-webkit-transform:translateY(-13px);transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#FFF;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.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:#303133}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-progress{position:relative;line-height:1}.el-progress__text{font-size:14px;color:#606266;display:inline-block;vertical-align:middle;margin-left:10px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .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%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:#67C23A}.el-progress.is-success .el-progress__text{color:#67C23A}.el-progress.is-warning .el-progress-bar__inner{background-color:#E6A23C}.el-badge__content,.el-progress.is-exception .el-progress-bar__inner{background-color:#F56C6C}.el-progress.is-warning .el-progress__text{color:#E6A23C}.el-progress.is-exception .el-progress__text{color:#F56C6C}.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}.el-card__header,.el-message,.el-step__icon{-webkit-box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:#EBEEF5;overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:#409EFF;text-align:right;border-radius:100px;line-height:1;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.el-progress-bar__inner::after{display:inline-block;height:100%;vertical-align:middle}.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}}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner{display:inline-block;vertical-align:middle}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.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}}.el-message{min-width:380px;box-sizing:border-box;border-radius:4px;border-width:1px;border-style:solid;border-color:#EBEEF5;position:fixed;left:50%;top:20px;-webkit-transform:translateX(-50%);transform:translateX(-50%);background-color:#edf2fc;-webkit-transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,top .4s,-webkit-transform .4s;transition:opacity .3s,transform .4s,top .4s;transition:opacity .3s,transform .4s,top .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}.el-message.is-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.el-message.is-closable .el-message__content{padding-right:16px}.el-message p{margin:0}.el-message--info .el-message__content{color:#909399}.el-message--success{background-color:#f0f9eb;border-color:#e1f3d8}.el-message--success .el-message__content{color:#67C23A}.el-message--warning{background-color:#fdf6ec;border-color:#faecd8}.el-message--warning .el-message__content{color:#E6A23C}.el-message--error{background-color:#fef0f0;border-color:#fde2e2}.el-message--error .el-message__content{color:#F56C6C}.el-message__icon{margin-right:10px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__content:focus{outline-width:0}.el-message__closeBtn{position:absolute;top:50%;right:15px;-webkit-transform:translateY(-50%);transform:translateY(-50%);cursor:pointer;color:#C0C4CC;font-size:16px}.el-message__closeBtn:focus{outline-width:0}.el-message__closeBtn:hover{color:#909399}.el-message .el-icon-success{color:#67C23A}.el-message .el-icon-error{color:#F56C6C}.el-message .el-icon-info{color:#909399}.el-message .el-icon-warning{color:#E6A23C}.el-message-fade-enter,.el-message-fade-leave-active{opacity:0;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%)}.el-badge{position:relative;vertical-align:middle;display:inline-block}.el-badge__content{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}.el-badge__content.is-fixed{position:absolute;top:0;right:10px;-webkit-transform:translateY(-50%) translateX(100%);transform:translateY(-50%) translateX(100%)}.el-rate__icon,.el-rate__item{position:relative;display:inline-block}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:#409EFF}.el-badge__content--success{background-color:#67C23A}.el-badge__content--warning{background-color:#E6A23C}.el-badge__content--info{background-color:#909399}.el-badge__content--danger{background-color:#F56C6C}.el-card{border-radius:4px;border:1px solid #EBEEF5;background-color:#FFF;overflow:hidden;color:#303133;-webkit-transition:.3s;transition:.3s}.el-card.is-always-shadow,.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-card__header{padding:18px 20px;border-bottom:1px solid #EBEEF5;box-sizing:border-box}.el-card__body,.el-main{padding:20px}.el-rate{height:20px;line-height:1}.el-rate:active,.el-rate:focus{outline-width:0}.el-rate__item{font-size:0;vertical-align:middle}.el-rate__icon{font-size:18px;margin-right:6px;color:#C0C4CC;-webkit-transition:.3s;transition:.3s}.el-rate__decimal,.el-rate__icon .path2{position:absolute;top:0;left:0}.el-rate__icon.hover{-webkit-transform:scale(1.15);transform:scale(1.15)}.el-rate__decimal{display:inline-block;overflow:hidden}.el-step.is-vertical,.el-steps{display:-webkit-box;display:-ms-flexbox}.el-rate__text{font-size:14px;vertical-align:middle}.el-steps{display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:#F5F7FA}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-flow:column;flex-flow:column}.el-step{position:relative;-ms-flex-negative:1;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.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}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:#303133;border-color:#303133}.el-step__head.is-wait{color:#C0C4CC;border-color:#C0C4CC}.el-step__head.is-success{color:#67C23A;border-color:#67C23A}.el-step__head.is-error{color:#F56C6C;border-color:#F56C6C}.el-step__head.is-finish{color:#409EFF;border-color:#409EFF}.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;box-sizing:border-box;background:#FFF;-webkit-transition:.15s ease-out;transition:.15s ease-out}.el-step.is-horizontal,.el-step__icon-inner{display:inline-block}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{-webkit-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{-webkit-transform:translateY(1px);transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:#C0C4CC}.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}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:#303133}.el-step__title.is-wait{color:#C0C4CC}.el-step__title.is-success{color:#67C23A}.el-step__title.is-error{color:#F56C6C}.el-step__title.is-finish{color:#409EFF}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:#303133}.el-step__description.is-wait{color:#C0C4CC}.el-step__description.is-success{color:#67C23A}.el-step__description.is-error{color:#F56C6C}.el-step__description.is-finish{color:#409EFF}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:flex}.el-step.is-vertical .el-step__head{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{-webkit-transform:scale(.8) translateY(1px);transform:scale(.8) translateY(1px)}.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}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.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}.el-step.is-simple .el-step__arrow::after,.el-step.is-simple .el-step__arrow::before{content:'';display:inline-block;position:absolute;height:15px;width:1px;background:#C0C4CC}.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}.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%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-carousel{position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.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}.el-carousel__arrow--left{left:16px}.el-carousel__arrow:hover{background-color:rgba(31,45,61,.23)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:2}.el-carousel__indicators--horizontal{bottom:0;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:26px;text-align:center;position:static;-webkit-transform:none;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:#C0C4CC;opacity:.24}.el-carousel__indicators--labels{left:0;right:0;-webkit-transform:none;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:12px 4px}.el-carousel__indicator--vertical{padding:4px 12px}.el-carousel__indicator--vertical .el-carousel__button{width:2px;height:15px}.el-carousel__indicator.is-active button{opacity:1}.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}.el-carousel__item,.el-carousel__mask{height:100%;position:absolute;top:0;left:0}.carousel-arrow-left-enter,.carousel-arrow-left-leave-active{-webkit-transform:translateY(-50%) translateX(-10px);transform:translateY(-50%) translateX(-10px);opacity:0}.carousel-arrow-right-enter,.carousel-arrow-right-leave-active{-webkit-transform:translateY(-50%) translateX(10px);transform:translateY(-50%) translateX(10px);opacity:0}.el-carousel__item{width:100%;display:inline-block;overflow:hidden;z-index:0}.el-carousel__item.is-active{z-index:2}.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}.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}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:1}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:2}.el-carousel__mask{width:100%;background-color:#FFF;opacity:.24;-webkit-transition:.2s;transition:.2s}.fade-in-linear-enter-active,.fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.fade-in-linear-enter,.fade-in-linear-leave,.fade-in-linear-leave-active{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.el-fade-in-linear-enter,.el-fade-in-linear-leave,.el-fade-in-linear-leave-active{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{-webkit-transition:all .3s cubic-bezier(.55,0,.1,1);transition:all .3s cubic-bezier(.55,0,.1,1)}.el-fade-in-enter,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.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)}.el-zoom-in-center-enter,.el-zoom-in-center-leave-active{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}.el-zoom-in-top-enter-active,.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),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top}.el-zoom-in-top-enter,.el-zoom-in-top-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.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),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center bottom;transform-origin:center bottom}.el-zoom-in-bottom-enter,.el-zoom-in-bottom-leave-active{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}.el-zoom-in-left-enter-active,.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),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:top left;transform-origin:top left}.el-zoom-in-left-enter,.el-zoom-in-left-leave-active{opacity:0;-webkit-transform:scale(.45,.45);transform:scale(.45,.45)}.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}.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}.el-list-enter-active,.el-list-leave-active{-webkit-transition:all 1s;transition:all 1s}.el-list-enter,.el-list-leave-active{opacity:0;-webkit-transform:translateY(-30px);transform:translateY(-30px)}.el-opacity-transition{-webkit-transition:opacity .3s cubic-bezier(.55,0,.1,1);transition:opacity .3s cubic-bezier(.55,0,.1,1)}.el-collapse{border-top:1px solid #EBEEF5;border-bottom:1px solid #EBEEF5}.el-collapse-item.is-disabled .el-collapse-item__header{color:#bbb;cursor:not-allowed}.el-collapse-item__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:48px;line-height:48px;background-color:#FFF;color:#303133;cursor:pointer;border-bottom:1px solid #EBEEF5;font-size:13px;font-weight:500;-webkit-transition:border-bottom-color .3s;transition:border-bottom-color .3s;outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;-webkit-transition:-webkit-transform .3s;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;font-weight:300}.el-collapse-item__arrow.is-active{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:#409EFF}.el-collapse-item__header.is-active{border-bottom-color:transparent}.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 #EBEEF5}.el-cascader__search-input,.el-cascader__tags,.el-tag{-webkit-box-sizing:border-box}.el-collapse-item__content{padding-bottom:25px;font-size:13px;color:#303133;line-height:1.769230769230769}.el-collapse-item:last-child{margin-bottom:-1px}.el-popper .popper__arrow,.el-popper .popper__arrow::after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.el-cascader,.el-tag{display:inline-block}.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))}.el-popper .popper__arrow::after{content:" ";border-width:6px}.el-popper[x-placement^=top]{margin-bottom:12px}.el-popper[x-placement^=top] .popper__arrow{bottom:-6px;left:50%;margin-right:3px;border-top-color:#EBEEF5;border-bottom-width:0}.el-popper[x-placement^=top] .popper__arrow::after{bottom:1px;margin-left:-6px;border-top-color:#FFF;border-bottom-width:0}.el-popper[x-placement^=bottom]{margin-top:12px}.el-popper[x-placement^=bottom] .popper__arrow{top:-6px;left:50%;margin-right:3px;border-top-width:0;border-bottom-color:#EBEEF5}.el-popper[x-placement^=bottom] .popper__arrow::after{top:1px;margin-left:-6px;border-top-width:0;border-bottom-color:#FFF}.el-popper[x-placement^=right]{margin-left:12px}.el-popper[x-placement^=right] .popper__arrow{top:50%;left:-6px;margin-bottom:3px;border-right-color:#EBEEF5;border-left-width:0}.el-popper[x-placement^=right] .popper__arrow::after{bottom:-6px;left:1px;border-right-color:#FFF;border-left-width:0}.el-popper[x-placement^=left]{margin-right:12px}.el-popper[x-placement^=left] .popper__arrow{top:50%;right:-6px;margin-bottom:3px;border-right-width:0;border-left-color:#EBEEF5}.el-popper[x-placement^=left] .popper__arrow::after{right:1px;bottom:-6px;margin-left:-6px;border-right-width:0;border-left-color:#FFF}.el-tag{background-color:#ecf5ff;border-color:#d9ecff;height:32px;padding:0 10px;line-height:30px;font-size:12px;color:#409EFF;border-width:1px;border-style:solid;border-radius:4px;box-sizing:border-box;white-space:nowrap}.el-tag.is-hit{border-color:#409EFF}.el-tag .el-tag__close{color:#409eff}.el-tag .el-tag__close:hover{color:#FFF;background-color:#409eff}.el-tag.el-tag--info{background-color:#f4f4f5;border-color:#e9e9eb;color:#909399}.el-tag.el-tag--info.is-hit{border-color:#909399}.el-tag.el-tag--info .el-tag__close{color:#909399}.el-tag.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#909399}.el-tag.el-tag--success{background-color:#f0f9eb;border-color:#e1f3d8;color:#67c23a}.el-tag.el-tag--success.is-hit{border-color:#67C23A}.el-tag.el-tag--success .el-tag__close{color:#67c23a}.el-tag.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#67c23a}.el-tag.el-tag--warning{background-color:#fdf6ec;border-color:#faecd8;color:#e6a23c}.el-tag.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#e6a23c}.el-tag.el-tag--danger{background-color:#fef0f0;border-color:#fde2e2;color:#f56c6c}.el-tag.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f56c6c}.el-tag .el-icon-close{border-radius:50%;text-align:center;position:relative;cursor:pointer;font-size:12px;height:16px;width:16px;line-height:16px;vertical-align:middle;top:-1px;right:-5px}.el-tag .el-icon-close::before{display:block}.el-tag--dark{background-color:#409eff;border-color:#409eff;color:#fff}.el-tag--dark.is-hit{border-color:#409EFF}.el-tag--dark .el-tag__close{color:#fff}.el-tag--dark .el-tag__close:hover{color:#FFF;background-color:#66b1ff}.el-tag--dark.el-tag--info{background-color:#909399;border-color:#909399;color:#fff}.el-tag--dark.el-tag--info.is-hit{border-color:#909399}.el-tag--dark.el-tag--info .el-tag__close{color:#fff}.el-tag--dark.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#a6a9ad}.el-tag--dark.el-tag--success{background-color:#67c23a;border-color:#67c23a;color:#fff}.el-tag--dark.el-tag--success.is-hit{border-color:#67C23A}.el-tag--dark.el-tag--success .el-tag__close{color:#fff}.el-tag--dark.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#85ce61}.el-tag--dark.el-tag--warning{background-color:#e6a23c;border-color:#e6a23c;color:#fff}.el-tag--dark.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag--dark.el-tag--warning .el-tag__close{color:#fff}.el-tag--dark.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#ebb563}.el-tag--dark.el-tag--danger{background-color:#f56c6c;border-color:#f56c6c;color:#fff}.el-tag--dark.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag--dark.el-tag--danger .el-tag__close{color:#fff}.el-tag--dark.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f78989}.el-tag--plain{background-color:#fff;border-color:#b3d8ff;color:#409eff}.el-tag--plain.is-hit{border-color:#409EFF}.el-tag--plain .el-tag__close{color:#409eff}.el-tag--plain .el-tag__close:hover{color:#FFF;background-color:#409eff}.el-tag--plain.el-tag--info{background-color:#fff;border-color:#d3d4d6;color:#909399}.el-tag--plain.el-tag--info.is-hit{border-color:#909399}.el-tag--plain.el-tag--info .el-tag__close{color:#909399}.el-tag--plain.el-tag--info .el-tag__close:hover{color:#FFF;background-color:#909399}.el-tag--plain.el-tag--success{background-color:#fff;border-color:#c2e7b0;color:#67c23a}.el-tag--plain.el-tag--success.is-hit{border-color:#67C23A}.el-tag--plain.el-tag--success .el-tag__close{color:#67c23a}.el-tag--plain.el-tag--success .el-tag__close:hover{color:#FFF;background-color:#67c23a}.el-tag--plain.el-tag--warning{background-color:#fff;border-color:#f5dab1;color:#e6a23c}.el-tag--plain.el-tag--warning.is-hit{border-color:#E6A23C}.el-tag--plain.el-tag--warning .el-tag__close{color:#e6a23c}.el-tag--plain.el-tag--warning .el-tag__close:hover{color:#FFF;background-color:#e6a23c}.el-tag--plain.el-tag--danger{background-color:#fff;border-color:#fbc4c4;color:#f56c6c}.el-tag--plain.el-tag--danger.is-hit{border-color:#F56C6C}.el-tag--plain.el-tag--danger .el-tag__close{color:#f56c6c}.el-tag--plain.el-tag--danger .el-tag__close:hover{color:#FFF;background-color:#f56c6c}.el-tag--medium{height:28px;line-height:26px}.el-tag--medium .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--small{height:24px;padding:0 8px;line-height:22px}.el-tag--small .el-icon-close{-webkit-transform:scale(.8);transform:scale(.8)}.el-tag--mini{height:20px;padding:0 5px;line-height:19px}.el-tag--mini .el-icon-close{margin-left:-3px;-webkit-transform:scale(.7);transform:scale(.7)}.el-cascader{position:relative;font-size:14px;line-height:40px}.el-cascader:not(.is-disabled):hover .el-input__inner{cursor:pointer;border-color:#C0C4CC}.el-cascader .el-input .el-input__inner:focus,.el-cascader .el-input.is-focus .el-input__inner{border-color:#409EFF}.el-cascader .el-input{cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis}.el-cascader .el-input .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}.el-cascader .el-input .el-icon-arrow-down.is-reverse{-webkit-transform:rotateZ(180deg);transform:rotateZ(180deg)}.el-cascader .el-input .el-icon-circle-close:hover{color:#909399}.el-cascader--medium{font-size:14px;line-height:36px}.el-cascader--small{font-size:13px;line-height:32px}.el-cascader--mini{font-size:12px;line-height:28px}.el-cascader.is-disabled .el-cascader__label{z-index:2;color:#C0C4CC}.el-cascader__dropdown{margin:5px 0;font-size:14px;background:#FFF;border:1px solid #E4E7ED;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;line-height:normal;text-align:left;box-sizing:border-box}.el-cascader__tags .el-tag{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:#f0f2f5}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{-webkit-box-flex:0;-ms-flex:none;flex:none;background-color:#C0C4CC;color:#FFF}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:#909399}.el-cascader__suggestion-panel{border-radius:4px}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:14px;color:#606266;text-align:center}.el-cascader__suggestion-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:#F5F7FA}.el-cascader__suggestion-item.is-checked{color:#409EFF;font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:#C0C4CC}.el-cascader__search-input{-webkit-box-flex:1;-ms-flex:1;flex:1;height:24px;min-width:60px;margin:2px 0 2px 15px;padding:0;color:#606266;border:none;outline:0;box-sizing:border-box}.el-cascader__search-input::-webkit-input-placeholder{color:#C0C4CC}.el-cascader__search-input:-ms-input-placeholder{color:#C0C4CC}.el-cascader__search-input::-ms-input-placeholder{color:#C0C4CC}.el-cascader__search-input::placeholder{color:#C0C4CC}.el-color-predefine{display:-webkit-box;display:-ms-flexbox;display:flex;font-size:12px;margin-top:8px;width:280px}.el-color-predefine__colors{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{-webkit-box-shadow:0 0 3px 2px #409EFF;box-shadow:0 0 3px 2px #409EFF}.el-color-predefine__color-selector>div{display:-webkit-box;display:-ms-flexbox;display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.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}.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%}.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}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.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%)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;top:0;left:0;right:0;bottom:0}.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))}.el-color-svpanel__black{background:-webkit-gradient(linear,left bottom,left top,from(#000),to(rgba(0,0,0,0)));background:linear-gradient(to top,#000,rgba(0,0,0,0))}.el-color-svpanel__cursor{position:absolute}.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)}.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==)}.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%}.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}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.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%)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper::after{display:table;clear:both}.el-color-dropdown__btns{margin-top:6px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.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}.el-color-dropdown__btn[disabled]{color:#ccc;cursor:not-allowed}.el-color-dropdown__btn:hover{color:#409EFF;border-color:#409EFF}.el-color-dropdown__link-btn{cursor:pointer;color:#409EFF;text-decoration:none;padding:15px;font-size:12px}.el-color-dropdown__link-btn:hover{color:tint(#409EFF,20%)}.el-color-picker{display:inline-block;position:relative;line-height:normal;height:40px}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--medium{height:36px}.el-color-picker--medium .el-color-picker__trigger{height:36px;width:36px}.el-color-picker--medium .el-color-picker__mask{height:34px;width:34px}.el-color-picker--small{height:32px}.el-color-picker--small .el-color-picker__trigger{height:32px;width:32px}.el-color-picker--small .el-color-picker__mask{height:30px;width:30px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.el-color-picker--mini{height:28px}.el-color-picker--mini .el-color-picker__trigger{height:28px;width:28px}.el-color-picker--mini .el-color-picker__mask{height:26px;width:26px}.el-color-picker--mini .el-color-picker__empty,.el-color-picker--mini .el-color-picker__icon{-webkit-transform:translate3d(-50%,-50%,0) scale(.8);transform:translate3d(-50%,-50%,0) scale(.8)}.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)}.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}.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}.el-color-picker__icon,.el-input,.el-textarea{display:inline-block;width:100%}.el-color-picker__color.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-picker__color-inner{position:absolute;left:0;top:0;right:0;bottom:0}.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)}.el-color-picker__icon{position:absolute;top:50%;left:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0);color:#FFF;text-align:center;font-size:12px}.el-input__prefix,.el-input__suffix{position:absolute;top:0;text-align:center}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;-webkit-box-sizing:content-box;box-sizing:content-box;background-color:#FFF;border:1px solid #EBEEF5;border-radius:4px;box-shadow:0 2px 12px 0 rgba(0,0,0,.1)}.el-input__inner,.el-textarea__inner,.el-transfer-panel{-webkit-box-sizing:border-box}.el-textarea{position:relative;vertical-align:bottom;font-size:14px}.el-textarea__inner{display:block;resize:vertical;padding:5px 15px;line-height:1.5;box-sizing:border-box;width:100%;font-size:inherit;color:#606266;background-color:#FFF;background-image:none;border:1px solid #DCDFE6;border-radius:4px;-webkit-transition:border-color .2s cubic-bezier(.645,.045,.355,1);transition:border-color .2s cubic-bezier(.645,.045,.355,1)}.el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea__inner:hover{border-color:#C0C4CC}.el-textarea__inner:focus{outline:0;border-color:#409EFF}.el-textarea .el-input__count{color:#909399;background:#FFF;position:absolute;font-size:12px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-webkit-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::-ms-input-placeholder{color:#C0C4CC}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:#C0C4CC}.el-textarea.is-exceed .el-textarea__inner{border-color:#F56C6C}.el-textarea.is-exceed .el-input__count{color:#F56C6C}.el-input{position:relative;font-size:14px}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:#b4bccc}.el-input::-webkit-scrollbar-corner{background:#fff}.el-input::-webkit-scrollbar-track{background:#fff}.el-input::-webkit-scrollbar-track-piece{background:#fff;width:6px}.el-input .el-input__clear{color:#C0C4CC;font-size:14px;cursor:pointer;-webkit-transition:color .2s cubic-bezier(.645,.045,.355,1);transition:color .2s cubic-bezier(.645,.045,.355,1)}.el-input .el-input__clear:hover{color:#909399}.el-input .el-input__count{height:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#909399;font-size:12px}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input,.el-input__inner{font-size:inherit}.el-input .el-input__count .el-input__count-inner{background:#FFF;line-height:initial;display:inline-block;padding:0 5px}.el-input__inner{-webkit-appearance:none;background-color:#FFF;background-image:none;border-radius:4px;border:1px solid #DCDFE6;box-sizing:border-box;color:#606266;display:inline-block;height:40px;line-height:40px;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%}.el-input__inner::-ms-reveal{display:none}.el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input__inner::placeholder{color:#C0C4CC}.el-input__inner:hover{border-color:#C0C4CC}.el-input.is-active .el-input__inner,.el-input__inner:focus{border-color:#409EFF;outline:0}.el-input__suffix{height:100%;right:5px;transition:all .3s;pointer-events:none}.el-input__suffix-inner{pointer-events:all}.el-input__prefix{height:100%;left:5px;transition:all .3s}.el-input__icon{height:100%;width:25px;text-align:center;-webkit-transition:all .3s;transition:all .3s;line-height:40px}.el-input__icon:after{content:'';height:100%;width:0;display:inline-block;vertical-align:middle}.el-input__validateIcon{pointer-events:none}.el-input.is-disabled .el-input__inner{background-color:#F5F7FA;border-color:#E4E7ED;color:#C0C4CC;cursor:not-allowed}.el-input.is-disabled .el-input__inner::-webkit-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::-ms-input-placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__inner::placeholder{color:#C0C4CC}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-image-viewer__btn,.el-image__preview,.el-link,.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-input.is-exceed .el-input__inner{border-color:#F56C6C}.el-input.is-exceed .el-input__suffix .el-input__count{color:#F56C6C}.el-input--suffix .el-input__inner{padding-right:30px}.el-input--prefix .el-input__inner{padding-left:30px}.el-input--medium{font-size:14px}.el-input--medium .el-input__inner{height:36px;line-height:36px}.el-input--medium .el-input__icon{line-height:36px}.el-input--small{font-size:13px}.el-input--small .el-input__inner{height:32px;line-height:32px}.el-input--small .el-input__icon{line-height:32px}.el-input--mini{font-size:12px}.el-input--mini .el-input__inner{height:28px;line-height:28px}.el-input--mini .el-input__icon{line-height:28px}.el-input-group{line-height:normal;display:inline-table;width:100%;border-collapse:separate;border-spacing:0}.el-input-group>.el-input__inner{vertical-align:middle;display:table-cell}.el-input-group__append,.el-input-group__prepend{background-color:#F5F7FA;color:#909399;vertical-align:middle;display:table-cell;position:relative;border:1px solid #DCDFE6;border-radius:4px;padding:0 20px;width:1px;white-space:nowrap}.el-input-group--append .el-input__inner,.el-input-group__prepend{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:-10px -20px}.el-input-group__append button.el-button,.el-input-group__append div.el-select .el-input__inner,.el-input-group__append div.el-select:hover .el-input__inner,.el-input-group__prepend button.el-button,.el-input-group__prepend div.el-select .el-input__inner,.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}.el-input-group__prepend{border-right:0}.el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--append .el-select .el-input.is-focus .el-input__inner,.el-input-group--prepend .el-select .el-input.is-focus .el-input__inner{border-color:transparent}.el-input-group--prepend .el-input__inner{border-top-left-radius:0;border-bottom-left-radius:0}.el-input__inner::-ms-clear{display:none;width:0;height:0}.el-transfer{font-size:14px}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{display:block;margin:0 auto;padding:10px;border-radius:50%;color:#FFF;background-color:#409EFF;font-size:0}.el-button-group>.el-button+.el-button,.el-transfer-panel__item+.el-transfer-panel__item,.el-transfer__button [class*=el-icon-]+span{margin-left:0}.el-divider__text,.el-image__error,.el-link,.el-timeline,.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer__button.is-with-texts{border-radius:4px}.el-transfer__button.is-disabled,.el-transfer__button.is-disabled:hover{border:1px solid #DCDFE6;background-color:#F5F7FA;color:#C0C4CC}.el-transfer__button:first-child{margin-bottom:10px}.el-transfer__button:nth-child(2){margin:0}.el-transfer-panel{border:1px solid #EBEEF5;border-radius:4px;overflow:hidden;background:#FFF;display:inline-block;vertical-align:middle;width:200px;max-height:100%;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:246px}.el-transfer-panel__body.is-with-footer{padding-bottom:40px}.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}.el-transfer-panel__list.is-filterable{height:194px;padding-top:0}.el-transfer-panel__item{height:30px;line-height:30px;padding-left:15px;display:block!important}.el-transfer-panel__item.el-checkbox{color:#606266}.el-transfer-panel__item:hover{color:#409EFF}.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}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;width:auto}.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}.el-transfer-panel__filter .el-input__icon{margin-left:5px}.el-transfer-panel .el-transfer-panel__header{height:40px;line-height:40px;background:#F5F7FA;margin:0;padding-left:15px;border-bottom:1px solid #EBEEF5;-webkit-box-sizing:border-box;box-sizing:border-box;color:#000}.el-container,.el-header{-webkit-box-sizing:border-box}.el-transfer-panel .el-transfer-panel__header .el-checkbox{display:block;line-height:40px}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:#303133;font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;color:#909399;font-size:12px;font-weight:400}.el-transfer-panel .el-transfer-panel__footer{height:40px;background:#FFF;margin:0;padding:0;border-top:1px solid #EBEEF5;position:absolute;bottom:0;left:0;width:100%;z-index:1}.el-transfer-panel .el-transfer-panel__footer::after{display:inline-block;height:100%;vertical-align:middle}.el-container,.el-timeline-item__node{display:-webkit-box;display:-ms-flexbox}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:#606266}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:30px;line-height:30px;padding:6px 15px 0;color:#909399;text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner::after{height:6px;width:3px;left:4px}.el-container{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;-ms-flex-preferred-size:auto;flex-basis:auto;box-sizing:border-box;min-width:0}.el-container.is-vertical,.el-drawer,.el-empty,.el-result{-webkit-box-orient:vertical;-webkit-box-direction:normal}.el-container.is-vertical{-ms-flex-direction:column;flex-direction:column}.el-header{padding:0 20px;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-aside{overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-main{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-preferred-size:auto;flex-basis:auto;overflow:auto;-webkit-box-sizing:border-box;box-sizing:border-box}.el-footer{padding:0 20px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-flex-negative:0;flex-shrink:0}.el-timeline{margin:0;list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid #E4E7ED}.el-timeline-item__icon{color:#FFF;font-size:13px}.el-timeline-item__node{position:absolute;background-color:#E4E7ED;border-radius:50%;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image__error,.el-timeline-item__dot{display:-webkit-box;display:-ms-flexbox}.el-timeline-item__node--normal{left:-1px;width:12px;height:12px}.el-timeline-item__node--large{left:-2px;width:14px;height:14px}.el-timeline-item__node--primary{background-color:#409EFF}.el-timeline-item__node--success{background-color:#67C23A}.el-timeline-item__node--warning{background-color:#E6A23C}.el-timeline-item__node--danger{background-color:#F56C6C}.el-timeline-item__node--info{background-color:#909399}.el-timeline-item__dot{position:absolute;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-timeline-item__content{color:#303133}.el-timeline-item__timestamp{color:#909399;line-height:1;font-size:13px}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-link{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;padding:0;font-weight:500}.el-link.is-underline:hover:after{position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid #409EFF}.el-link.el-link--default:after,.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:#409EFF}.el-link.is-disabled{cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default{color:#606266}.el-link.el-link--default:hover{color:#409EFF}.el-link.el-link--default.is-disabled{color:#C0C4CC}.el-link.el-link--primary{color:#409EFF}.el-link.el-link--primary:hover{color:#66b1ff}.el-link.el-link--primary.is-disabled{color:#a0cfff}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:#F56C6C}.el-link.el-link--danger{color:#F56C6C}.el-link.el-link--danger:hover{color:#f78989}.el-link.el-link--danger.is-disabled{color:#fab6b6}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:#67C23A}.el-link.el-link--success{color:#67C23A}.el-link.el-link--success:hover{color:#85ce61}.el-link.el-link--success.is-disabled{color:#b3e19d}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:#E6A23C}.el-link.el-link--warning{color:#E6A23C}.el-link.el-link--warning:hover{color:#ebb563}.el-link.el-link--warning.is-disabled{color:#f3d19e}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:#909399}.el-link.el-link--info{color:#909399}.el-link.el-link--info:hover{color:#a6a9ad}.el-link.el-link--info.is-disabled{color:#c8c9cc}.el-divider{background-color:#DCDFE6;position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative}.el-divider__text{position:absolute;background-color:#FFF;padding:0 20px;font-weight:500;color:#303133}.el-image__error,.el-image__placeholder{background:#F5F7FA}.el-divider__text.is-left{left:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-divider__text.is-center{left:50%;-webkit-transform:translateX(-50%) translateY(-50%);transform:translateX(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.el-image__error,.el-image__inner,.el-image__placeholder{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top}.el-image__inner--center{position:relative;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);display:block}.el-image__error{display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#C0C4CC;vertical-align:middle}.el-image-viewer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0}.el-image-viewer__btn{position:absolute;z-index: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;border-radius:50%;opacity:.8;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-user-select:none;user-select:none}.el-button,.el-checkbox,.el-checkbox-button__inner,.el-empty__image img,.el-radio{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:24px;color:#fff;background-color:#606266}.el-image-viewer__canvas{width:100%;height:100%;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-image-viewer__actions{left:50%;bottom:30px;-webkit-transform:translateX(-50%);transform:translateX(-50%);width:282px;height:44px;padding:0 23px;background-color:#606266;border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-pack:distribute;justify-content:space-around}.el-image-viewer__next,.el-image-viewer__prev{width:44px;height:44px;font-size:24px;color:#fff;background-color:#606266;border-color:#fff;top:50%}.el-image-viewer__prev{-webkit-transform:translateY(-50%);transform:translateY(-50%);left:40px}.el-image-viewer__next{-webkit-transform:translateY(-50%);transform:translateY(-50%);right:40px;text-indent:2px}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in .3s;animation:viewer-fade-in .3s}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out .3s;animation:viewer-fade-out .3s}@-webkit-keyframes viewer-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 viewer-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 viewer-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 viewer-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}}.el-button{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;color:#606266;-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;padding:12px 20px;font-size:14px;border-radius:4px}.el-button+.el-button,.el-checkbox.is-bordered+.el-checkbox.is-bordered{margin-left:10px}.el-button:focus,.el-button:hover{color:#409EFF;border-color:#c6e2ff;background-color:#ecf5ff}.el-button:active{color:#3a8ee6;border-color:#3a8ee6;outline:0}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon-]+span{margin-left:5px}.el-button.is-plain:focus,.el-button.is-plain:hover{background:#FFF;border-color:#409EFF;color:#409EFF}.el-button.is-active,.el-button.is-plain:active{color:#3a8ee6;border-color:#3a8ee6}.el-button.is-plain:active{background:#FFF;outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5}.el-button.is-disabled.el-button--text{background-color:transparent}.el-button.is-disabled.is-plain,.el-button.is-disabled.is-plain:focus,.el-button.is-disabled.is-plain:hover{background-color:#FFF;border-color:#EBEEF5;color:#C0C4CC}.el-button.is-loading{position:relative;pointer-events:none}.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)}.el-button.is-round{border-radius:20px;padding:12px 23px}.el-button.is-circle{border-radius:50%;padding:12px}.el-button--primary{color:#FFF;background-color:#409EFF;border-color:#409EFF}.el-button--primary:focus,.el-button--primary:hover{background:#66b1ff;border-color:#66b1ff;color:#FFF}.el-button--primary.is-active,.el-button--primary:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF}.el-button--primary:active{outline:0}.el-button--primary.is-disabled,.el-button--primary.is-disabled:active,.el-button--primary.is-disabled:focus,.el-button--primary.is-disabled:hover{color:#FFF;background-color:#a0cfff;border-color:#a0cfff}.el-button--primary.is-plain{color:#409EFF;background:#ecf5ff;border-color:#b3d8ff}.el-button--primary.is-plain:focus,.el-button--primary.is-plain:hover{background:#409EFF;border-color:#409EFF;color:#FFF}.el-button--primary.is-plain:active{background:#3a8ee6;border-color:#3a8ee6;color:#FFF;outline:0}.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover{color:#8cc5ff;background-color:#ecf5ff;border-color:#d9ecff}.el-button--success{color:#FFF;background-color:#67C23A;border-color:#67C23A}.el-button--success:focus,.el-button--success:hover{background:#85ce61;border-color:#85ce61;color:#FFF}.el-button--success.is-active,.el-button--success:active{background:#5daf34;border-color:#5daf34;color:#FFF}.el-button--success:active{outline:0}.el-button--success.is-disabled,.el-button--success.is-disabled:active,.el-button--success.is-disabled:focus,.el-button--success.is-disabled:hover{color:#FFF;background-color:#b3e19d;border-color:#b3e19d}.el-button--success.is-plain{color:#67C23A;background:#f0f9eb;border-color:#c2e7b0}.el-button--success.is-plain:focus,.el-button--success.is-plain:hover{background:#67C23A;border-color:#67C23A;color:#FFF}.el-button--success.is-plain:active{background:#5daf34;border-color:#5daf34;color:#FFF;outline:0}.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover{color:#a4da89;background-color:#f0f9eb;border-color:#e1f3d8}.el-button--warning{color:#FFF;background-color:#E6A23C;border-color:#E6A23C}.el-button--warning:focus,.el-button--warning:hover{background:#ebb563;border-color:#ebb563;color:#FFF}.el-button--warning.is-active,.el-button--warning:active{background:#cf9236;border-color:#cf9236;color:#FFF}.el-button--warning:active{outline:0}.el-button--warning.is-disabled,.el-button--warning.is-disabled:active,.el-button--warning.is-disabled:focus,.el-button--warning.is-disabled:hover{color:#FFF;background-color:#f3d19e;border-color:#f3d19e}.el-button--warning.is-plain{color:#E6A23C;background:#fdf6ec;border-color:#f5dab1}.el-button--warning.is-plain:focus,.el-button--warning.is-plain:hover{background:#E6A23C;border-color:#E6A23C;color:#FFF}.el-button--warning.is-plain:active{background:#cf9236;border-color:#cf9236;color:#FFF;outline:0}.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover{color:#f0c78a;background-color:#fdf6ec;border-color:#faecd8}.el-button--danger{color:#FFF;background-color:#F56C6C;border-color:#F56C6C}.el-button--danger:focus,.el-button--danger:hover{background:#f78989;border-color:#f78989;color:#FFF}.el-button--danger.is-active,.el-button--danger:active{background:#dd6161;border-color:#dd6161;color:#FFF}.el-button--danger:active{outline:0}.el-button--danger.is-disabled,.el-button--danger.is-disabled:active,.el-button--danger.is-disabled:focus,.el-button--danger.is-disabled:hover{color:#FFF;background-color:#fab6b6;border-color:#fab6b6}.el-button--danger.is-plain{color:#F56C6C;background:#fef0f0;border-color:#fbc4c4}.el-button--danger.is-plain:focus,.el-button--danger.is-plain:hover{background:#F56C6C;border-color:#F56C6C;color:#FFF}.el-button--danger.is-plain:active{background:#dd6161;border-color:#dd6161;color:#FFF;outline:0}.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover{color:#f9a7a7;background-color:#fef0f0;border-color:#fde2e2}.el-button--info{color:#FFF;background-color:#909399;border-color:#909399}.el-button--info:focus,.el-button--info:hover{background:#a6a9ad;border-color:#a6a9ad;color:#FFF}.el-button--info.is-active,.el-button--info:active{background:#82848a;border-color:#82848a;color:#FFF}.el-button--info:active{outline:0}.el-button--info.is-disabled,.el-button--info.is-disabled:active,.el-button--info.is-disabled:focus,.el-button--info.is-disabled:hover{color:#FFF;background-color:#c8c9cc;border-color:#c8c9cc}.el-button--info.is-plain{color:#909399;background:#f4f4f5;border-color:#d3d4d6}.el-button--info.is-plain:focus,.el-button--info.is-plain:hover{background:#909399;border-color:#909399;color:#FFF}.el-button--info.is-plain:active{background:#82848a;border-color:#82848a;color:#FFF;outline:0}.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover{color:#bcbec2;background-color:#f4f4f5;border-color:#e9e9eb}.el-button--medium{padding:10px 20px;font-size:14px;border-radius:4px}.el-button--medium.is-round{padding:10px 20px}.el-button--medium.is-circle{padding:10px}.el-button--small{padding:9px 15px;font-size:12px;border-radius:3px}.el-button--small.is-round{padding:9px 15px}.el-button--small.is-circle{padding:9px}.el-button--mini,.el-button--mini.is-round{padding:7px 15px}.el-button--mini{font-size:12px;border-radius:3px}.el-button--mini.is-circle{padding:7px}.el-button--text{border-color:transparent;color:#409EFF;background:0 0;padding-left:0;padding-right:0}.el-button--text:focus,.el-button--text:hover{color:#66b1ff;border-color:transparent;background-color:transparent}.el-button--text:active{color:#3a8ee6;border-color:transparent;background-color:transparent}.el-button--text.is-disabled,.el-button--text.is-disabled:focus,.el-button--text.is-disabled:hover{border-color:transparent}.el-button-group .el-button--danger:last-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:last-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:last-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:last-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:last-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child),.el-button-group>.el-dropdown>.el-button{border-left-color:rgba(255,255,255,.5)}.el-button-group .el-button--danger:first-child,.el-button-group .el-button--danger:not(:first-child):not(:last-child),.el-button-group .el-button--info:first-child,.el-button-group .el-button--info:not(:first-child):not(:last-child),.el-button-group .el-button--primary:first-child,.el-button-group .el-button--primary:not(:first-child):not(:last-child),.el-button-group .el-button--success:first-child,.el-button-group .el-button--success:not(:first-child):not(:last-child),.el-button-group .el-button--warning:first-child,.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-right-color:rgba(255,255,255,.5)}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group::after,.el-button-group::before{display:table}.el-button-group::after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button.is-disabled{z-index:1}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-radius:4px}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:20px}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button.is-active,.el-button-group>.el-button:not(.is-disabled):active,.el-button-group>.el-button:not(.is-disabled):focus,.el-button-group>.el-button:not(.is-disabled):hover{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0}.el-calendar{background-color:#fff}.el-calendar__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:12px 20px;border-bottom:1px solid #EBEEF5}.el-backtop,.el-page-header{display:-webkit-box;display:-ms-flexbox}.el-calendar__title{color:#000;-ms-flex-item-align:center;align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:#606266;font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:#C0C4CC}.el-backtop,.el-calendar-table td.is-today{color:#409EFF}.el-calendar-table td{border-bottom:1px solid #EBEEF5;border-right:1px solid #EBEEF5;vertical-align:top;-webkit-transition:background-color .2s ease;transition:background-color .2s ease}.el-calendar-table td.is-selected{background-color:#F2F8FE}.el-calendar-table tr:first-child td{border-top:1px solid #EBEEF5}.el-calendar-table tr td:first-child{border-left:1px solid #EBEEF5}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{-webkit-box-sizing:border-box;box-sizing:border-box;padding:8px;height:85px}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:#F2F8FE}.el-backtop{position:fixed;background-color:#FFF;width:40px;height:40px;border-radius:50%;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;font-size:20px;-webkit-box-shadow:0 0 6px rgba(0,0,0,.12);box-shadow:0 0 6px rgba(0,0,0,.12);cursor:pointer;z-index:5}.el-backtop:hover{background-color:#F2F6FC}.el-page-header{display:flex;line-height:24px}.el-page-header__left{display:-webkit-box;display:-ms-flexbox;display:flex;cursor:pointer;margin-right:40px;position:relative}.el-page-header__left::after{position:absolute;width:1px;height:16px;right:-20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);background-color:#DCDFE6}.el-checkbox,.el-checkbox__input{display:inline-block;position:relative;white-space:nowrap}.el-page-header__left .el-icon-back{font-size:18px;margin-right:6px;-ms-flex-item-align:center;align-self:center}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:#303133}.el-checkbox{color:#606266;font-weight:500;font-size:14px;cursor:pointer;user-select:none;margin-right:30px}.el-checkbox.is-bordered{padding:9px 20px 9px 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;line-height:normal;height:40px}.el-checkbox.is-bordered.is-checked{border-color:#409EFF}.el-checkbox.is-bordered.is-disabled{border-color:#EBEEF5;cursor:not-allowed}.el-checkbox.is-bordered.el-checkbox--medium{padding:7px 20px 7px 10px;border-radius:4px;height:36px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__label{line-height:17px;font-size:14px}.el-checkbox.is-bordered.el-checkbox--medium .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:5px 15px 5px 10px;border-radius:3px;height:32px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{line-height:15px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox.is-bordered.el-checkbox--mini{padding:3px 15px 3px 10px;border-radius:3px;height:28px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__label{line-height:12px;font-size:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--mini .el-checkbox__inner::after{height:6px;width:2px}.el-checkbox__input{cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:#edf2fc;border-color:#DCDFE6;cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner::after{cursor:not-allowed;border-color:#C0C4CC}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:#F2F6FC;border-color:#DCDFE6}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner::after{border-color:#C0C4CC}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:#F2F6FC;border-color:#DCDFE6}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner::before{background-color:#C0C4CC;border-color:#C0C4CC}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:#409EFF;border-color:#409EFF}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:#C0C4CC;cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner::after{-webkit-transform:rotate(45deg) scaleY(1);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:#409EFF}.el-checkbox__input.is-focus .el-checkbox__inner{border-color:#409EFF}.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}.el-checkbox__input.is-indeterminate .el-checkbox__inner::after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:1px solid #DCDFE6;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)}.el-checkbox__inner:hover{border-color:#409EFF}.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 ease-in .05s;transition:-webkit-transform .15s ease-in .05s;transition:transform .15s ease-in .05s;transition:transform .15s ease-in .05s,-webkit-transform .15s ease-in .05s;-webkit-transform-origin:center;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox-button,.el-checkbox-button__inner{display:inline-block;position:relative}.el-checkbox__label{display:inline-block;padding-left:10px;line-height:19px;font-size:14px}.el-checkbox:last-of-type{margin-right:0}.el-checkbox-button__inner{line-height:1;font-weight:500;white-space:nowrap;vertical-align:middle;cursor:pointer;background:#FFF;border:1px solid #DCDFE6;border-left:0;color:#606266;-webkit-appearance:none;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;outline:0;margin:0;-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}.el-checkbox-button__inner.is-round{padding:12px 20px}.el-checkbox-button__inner:hover{color:#409EFF}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-radio,.el-radio__inner,.el-radio__input{position:relative;display:inline-block}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:#FFF;background-color:#409EFF;border-color:#409EFF;-webkit-box-shadow:-1px 0 0 0 #8cc5ff;box-shadow:-1px 0 0 0 #8cc5ff}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:#409EFF}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:#C0C4CC;cursor:not-allowed;background-image:none;background-color:#FFF;border-color:#EBEEF5;-webkit-box-shadow:none;box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:#EBEEF5}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:1px solid #DCDFE6;border-radius:4px 0 0 4px;-webkit-box-shadow:none!important;box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:#409EFF}.el-checkbox-button:last-child .el-checkbox-button__inner{border-radius:0 4px 4px 0}.el-checkbox-button--medium .el-checkbox-button__inner{padding:10px 20px;font-size:14px;border-radius:0}.el-checkbox-button--medium .el-checkbox-button__inner.is-round{padding:10px 20px}.el-checkbox-button--small .el-checkbox-button__inner{padding:9px 15px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:9px 15px}.el-checkbox-button--mini .el-checkbox-button__inner{padding:7px 15px;font-size:12px;border-radius:0}.el-checkbox-button--mini .el-checkbox-button__inner.is-round{padding:7px 15px}.el-checkbox-group{font-size:0}.el-avatar,.el-cascader-panel,.el-radio,.el-radio--medium.is-bordered .el-radio__label,.el-radio__label{font-size:14px}.el-radio{color:#606266;font-weight:500;line-height:1;cursor:pointer;white-space:nowrap;outline:0;margin-right:30px}.el-cascader-node>.el-radio,.el-radio:last-child{margin-right:0}.el-radio.is-bordered{padding:12px 20px 0 10px;border-radius:4px;border:1px solid #DCDFE6;-webkit-box-sizing:border-box;box-sizing:border-box;height:40px}.el-cascader-menu,.el-cascader-menu__list,.el-radio__inner{-webkit-box-sizing:border-box}.el-radio.is-bordered.is-checked{border-color:#409EFF}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:#EBEEF5}.el-radio__input.is-disabled .el-radio__inner,.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:#F5F7FA;border-color:#E4E7ED}.el-radio.is-bordered+.el-radio.is-bordered{margin-left:10px}.el-radio--medium.is-bordered{padding:10px 20px 0 10px;border-radius:4px;height:36px}.el-radio--mini.is-bordered .el-radio__label,.el-radio--small.is-bordered .el-radio__label{font-size:12px}.el-radio--medium.is-bordered .el-radio__inner{height:14px;width:14px}.el-radio--small.is-bordered{padding:8px 15px 0 10px;border-radius:3px;height:32px}.el-radio--small.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio--mini.is-bordered{padding:6px 15px 0 10px;border-radius:3px;height:28px}.el-radio--mini.is-bordered .el-radio__inner{height:12px;width:12px}.el-radio__input{white-space:nowrap;cursor:pointer;outline:0;line-height:1;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner::after{cursor:not-allowed;background-color:#F5F7FA}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner::after{background-color:#C0C4CC}.el-radio__input.is-disabled+span.el-radio__label{color:#C0C4CC;cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:#409EFF;background:#409EFF}.el-radio__input.is-checked .el-radio__inner::after{-webkit-transform:translate(-50%,-50%) scale(1);transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:#409EFF}.el-radio__input.is-focus .el-radio__inner{border-color:#409EFF}.el-radio__inner{border:1px solid #DCDFE6;border-radius:100%;width:14px;height:14px;background-color:#FFF;cursor:pointer;box-sizing:border-box}.el-radio__inner:hover{border-color:#409EFF}.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 ease-in;transition:-webkit-transform .15s ease-in;transition:transform .15s ease-in;transition:transform .15s ease-in,-webkit-transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;top:0;left:0;right:0;bottom:0;margin:0}.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{-webkit-box-shadow:0 0 2px 2px #409EFF;box-shadow:0 0 2px 2px #409EFF}.el-radio__label{padding-left:10px}.el-scrollbar{overflow:hidden;position:relative}.el-scrollbar:active>.el-scrollbar__bar,.el-scrollbar:focus>.el-scrollbar__bar,.el-scrollbar:hover>.el-scrollbar__bar{opacity:1;-webkit-transition:opacity 340ms ease-out;transition:opacity 340ms ease-out}.el-scrollbar__wrap{overflow:scroll;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{width:0;height:0}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:rgba(144,147,153,.3);-webkit-transition:.3s background-color;transition:.3s background-color}.el-scrollbar__thumb:hover{background-color:rgba(144,147,153,.5)}.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}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-cascader-panel{display:-webkit-box;display:-ms-flexbox;display:flex;border-radius:4px}.el-cascader-panel.is-bordered{border:1px solid #E4E7ED;border-radius:4px}.el-cascader-menu{min-width:180px;box-sizing:border-box;color:#606266;border-right:solid 1px #E4E7ED}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;box-sizing:border-box}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);text-align:center;color:#C0C4CC}.el-cascader-node{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:#606266}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:#409EFF;font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:#F5F7FA}.el-cascader-node.is-disabled{color:#C0C4CC;cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-avatar{display:inline-block;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;overflow:hidden;color:#fff;background:#C0C4CC;width:40px;height:40px;line-height:40px}.el-drawer,.el-drawer__body>*{-webkit-box-sizing:border-box}.el-avatar>img{display:block;height:100%;vertical-align:middle}.el-empty__image img,.el-empty__image svg{vertical-align:top;height:100%;width:100%}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:4px}.el-avatar--icon{font-size:18px}.el-avatar--large{width:40px;height:40px;line-height:40px}.el-avatar--medium{width:36px;height:36px;line-height:36px}.el-avatar--small{width:28px;height:28px;line-height:28px}@-webkit-keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes el-drawer-fade-in{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes rtl-drawer-in{0%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@keyframes rtl-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(100%,0);transform:translate(100%,0)}}@-webkit-keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ltr-drawer-in{0%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@keyframes ltr-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(-100%,0);transform:translate(-100%,0)}}@-webkit-keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes ttb-drawer-in{0%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@keyframes ttb-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,-100%);transform:translate(0,-100%)}}@-webkit-keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@keyframes btt-drawer-in{0%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}100%{-webkit-transform:translate(0,0);transform:translate(0,0)}}@-webkit-keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}@keyframes btt-drawer-out{0%{-webkit-transform:translate(0,0);transform:translate(0,0)}100%{-webkit-transform:translate(0,100%);transform:translate(0,100%)}}.el-drawer{position:absolute;box-sizing:border-box;background-color:#FFF;display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-webkit-box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);box-shadow:0 8px 10px -5px rgba(0,0,0,.2),0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12);overflow:hidden;outline:0}.el-drawer.rtl{-webkit-animation:rtl-drawer-out .3s;animation:rtl-drawer-out .3s;right:0}.el-drawer__open .el-drawer.rtl{-webkit-animation:rtl-drawer-in .3s 1ms;animation:rtl-drawer-in .3s 1ms}.el-drawer.ltr{-webkit-animation:ltr-drawer-out .3s;animation:ltr-drawer-out .3s;left:0}.el-drawer__open .el-drawer.ltr{-webkit-animation:ltr-drawer-in .3s 1ms;animation:ltr-drawer-in .3s 1ms}.el-drawer.ttb{-webkit-animation:ttb-drawer-out .3s;animation:ttb-drawer-out .3s;top:0}.el-drawer__open .el-drawer.ttb{-webkit-animation:ttb-drawer-in .3s 1ms;animation:ttb-drawer-in .3s 1ms}.el-drawer.btt{-webkit-animation:btt-drawer-out .3s;animation:btt-drawer-out .3s;bottom:0}.el-drawer__open .el-drawer.btt{-webkit-animation:btt-drawer-in .3s 1ms;animation:btt-drawer-in .3s 1ms}.el-drawer__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:hidden;margin:0}.el-drawer__header{-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#72767b;display:-webkit-box;display:-ms-flexbox;display:flex;margin-bottom:32px;padding:20px 20px 0}.el-drawer__header>:first-child{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-drawer__title{margin:0;-webkit-box-flex:1;-ms-flex:1;flex:1;line-height:inherit;font-size:1rem}.el-drawer__close-btn{border:none;cursor:pointer;font-size:20px;color:inherit;background-color:transparent}.el-drawer__body{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto}.el-drawer__body>*{box-sizing:border-box}.el-drawer.ltr,.el-drawer.rtl{height:100%;top:0;bottom:0}.el-drawer.btt,.el-drawer.ttb{width:100%;left:0;right:0}.el-drawer__container{position:relative;left:0;right:0;top:0;bottom:0;height:100%;width:100%}.el-drawer-fade-enter-active{-webkit-animation:el-drawer-fade-in .3s;animation:el-drawer-fade-in .3s}.el-drawer-fade-leave-active{animation:el-drawer-fade-in .3s reverse}.el-statistic{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;padding:0;color:#000;font-size:14px;font-variant:tabular-nums;line-height:1.5715;list-style:none;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum";text-align:center}.el-statistic .head{margin-bottom:4px;color:#00073;font-size:14px}.el-statistic .con{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.el-statistic .con .number{font-size:20px;padding:0 4px}.el-statistic .con span{display:inline-block;margin:0;line-height:100%}.el-popconfirm__main,.el-skeleton__image{display:-ms-flexbox;-webkit-box-align:center;display:-webkit-box}.el-popconfirm__main{display:flex;-ms-flex-align:center;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin:0}@-webkit-keyframes el-skeleton-loading{0%{background-position:100% 50%}100%{background-position:0 50%}}@keyframes el-skeleton-loading{0%{background-position:100% 50%}100%{background-position:0 50%}}.el-skeleton{width:100%}.el-skeleton__first-line,.el-skeleton__paragraph{height:16px;margin-top:16px;background:#f2f2f2}.el-skeleton.is-animated .el-skeleton__item{background:-webkit-gradient(linear,left top,right top,color-stop(25%,#f2f2f2),color-stop(37%,#e6e6e6),color-stop(63%,#f2f2f2));background:linear-gradient(90deg,#f2f2f2 25%,#e6e6e6 37%,#f2f2f2 63%);background-size:400% 100%;-webkit-animation:el-skeleton-loading 1.4s ease infinite;animation:el-skeleton-loading 1.4s ease infinite}.el-skeleton__item{background:#f2f2f2;display:inline-block;height:16px;border-radius:4px;width:100%}.el-skeleton__circle{border-radius:50%;width:36px;height:36px;line-height:36px}.el-skeleton__circle--lg{width:40px;height:40px;line-height:40px}.el-skeleton__circle--md{width:28px;height:28px;line-height:28px}.el-skeleton__button{height:40px;width:64px;border-radius:4px}.el-skeleton__p{width:100%}.el-skeleton__p.is-last{width:61%}.el-skeleton__p.is-first{width:33%}.el-skeleton__text{width:100%;height:13px}.el-skeleton__caption{height:12px}.el-skeleton__h1{height:20px}.el-skeleton__h3{height:18px}.el-skeleton__h5{height:16px}.el-skeleton__image{width:unset;display:flex;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:0}.el-skeleton__image svg{fill:#DCDDE0;width:22%;height:22%}.el-empty{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 0}.el-empty__image{width:160px}.el-empty__image img{user-select:none;-o-object-fit:contain;object-fit:contain}.el-empty__image svg{fill:#DCDDE0}.el-empty__description{margin-top:20px}.el-empty__description p{margin:0;font-size:14px;color:#909399}.el-empty__bottom,.el-result__title{margin-top:20px}.el-descriptions{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:14px;color:#303133}.el-descriptions__header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:20px}.el-descriptions__title{font-size:16px;font-weight:700}.el-descriptions--mini,.el-descriptions--small{font-size:12px}.el-descriptions__body{color:#606266;background-color:#FFF}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%;table-layout:fixed}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell{-webkit-box-sizing:border-box;box-sizing:border-box;text-align:left;font-weight:400;line-height:1.5}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions-item__cell.is-right{text-align:right}.el-descriptions .is-bordered{table-layout:auto}.el-descriptions .is-bordered .el-descriptions-item__cell{border:1px solid #EBEEF5;padding:12px 10px}.el-descriptions :not(.is-bordered) .el-descriptions-item__cell{padding-bottom:12px}.el-descriptions--medium.is-bordered .el-descriptions-item__cell{padding:10px}.el-descriptions--medium:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:10px}.el-descriptions--small.is-bordered .el-descriptions-item__cell{padding:8px 10px}.el-descriptions--small:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:8px}.el-descriptions--mini.is-bordered .el-descriptions-item__cell{padding:6px 10px}.el-descriptions--mini:not(.is-bordered) .el-descriptions-item__cell{padding-bottom:6px}.el-descriptions-item{vertical-align:top}.el-descriptions-item__container{display:-webkit-box;display:-ms-flexbox;display:flex}.el-descriptions-item__container .el-descriptions-item__content,.el-descriptions-item__container .el-descriptions-item__label{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.el-descriptions-item__container .el-descriptions-item__content{-webkit-box-flex:1;-ms-flex:1;flex:1}.el-descriptions-item__label.has-colon::after{content:':';position:relative;top:-.5px}.el-descriptions-item__label.is-bordered-label{font-weight:700;color:#909399;background:#fafafa}.el-descriptions-item__label:not(.is-bordered-label){margin-right:10px}.el-descriptions-item__content{word-break:break-word;overflow-wrap:break-word}.el-result{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;padding:40px 30px}.el-result__icon svg{width:64px;height:64px}.el-result__title p{margin:0;font-size:20px;color:#303133;line-height:1.3}.el-result__subtitle{margin-top:10px}.el-result__subtitle p{margin:0;font-size:14px;color:#606266;line-height:1.3}.el-result__extra{margin-top:30px}.el-result .icon-success{fill:#67C23A}.el-result .icon-error{fill:#F56C6C}.el-result .icon-info{fill:#909399}.el-result .icon-warning{fill:#E6A23C} \ No newline at end of file diff --git a/crmeb/public/install/images/install/bg.png b/crmeb/public/install/images/install/bg.png old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/btn.png b/crmeb/public/install/images/install/btn.png old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/complete.png b/crmeb/public/install/images/install/complete.png old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/environment.png b/crmeb/public/install/images/install/environment.png new file mode 100755 index 0000000000000000000000000000000000000000..20b54d5305f344037493f84c85b56647e7069522 GIT binary patch literal 1427 zcmV;E1#J3>P)Px#1am@3R0s$N2z&@+hyVZuJxN4CRA_?EBxoq2VhlT3cAcln?9?)eYr&AfN!ULnP{(3y(qyUF(j zZ38v}Wh@V-feA%oWvjg>z7MxP01$xJI?p`gv1WcoWc?FOvCybqn>D_dhx=M@%C^v% zikZJ=uB1#)q8hS{89mq6cKb=^`8a6ljQK^iS>P}bK=qn$jjvW-?}&XQ=uu$O5~*D- zh8NS)8S@*}D?mVz-6nNUgKB8Gng%%6*LGXsV*o+h40B&(SjLP#$;8}1MMhGG8)a+9 zX$3gj|BfsUJa%%d+T)QgfkvR*y%hfkN)i}XO@8)a`wPD;mgoH%yYqYc#{(XZTm)Wa zsh9>3ya){<-gr2AvC%Hf*0`=>7qGSvxw(SiHR3&BC)*kq)lG%T$VDtR+ex;@mj!~? zPO=rUVL?+UST~w$d^nnDG!V}%TJBg_LEru9k(tV}W+T#%;-8bai&`BIXJ$rxt9*@W zOcZ6c6AzAz7ZkM)hIVWjN{xmh(ZpKd1c0U1(NM7d+mtpKj*bNk5_U38(UrQQx6;Q} z+Sp(gXrk))fvf0@ie!rp&G_8vPqRtP0XYHmFDch(r_DfpuuwGlUZG82LRCOhMIV$=SwSe4dxb3v9@$ z<$1})6kVyi#ftG#!}cDZ#R`F`ax)n>u{9nF*8k>aB5qT%rCzeeZA-m7nuxlYNFgwA zb!V{dP$tdRxWM*;W#k^CKt|&wTk0#uON}fqDRK)mW3y4=kiykmClS~n@JSx=1G8{J z&;~);7m34IoK?|HBGT^k4K2$_I%TWCPx-cn&mSJ18VV}&<* zd*hFqiz?c_`21XPbbol@-SF3!8uN&MR&&4nTai6bUP(zL=i=c)*Cy<7P6C8%t+qcXl*QX3}hptGE2(EUYV7R<2Nf19&cz zQnIDKV!YIF`fus2Z13wC;>+!t8d@&hcTkk2E<^Jl>Yn$SZmU`c)3ou> zj`~4>uCAuLSmq0-vlOB6g^$Tb#h*4@SoUH$exxqKRZlcW2FAO*_a1yRTT%AB3TZtx zt?3y^9Pr$mI+T2>Vm+#dolfI$4Gi%}G~sm4|3>wAvaxtsSSQ zfHF(u>E*m91s-k4`4gBnzyyG(I_^;~71BIT7)4?L0*6~VWBx4XEooXhWB%0MGZcws z+HkkWGUohpDf^brnBQ2|i-;T{eZw7;<`zo>Fx=OA)3?S~tH^HPGIJYImkZOtWkq)T h*7$0N`&w@T{0$A*$sn;Q2gU#Z002ovPDHLkV1jqQw2}Y- literal 0 HcmV?d00001 diff --git a/crmeb/public/install/images/install/header.png b/crmeb/public/install/images/install/header.png old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/icon.png b/crmeb/public/install/images/install/icon.png old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/icon_install.png b/crmeb/public/install/images/install/icon_install.png old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/ignore.png b/crmeb/public/install/images/install/ignore.png old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/jurisdiction.png b/crmeb/public/install/images/install/jurisdiction.png new file mode 100755 index 0000000000000000000000000000000000000000..7bc320dab15c7ae31b890ebfb655cbc68e636dd0 GIT binary patch literal 3489 zcmV;S4PNqzP)Px#1am@3R0s$N2z&@+hyVZ$OG!jQRCt`#oNa8BS9ZsL=gy4BR5URX()t5RT-8*r zid3qly9QkCSW6W`Z16U)CD?6dunj1X00GogW!0&gXp^o}+ey5E*zlNQqrAZ4grp%_ zuf{0G_OeLp53JS=UddTei4U|mDGPp?c}_pfOP(3O%-A#Iw13Ic-22>npYy->KKGt` z?l~5|25j+L#csEIpNOdkKD0$zFTJ&EWU1wlrF_}e`m?2C%n=2@Kw;8D)ys&qyx(5? z$x_L)B;>a>c0ZdZD{thh_nccPsv z<(S%IsGhWq>6mXceZHXk_g9y0b|HH;d6tYK(m7?@XFl$zyOk?>b3%S=eb+`@X1l0v zCpL0G7}Z`e=H&QipMBWZ7Yr|?%^JT|qMm|%K&_)q6#9Yl)2bJ;?TAH@kB-nEZ8XAW zRCfX;j>n^@o^nCgPtpk2WDS%Z4Qxoe%5Q7z-XtPV+p6203#CH85$TD*M~m4lGA3W$ zc+8WZ4s-M-eK35k%f_|L(z={rfBL z%~yBFGw&{+oSLc;ktY>4r|cM`KrhDhO;1i-`S;Gi?R1=Gkl*6BioM=t--y_eH3DlD z$^z7z<08_fVf*C4hK)DUwYTG$cb892 zPge;%MszS%rW6?k8AcdZWLQKaj00~M zcs$2sTVwZ|z&^*rJHRcFQPs$=jByQPWH?i@0RLiziVI{}t=Q^ESd(eJ8Bo2aBIiZ4 z>!5$b&lXa(rm=git-3};{uGflsFo02IHR4Sbja4m?gs*eYUJ@R|KqdXg|5nRG@T5s zbbGzq#Fm|a55c{dcIJd~OAI}V_S_wtyb=snE=tbohOTlWGN>>i+ZwwS;QjX61+DzS zV8~tcNZ~hC?Z=HVj{)V25oU4FagfU>mu=z7;lTQ_h18C7&S-Sn+Cs}Cg}?WQB6gWA zvR2V@QC)|yT*NFw_-r9Xz)pmn257Yg#}N7j8MbY?;kLsg2O2hhp01TS$+vb6?MLkf zpd^eGfsF#7(Jexj^h}fvB`76|)`=()m!Z`f1Q-$Md@iv5mDwuII&96>Kn<#IfUJ%6 z^8Z(qDZKpJ>8smkdpP@?wRLS?MOtD+boL$R>-b>*&mgzkQ6>=X2@C-vk%;|Y#<;u) zr7^{%cqv6$O7bHpuij;%Yc8#=<#XNJdH*bJ1-TT5^oai48#3nk9tv7MnOA42Ady!1I!O(#Pu zvDukn<>K(N!lbfl%avS7=0sk|i|D8`?e=)f7jnK=VPkSyb7rn~A}{145j)~ct4OMS zZC(hHw7RPunb)wnSmbBqjd|3WRy&f`AemGiO*)Iaj9F0UWs1CzHzG-=sORe|u8S}_ zSNT*Z_S;DrBHzrBXi3Nmc~xE4W?f6t%p$7CGOCN7Ivm(IoRV2JNAawXw|zc>{ddmv z;lPF-Recs=PW@itopB})IP;pVK_7Xt59W=$qWfAqt|m?YL%TP;LD>E?flfs3AlyQ@ zhtMl(?>H1#ztef*3kE}OgEr?&#(e7bg}BUnZPvBQ{ef>Ku8v~2F@a1PSn+7#>psAGAVgPiM{6pl=1a1C%Bz`%&+Ly9?|5$(5Kl2`-{6e2u{vT440 z8MiNzm}M&pyz6XLfKfMa11Qxf+GK6QR;4#3s{+7Q?RR^<-u|iS=`c`Q(lGI^Ud!2~P!dfmMD{nbh0Y7Yv)&+b;mb9DxCddPYfJY-cW) zaXHiDGTCdxAH@F*`p2sF53+udYIn*-Nqsas%GV8G;Cuv{L47rTtE8thFa{vds$^_? z%NVwPBjs31u@_rA2fw}OV~dzqF2@v-hzT2h$%Tg>8QIUQO`zf zx7#1D@LZsLNWRvEPsY=inFGo@PIna}vKK(0=e-|){~kCrJR8~oM9kC9HX@L>OM|%( z42ImVpC0^c>_slPLO2r9U_80wnRk~%RI9XATjTi&-Tup)H_ty@TH1_A$=1g1ogcK< zz723Vu)eR=8u$q0iA8cri)L%kXCUOvv$JVXwJoMN0WdW+bpVm&DAzA_)D6Y+6C>Z( z7Yqx$0wD0iBwasj_95iOf|>`6x$jRNk0-YHtzty}0YHqrhz{76Vbuep`dsB1fashqs`>`y--`heJJY?Mm9clF0XU1}0Qu-?-`v zTl`kS2zfBD{sicmoX99_a$ZS^b%; z=EGT>qi40`7(3Dkgn^yg>d!XB^Y`zsyywRCJs|5yC=p5pJ%nU`Y*qBC=l+D>snEon zsmp;oYRu8u>di|2;;FyAA#ppqF>hAwK2s5Ywm8T&|bp~cw zecG&R#nT!&DkAj@n+Z|Uk*SF{j_$3Tu}xL)Ik(a%Z-U0{|J`5Qyy;(Ph|Hpc3Lh#h zeOW|~Ks5MQRRhiwlM~UI;H?uQdzr)i8$d*^tLmw{OmxoWpIhD7RV7M$?E4Oj>am`V zx|Z3>rbAZuLR;(4ZWa+Mwhn}Wmbqp@9IshJ|?hPdHKufsgv_{0%R6WTI08h zY`6Q6h&f0!urUn0`o;8AFkSoUkh2@Xsy*i_T&jut^o4Z7Z1DN5!iPKsdj*b@h?bN- zK@Vp$+D_y=guH0=>Nq004{#1^@s6W~Dxa00001b5ch_0Itp) z=>Px#1am@3R0s$N2z&@+hyVZ|nMp)JRCt{2oqv>FRh8#I`_(Hf+SsPsOdDNvTWzW^ zC@R?46NWex3QcIG#THsd;vy_j;u18BD8a<>IV5cm5VF7p3Jy5H0y{beLpRt&2@^DF zQ4@zO6G=r1O}A0gZCa|Oq+aSff1F#PQmI$($36Gm_g?MKT3HKn@7-s=mv_(i{Mcu2 z!*LwP=?EnC0A~V=fRlheV0LnOA20-L1s*W7Z&tHs*|_OAj^i|oL>QI>mjFdzBk*lt z5Ew~rn++TfoC*vO#9|HbB{M5G*JHB^7IUX0D`?q-P~PE~&2> zzB-QMI88#*rAa5hsup3G;`v@ln!lr$&r&*3=jf}}Z;el6*W34eFK zq=zQGU)M@nk}N+xG2z<1l4ea|x0oz9ZEIw?%5i`&Q;_swNxSP5g-VP{+8|#8b)2e5 zxN zX+8F852&Xce#l^rjNhdY2O~+|<76D(b z;l2YE{(fY_e@_`CVrE0Y_kg#$KsXgq*vNXAa6&T=dVwvH7U$HypG`BwnEO3EvrbNZ6fg2=YW;f>Th~wnMEPzVq7$z}W(y0VNIi9d&J0I8! ztTwY-t2{pp%yEHm4kH<9Y@oHoVVr9v4OJQWI8LWhPk-G9EFrwd39 z!qoF;5j*W)DxkJ+N6RusYkf<-5xoFR-+5ili^t0GwfFk7eVz z(^g2jCBi8F8BHoxSVOx-Nq0wRTaxBy_5C*Zwl7u4YwtLnO!EGWi^O|V*tsOJaehqyoHj=xsv#|Qg%ol9r|Hm{&#eqetn^VT{UCZ#d5QjC`@A zb((tlc(+1Txy5o}aHd1jO({BMDPrwt9bO8t5qe|!;y9gz!tA1<^Fp4BX=aml1hFHE z7l9w9eBMueI?fcB*?u$I*T}Oj5KhCG*>FU24gG*8;3ujbCo;Zn>$D2~TXY&m((8aX z5Dsjnp$mA@%%)6;H`DN!(rFk;bCP`XF_@R~`Jot2IPHfd1J(d%MKZZt(yPo&k?gfC zzQi=MNxQ5QGj=-dhWE7TJ)Dllh?_R35ZPYa;sP5@C@>Y=#@%gmWCH zGAViwnfeW;^LN^@_kvX&g{U4RC218+d6%$H@d2 zh#5>0rkb{MT_mZN8n;J~EG?}geXzu%DW7*7X9`>(oNq?3afL$K@R~b%g(4-70BM(~ z%D~2yHXO&90v8D9&PaBa0^20LeY%^HWB*qJj{`C4I6M?F)YfsF3HUjP8IG9^O4>^L zFjIizf%TI10uK;2!N*Tqk4Gwq_vStwYN)y^~ zoEeEPF*y)M`-6Eq(Ey(_v$Uxdoc2d}UzQ2}r8*>?>__wVqfT}KH|Ony(-Iia8`0kH z%xo;8y|%>#!U4d{)&mda?MEG4=CcPUp$j-VqP?F*wAI$QKsXb5AJ7gFL7z7>4{dd_ z;<+RN;Ecxw!a0PQ?FHVGw;xs54lK*t3CEcUxIj3EVP+2jSLN+T1@-~wnVDy9b(|*P z0^uBinXLiV=IzHMhJiE8tR17R9H%XDfpDh8%$5Py=j}(rKHy|Ci&+EPahxi+KsXgK zvnzlPkiLv#8g>A0a&d5+=Hmk4OpBS_3Y<(nB|X1Hm^t{elH=rn3xrb@Gy5L!TEf0W zGiDQmz*%OtBuPo`I8F|@KsYsFX2Z$8#EHOtWFr*&fXji`Cec)m<2X*cA*oN&b&`Ij z^gJTzVo5QxygD-kN!^lu8sT?1&e!D!<$#dG#Bmx%p-9j|U;sD;I02Y5%_C*P64F*e zCAf{r0X@fQ2ua<*9^j87ncM)p-OLopUfbg7zMWJg`H(gxe*lm)n~*$h_N3c~fW4kW z$#L2P7YHXhW_Ey(62ozvHpVxp9mjE;DRF^t9LI5{#0A1}9LJdw7YN639A`>$-=t1r z-(Nw9dYMZIk$e%bJ*jfmmPncfyo&I-<^V4P?liNZ9Nnr&5_vR_5P5XWgiB>$FEC_g zPdCw@p2VNI75v!;?D2@G3Y1jrEAxs%fnE-BjEvcWKbUw+K|D3q#Q}-^U0wY6$&$50 zv8ZM+T5pJ}q%Po(fMbCd6T-b`O}OPhfStgvfu90Tnb~u3+|7=r3xuTkz^R1T`4fQS zE8Kb~&^7`g>CXsf0meU9?-aLfBA=W_M+hL&07QuFcwf|KG35v4xM(IeCSCAHWvO~ zW$0h2{lIp?w<)ltT;S26(u}OV@zd!pN_qj%N60F0CgGib8PHAmIxC$onBB3pj_`i;LfBW*24VR0JfQ3M>ZRMhzV-aGIHI%G9Z8 zkTe&#fZ+295ljvfMErARwzUC&ioiR8iwVMzcEC~w9suqJ?(g*3#k}R}D-?Mba4vEF zJts2)Y?Qd~sBZ56QK>caVr6hp?n7pF(-iHzitzrt9XO642r+pI_zv&|GyA`hZ8t<_ z0+B4STnH?s@+@IGT2dgAk?w`SrPMBV532+66 zFCWEZ5Lg4;(@_=ZN-Fk`@^%@QS`gJ{F)VSPiO=o+TWhH^E*S{KWoCBsq&EH<_-Z8k zweU1ypmSR@mv$!;eUnMgO%?}$S!P^J zfo=UO^>E(`EogH4dDHCW_*Vcc2*2MOCB3}K?E?`7LQ+xEM+lwKCpj|BLR*q_vRBib zPBt2nP9k)~t7xvz1Hj{wu1=Pa#{HQiX&tbR(0MnDKHxz~>ynN5wqxE(ozp+cP8oM% zP5tgFak?2>`c~>|^Oma>{OM#~1bi46l(bgTA2ze`C<2k}F+4#SS-0g&I2DrK2J8k_ z(k8+HAn8hA3(f6_CsHJQXPc9m*8*T0VXZtb&IPt5!r2z|E>~~=N^K~>*IGmv4#VJ_ zLXju>KcTBBDffuT4(Dj#LxkV(-!!YyR05IA8m=XDMzutpv;~r8NxFlO)iKLukf=lDO5Glw^HxzF7gB+0HT%YL9FaA^LYQqD=#fN(fAYK z%aZPC#%!WtfsoV-JWkkX>==^p&uzexoL#AlBq(45AwsE@m_uub)i^!Cy^@yZ?Z{NT zx};fsD|MHJ{gYW$A7~v;pum>CkL%*R9ho7#8~7(lZ^*Kdh6F;=06`o&YQ!Mv9P(Y7 zX^3R4|6ZW|H)ESa5xAw*W)giL(=nrEwpi)P7NLohdL_2D9kbJINXv5Ey_};D~&b%oSL?YMykyozJ!a{*9 zR@-6Awm`6Gw9JDp5>251TnpSfF>)}L;hKpi7##;eNm(r%6D~ZUtHg7-LoH+!M z$YpTw$`v}P%XpCXoViwGp^HRQc|UM{%$Y<@0+FoE-x90QRv}p~Ygch75|)wHh5XiH1-WAJOMUuQjU!%iDILV3Hw*6d* z|10wLqr;d5T-~h3jw*96>YTGfRWX)$2yD|R5cVTpAH&de+(By`aEi?>v_USVX;?-F zomg)n7E9Tuj_6;ZD>MT`lC8ikeweOl%m)6qq@&XqsVET1=55D?PA2;f=jZK5qa+97 zKAg879ZC`SV3rN^e_SVEd^*cET9_gQ?&>Y6ZPM1XIj;jglg7Z50+F1O?zkUuvNY4~ zo9*Y~vxh8MlB6S#Pf0};xQ+JR_liMp&qyZwE={Rz(}paS^cRgjTxkYzEp56!UxgcJ z{{wy(=W^ zMx)s&2(}W+Mt+}A=w&~lT3Ixb&$T3`%_*o+WLn|_1vn;`LHyfkT6OBL?~z7o@5Z%MONZr&z10LCD&kuiQ~u;aOd z?45YISfm%D&*0C1MJUsKx#5H2te>p5$1E1Ci~G zGXh)#+-PP8CSOd>Tr4L1Hku_ApC?qPn@Ut~PBxQQ5lY#{W+1k~V!3I71tWql+8DRj zQ2A|$Fo?PRl`FKc%XpYF%lC@98*9Ad>nASyzfW09-{VDcY1$kjd;}Ame6+fXmHneTHqEnt{!Iz&oa^ zDV@}IzEjdegp9FSE|Zjji_Glq>25N!LEwBz+lfD@nJei8vpA(SdrO*aWv+~2YZ}VH z=SGXH87fUFsufAZ;X&F{9P(l}p^WbXW;R;w=E)?_JOVr-=|tdq;Iz0d9>&WFC#~z+ zw4S^Nk#%&;{XoB&-P+_j!C8N$>=^xPY88iZ z5|Q{oWIx8)YGyY!@Z56Zi`HwRSP3a6va3BIzS>>nKW~(A=#jg zxrRMLC=pvXX7&&vupl)Rp)o)L#Qo7c z2@De=mKr7YZ!AhUv}Lo2j>MODud-#7tX%K2E)Ml$W_!%+yG?3qAMlsJzh+>5KvK;q zUdCq-17tJGS!-suXJEG`l7xI&q)xaz8AUgf*#AD?Px<`!qImHUU;f^Q&f7 zcRX^ndfOY@6rtr;;c5LqM+ z`#=&NnJ2Li{2d_VTkizYZmLJ!r0YZq#+k8gN~~_=B(jS`+j1T7L}Z(9By74@rI6$& zik)HczIvl$Vv~HX*y)tlRyerjI7eV&VN831edTWIj`DJGXkU_Osg;q<9tE6O%Z&xH zIrP*}G)iO!BHJ5*`d?0GW|Hhb#2t8vYlceo?bEn8v_EF{bwaA1nA9}8EfBvd+16Mm zP*ak{tf-|nL7mp6`#I(lH@teJ&`n(-)h-Sl#g`)6dtEIz6^L~p=y|>x*8|&@%DEI-L$?OuQnd zJ&AADdasK^N3t8(8PVR$B~?w49$O#|m|0dQ0PCeUqODy`&K>2nIc9MOUM4oxa-WMs zXOi?k+aj8LF(LKFv=oS&M66ZBAvVoOM?TZ(ECC*io1CxvsOp=PE)E?}%zo&F)R1Dl zK-{I6*gNfM=#6O0LtC?_v%cfFGl;#_@-4YI%m{uR*5;k3~sAKY?FX zyP-hbeS_GivK^-$T4xWe5H%`mc5g|CM8d`42n_gbM0>3|gP0r9*0Y2PdDBuLZmGt( zN#!%g$%B>&N7fim$F$c~W&yZ3RG>`U2%ouY9w_7ua9W*->IP>QGxhp7X~8R zbDZ|W;zpblj5A#vrpC+!{4l0T;Eag&Vla;y^C#8Fugt9KvRnb!6R}aqsKlbispY035c`MG11tqfk?lH8+b~qJk^Yt1PW-g=^(yd;7&6&{{ zn^4ONM8h+OqYiSVV0lbu%(y6}iJgQ|am|Y|q}v(&}C#N8|fW7lBG zVuUECS)!`M-vAe9V7Drg<`cgjHNZEL$gir53&cZYlXBxWNq%^)Gx74PRrpcKhSfR+ zv>@e%^ynxzk;R_M823c7w2`n65u49SIwb?U6_NBOz~2-0LSk|-v0D=bI5a)`a%4v! zOwk@rl+fuQygqkrD1I&BMoA?O{VQ|>#*)ZB0Wf;7zFOOrNPd(5Cx)#_yb!p*St23n zWrR-rl^K}dK^=if6W7+F{3A`lT;LH&vDeWYr{y_V%xrdE4~>gMNyWYux(SOLwKRdp zhSu0nM0>YKv^9~J0RJHAzh-0~07WXb#(q9t% zpBLM9!f&ZlKqv3ce=43YN6-V@D(OKm;R4GcIYKq;-U4r7RB_f62^hie4ILvOqjQ z_GLpC0Xrq#A*oek#2qIZLnYfs^YETX)= z2xNVB;f=s|fpwD3XkQzHNZp%xq`94^8Quq|IbGwVa;)gd#?_o7w6{jYz5~&bLNBWoD&__UcB` z06|1!agmwbnZ`im@AytLOLdx7(j&ynCOl+jQ7d@$uhc4FMNFG@upcojW5~o@f)MoP z@VWs9j5x?M1t^67|*39Y-mZ)^#i#BtiSIWrps-j}9<4xu@b zC(evusAMB!2v0B$5gc8sc@UTwDu{u>=65`ujP z#c7SE7te|$qUYUYm-RI-9t2J?vtPtCTK55xWG2xHg}fc7V;EdzUpXjFqZ2l+ja|hu zC;w!%eJ^iUrozm|%MM)+lW1DY;gA~TapOHTJnf?GWH@qF V-~w@{_8|ZO002ovPDHLkV1hhpTmAq5 literal 0 HcmV?d00001 diff --git a/crmeb/public/install/images/install/logo.png b/crmeb/public/install/images/install/logo.png old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/pop_loading.gif b/crmeb/public/install/images/install/pop_loading.gif old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/shuaxin.png b/crmeb/public/install/images/install/shuaxin.png new file mode 100755 index 0000000000000000000000000000000000000000..e14b5fd70ad6f8cae598054f6e564f91b9bd4fd9 GIT binary patch literal 791 zcmV+y1L*vTP)95QcZvfN=#871-_oDhNV;H>m)pg2)xbsUY~>0$hPf1y(BXxq>JS=<=N{G?I)! zAZ9%IW_ETZq`m+CJ2a>A!Tg^B7K=sCT6;!WFdmP8k@iN3RxqfaNj4QLBQAZ}fEAml z>e3VME(ii6El^@B4BTVj?{uHYKB(LxWwJT2m%HOc%*c^@N^Ug;Y=FfdFR$htVAO6iFiZhOVfK> z1vuhGd`%J>+>%-|pU-b`WJ>u8PFw^*kWg0GDWD68pWwz%N{3sHJ|a@;f_DN?J`?QY zZ#5)$hJJ+;D*A)I*OUcH6tIRqYyM2>EE}SBB}X8h$3~bG;rjOJYb2*4psbdhT#hd< zC_7VG3M)5Z7)Fv)5rEQXk}qqtdH3!My;IUjePT+yg8e=0|3g{EVA(}b+c<}CKfhn9 z=x0g^$6+yUQ6OM|fJe$IHOmeqj^l{YzEKL38ZxPsz)k^J_JCz0%1)H`!A=1@!0*A5 zvJ++7%g}$j0F)lx_A(msKA?{W_#}xrs=4072rNf}KPwotT2lRcUboTeL-$;%U z75E&_`0HI!@?%wP7jR)kKSRHXlz1lqwbhNI$5{&3mn6(SB^A6A;NanNL_ATx!TAmm zU#VKb`|e~krE~|G8&V@mY-GdkHCPyN_In6wvnaz7Ua^Fci1-4m`H<&V(tr|;Fcas* zO4iHqM#@`Dvf}5(Z7ldvUOUWAWhv{sE&C VVlW?h%ccMT002ovPDHLkV1k|UWhVdt literal 0 HcmV?d00001 diff --git a/crmeb/public/install/images/install/solgen.png b/crmeb/public/install/images/install/solgen.png new file mode 100755 index 0000000000000000000000000000000000000000..3740a32a5c6cfb99539eaddefde21794b01b0627 GIT binary patch literal 8119 zcmV;oA4uSdP)Px#1am@3R0s$N2z&@+hyVZ|VM#?)&+vAbKl^uY%Q85MKqW zs~~$7tgeFWRj^70aVoG z4Q|i_0IUGqU7C&?+#nVJ*aA2Jcm%MzG(9)C!42jC04abE0M?hLq&8+hYzk-2C2{$=0or-(OItt^m|mvwn#Y$4177OBgx7GO+SLFhjfmNH0y( zoB-fSEq0$4#4B)E2ww`|{WU9d0DBpfOVctGctiF+BrgCqTG8|SU;}2cIbnq_^8HIJ z?v9M-3*#1em=Q*Ofshhy+By4jc$06cJ?c9*gtl$-;=(*pReR?jOP8J#vXH!ZWt zS_ciHXX;BJzhfovNhx?ATx4*56@b~i?0&UzhcPUUs=u=_6_;fT(RlCCu`f&D4$!k^{XeUb1G9;N zJJu}wbK~B-cxS+&byzvFjs2AREp$D?I>gdgZTG}4#??i23al|*w7es-a6e_7)Y@`& zPB5k4UopeFr}XJX95FB_I{>ha-LNd)I~FAQ*?AQDiQ)O@i3!W+R6^GRtaRSZZp6DR?!7Q!b+Rq1)Qc4TB1V=mA%-g|A1U>2fhrTns~ba1;5 zik4iJiy|sw;8_}AjhWQ*?7+|0s%*u5PWk`nG2)J15jetZW(q9isbjvrXMTFYIUMHF zIf}3LPPxe8D}cwDaEoq91J6Ijm;+2)#9@t`sE!jg#)EWEMEtTrsFuX*p(EwrYuFR_ zXZW30z(_+A7d(CG0vKH+P|eW3$Uqsp?Vk8$jg89Vza>es2k?c6G9vmvBC7dWO+;Ua z=tx9+BBCTos+h>H5m;I8$@H7Zj7v&HYySDhs!Sbrs= zGCB64N)0r+#`yi`Oa>&qArIgH91Ns{C+4#Imb z`T(GslLsBB$jDi>1TyBsw`BCC$UsU&YXAwEaju@xOR-|73WaH zcoa6V=K#hFc=Yi;RBSTC9>!~&!g?|*L_8US^_*m?tk7k!VP97n^XCGOQRS4SJl9V! z9vL@;E$S%{&szoSao#YF$GOK4_OgxUXMMVu@!y~3phe-`IOXC2PXqOY@1n=B!s`5Y zFsFYz{#m1`>nC}!V7+14$odac>JMmtHXH%GGPil;b~D(pl^vR=EJvPqkw3k@zhH*b z4;bC@($!bkQ|N;ut9w^&CeWhi`oVct`N|{X%>vKYFl))Pr~fr3uK!8~d)uxsYn(eD zx$ni^MhY|CYiolM07ii=ev?)Wbnt?i8ZRJjyjrWGRnKduJmtxL53?9ty+Jb+hVbY_ zJR;~hk81{NG>Q?D&4Bmp$cgc%>Tgl{EA@_yOEm*c4W$RO5Il2P=;;5dFCD`y5~Wl2 z0<%b+$^4u;&cP#_-atv7==3 zb`vdQNW&TsdEj}~_Ix7l9h}%n7Fh4aIDRhtu=fh~G>4=7LQjv4#F%BF--dW(2G6|(~^H`ien9ewouGKEHTA3q4ArDJgf+AU;~ zVQ&cQ-I2a_h`3Q#W35j|c9_SAK3!sl z(f7Nt;~9}I(c8IGK8tQ`j3W2D`z3?c2D|kk+?17d`56XgkI7 zbiC&p)8z!5>rlVZH15-}I0AT|Sl|lS7_O4XAcIjfWlWqu3Mip3&{W1dguU{;(bvdZ!>I6?@2jN1z7JyuF6CQWDZ?*fYwI&r2+m; zC}88uC>FzuJO2sH7aIxTrj@MQ(pPTV*;LM#x$Dfyj%Fqz&C{Z9g8EhQW!;y!GeeroWx}&w4b22# z1GC3_4P$yDPVvBN<+*bvB6bW_L!o<~zr@CQt$?OS{t1m5+X2Fd)$d}I;m+Q51r?j5WS(QTX-aZjDoS_k|2asgS}3fOR@DTb6789pON z=+tvH<&;;9w$k&g%a9iNo8zLXUf&NqPZg{aOB@Wq2xo~qKd?>^_~zeJziV?ddR!0) zB}Lef7I^LA1vKv$2xv!V+JnA3SpM7v`tFTXaOMrLG6(bw$%W<1&i8-ocwPq(q-0W& zWn|OC5fKea3k4%og`^WfAhk%6BoAcMAO(R_w`4^0L^hSrSg5#-jLbM3$)=~;&y*VI zEfM|ad%%qQKS_N9BcOLgbkylU-^fq%Y`Nz3z0CiPe*v?=;_ zWYQvL(l_S$is>r={4+E~Sdt_afN#`Hr*{IyZ*R$rZAC<18F$LBRYP#j4LnDcE<<=j zuKT^BW;(dRk|Zg5bkj%EicI>!l+Ne$I~g6fXZ%6^Iuc4UssCKOE{(D-eBnN? z$jZYcLmK8Xs~pq+kIbCx`R7ZLB>x8Lm1OjON&{unv;KVGHoQ6o%~Y%MBk-Nh`EXAj zUE*oiXIr`dx7E+pzu!Xd32<8FKS`~_Fq`GKMD$JBd@C-?xN1f=EurA5`NuauRRI46 zc7q`DQ;c9mHhZ)`R*VxRMx4nB7{nAU+8h*{HJj zXlCSif&VCYQcUYSTB{1D}2S3g>{4g>J~VZcTDEi^Zscpl^o8J>JMQ(taX4+&-Omh zR9}2|jPIc4SYqQvHj5rVqr9T9IJig-5&H{LLh;VV=X?O3^51Z=Eg@T`pOw}h{RYjv4tvY>==8tb2Tx; zn3nT$i}TOpo*6C9bJ;P?5oU5#5L2jn;5z#7w8%q>W(?^g26`=F7k}4?erDe2y?8R6 zdEfU{JyG1LDr@u?MiCe4f6)bl@huHJC$Bu7KEqKIZHZqrq}N@5r#mR$_tQN}HdZp^x55X%_R zC#Ml?3du%>AXo!#tIE!d$k2R^p{e8fLB@Y7F4d;++r}yP+8_LE>#H*oziUYE;E&lB z+ay<9%kMb|DH4=r&M3se{g>=Bj+{mi1`s0g*2uKwUa>$~UkneD2V6 z_q$%Jom;;H=d0TfIEJ*ZT`sG}_x8sCENe(tXde5^PW4#{-_A4VE_5DCq4|-M4VQ`G z)m2ycR6LElt~x#XF82)Ne{}pWN-A~e>ZE@ufX#t_3Rm#Fle_ZgJio_)oBL{9T+jxs z80r_1XIPm^J^Gl+prQB02!r54jKoV686#u+Y3^+JwF%PryG+ zOG@Ul0Fep$KN4S5AahAgE^`o>F?}I(F|3Q0oa=Vc|AlNYel$3bTzLJ&6GtjyN_5zIbCnG!7e^66@c_B%X zC)OP~v7WfZ7<52JL=^c_StszqBs}&zfR%FrQF!Qkk|a@`Bnrot?8VudjO^58`2RB* zdAcK_Pw2i(*@mYe!!x222Co1kIY)qhDyJmE{F4`AREw3 z%yqsX)4#gMyEPf!`)i8c;xTwnX8cOxq!Bz8e>v~%k|g=V*N%GUk%+1!Nj~?){fUfR z=Tgmw&5cM1yMnR0@SrRg1;1y2s#9(5`-6Laf8_YBQc zEl*tMCXnq(*a014m zq3c#?xsTw%C7x*CU5si#J0c5FbUgD|pBU*P624Cw2b4$Hd9ToOAvWm+NZE^tk zL$*Tr18oembA6MAmYk-85uDdwhuY@nGFTsc&pq!;91qa*CcEl`_p3E(Od5g=Yhb5= zdIG(6@@-=oV4}+NPDMXCAg&?3fsGxNc&L+tX{jf1RM}J-99jmqr}!`mEwJGjJJ=28 zLHG+c+eHEUv5Y7STue~9MP%2F$8=>XMKjN|@R=M1ib9^nGwPuq!2E_Ztg(~_o<}#N z)mQ?}wI<`adglLy@6wp~xozop?b6|Sw;nqN@EnUHY(#v5J#J2!uF$#^oU;)$dUY!7 z#mMOL4SN?v>yroHIP(~`%}+iM_eSG^&D@fzvWEPt^4{{G_HMX+Md;r zhKfyAWm~uZP+##4&{sI`%4R1hzbsQ{_Z~tr7-(ahA?@i{83n;WKr{Qm0h|V|<$Y~P z13kUju*&pIVZa*m?m`?irqsC9zBU6i?BM?#tSHn6Rdzr#cDE7#^D_e?8qyPJ5T3{u zz;zGDn-QR8@M6b&`iOHcYz^y;&)Q_}ngM39-ulL_jfa%p1FRQO7K3Nli=^p{v;$bg zkd{+CFaKa3Lt4C3h38qy{4V?$ed7X~X6*@%5dnLWq0^y_8Ut8Es&LBB7IB!h%k`QC z^-LT8j-+#|@gNY#91FPp+$qaOj&n8e{Q@f9Ixrtk@UO=*CtdeeR`6sWaoXukHx@Re zePtutmW^cTlvg<4q=;VdMJSx{qN4Gv4(y$yJ;HZCs-ArqY)Cg026t@lGSg@TBY+1) zm{&k9c|F43eh+<-DeZxy%_y$m54Xr$>d3RaXCJfB`z}MnZ&*i}2X5y+G~d?%unHx= zAPut`(#-RZ;3M}o9(HARAf6P)VBT{(4=yeq?+-p2m|t2qx7P^hFcOqLcyj7wXoh&q z!iP%6XTATR^hVHFox)#%_MRDM+47Fw$fOZ*uV5V(IhV;8yx@E@x#4$4ZC2qJr>gu3 z=lOZhE;K4W$O7fX5PF6HtjBnFdrdu>qgQ2aB?*F zc>jkpq!nN1o@bTIze@JbaB_L&DbL+!P^X6>Ucyp_G;F%9AXCFGNON3*aB*cg|J-8; zYG%B?-eB=$=T3Q_`0(8GOm74p~r_uV)7SkY<=1B-m~Jnml(Q;^_zT%!3`$?)Q3sj@rW(&@PCRt54@Xt%7!iM z<7j;8nx`3X4mRH4Sr2>EIWwXZze%`B1&U(B2Jt04soZ zWcWtr;4=~B1LkuNle0Xf^G~ZD$z&qhI64T(SITWaMWpFi|4hF5JOi*y zza^VNXYV{;leyjfo!W2I=luI=rfd>RY+|3uWJAbe>S-Uap8G&%-2M%H+S+;VD;b{J z644I8Ly{yPC*b~zh>Di^Ixd(^=}am_#&96RgL{|{!K}&X6s=b@ zlr&DixKQ)&bU+>XRzprLYpnomhN1tQN1u}<8FiU-1Zds77&tbXo=f>HCy#pb(52r} z{=I>d)uuzveVh077#?zEr>D%!qGNx9Jy!b0ohe~cfw_Y&gOKs>##fgZjxgzaqNc22 z+O`xY#n-7#m~=ev07$y4l#IdpnT%5R)%i}wu-%YV0-wnWNRUQlM1P?Uqe(V2yn{`N z=x@eX0eC}3k^M*01XJ4HkWK$~gZUvPla7eU7;w3(7?d2Q&X1PGGSL2t%p#LeV6)}} z*pzWZL?7K0Q38%J{gw>h>|j!9U7Im|B%+UGH^w?na!p1a6KXLo(M;nshY?N0skbPQ zE^!LLrh@u|I2BiH93Ff-GDdqaeH?ED3o?9t+DIziDq*~~PkmBeahn;LIoc9Y$kCAY z?#!@vLo}_poo_^8W1|B^<_FUQo6?cU>Uj6JK;E<2oN1ZlcwvW-q`lpD@uo8JiHywj zIUSOB8f_0SqTlp7{Wrif zu_xo@==;8gEg1u)*J8{9@t#yJUbVRUgFQ*^^ml#0z*;CmKxW z1KEXTPh^e;x$G+uZJb=XDG}W%Z|Daydg5aYPc9oaCE2{zYqAS%RK4k(fDJjp3gt=f z!Y2!BNyY#^dY-={YlwX#qCYi1JH~WIL>bJT6>+9`Pd=5w+U0Ri`S(4{r-H>ONXf`| zNj69NC}YNfQJyg7(cj6)v3OzYo^`imQTG49l9XBOc3e#>~j)5!HWNs^MsQ8o${5!GW(Iy`n< zHHIeYv5`>r&XMLjp^HCB)0N?N*SSOu;uXkOT%U;2lS=gMT=o|Ob zfv>`qer_C|Jd+ooAzIvMPkgH-Wf46tgazuYp;8jfMBXHTO`Ejk{~ys2>kJzgdEno@ zE-??FX^m#SdSHf&h8U4z5d*UeICZ`J%KhEK#-cuT@ivhwyldfmn7HDrUDui33jM%)p|hoJ2|pV`Pwv4x zdi-GTBV`@$l`-*N3#joddcG%6Mx^102&svEFRxj^V(hwqNVvAX^PEV6__X6)eG#+o zF_o_!xd@SuZDUSg;i@l8!=i@tk^pN&7bEMRjOoavMFU>QQvS)iMfd1*R`I*sWH{5j)+ZLZsR6-{F%%K89fv=8PXI2+ZWef`mZ`7ht*U(G2q(h`Bi{rv*xj1Y?JHY&6mPEH}qW}u0ba%!#}$e4L4X2 zU=!;PHe%5Hl<8G@=3TfneQaFxIu`m-fam|GGJbC`9oQq3UYd?e!dRU;7vRc6Gk#V8 zpW0sl@8)M)Z+Px#1am@3R0s$N2z&@+hyVZvMoC0LRA__eqN`a*kqTT1lzt*6g(&iVJb_x5=?mk=bjTrQ8NMcO=#204I` zML-6FQvpr{Q8WO6c^n`sfqEIZ3&?*+5;}O)*49~cW+)hWk($nQ?S?c6n!Ny(f>{qD zjUq?P5{TLXZiFm-XV#l~)XGs6!Fo%@4wg{?;$nbQ{Sg6XFg1~Yy7t_ zV<8E23JhJKiTDJ;%raN~uB&fW?m_{&c0(F85hgH~Dh(VEM2(Q93`#C_!QT!#i?IwO z-kLYD0Ki-d5^w1&#xj4q`aHq~E!EMs*uh!?9ria!Fkx_mb}XUt+V<*kU)uX5IJ?!5 z5*a040)^;a^%sVDa>D-BjeJx8TutW`yrsjqT$HI9K&C3m1&=Pfz=fST^?lwNdA*0T zTMa1-L@WSgiZV54w;EEsHS#F9prtxGGD^IJg&}sD%*ZJ5Qb9{~w5J9h1>0f=Ys2=Q z^#(y_iyf@>{Iwf&7GoKhz6f4cA%OTjb8h`v7xQd`uHBFZ5^sT!7@Ew21j7opZ=5|j zalNE95vBz%761r|&_tMA%`@0)HWm`m)zD=Xe3<#onRD;wMwkRT75bEd%WO?f!Fo%@ zj*zW-LJ32sw^Zzy{^%6UGAiaLqu?`B8v)LpiU;a1-opiE$WpplZ|ZT3uwz>$ti>ip z#NpJMcX4#p+X{LUIW#&iX_~*atq+te$;J1teuToLP1qK{L7^9iM%r?@JYHO^9Z&-DHG(5upW^=b6aSqtOZH(~vPg@xdEqElAD@ZpjD1KDV*vyx z766Dev`CvLI`)mj2Mq~0l2(F!%eFgh0gIjXtwD|m2w4CJnx`rxN5tXen*G=ux7KMJ zw2!GG)`5^EI!*-UpY^dT@yXf)SQ?q&v^|w3aQx0$mBa!BWQdOAkNM^Ggbg^Eu^(DZ zl+z}$jH>RhaC7vYYH=8xDgvCS@`;OI>{+@E73rnW(DMton)?^<+fbLv(Kt~AQS^M> z!Ut1#;^2y%F7}I0+HkSIP5ppG(SC2lyJL4s9uBQ2b{Qpa7}IyT6>Ay3gPI2y)JV%M z;f{5d*_Ml|RRsg`}xV5P2{t^RIBVPL%(|2L-D{r{i2c||)efMifEGtQ8 zZkWdffUHXUf0p@yQ!D^%id&6ySx1q(c%8>Sp2SKl<3#uQIe)CcAge&2UZvf??YrhO z8p#ohQNOMn2U3e%+ItcU0H+@|;rhs5N>lL(0`&@xlXqn_TW{h-_jwo58WM15MKS8u zm1B`61^}>cS%F8f*GIbX&7&5jY4{8ScQtA6>(&FbeeUM&xi|h8e?NVUg2aswX00$+ zMlV58Qa0km7#vP3aohi?G=UFqpT@A=rZfdV;2#7@LPwx(JdHE}ERRaU!Bp3$@icY+ z{D{7Z{{l_HCnO0S0*~6-z$^vo%$sOWScY%or~dXpL;D7^#G|%0p|j}BkfVSkaQqQH zDcezVKY0JQE)cbM7M&S-HdEk6wfy=j`rM6g zLwRMUHmBhB+`20unAHw8TlD9>zo;F;I|TF0f;MsHcPw*NFb>n2tv7*g;80pIejWT% zZTDVbnX6`gc0C`qR9>9d8Z0#-YBcB8?w)CKUBF6H1~3$_puz@*71ESpw%J9nS#Ror zz{f(9RS*&Qn7h(Mw_6nE-1@T&ZU}x>!GXaI?&>=LFI7C+v4l#n`cLhk!!T>d5-L4? z?RC2{yVZ~q87;PA;nZq%O^)01y_F!oEIph}XHI?JkB+0000Px#1am@3R0s$N2z&@+hyVZrYe_^wR7i=vmQ6@hQ5462=e}nc<7dV|3p1r69h^WI z2P%pr+O%;|AT5H(U4+dv8>Mz_ikXZS5iwHKW}sO_t->$}vQeRhSeT(^ZKkDfp$PB8?4{yxh zE1GZ#aDXb&guO9;Z)PxEK`Qfb3E&OVLicJV0;w}k*yEIzc{arjQ@MxRLbD3Mvh3g% z!U3vMOeA>~t(h%^r=_*gq>}f%bRDj4A>7=P)e}i{nW-k)w6-Y|UwtP>Yg_S6-OsT~ zI!wT|S$JJpCBc2&>?wD0>Ek`7et*ri)McWz6Uo}pS=CVP`i=!mEPj0s>EDqtn-ljM1iZhv`N zbml@2OJC+x`@bU-l9d>yaw9~G nMhj8HRPOcgq?Jco@!RqjV0`6=1Uy@A00000NkvXXu0mjf(1}1| literal 0 HcmV?d00001 diff --git a/crmeb/public/install/images/install/tab.png b/crmeb/public/install/images/install/tab.png old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/tips_system.png b/crmeb/public/install/images/install/tips_system.png old mode 100644 new mode 100755 diff --git a/crmeb/public/install/images/install/trip-icon.png b/crmeb/public/install/images/install/trip-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..4d50edbda0d29359e9d265c0bf5bba37e271f3d2 GIT binary patch literal 777 zcmV+k1NQuhP)Px#1am@3R0s$N2z&@+hyVZrvq?ljR7i=XmcLI^Q5c4w@Ags}Borth#%LHYF_EET zM~MVTa3n?t1_mR#;ObwXi-|uLj3x|CbaB+AB^o9YHaiew6k?;1Ktqu>6p)DEJ`w2!P}MaN(!gRsN|3U_FjDeZC_GmzL7KoaF8Yoo}nd}+fN_hga$?&+M zaX~^SgaM#vQILtqNbc>Cz-%%+4!i;E<0cb33=%-gn_gT8xV0Z@)r!nqdsNZ57p$p! zgpR=#I<9^tcfI5#IP_u0eUAzlogV=;F-1Zs{(5eLDI={OR3m{u+ zn*s)owN)j-NWGyI6AM7J%Gd>3BGaZ$xA?1G@2s2J_88ViB0Qvq_Y6RHvh~_27y}jh zHxl6?OGL+vU2tF<-QrJQRuLVu5Q+IQxuw-QyPWd{L?mY6ns4VJxZ@M3+Ginj`GOSp zt#Ds$Ch4`j2OX4Z{Y`eAEx&dw&^14XO5t;r?BH&H_leUr8<8|huQ4#6qO|%Nx3rG> z{f8oH8`VYdcT)c>-SY>k$z{P(mG>ue`Fz}73`tq@eEPb ze#Tc2{$Cr3@Q{d(AreEi52X4O>KYPx#1am@3R0s$N2z&@+hyVZr;z>k7R5*>Dl|g7!R}_Z7^YTK>Brz7c$iiiWP+YWR zX5K3ZP9PxCg-9b5jG&l>7AZ4?P(cd=jkrkTj1;OHX~en+7<5svi^vQJ=FLo`uF5RB z>|z#z6PP>=eRGeCnHMKxMxFetd(VIF|G#tJJ@*P9Kq8m6{h{hHG4dS{1;(0G1yN6t zKO?nQ_wy4=Z#rp6C&FDzCbUOxwTN~?MU=~)lezoJ22L?G3;fa&@>KPS3ja2j9kk#m zkO1sv&L91o!{_o7>7Z51rVUOpbs4zcoW8)w#e#do+vPjv$Jb}aY-4@}CV}bKgB$yR zQ>{r>`zlp^2?W4O|K_W&JBS1DJi1u!-yA*;+-xjn%JGuP)|_3pC|*cKYyMXGpNZdU zoy6PW6jKj?Z&7MS>_esaLS;tgtKEpU;(2uOrNA8kQJvml;72y*0arw>xNFJ8UQICdN6pdL`1>0uplEGw;H9fU0UCkIoz!{Kqy2Eq$OymjM)=+3QaRi1_>G4fe_KPI_k` zy|)o+0tak0x4IGiBKQ4ZypW0lpWfH;N&M`7qaBpNkY7oLLBxh9QXWpIb-650(z39cV`Q7Oc zAdx$}&yO6K7R&kuRd?G=D5I>a%5uct|5y7f){3{H0T1zpOa2-F0000Px#1am@3R0s$N2z&@+hyVZrPf0{UR7i=Hmd{I6Q545N=gw#%zBfu>lA9K@G^jU= zpiKrYg#;G{LWsCE5|ZdY2wW&hZCWHzWSbai9q1y07Q-xDg$oI+Q3z+oNl1P7w3umT zGUv|qtnPj1`{UfhJMTWh5v3?h8|;LIVMK<2fm*77>ZXBpi+PvImA6`HNGo9#T@V;^ z74SC{vZ6A7meGF(#Y`|G$|6FKk9d)Ceh}0IYVT~&=`O3@HT(} z(;ib3-TmHJ|M=!zj1egK0PWrmdRW13fAtm@C?r*N6Os09I{MAw{qgg(2Nm*3gbiTC zhY;sKdy7{c^pio&sxQ7{bdrwINpF1{CtoL1x$;&y6J*;>bLaRpU5}Tln?!=+wO3AY zfoxyCxNQJbWge(F3H^ihwYfCtKmt&SPx#1am@3R0s$N2z&@+hyVZr6-h)vR7i=n)IVqwQ5?YW@9%o1)m)2%gM&CZNKmNQ zOH==V2O@EBv(Ul8MUWtv2pvQOogAVhip0TLP&!l)v5TC8wn>hHLkS%^IA&CGrB<)^ z9Fm4hb4in${>I;XzxUz&evc>YW5n!~F=h-uQHmo&`-Pb0OmZZme*~@wf(#nCWIxh3 zqCc}B=|*bRN4EwFO)X|l_&RgIco1>o+3LVrXO=TbgwF`acOn4VAdrM}?|}v%5R68u zDqHI6HUj+Lj2iQJ4RW)Y6kJaOkaok>uSs-(RPBb?mO}P_ihL@W)!ni#%MIM z0CGNL%TrLtfcE|iUrJ`q+6`$!yJMl1u6XKnaVr0#m+j4;p<)%>ur_uKr5^W+v_Sn} zf~*`|Kb-Fssn>)=y^X^*FcDhiZ(S@UUVQBb3jI_oR>AeruK{ge2_oTv)7002ovPDHLk FV1hb<7`Ffb literal 0 HcmV?d00001 diff --git a/crmeb/public/install/index.php b/crmeb/public/install/index.php old mode 100644 new mode 100755 index a8d9b056b..02c3a6ed5 --- a/crmeb/public/install/index.php +++ b/crmeb/public/install/index.php @@ -2,26 +2,28 @@ //文件签名 $fileValue = ''; //最低php版本要求 -define('PHP_EDITION', '7.1.0'); +define('PHP_EDITION', '7.2.0'); //服务环境检测 -if (function_exists('saeAutoLoader') || isset($_SERVER['HTTP_BAE_ENV_APPID'])) +if (function_exists('saeAutoLoader') || isset($_SERVER['HTTP_BAE_ENV_APPID'])) { showHtml('对不起,当前环境不支持本系统,请使用独立服务或云主机!'); +} define('APP_DIR', _dir_path(substr(dirname(__FILE__), 0, -15)));//项目目录 define('SITE_DIR', _dir_path(substr(dirname(__FILE__), 0, -8)));//入口文件目录 if (file_exists('../install.lock')) { - showHtml('你已经安装过该系统,如果想重新安装,请先删除install目录下的 install.lock 文件,然后再安装。'); + showHtml('你已经安装过该系统,如果想重新安装,请先删除public目录下的 install.lock 文件,然后再安装。'); } + @set_time_limit(1000); -if (PHP_EDITION > phpversion()) { - showHtml('您的php版本过低,不能安装本软件,请升级到' . PHP_EDITION . '或更高版本再安装,谢谢!'); +if (PHP_EDITION >= phpversion()) { + showHtml('您的php版本过低,不能安装本软件,兼容php版本7.2~7.4,谢谢!'); } -if (phpversion() > '8.0') { - showHtml('您的php版本太高,不能安装本软件,兼容php版本7.1~7.4,谢谢!'); +if (phpversion() > 8.0) { + showHtml('您的php版本太高,不能安装本软件,兼容php版本7.2~7.4,谢谢!'); } -define("CRMEB_VERSION", '20180601'); + date_default_timezone_set('PRC'); error_reporting(E_ALL & ~E_NOTICE); header('Content-Type: text/html; charset=UTF-8'); @@ -46,160 +48,102 @@ $step = $_GET['step'] ?? 1; //地址 $scriptName = !empty($_SERVER["REQUEST_URI"]) ? $scriptName = $_SERVER["REQUEST_URI"] : $scriptName = $_SERVER["PHP_SELF"]; -$rootpath = @preg_replace("/\/(I|i)nstall\/index\.php(.*)$/", "", $scriptName); +$rootPath = @preg_replace("/\/(I|i)nstall\/index\.php(.*)$/", "", $scriptName); $domain = empty($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']; if ((int)$_SERVER['SERVER_PORT'] != 80) { $domain .= ":" . $_SERVER['SERVER_PORT']; } -$domain = $domain . $rootpath; +$domain = $domain . $rootPath; switch ($step) { - case '1': include_once("./templates/step1.php"); exit(); case '2': - - if (phpversion() <= PHP_EDITION) { - die('本系统需要PHP版本 >= ' . PHP_EDITION . '环境,当前PHP版本为:' . phpversion()); + if (phpversion() <= PHP_EDITION || phpversion() > 8.0) { + die('本系统需要PHP为 7.2~7.4 版本,当前PHP版本为:' . phpversion()); } - $phpv = @ phpversion(); + $passOne = $passTwo = 'yes'; $os = PHP_OS; - //$os = php_uname(); - $tmp = function_exists('gd_info') ? gd_info() : array(); $server = $_SERVER["SERVER_SOFTWARE"]; - $host = (empty($_SERVER["SERVER_ADDR"]) ? $_SERVER["SERVER_HOST"] : $_SERVER["SERVER_ADDR"]); - $name = $_SERVER["SERVER_NAME"]; - $max_execution_time = ini_get('max_execution_time'); - $allow_reference = (ini_get('allow_call_time_pass_reference') ? '[√]On' : '[×]Off'); - $allow_url_fopen = (ini_get('allow_url_fopen') ? '[√]On' : '[×]Off'); - $safe_mode = (ini_get('safe_mode') ? '√ 关闭' : '√ 启用'); - - $err = 0; - if (empty($tmp['GD Version'])) { - $gd = '√ 未安装'; - $err++; - } else { - $gd = '√ ' . $tmp['GD Version']; - } - - - if (extension_loaded('redis')) { - $redis = '√ 已安装'; - } else { - $redis = '√ 点击查看帮助'; - $err++; - } - - if (function_exists('mysqli_connect')) { - $mysql = '√ 已安装'; - } else { - $mysql = '√ 请安装mysqli扩展'; - $err++; - } + $phpv = phpversion(); if (ini_get('file_uploads')) { - $uploadSize = '√ ' . ini_get('upload_max_filesize'); + $uploadSize = '对' . ini_get('upload_max_filesize'); } else { - $uploadSize = '√禁止上传'; + $passOne = 'no'; + $uploadSize = '错禁止上传'; } if (function_exists('session_start')) { - $session = '√ 启用'; + $session = '对启用'; } else { - $session = '√ 关闭'; - $err++; + $passOne = 'no'; + $session = '错关闭'; + } + if (!ini_get('safe_mode')) { + $safe_mode = '对启用'; + } else { + $passOne = 'no'; + $safe_mode = '错关闭'; + } + $tmp = function_exists('gd_info') ? gd_info() : array(); + if (!empty($tmp['GD Version'])) { + $gd = '对' . $tmp['GD Version']; + } else { + $passOne = 'no'; + $gd = '错未安装'; + } + if (function_exists('mysqli_connect')) { + $mysql = '对已安装'; + } else { + $passOne = 'no'; + $mysql = '错请安装mysqli扩展'; } if (function_exists('curl_init')) { - $curl = '√ 启用'; + $curl = '对启用'; } else { - $curl = '√ 关闭'; - $err++; + $passOne = 'no'; + $curl = '错关闭'; } - if (function_exists('bcadd')) { - $bcmath = '√ 启用'; + $bcmath = '对启用'; } else { - $bcmath = '√ 关闭'; - $err++; + $passOne = 'no'; + $bcmath = '错关闭'; } if (function_exists('openssl_encrypt')) { - $openssl = '√ 启用'; + $openssl = '对启用'; } else { - $openssl = '√ 关闭'; - $err++; + $passOne = 'no'; + $openssl = '错关闭'; } - if (function_exists('finfo_open')) { - $finfo_open = '√ 启用'; - } else { - $finfo_open = '√点击查看帮助'; - $err++; - } - - $folder = array( 'public', - 'public/uploads', 'runtime', ); + foreach ($folder as $dir) { + if (!is_file(APP_DIR . $dir)) { + if (!is_dir(APP_DIR . $dir)) { + dir_create(APP_DIR . $dir); + } + } + if (!testwrite(APP_DIR . $dir) || !is_readable(APP_DIR . $dir)) { + $passTwo = 'no'; + } + } $file = array( '.env', '.version', '.constant', ); - //必须开启函数 -// $disabled = explode(',', ini_get('disable_functions')); -// -// -// if (function_exists('file_put_contents')) { -// $file_put_contents = '√ 启用'; -// } else { -// $file_put_contents = '√ 禁用'; -// $err++; -// } -// if (function_exists('imagettftext')) { -// $imagettftext = '√ 启用'; -// } else { -// $imagettftext = '√ 禁用'; -// $err++; -// } -// if (!in_array('proc_open', $disabled)) { -// $proc_open = '√ 启用'; -// } else { -// $proc_open = '√ 禁用'; -// $err++; -// } -// if (!in_array('pcntl_signal', $disabled)) { -// $pcntl_signal = '√ 启用'; -// } else { -// $pcntl_signal = '√ 禁用'; -// $err++; -// } -// if (!in_array('pcntl_signal_dispatch', $disabled)) { -// $pcntl_signal_dispatch = '√ 启用'; -// } else { -// $pcntl_signal_dispatch = '√ 禁用'; -// $err++; -// } -// if (!in_array('pcntl_fork', $disabled)) { -// $pcntl_fork = '√ 启用'; -// } else { -// $pcntl_fork = '√ 禁用'; -// $err++; -// } -// if (!in_array('pcntl_wait', $disabled)) { -// $pcntl_wait = '√ 启用'; -// } else { -// $pcntl_wait = '√ 禁用'; -// $err++; -// } -// if (!in_array('pcntl_alarm', $disabled)) { -// $pcntl_alarm = '√ 启用'; -// } else { -// $pcntl_alarm = '√ 禁用'; -// $err++; -// } + foreach ($file as $filename) { + if (!is_writeable(APP_DIR . $filename) || !is_readable(APP_DIR . $filename)) { + $passTwo = 'no'; + } + } + include_once("./templates/step2.php"); exit(); @@ -208,8 +152,9 @@ switch ($step) { $_POST['dbport'] = $_POST['dbport'] ?: '3306'; if ($_GET['mysqldbpwd']) { $dbHost = $_POST['dbHost']; - $conn = @mysqli_connect($dbHost, $_POST['dbUser'], $_POST['dbPwd'], NULL, $_POST['dbport']); -// var_dump(mysqli_connect_errno($conn)); + $conn = mysqli_init(); + mysqli_options($conn, MYSQLI_OPT_CONNECT_TIMEOUT, 2); + @mysqli_real_connect($conn, $dbHost, $_POST['dbUser'], $_POST['dbPwd'], NULL, $_POST['dbport']); if ($error = mysqli_connect_errno($conn)) { if ($error == 2002) { die(json_encode(2002));//地址或端口错误 @@ -219,7 +164,6 @@ switch ($step) { die(json_encode(-1));//链接失败 } } else { - $result = mysqli_query($conn, "SELECT @@global.sql_mode"); $result = $result->fetch_array(); $version = mysqli_get_server_info($conn); @@ -246,10 +190,7 @@ switch ($step) { mysqli_close($conn); exit(json_encode(1));//数据库配置成功 } - } - - } } if ($_GET['redisdbpwd']) { @@ -285,7 +226,6 @@ switch ($step) { include_once("./templates/step3.php"); exit(); - case '4': if (intval($_GET['install'])) { $n = intval($_GET['n']); @@ -302,7 +242,6 @@ switch ($step) { $username = trim($_POST['manager']); $password = trim($_POST['manager_pwd']) ?: 'crmeb.com'; - $email = trim($_POST['manager_email']); if (!function_exists('mysqli_connect')) { $arr['msg'] = "请安装 mysqli 扩展!"; @@ -315,8 +254,8 @@ switch ($step) { } mysqli_set_charset($conn, "utf8"); //,character_set_client=binary,sql_mode=''; $version = mysqli_get_server_info($conn); - if ($version < 5.1) { - $arr['msg'] = '数据库版本太低! 必须5.1以上'; + if ($version < 5.7 || $version >= 5.8) { + $arr['msg'] = '数据库版本必须是5.7版本'; exit(json_encode($arr)); } @@ -328,7 +267,7 @@ switch ($step) { } if ($n == -1) { $arr['n'] = 0; - $arr['msg'] = "成功创建数据库:{$dbName}
"; + $arr['msg'] = "成功创建数据库:{$dbName}"; exit(json_encode($arr)); } mysqli_select_db($conn, $dbName); @@ -344,29 +283,29 @@ switch ($step) { */ $counts = count($sqlFormat); for ($i = $n; $i < $counts; $i++) { - $sql = str_replace('demo.crmeb.com', $_SERVER['SERVER_NAME'], trim($sqlFormat[$i])); + $sql = trim($sqlFormat[$i]); if (strstr($sql, 'CREATE TABLE')) { preg_match('/CREATE TABLE (IF NOT EXISTS)? `eb_([^ ]*)`/is', $sql, $matches); mysqli_query($conn, "DROP TABLE IF EXISTS `$matches[2]"); $sql = str_replace('`eb_', '`' . $dbPrefix, $sql);//替换表前缀 $ret = mysqli_query($conn, $sql); if ($ret) { - $message = '
  • √创建数据表[' . $dbPrefix . $matches[2] . ']完成!' . date('Y-m-d H:i:s') . '
  • '; + $message = '创建数据表[' . $dbPrefix . $matches[2] . ']完成!'; } else { $err = mysqli_error($conn); - $message = '
  • √创建数据表[' . $dbPrefix . $matches[2] . ']失败!失败原因:' . $err . '' . date('Y-m-d H:i:s') . '
  • '; + $message = '创建数据表[' . $dbPrefix . $matches[2] . ']失败!失败原因:' . $err; } $i++; - $arr = array('n' => $i, 'msg' => $message); + $arr = array('n' => $i, 'count' => $counts, 'msg' => $message, 'time' => date('Y-m-d H:i:s')); exit(json_encode($arr)); } else { if (trim($sql) == '') continue; $sql = str_replace('`eb_', '`' . $dbPrefix, $sql);//替换表前缀 + $sql = str_replace('demo.crmeb.com', $_SERVER['SERVER_NAME'], $sql);//替换图片域名 $ret = mysqli_query($conn, $sql); $message = ''; - $arr = array('n' => $i, 'msg' => $message); -// echo json_encode($arr); exit; + $arr = array('n' => $i, 'count' => $counts, 'msg' => $message, 'time' => date('Y-m-d H:i:s')); } } @@ -397,6 +336,7 @@ switch ($step) { , 'eb_system_city' , 'eb_diy' , 'eb_member_ship' + , 'eb_system_timer' , 'eb_member_right' , 'eb_agreement' , 'eb_store_service_speechcraft' @@ -412,8 +352,10 @@ switch ($step) { mysqli_query($conn, "truncate table " . $val[0]); } } - delFile(APP_DIR . '/uploads'); // 清空测试图片 } + + $unique = uniqid(); + //读取配置文件,并替换真实配置数据1 $strConfig = file_get_contents(SITE_DIR . 'install/' . $configFile); $strConfig = str_replace('#DB_HOST#', $dbHost, $strConfig); @@ -423,7 +365,12 @@ switch ($step) { $strConfig = str_replace('#DB_PORT#', $_POST['dbport'], $strConfig); $strConfig = str_replace('#DB_PREFIX#', $dbPrefix, $strConfig); $strConfig = str_replace('#DB_CHARSET#', 'utf8', $strConfig); - // $strConfig = str_replace('#DB_DEBUG#', false, $strConfig); + + //缓存配置 + $cachetype = $_POST['cache_type'] == 0 ? 'file' : 'redis'; + $strConfig = str_replace('#CACHE_TYPE#', $cachetype, $strConfig); + $strConfig = str_replace('#CACHE_PREFIX#', 'cache_' . $unique . ':', $strConfig); + $strConfig = str_replace('#CACHE_TAG_PREFIX#', 'cache_tag_' . $unique . ':', $strConfig); //redis数据库信息 $rbhost = $_POST['rbhost'] ?? '127.0.0.1'; @@ -436,19 +383,11 @@ switch ($step) { $strConfig = str_replace('#RB_SELECT#', $rbselect, $strConfig); //需改队列名称 - $strConfig = str_replace('#QUEUE_NAME#', uniqid(), $strConfig); + $strConfig = str_replace('#QUEUE_NAME#', $unique, $strConfig); @chmod(APP_DIR . '/.env', 0777); //数据库配置文件的地址 @file_put_contents(APP_DIR . '/.env', $strConfig); //数据库配置文件的地址 - //读取配置文件,并替换换配置 -// $strConfig = file_get_contents(SITE_DIR . '/application/config.php'); -// $strConfig = str_replace('CRMEB_cache_prefix', $uniqid_str, $strConfig); -// @chmod(SITE_DIR . '/application/config.php',0777); //配置文件的地址 -// @file_put_contents(SITE_DIR . '/application/config.php', $strConfig); //配置文件的地址 - - //更新网站配置信息2 - //插入管理员表字段tp_admin表 $time = time(); $ip = get_client_ip(); @@ -463,15 +402,8 @@ switch ($step) { $site_url = '\'"http://' . $_SERVER['SERVER_NAME'] . '"\''; $res2 = mysqli_query($conn, 'UPDATE `' . $dbPrefix . 'system_config` SET `value`=' . $site_url . ' WHERE `menu_name`="site_url"'); } - if ($res) { - $message = '成功添加管理员
    成功写入配置文件
    安装完成.'; - $arr = array('n' => 999999, 'msg' => $message); - exit(json_encode($arr)); - } else { - $message = '添加管理员失败
    成功写入配置文件
    安装完成.'; - $arr = array('n' => 999999, 'msg' => $message); - exit(json_encode($arr)); - } + $arr = array('n' => 999999, 'count' => $counts, 'msg' => '安装完成', 'time' => date('Y-m-d H:i:s')); + exit(json_encode($arr)); } include_once("./templates/step4.php"); diff --git a/crmeb/public/install/js/ajaxForm.js b/crmeb/public/install/js/ajaxForm.js old mode 100644 new mode 100755 diff --git a/crmeb/public/install/js/element-ui.js b/crmeb/public/install/js/element-ui.js new file mode 100755 index 000000000..18c1c23d4 --- /dev/null +++ b/crmeb/public/install/js/element-ui.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("vue")):"function"==typeof define&&define.amd?define("ELEMENT",["vue"],t):"object"==typeof exports?exports.ELEMENT=t(require("vue")):e.ELEMENT=t(e.Vue)}("undefined"!=typeof self?self:this,function(e){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=51)}([function(t,n){t.exports=e},function(e,t,n){var i=n(4);e.exports=function(e,t,n){return void 0===n?i(e,t,!1):i(e,n,!1!==t)}},function(e,t,n){var i;!function(r){"use strict";var o={},s=/d{1,4}|M{1,4}|yy(?:yy)?|S{1,3}|Do|ZZ|([HhMsDm])\1?|[aA]|"[^"]*"|'[^']*'/g,a="[^\\s]+",l=/\[([^]*?)\]/gm,u=function(){};function c(e,t){for(var n=[],i=0,r=e.length;i3?0:(e-e%10!=10)*e%10]}};var g={D:function(e){return e.getDay()},DD:function(e){return d(e.getDay())},Do:function(e,t){return t.DoFn(e.getDate())},d:function(e){return e.getDate()},dd:function(e){return d(e.getDate())},ddd:function(e,t){return t.dayNamesShort[e.getDay()]},dddd:function(e,t){return t.dayNames[e.getDay()]},M:function(e){return e.getMonth()+1},MM:function(e){return d(e.getMonth()+1)},MMM:function(e,t){return t.monthNamesShort[e.getMonth()]},MMMM:function(e,t){return t.monthNames[e.getMonth()]},yy:function(e){return d(String(e.getFullYear()),4).substr(2)},yyyy:function(e){return d(e.getFullYear(),4)},h:function(e){return e.getHours()%12||12},hh:function(e){return d(e.getHours()%12||12)},H:function(e){return e.getHours()},HH:function(e){return d(e.getHours())},m:function(e){return e.getMinutes()},mm:function(e){return d(e.getMinutes())},s:function(e){return e.getSeconds()},ss:function(e){return d(e.getSeconds())},S:function(e){return Math.round(e.getMilliseconds()/100)},SS:function(e){return d(Math.round(e.getMilliseconds()/10),2)},SSS:function(e){return d(e.getMilliseconds(),3)},a:function(e,t){return e.getHours()<12?t.amPm[0]:t.amPm[1]},A:function(e,t){return e.getHours()<12?t.amPm[0].toUpperCase():t.amPm[1].toUpperCase()},ZZ:function(e){var t=e.getTimezoneOffset();return(t>0?"-":"+")+d(100*Math.floor(Math.abs(t)/60)+Math.abs(t)%60,4)}},y={d:["\\d\\d?",function(e,t){e.day=t}],Do:["\\d\\d?"+a,function(e,t){e.day=parseInt(t,10)}],M:["\\d\\d?",function(e,t){e.month=t-1}],yy:["\\d\\d?",function(e,t){var n=+(""+(new Date).getFullYear()).substr(0,2);e.year=""+(t>68?n-1:n)+t}],h:["\\d\\d?",function(e,t){e.hour=t}],m:["\\d\\d?",function(e,t){e.minute=t}],s:["\\d\\d?",function(e,t){e.second=t}],yyyy:["\\d{4}",function(e,t){e.year=t}],S:["\\d",function(e,t){e.millisecond=100*t}],SS:["\\d{2}",function(e,t){e.millisecond=10*t}],SSS:["\\d{3}",function(e,t){e.millisecond=t}],D:["\\d\\d?",u],ddd:[a,u],MMM:[a,h("monthNamesShort")],MMMM:[a,h("monthNames")],a:[a,function(e,t,n){var i=t.toLowerCase();i===n.amPm[0]?e.isPm=!1:i===n.amPm[1]&&(e.isPm=!0)}],ZZ:["[^\\s]*?[\\+\\-]\\d\\d:?\\d\\d|[^\\s]*?Z",function(e,t){var n,i=(t+"").match(/([+-]|\d\d)/gi);i&&(n=60*i[1]+parseInt(i[2],10),e.timezoneOffset="+"===i[0]?n:-n)}]};y.dd=y.d,y.dddd=y.ddd,y.DD=y.D,y.mm=y.m,y.hh=y.H=y.HH=y.h,y.MM=y.M,y.ss=y.s,y.A=y.a,o.masks={default:"ddd MMM dd yyyy HH:mm:ss",shortDate:"M/D/yy",mediumDate:"MMM d, yyyy",longDate:"MMMM d, yyyy",fullDate:"dddd, MMMM d, yyyy",shortTime:"HH:mm",mediumTime:"HH:mm:ss",longTime:"HH:mm:ss.SSS"},o.format=function(e,t,n){var i=n||o.i18n;if("number"==typeof e&&(e=new Date(e)),"[object Date]"!==Object.prototype.toString.call(e)||isNaN(e.getTime()))throw new Error("Invalid Date in fecha.format");t=o.masks[t]||t||o.masks.default;var r=[];return(t=(t=t.replace(l,function(e,t){return r.push(t),"@@@"})).replace(s,function(t){return t in g?g[t](e,i):t.slice(1,t.length-1)})).replace(/@@@/g,function(){return r.shift()})},o.parse=function(e,t,n){var i=n||o.i18n;if("string"!=typeof t)throw new Error("Invalid format in fecha.parse");if(t=o.masks[t]||t,e.length>1e3)return null;var r={},a=[],u=[];t=t.replace(l,function(e,t){return u.push(t),"@@@"});var c,h=(c=t,c.replace(/[|\\{()[^$+*?.-]/g,"\\$&")).replace(s,function(e){if(y[e]){var t=y[e];return a.push(t[1]),"("+t[0]+")"}return e});h=h.replace(/@@@/g,function(){return u.shift()});var d=e.match(new RegExp(h,"i"));if(!d)return null;for(var f=1;fe?u():!0!==t&&(r=setTimeout(i?function(){r=void 0}:u,void 0===i?e-a:e))}}},function(e,t,n){(function(e,i){var r;(function(){var o,s=200,a="Unsupported core-js use. Try https://npms.io/search?q=ponyfill.",l="Expected a function",u="__lodash_hash_undefined__",c=500,h="__lodash_placeholder__",d=1,f=2,p=4,m=1,v=2,g=1,y=2,b=4,_=8,w=16,x=32,C=64,k=128,S=256,D=512,E=30,$="...",T=800,M=16,N=1,P=2,O=1/0,I=9007199254740991,A=1.7976931348623157e308,F=NaN,L=4294967295,V=L-1,B=L>>>1,z=[["ary",k],["bind",g],["bindKey",y],["curry",_],["curryRight",w],["flip",D],["partial",x],["partialRight",C],["rearg",S]],R="[object Arguments]",H="[object Array]",j="[object AsyncFunction]",W="[object Boolean]",q="[object Date]",Y="[object DOMException]",K="[object Error]",U="[object Function]",G="[object GeneratorFunction]",X="[object Map]",Z="[object Number]",J="[object Null]",Q="[object Object]",ee="[object Proxy]",te="[object RegExp]",ne="[object Set]",ie="[object String]",re="[object Symbol]",oe="[object Undefined]",se="[object WeakMap]",ae="[object WeakSet]",le="[object ArrayBuffer]",ue="[object DataView]",ce="[object Float32Array]",he="[object Float64Array]",de="[object Int8Array]",fe="[object Int16Array]",pe="[object Int32Array]",me="[object Uint8Array]",ve="[object Uint8ClampedArray]",ge="[object Uint16Array]",ye="[object Uint32Array]",be=/\b__p \+= '';/g,_e=/\b(__p \+=) '' \+/g,we=/(__e\(.*?\)|\b__t\)) \+\n'';/g,xe=/&(?:amp|lt|gt|quot|#39);/g,Ce=/[&<>"']/g,ke=RegExp(xe.source),Se=RegExp(Ce.source),De=/<%-([\s\S]+?)%>/g,Ee=/<%([\s\S]+?)%>/g,$e=/<%=([\s\S]+?)%>/g,Te=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Me=/^\w*$/,Ne=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Pe=/[\\^$.*+?()[\]{}|]/g,Oe=RegExp(Pe.source),Ie=/^\s+|\s+$/g,Ae=/^\s+/,Fe=/\s+$/,Le=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,Ve=/\{\n\/\* \[wrapped with (.+)\] \*/,Be=/,? & /,ze=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g,Re=/\\(\\)?/g,He=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,je=/\w*$/,We=/^[-+]0x[0-9a-f]+$/i,qe=/^0b[01]+$/i,Ye=/^\[object .+?Constructor\]$/,Ke=/^0o[0-7]+$/i,Ue=/^(?:0|[1-9]\d*)$/,Ge=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,Xe=/($^)/,Ze=/['\n\r\u2028\u2029\\]/g,Je="\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff",Qe="\\xac\\xb1\\xd7\\xf7\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf\\u2000-\\u206f \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",et="[\\ud800-\\udfff]",tt="["+Qe+"]",nt="["+Je+"]",it="\\d+",rt="[\\u2700-\\u27bf]",ot="[a-z\\xdf-\\xf6\\xf8-\\xff]",st="[^\\ud800-\\udfff"+Qe+it+"\\u2700-\\u27bfa-z\\xdf-\\xf6\\xf8-\\xffA-Z\\xc0-\\xd6\\xd8-\\xde]",at="\\ud83c[\\udffb-\\udfff]",lt="[^\\ud800-\\udfff]",ut="(?:\\ud83c[\\udde6-\\uddff]){2}",ct="[\\ud800-\\udbff][\\udc00-\\udfff]",ht="[A-Z\\xc0-\\xd6\\xd8-\\xde]",dt="(?:"+ot+"|"+st+")",ft="(?:"+ht+"|"+st+")",pt="(?:"+nt+"|"+at+")"+"?",mt="[\\ufe0e\\ufe0f]?"+pt+("(?:\\u200d(?:"+[lt,ut,ct].join("|")+")[\\ufe0e\\ufe0f]?"+pt+")*"),vt="(?:"+[rt,ut,ct].join("|")+")"+mt,gt="(?:"+[lt+nt+"?",nt,ut,ct,et].join("|")+")",yt=RegExp("['’]","g"),bt=RegExp(nt,"g"),_t=RegExp(at+"(?="+at+")|"+gt+mt,"g"),wt=RegExp([ht+"?"+ot+"+(?:['’](?:d|ll|m|re|s|t|ve))?(?="+[tt,ht,"$"].join("|")+")",ft+"+(?:['’](?:D|LL|M|RE|S|T|VE))?(?="+[tt,ht+dt,"$"].join("|")+")",ht+"?"+dt+"+(?:['’](?:d|ll|m|re|s|t|ve))?",ht+"+(?:['’](?:D|LL|M|RE|S|T|VE))?","\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])","\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",it,vt].join("|"),"g"),xt=RegExp("[\\u200d\\ud800-\\udfff"+Je+"\\ufe0e\\ufe0f]"),Ct=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/,kt=["Array","Buffer","DataView","Date","Error","Float32Array","Float64Array","Function","Int8Array","Int16Array","Int32Array","Map","Math","Object","Promise","RegExp","Set","String","Symbol","TypeError","Uint8Array","Uint8ClampedArray","Uint16Array","Uint32Array","WeakMap","_","clearTimeout","isFinite","parseInt","setTimeout"],St=-1,Dt={};Dt[ce]=Dt[he]=Dt[de]=Dt[fe]=Dt[pe]=Dt[me]=Dt[ve]=Dt[ge]=Dt[ye]=!0,Dt[R]=Dt[H]=Dt[le]=Dt[W]=Dt[ue]=Dt[q]=Dt[K]=Dt[U]=Dt[X]=Dt[Z]=Dt[Q]=Dt[te]=Dt[ne]=Dt[ie]=Dt[se]=!1;var Et={};Et[R]=Et[H]=Et[le]=Et[ue]=Et[W]=Et[q]=Et[ce]=Et[he]=Et[de]=Et[fe]=Et[pe]=Et[X]=Et[Z]=Et[Q]=Et[te]=Et[ne]=Et[ie]=Et[re]=Et[me]=Et[ve]=Et[ge]=Et[ye]=!0,Et[K]=Et[U]=Et[se]=!1;var $t={"\\":"\\","'":"'","\n":"n","\r":"r","\u2028":"u2028","\u2029":"u2029"},Tt=parseFloat,Mt=parseInt,Nt="object"==typeof e&&e&&e.Object===Object&&e,Pt="object"==typeof self&&self&&self.Object===Object&&self,Ot=Nt||Pt||Function("return this")(),It=t&&!t.nodeType&&t,At=It&&"object"==typeof i&&i&&!i.nodeType&&i,Ft=At&&At.exports===It,Lt=Ft&&Nt.process,Vt=function(){try{var e=At&&At.require&&At.require("util").types;return e||Lt&&Lt.binding&&Lt.binding("util")}catch(e){}}(),Bt=Vt&&Vt.isArrayBuffer,zt=Vt&&Vt.isDate,Rt=Vt&&Vt.isMap,Ht=Vt&&Vt.isRegExp,jt=Vt&&Vt.isSet,Wt=Vt&&Vt.isTypedArray;function qt(e,t,n){switch(n.length){case 0:return e.call(t);case 1:return e.call(t,n[0]);case 2:return e.call(t,n[0],n[1]);case 3:return e.call(t,n[0],n[1],n[2])}return e.apply(t,n)}function Yt(e,t,n,i){for(var r=-1,o=null==e?0:e.length;++r-1}function Jt(e,t,n){for(var i=-1,r=null==e?0:e.length;++i-1;);return n}function wn(e,t){for(var n=e.length;n--&&ln(t,e[n],0)>-1;);return n}var xn=fn({"À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","Ç":"C","ç":"c","Ð":"D","ð":"d","È":"E","É":"E","Ê":"E","Ë":"E","è":"e","é":"e","ê":"e","ë":"e","Ì":"I","Í":"I","Î":"I","Ï":"I","ì":"i","í":"i","î":"i","ï":"i","Ñ":"N","ñ":"n","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","Ù":"U","Ú":"U","Û":"U","Ü":"U","ù":"u","ú":"u","û":"u","ü":"u","Ý":"Y","ý":"y","ÿ":"y","Æ":"Ae","æ":"ae","Þ":"Th","þ":"th","ß":"ss","Ā":"A","Ă":"A","Ą":"A","ā":"a","ă":"a","ą":"a","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","ć":"c","ĉ":"c","ċ":"c","č":"c","Ď":"D","Đ":"D","ď":"d","đ":"d","Ē":"E","Ĕ":"E","Ė":"E","Ę":"E","Ě":"E","ē":"e","ĕ":"e","ė":"e","ę":"e","ě":"e","Ĝ":"G","Ğ":"G","Ġ":"G","Ģ":"G","ĝ":"g","ğ":"g","ġ":"g","ģ":"g","Ĥ":"H","Ħ":"H","ĥ":"h","ħ":"h","Ĩ":"I","Ī":"I","Ĭ":"I","Į":"I","İ":"I","ĩ":"i","ī":"i","ĭ":"i","į":"i","ı":"i","Ĵ":"J","ĵ":"j","Ķ":"K","ķ":"k","ĸ":"k","Ĺ":"L","Ļ":"L","Ľ":"L","Ŀ":"L","Ł":"L","ĺ":"l","ļ":"l","ľ":"l","ŀ":"l","ł":"l","Ń":"N","Ņ":"N","Ň":"N","Ŋ":"N","ń":"n","ņ":"n","ň":"n","ŋ":"n","Ō":"O","Ŏ":"O","Ő":"O","ō":"o","ŏ":"o","ő":"o","Ŕ":"R","Ŗ":"R","Ř":"R","ŕ":"r","ŗ":"r","ř":"r","Ś":"S","Ŝ":"S","Ş":"S","Š":"S","ś":"s","ŝ":"s","ş":"s","š":"s","Ţ":"T","Ť":"T","Ŧ":"T","ţ":"t","ť":"t","ŧ":"t","Ũ":"U","Ū":"U","Ŭ":"U","Ů":"U","Ű":"U","Ų":"U","ũ":"u","ū":"u","ŭ":"u","ů":"u","ű":"u","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","Ż":"Z","Ž":"Z","ź":"z","ż":"z","ž":"z","IJ":"IJ","ij":"ij","Œ":"Oe","œ":"oe","ʼn":"'n","ſ":"s"}),Cn=fn({"&":"&","<":"<",">":">",'"':""","'":"'"});function kn(e){return"\\"+$t[e]}function Sn(e){return xt.test(e)}function Dn(e){var t=-1,n=Array(e.size);return e.forEach(function(e,i){n[++t]=[i,e]}),n}function En(e,t){return function(n){return e(t(n))}}function $n(e,t){for(var n=-1,i=e.length,r=0,o=[];++n",""":'"',"'":"'"});var In=function e(t){var n,i=(t=null==t?Ot:In.defaults(Ot.Object(),t,In.pick(Ot,kt))).Array,r=t.Date,Je=t.Error,Qe=t.Function,et=t.Math,tt=t.Object,nt=t.RegExp,it=t.String,rt=t.TypeError,ot=i.prototype,st=Qe.prototype,at=tt.prototype,lt=t["__core-js_shared__"],ut=st.toString,ct=at.hasOwnProperty,ht=0,dt=(n=/[^.]+$/.exec(lt&<.keys&<.keys.IE_PROTO||""))?"Symbol(src)_1."+n:"",ft=at.toString,pt=ut.call(tt),mt=Ot._,vt=nt("^"+ut.call(ct).replace(Pe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),gt=Ft?t.Buffer:o,_t=t.Symbol,xt=t.Uint8Array,$t=gt?gt.allocUnsafe:o,Nt=En(tt.getPrototypeOf,tt),Pt=tt.create,It=at.propertyIsEnumerable,At=ot.splice,Lt=_t?_t.isConcatSpreadable:o,Vt=_t?_t.iterator:o,on=_t?_t.toStringTag:o,fn=function(){try{var e=Bo(tt,"defineProperty");return e({},"",{}),e}catch(e){}}(),An=t.clearTimeout!==Ot.clearTimeout&&t.clearTimeout,Fn=r&&r.now!==Ot.Date.now&&r.now,Ln=t.setTimeout!==Ot.setTimeout&&t.setTimeout,Vn=et.ceil,Bn=et.floor,zn=tt.getOwnPropertySymbols,Rn=gt?gt.isBuffer:o,Hn=t.isFinite,jn=ot.join,Wn=En(tt.keys,tt),qn=et.max,Yn=et.min,Kn=r.now,Un=t.parseInt,Gn=et.random,Xn=ot.reverse,Zn=Bo(t,"DataView"),Jn=Bo(t,"Map"),Qn=Bo(t,"Promise"),ei=Bo(t,"Set"),ti=Bo(t,"WeakMap"),ni=Bo(tt,"create"),ii=ti&&new ti,ri={},oi=hs(Zn),si=hs(Jn),ai=hs(Qn),li=hs(ei),ui=hs(ti),ci=_t?_t.prototype:o,hi=ci?ci.valueOf:o,di=ci?ci.toString:o;function fi(e){if($a(e)&&!ga(e)&&!(e instanceof gi)){if(e instanceof vi)return e;if(ct.call(e,"__wrapped__"))return ds(e)}return new vi(e)}var pi=function(){function e(){}return function(t){if(!Ea(t))return{};if(Pt)return Pt(t);e.prototype=t;var n=new e;return e.prototype=o,n}}();function mi(){}function vi(e,t){this.__wrapped__=e,this.__actions__=[],this.__chain__=!!t,this.__index__=0,this.__values__=o}function gi(e){this.__wrapped__=e,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=L,this.__views__=[]}function yi(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t=t?e:t)),e}function Ai(e,t,n,i,r,s){var a,l=t&d,u=t&f,c=t&p;if(n&&(a=r?n(e,i,r,s):n(e)),a!==o)return a;if(!Ea(e))return e;var h=ga(e);if(h){if(a=function(e){var t=e.length,n=new e.constructor(t);return t&&"string"==typeof e[0]&&ct.call(e,"index")&&(n.index=e.index,n.input=e.input),n}(e),!l)return no(e,a)}else{var m=Ho(e),v=m==U||m==G;if(wa(e))return Xr(e,l);if(m==Q||m==R||v&&!r){if(a=u||v?{}:Wo(e),!l)return u?function(e,t){return io(e,Ro(e),t)}(e,function(e,t){return e&&io(t,ol(t),e)}(a,e)):function(e,t){return io(e,zo(e),t)}(e,Ni(a,e))}else{if(!Et[m])return r?e:{};a=function(e,t,n){var i,r,o,s=e.constructor;switch(t){case le:return Zr(e);case W:case q:return new s(+e);case ue:return function(e,t){var n=t?Zr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case ce:case he:case de:case fe:case pe:case me:case ve:case ge:case ye:return Jr(e,n);case X:return new s;case Z:case ie:return new s(e);case te:return(o=new(r=e).constructor(r.source,je.exec(r))).lastIndex=r.lastIndex,o;case ne:return new s;case re:return i=e,hi?tt(hi.call(i)):{}}}(e,m,l)}}s||(s=new xi);var g=s.get(e);if(g)return g;s.set(e,a),Oa(e)?e.forEach(function(i){a.add(Ai(i,t,n,i,e,s))}):Ta(e)&&e.forEach(function(i,r){a.set(r,Ai(i,t,n,r,e,s))});var y=h?o:(c?u?Po:No:u?ol:rl)(e);return Kt(y||e,function(i,r){y&&(i=e[r=i]),$i(a,r,Ai(i,t,n,r,e,s))}),a}function Fi(e,t,n){var i=n.length;if(null==e)return!i;for(e=tt(e);i--;){var r=n[i],s=t[r],a=e[r];if(a===o&&!(r in e)||!s(a))return!1}return!0}function Li(e,t,n){if("function"!=typeof e)throw new rt(l);return rs(function(){e.apply(o,n)},t)}function Vi(e,t,n,i){var r=-1,o=Zt,a=!0,l=e.length,u=[],c=t.length;if(!l)return u;n&&(t=Qt(t,gn(n))),i?(o=Jt,a=!1):t.length>=s&&(o=bn,a=!1,t=new wi(t));e:for(;++r-1},bi.prototype.set=function(e,t){var n=this.__data__,i=Ti(n,e);return i<0?(++this.size,n.push([e,t])):n[i][1]=t,this},_i.prototype.clear=function(){this.size=0,this.__data__={hash:new yi,map:new(Jn||bi),string:new yi}},_i.prototype.delete=function(e){var t=Lo(this,e).delete(e);return this.size-=t?1:0,t},_i.prototype.get=function(e){return Lo(this,e).get(e)},_i.prototype.has=function(e){return Lo(this,e).has(e)},_i.prototype.set=function(e,t){var n=Lo(this,e),i=n.size;return n.set(e,t),this.size+=n.size==i?0:1,this},wi.prototype.add=wi.prototype.push=function(e){return this.__data__.set(e,u),this},wi.prototype.has=function(e){return this.__data__.has(e)},xi.prototype.clear=function(){this.__data__=new bi,this.size=0},xi.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},xi.prototype.get=function(e){return this.__data__.get(e)},xi.prototype.has=function(e){return this.__data__.has(e)},xi.prototype.set=function(e,t){var n=this.__data__;if(n instanceof bi){var i=n.__data__;if(!Jn||i.length0&&n(a)?t>1?Wi(a,t-1,n,i,r):en(r,a):i||(r[r.length]=a)}return r}var qi=ao(),Yi=ao(!0);function Ki(e,t){return e&&qi(e,t,rl)}function Ui(e,t){return e&&Yi(e,t,rl)}function Gi(e,t){return Xt(t,function(t){return ka(e[t])})}function Xi(e,t){for(var n=0,i=(t=Yr(t,e)).length;null!=e&&nt}function er(e,t){return null!=e&&ct.call(e,t)}function tr(e,t){return null!=e&&t in tt(e)}function nr(e,t,n){for(var r=n?Jt:Zt,s=e[0].length,a=e.length,l=a,u=i(a),c=1/0,h=[];l--;){var d=e[l];l&&t&&(d=Qt(d,gn(t))),c=Yn(d.length,c),u[l]=!n&&(t||s>=120&&d.length>=120)?new wi(l&&d):o}d=e[0];var f=-1,p=u[0];e:for(;++f=a)return l;var u=n[i];return l*("desc"==u?-1:1)}}return e.index-t.index}(e,t,n)})}function yr(e,t,n){for(var i=-1,r=t.length,o={};++i-1;)a!==e&&At.call(a,l,1),At.call(e,l,1);return e}function _r(e,t){for(var n=e?t.length:0,i=n-1;n--;){var r=t[n];if(n==i||r!==o){var o=r;Yo(r)?At.call(e,r,1):Vr(e,r)}}return e}function wr(e,t){return e+Bn(Gn()*(t-e+1))}function xr(e,t){var n="";if(!e||t<1||t>I)return n;do{t%2&&(n+=e),(t=Bn(t/2))&&(e+=e)}while(t);return n}function Cr(e,t){return os(es(e,t,Ml),e+"")}function kr(e){return ki(fl(e))}function Sr(e,t){var n=fl(e);return ls(n,Ii(t,0,n.length))}function Dr(e,t,n,i){if(!Ea(e))return e;for(var r=-1,s=(t=Yr(t,e)).length,a=s-1,l=e;null!=l&&++ro?0:o+t),(n=n>o?o:n)<0&&(n+=o),o=t>n?0:n-t>>>0,t>>>=0;for(var s=i(o);++r>>1,s=e[o];null!==s&&!Aa(s)&&(n?s<=t:s=s){var c=t?null:Co(e);if(c)return Tn(c);a=!1,r=bn,u=new wi}else u=t?[]:l;e:for(;++i=i?e:Mr(e,t,n)}var Gr=An||function(e){return Ot.clearTimeout(e)};function Xr(e,t){if(t)return e.slice();var n=e.length,i=$t?$t(n):new e.constructor(n);return e.copy(i),i}function Zr(e){var t=new e.constructor(e.byteLength);return new xt(t).set(new xt(e)),t}function Jr(e,t){var n=t?Zr(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}function Qr(e,t){if(e!==t){var n=e!==o,i=null===e,r=e==e,s=Aa(e),a=t!==o,l=null===t,u=t==t,c=Aa(t);if(!l&&!c&&!s&&e>t||s&&a&&u&&!l&&!c||i&&a&&u||!n&&u||!r)return 1;if(!i&&!s&&!c&&e1?n[r-1]:o,a=r>2?n[2]:o;for(s=e.length>3&&"function"==typeof s?(r--,s):o,a&&Ko(n[0],n[1],a)&&(s=r<3?o:s,r=1),t=tt(t);++i-1?r[s?t[a]:a]:o}}function fo(e){return Mo(function(t){var n=t.length,i=n,r=vi.prototype.thru;for(e&&t.reverse();i--;){var s=t[i];if("function"!=typeof s)throw new rt(l);if(r&&!a&&"wrapper"==Io(s))var a=new vi([],!0)}for(i=a?i:n;++i1&&_.reverse(),d&&cl))return!1;var c=s.get(e);if(c&&s.get(t))return c==t;var h=-1,d=!0,f=n&v?new wi:o;for(s.set(e,t),s.set(t,e);++h-1&&e%1==0&&e1?"& ":"")+t[i],t=t.join(n>2?", ":" "),e.replace(Le,"{\n/* [wrapped with "+t+"] */\n")}(i,function(e,t){return Kt(z,function(n){var i="_."+n[0];t&n[1]&&!Zt(e,i)&&e.push(i)}),e.sort()}(function(e){var t=e.match(Ve);return t?t[1].split(Be):[]}(i),n)))}function as(e){var t=0,n=0;return function(){var i=Kn(),r=M-(i-n);if(n=i,r>0){if(++t>=T)return arguments[0]}else t=0;return e.apply(o,arguments)}}function ls(e,t){var n=-1,i=e.length,r=i-1;for(t=t===o?i:t;++n1?e[t-1]:o;return n="function"==typeof n?(e.pop(),n):o,Ps(e,n)});function Bs(e){var t=fi(e);return t.__chain__=!0,t}function zs(e,t){return t(e)}var Rs=Mo(function(e){var t=e.length,n=t?e[0]:0,i=this.__wrapped__,r=function(t){return Oi(t,e)};return!(t>1||this.__actions__.length)&&i instanceof gi&&Yo(n)?((i=i.slice(n,+n+(t?1:0))).__actions__.push({func:zs,args:[r],thisArg:o}),new vi(i,this.__chain__).thru(function(e){return t&&!e.length&&e.push(o),e})):this.thru(r)});var Hs=ro(function(e,t,n){ct.call(e,n)?++e[n]:Pi(e,n,1)});var js=ho(vs),Ws=ho(gs);function qs(e,t){return(ga(e)?Kt:Bi)(e,Fo(t,3))}function Ys(e,t){return(ga(e)?Ut:zi)(e,Fo(t,3))}var Ks=ro(function(e,t,n){ct.call(e,n)?e[n].push(t):Pi(e,n,[t])});var Us=Cr(function(e,t,n){var r=-1,o="function"==typeof t,s=ba(e)?i(e.length):[];return Bi(e,function(e){s[++r]=o?qt(t,e,n):ir(e,t,n)}),s}),Gs=ro(function(e,t,n){Pi(e,n,t)});function Xs(e,t){return(ga(e)?Qt:dr)(e,Fo(t,3))}var Zs=ro(function(e,t,n){e[n?0:1].push(t)},function(){return[[],[]]});var Js=Cr(function(e,t){if(null==e)return[];var n=t.length;return n>1&&Ko(e,t[0],t[1])?t=[]:n>2&&Ko(t[0],t[1],t[2])&&(t=[t[0]]),gr(e,Wi(t,1),[])}),Qs=Fn||function(){return Ot.Date.now()};function ea(e,t,n){return t=n?o:t,t=e&&null==t?e.length:t,So(e,k,o,o,o,o,t)}function ta(e,t){var n;if("function"!=typeof t)throw new rt(l);return e=Ra(e),function(){return--e>0&&(n=t.apply(this,arguments)),e<=1&&(t=o),n}}var na=Cr(function(e,t,n){var i=g;if(n.length){var r=$n(n,Ao(na));i|=x}return So(e,i,t,n,r)}),ia=Cr(function(e,t,n){var i=g|y;if(n.length){var r=$n(n,Ao(ia));i|=x}return So(t,i,e,n,r)});function ra(e,t,n){var i,r,s,a,u,c,h=0,d=!1,f=!1,p=!0;if("function"!=typeof e)throw new rt(l);function m(t){var n=i,s=r;return i=r=o,h=t,a=e.apply(s,n)}function v(e){var n=e-c;return c===o||n>=t||n<0||f&&e-h>=s}function g(){var e=Qs();if(v(e))return y(e);u=rs(g,function(e){var n=t-(e-c);return f?Yn(n,s-(e-h)):n}(e))}function y(e){return u=o,p&&i?m(e):(i=r=o,a)}function b(){var e=Qs(),n=v(e);if(i=arguments,r=this,c=e,n){if(u===o)return function(e){return h=e,u=rs(g,t),d?m(e):a}(c);if(f)return Gr(u),u=rs(g,t),m(c)}return u===o&&(u=rs(g,t)),a}return t=ja(t)||0,Ea(n)&&(d=!!n.leading,s=(f="maxWait"in n)?qn(ja(n.maxWait)||0,t):s,p="trailing"in n?!!n.trailing:p),b.cancel=function(){u!==o&&Gr(u),h=0,i=c=r=u=o},b.flush=function(){return u===o?a:y(Qs())},b}var oa=Cr(function(e,t){return Li(e,1,t)}),sa=Cr(function(e,t,n){return Li(e,ja(t)||0,n)});function aa(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new rt(l);var n=function(){var i=arguments,r=t?t.apply(this,i):i[0],o=n.cache;if(o.has(r))return o.get(r);var s=e.apply(this,i);return n.cache=o.set(r,s)||o,s};return n.cache=new(aa.Cache||_i),n}function la(e){if("function"!=typeof e)throw new rt(l);return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}}aa.Cache=_i;var ua=Kr(function(e,t){var n=(t=1==t.length&&ga(t[0])?Qt(t[0],gn(Fo())):Qt(Wi(t,1),gn(Fo()))).length;return Cr(function(i){for(var r=-1,o=Yn(i.length,n);++r=t}),va=rr(function(){return arguments}())?rr:function(e){return $a(e)&&ct.call(e,"callee")&&!It.call(e,"callee")},ga=i.isArray,ya=Bt?gn(Bt):function(e){return $a(e)&&Ji(e)==le};function ba(e){return null!=e&&Da(e.length)&&!ka(e)}function _a(e){return $a(e)&&ba(e)}var wa=Rn||jl,xa=zt?gn(zt):function(e){return $a(e)&&Ji(e)==q};function Ca(e){if(!$a(e))return!1;var t=Ji(e);return t==K||t==Y||"string"==typeof e.message&&"string"==typeof e.name&&!Na(e)}function ka(e){if(!Ea(e))return!1;var t=Ji(e);return t==U||t==G||t==j||t==ee}function Sa(e){return"number"==typeof e&&e==Ra(e)}function Da(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=I}function Ea(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function $a(e){return null!=e&&"object"==typeof e}var Ta=Rt?gn(Rt):function(e){return $a(e)&&Ho(e)==X};function Ma(e){return"number"==typeof e||$a(e)&&Ji(e)==Z}function Na(e){if(!$a(e)||Ji(e)!=Q)return!1;var t=Nt(e);if(null===t)return!0;var n=ct.call(t,"constructor")&&t.constructor;return"function"==typeof n&&n instanceof n&&ut.call(n)==pt}var Pa=Ht?gn(Ht):function(e){return $a(e)&&Ji(e)==te};var Oa=jt?gn(jt):function(e){return $a(e)&&Ho(e)==ne};function Ia(e){return"string"==typeof e||!ga(e)&&$a(e)&&Ji(e)==ie}function Aa(e){return"symbol"==typeof e||$a(e)&&Ji(e)==re}var Fa=Wt?gn(Wt):function(e){return $a(e)&&Da(e.length)&&!!Dt[Ji(e)]};var La=_o(hr),Va=_o(function(e,t){return e<=t});function Ba(e){if(!e)return[];if(ba(e))return Ia(e)?Pn(e):no(e);if(Vt&&e[Vt])return function(e){for(var t,n=[];!(t=e.next()).done;)n.push(t.value);return n}(e[Vt]());var t=Ho(e);return(t==X?Dn:t==ne?Tn:fl)(e)}function za(e){return e?(e=ja(e))===O||e===-O?(e<0?-1:1)*A:e==e?e:0:0===e?e:0}function Ra(e){var t=za(e),n=t%1;return t==t?n?t-n:t:0}function Ha(e){return e?Ii(Ra(e),0,L):0}function ja(e){if("number"==typeof e)return e;if(Aa(e))return F;if(Ea(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Ea(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(Ie,"");var n=qe.test(e);return n||Ke.test(e)?Mt(e.slice(2),n?2:8):We.test(e)?F:+e}function Wa(e){return io(e,ol(e))}function qa(e){return null==e?"":Fr(e)}var Ya=oo(function(e,t){if(Zo(t)||ba(t))io(t,rl(t),e);else for(var n in t)ct.call(t,n)&&$i(e,n,t[n])}),Ka=oo(function(e,t){io(t,ol(t),e)}),Ua=oo(function(e,t,n,i){io(t,ol(t),e,i)}),Ga=oo(function(e,t,n,i){io(t,rl(t),e,i)}),Xa=Mo(Oi);var Za=Cr(function(e,t){e=tt(e);var n=-1,i=t.length,r=i>2?t[2]:o;for(r&&Ko(t[0],t[1],r)&&(i=1);++n1),t}),io(e,Po(e),n),i&&(n=Ai(n,d|f|p,$o));for(var r=t.length;r--;)Vr(n,t[r]);return n});var ul=Mo(function(e,t){return null==e?{}:function(e,t){return yr(e,t,function(t,n){return el(e,n)})}(e,t)});function cl(e,t){if(null==e)return{};var n=Qt(Po(e),function(e){return[e]});return t=Fo(t),yr(e,n,function(e,n){return t(e,n[0])})}var hl=ko(rl),dl=ko(ol);function fl(e){return null==e?[]:yn(e,rl(e))}var pl=uo(function(e,t,n){return t=t.toLowerCase(),e+(n?ml(t):t)});function ml(e){return Cl(qa(e).toLowerCase())}function vl(e){return(e=qa(e))&&e.replace(Ge,xn).replace(bt,"")}var gl=uo(function(e,t,n){return e+(n?"-":"")+t.toLowerCase()}),yl=uo(function(e,t,n){return e+(n?" ":"")+t.toLowerCase()}),bl=lo("toLowerCase");var _l=uo(function(e,t,n){return e+(n?"_":"")+t.toLowerCase()});var wl=uo(function(e,t,n){return e+(n?" ":"")+Cl(t)});var xl=uo(function(e,t,n){return e+(n?" ":"")+t.toUpperCase()}),Cl=lo("toUpperCase");function kl(e,t,n){return e=qa(e),(t=n?o:t)===o?function(e){return Ct.test(e)}(e)?function(e){return e.match(wt)||[]}(e):function(e){return e.match(ze)||[]}(e):e.match(t)||[]}var Sl=Cr(function(e,t){try{return qt(e,o,t)}catch(e){return Ca(e)?e:new Je(e)}}),Dl=Mo(function(e,t){return Kt(t,function(t){t=cs(t),Pi(e,t,na(e[t],e))}),e});function El(e){return function(){return e}}var $l=fo(),Tl=fo(!0);function Ml(e){return e}function Nl(e){return lr("function"==typeof e?e:Ai(e,d))}var Pl=Cr(function(e,t){return function(n){return ir(n,e,t)}}),Ol=Cr(function(e,t){return function(n){return ir(e,n,t)}});function Il(e,t,n){var i=rl(t),r=Gi(t,i);null!=n||Ea(t)&&(r.length||!i.length)||(n=t,t=e,e=this,r=Gi(t,rl(t)));var o=!(Ea(n)&&"chain"in n&&!n.chain),s=ka(e);return Kt(r,function(n){var i=t[n];e[n]=i,s&&(e.prototype[n]=function(){var t=this.__chain__;if(o||t){var n=e(this.__wrapped__);return(n.__actions__=no(this.__actions__)).push({func:i,args:arguments,thisArg:e}),n.__chain__=t,n}return i.apply(e,en([this.value()],arguments))})}),e}function Al(){}var Fl=go(Qt),Ll=go(Gt),Vl=go(rn);function Bl(e){return Uo(e)?dn(cs(e)):function(e){return function(t){return Xi(t,e)}}(e)}var zl=bo(),Rl=bo(!0);function Hl(){return[]}function jl(){return!1}var Wl=vo(function(e,t){return e+t},0),ql=xo("ceil"),Yl=vo(function(e,t){return e/t},1),Kl=xo("floor");var Ul,Gl=vo(function(e,t){return e*t},1),Xl=xo("round"),Zl=vo(function(e,t){return e-t},0);return fi.after=function(e,t){if("function"!=typeof t)throw new rt(l);return e=Ra(e),function(){if(--e<1)return t.apply(this,arguments)}},fi.ary=ea,fi.assign=Ya,fi.assignIn=Ka,fi.assignInWith=Ua,fi.assignWith=Ga,fi.at=Xa,fi.before=ta,fi.bind=na,fi.bindAll=Dl,fi.bindKey=ia,fi.castArray=function(){if(!arguments.length)return[];var e=arguments[0];return ga(e)?e:[e]},fi.chain=Bs,fi.chunk=function(e,t,n){t=(n?Ko(e,t,n):t===o)?1:qn(Ra(t),0);var r=null==e?0:e.length;if(!r||t<1)return[];for(var s=0,a=0,l=i(Vn(r/t));sr?0:r+n),(i=i===o||i>r?r:Ra(i))<0&&(i+=r),i=n>i?0:Ha(i);n>>0)?(e=qa(e))&&("string"==typeof t||null!=t&&!Pa(t))&&!(t=Fr(t))&&Sn(e)?Ur(Pn(e),0,n):e.split(t,n):[]},fi.spread=function(e,t){if("function"!=typeof e)throw new rt(l);return t=null==t?0:qn(Ra(t),0),Cr(function(n){var i=n[t],r=Ur(n,0,t);return i&&en(r,i),qt(e,this,r)})},fi.tail=function(e){var t=null==e?0:e.length;return t?Mr(e,1,t):[]},fi.take=function(e,t,n){return e&&e.length?Mr(e,0,(t=n||t===o?1:Ra(t))<0?0:t):[]},fi.takeRight=function(e,t,n){var i=null==e?0:e.length;return i?Mr(e,(t=i-(t=n||t===o?1:Ra(t)))<0?0:t,i):[]},fi.takeRightWhile=function(e,t){return e&&e.length?zr(e,Fo(t,3),!1,!0):[]},fi.takeWhile=function(e,t){return e&&e.length?zr(e,Fo(t,3)):[]},fi.tap=function(e,t){return t(e),e},fi.throttle=function(e,t,n){var i=!0,r=!0;if("function"!=typeof e)throw new rt(l);return Ea(n)&&(i="leading"in n?!!n.leading:i,r="trailing"in n?!!n.trailing:r),ra(e,t,{leading:i,maxWait:t,trailing:r})},fi.thru=zs,fi.toArray=Ba,fi.toPairs=hl,fi.toPairsIn=dl,fi.toPath=function(e){return ga(e)?Qt(e,cs):Aa(e)?[e]:no(us(qa(e)))},fi.toPlainObject=Wa,fi.transform=function(e,t,n){var i=ga(e),r=i||wa(e)||Fa(e);if(t=Fo(t,4),null==n){var o=e&&e.constructor;n=r?i?new o:[]:Ea(e)&&ka(o)?pi(Nt(e)):{}}return(r?Kt:Ki)(e,function(e,i,r){return t(n,e,i,r)}),n},fi.unary=function(e){return ea(e,1)},fi.union=$s,fi.unionBy=Ts,fi.unionWith=Ms,fi.uniq=function(e){return e&&e.length?Lr(e):[]},fi.uniqBy=function(e,t){return e&&e.length?Lr(e,Fo(t,2)):[]},fi.uniqWith=function(e,t){return t="function"==typeof t?t:o,e&&e.length?Lr(e,o,t):[]},fi.unset=function(e,t){return null==e||Vr(e,t)},fi.unzip=Ns,fi.unzipWith=Ps,fi.update=function(e,t,n){return null==e?e:Br(e,t,qr(n))},fi.updateWith=function(e,t,n,i){return i="function"==typeof i?i:o,null==e?e:Br(e,t,qr(n),i)},fi.values=fl,fi.valuesIn=function(e){return null==e?[]:yn(e,ol(e))},fi.without=Os,fi.words=kl,fi.wrap=function(e,t){return ca(qr(t),e)},fi.xor=Is,fi.xorBy=As,fi.xorWith=Fs,fi.zip=Ls,fi.zipObject=function(e,t){return jr(e||[],t||[],$i)},fi.zipObjectDeep=function(e,t){return jr(e||[],t||[],Dr)},fi.zipWith=Vs,fi.entries=hl,fi.entriesIn=dl,fi.extend=Ka,fi.extendWith=Ua,Il(fi,fi),fi.add=Wl,fi.attempt=Sl,fi.camelCase=pl,fi.capitalize=ml,fi.ceil=ql,fi.clamp=function(e,t,n){return n===o&&(n=t,t=o),n!==o&&(n=(n=ja(n))==n?n:0),t!==o&&(t=(t=ja(t))==t?t:0),Ii(ja(e),t,n)},fi.clone=function(e){return Ai(e,p)},fi.cloneDeep=function(e){return Ai(e,d|p)},fi.cloneDeepWith=function(e,t){return Ai(e,d|p,t="function"==typeof t?t:o)},fi.cloneWith=function(e,t){return Ai(e,p,t="function"==typeof t?t:o)},fi.conformsTo=function(e,t){return null==t||Fi(e,t,rl(t))},fi.deburr=vl,fi.defaultTo=function(e,t){return null==e||e!=e?t:e},fi.divide=Yl,fi.endsWith=function(e,t,n){e=qa(e),t=Fr(t);var i=e.length,r=n=n===o?i:Ii(Ra(n),0,i);return(n-=t.length)>=0&&e.slice(n,r)==t},fi.eq=fa,fi.escape=function(e){return(e=qa(e))&&Se.test(e)?e.replace(Ce,Cn):e},fi.escapeRegExp=function(e){return(e=qa(e))&&Oe.test(e)?e.replace(Pe,"\\$&"):e},fi.every=function(e,t,n){var i=ga(e)?Gt:Ri;return n&&Ko(e,t,n)&&(t=o),i(e,Fo(t,3))},fi.find=js,fi.findIndex=vs,fi.findKey=function(e,t){return sn(e,Fo(t,3),Ki)},fi.findLast=Ws,fi.findLastIndex=gs,fi.findLastKey=function(e,t){return sn(e,Fo(t,3),Ui)},fi.floor=Kl,fi.forEach=qs,fi.forEachRight=Ys,fi.forIn=function(e,t){return null==e?e:qi(e,Fo(t,3),ol)},fi.forInRight=function(e,t){return null==e?e:Yi(e,Fo(t,3),ol)},fi.forOwn=function(e,t){return e&&Ki(e,Fo(t,3))},fi.forOwnRight=function(e,t){return e&&Ui(e,Fo(t,3))},fi.get=Qa,fi.gt=pa,fi.gte=ma,fi.has=function(e,t){return null!=e&&jo(e,t,er)},fi.hasIn=el,fi.head=bs,fi.identity=Ml,fi.includes=function(e,t,n,i){e=ba(e)?e:fl(e),n=n&&!i?Ra(n):0;var r=e.length;return n<0&&(n=qn(r+n,0)),Ia(e)?n<=r&&e.indexOf(t,n)>-1:!!r&&ln(e,t,n)>-1},fi.indexOf=function(e,t,n){var i=null==e?0:e.length;if(!i)return-1;var r=null==n?0:Ra(n);return r<0&&(r=qn(i+r,0)),ln(e,t,r)},fi.inRange=function(e,t,n){return t=za(t),n===o?(n=t,t=0):n=za(n),function(e,t,n){return e>=Yn(t,n)&&e=-I&&e<=I},fi.isSet=Oa,fi.isString=Ia,fi.isSymbol=Aa,fi.isTypedArray=Fa,fi.isUndefined=function(e){return e===o},fi.isWeakMap=function(e){return $a(e)&&Ho(e)==se},fi.isWeakSet=function(e){return $a(e)&&Ji(e)==ae},fi.join=function(e,t){return null==e?"":jn.call(e,t)},fi.kebabCase=gl,fi.last=Cs,fi.lastIndexOf=function(e,t,n){var i=null==e?0:e.length;if(!i)return-1;var r=i;return n!==o&&(r=(r=Ra(n))<0?qn(i+r,0):Yn(r,i-1)),t==t?function(e,t,n){for(var i=n+1;i--;)if(e[i]===t)return i;return i}(e,t,r):an(e,cn,r,!0)},fi.lowerCase=yl,fi.lowerFirst=bl,fi.lt=La,fi.lte=Va,fi.max=function(e){return e&&e.length?Hi(e,Ml,Qi):o},fi.maxBy=function(e,t){return e&&e.length?Hi(e,Fo(t,2),Qi):o},fi.mean=function(e){return hn(e,Ml)},fi.meanBy=function(e,t){return hn(e,Fo(t,2))},fi.min=function(e){return e&&e.length?Hi(e,Ml,hr):o},fi.minBy=function(e,t){return e&&e.length?Hi(e,Fo(t,2),hr):o},fi.stubArray=Hl,fi.stubFalse=jl,fi.stubObject=function(){return{}},fi.stubString=function(){return""},fi.stubTrue=function(){return!0},fi.multiply=Gl,fi.nth=function(e,t){return e&&e.length?vr(e,Ra(t)):o},fi.noConflict=function(){return Ot._===this&&(Ot._=mt),this},fi.noop=Al,fi.now=Qs,fi.pad=function(e,t,n){e=qa(e);var i=(t=Ra(t))?Nn(e):0;if(!t||i>=t)return e;var r=(t-i)/2;return yo(Bn(r),n)+e+yo(Vn(r),n)},fi.padEnd=function(e,t,n){e=qa(e);var i=(t=Ra(t))?Nn(e):0;return t&&it){var i=e;e=t,t=i}if(n||e%1||t%1){var r=Gn();return Yn(e+r*(t-e+Tt("1e-"+((r+"").length-1))),t)}return wr(e,t)},fi.reduce=function(e,t,n){var i=ga(e)?tn:pn,r=arguments.length<3;return i(e,Fo(t,4),n,r,Bi)},fi.reduceRight=function(e,t,n){var i=ga(e)?nn:pn,r=arguments.length<3;return i(e,Fo(t,4),n,r,zi)},fi.repeat=function(e,t,n){return t=(n?Ko(e,t,n):t===o)?1:Ra(t),xr(qa(e),t)},fi.replace=function(){var e=arguments,t=qa(e[0]);return e.length<3?t:t.replace(e[1],e[2])},fi.result=function(e,t,n){var i=-1,r=(t=Yr(t,e)).length;for(r||(r=1,e=o);++iI)return[];var n=L,i=Yn(e,L);t=Fo(t),e-=L;for(var r=vn(i,t);++n=s)return e;var l=n-Nn(i);if(l<1)return i;var u=a?Ur(a,0,l).join(""):e.slice(0,l);if(r===o)return u+i;if(a&&(l+=u.length-l),Pa(r)){if(e.slice(l).search(r)){var c,h=u;for(r.global||(r=nt(r.source,qa(je.exec(r))+"g")),r.lastIndex=0;c=r.exec(h);)var d=c.index;u=u.slice(0,d===o?l:d)}}else if(e.indexOf(Fr(r),l)!=l){var f=u.lastIndexOf(r);f>-1&&(u=u.slice(0,f))}return u+i},fi.unescape=function(e){return(e=qa(e))&&ke.test(e)?e.replace(xe,On):e},fi.uniqueId=function(e){var t=++ht;return qa(e)+t},fi.upperCase=xl,fi.upperFirst=Cl,fi.each=qs,fi.eachRight=Ys,fi.first=bs,Il(fi,(Ul={},Ki(fi,function(e,t){ct.call(fi.prototype,t)||(Ul[t]=e)}),Ul),{chain:!1}),fi.VERSION="4.17.14",Kt(["bind","bindKey","curry","curryRight","partial","partialRight"],function(e){fi[e].placeholder=fi}),Kt(["drop","take"],function(e,t){gi.prototype[e]=function(n){n=n===o?1:qn(Ra(n),0);var i=this.__filtered__&&!t?new gi(this):this.clone();return i.__filtered__?i.__takeCount__=Yn(n,i.__takeCount__):i.__views__.push({size:Yn(n,L),type:e+(i.__dir__<0?"Right":"")}),i},gi.prototype[e+"Right"]=function(t){return this.reverse()[e](t).reverse()}}),Kt(["filter","map","takeWhile"],function(e,t){var n=t+1,i=n==N||3==n;gi.prototype[e]=function(e){var t=this.clone();return t.__iteratees__.push({iteratee:Fo(e,3),type:n}),t.__filtered__=t.__filtered__||i,t}}),Kt(["head","last"],function(e,t){var n="take"+(t?"Right":"");gi.prototype[e]=function(){return this[n](1).value()[0]}}),Kt(["initial","tail"],function(e,t){var n="drop"+(t?"":"Right");gi.prototype[e]=function(){return this.__filtered__?new gi(this):this[n](1)}}),gi.prototype.compact=function(){return this.filter(Ml)},gi.prototype.find=function(e){return this.filter(e).head()},gi.prototype.findLast=function(e){return this.reverse().find(e)},gi.prototype.invokeMap=Cr(function(e,t){return"function"==typeof e?new gi(this):this.map(function(n){return ir(n,e,t)})}),gi.prototype.reject=function(e){return this.filter(la(Fo(e)))},gi.prototype.slice=function(e,t){e=Ra(e);var n=this;return n.__filtered__&&(e>0||t<0)?new gi(n):(e<0?n=n.takeRight(-e):e&&(n=n.drop(e)),t!==o&&(n=(t=Ra(t))<0?n.dropRight(-t):n.take(t-e)),n)},gi.prototype.takeRightWhile=function(e){return this.reverse().takeWhile(e).reverse()},gi.prototype.toArray=function(){return this.take(L)},Ki(gi.prototype,function(e,t){var n=/^(?:filter|find|map|reject)|While$/.test(t),i=/^(?:head|last)$/.test(t),r=fi[i?"take"+("last"==t?"Right":""):t],s=i||/^find/.test(t);r&&(fi.prototype[t]=function(){var t=this.__wrapped__,a=i?[1]:arguments,l=t instanceof gi,u=a[0],c=l||ga(t),h=function(e){var t=r.apply(fi,en([e],a));return i&&d?t[0]:t};c&&n&&"function"==typeof u&&1!=u.length&&(l=c=!1);var d=this.__chain__,f=!!this.__actions__.length,p=s&&!d,m=l&&!f;if(!s&&c){t=m?t:new gi(this);var v=e.apply(t,a);return v.__actions__.push({func:zs,args:[h],thisArg:o}),new vi(v,d)}return p&&m?e.apply(this,a):(v=this.thru(h),p?i?v.value()[0]:v.value():v)})}),Kt(["pop","push","shift","sort","splice","unshift"],function(e){var t=ot[e],n=/^(?:push|sort|unshift)$/.test(e)?"tap":"thru",i=/^(?:pop|shift)$/.test(e);fi.prototype[e]=function(){var e=arguments;if(i&&!this.__chain__){var r=this.value();return t.apply(ga(r)?r:[],e)}return this[n](function(n){return t.apply(ga(n)?n:[],e)})}}),Ki(gi.prototype,function(e,t){var n=fi[t];if(n){var i=n.name+"";ct.call(ri,i)||(ri[i]=[]),ri[i].push({name:t,func:n})}}),ri[po(o,y).name]=[{name:"wrapper",func:o}],gi.prototype.clone=function(){var e=new gi(this.__wrapped__);return e.__actions__=no(this.__actions__),e.__dir__=this.__dir__,e.__filtered__=this.__filtered__,e.__iteratees__=no(this.__iteratees__),e.__takeCount__=this.__takeCount__,e.__views__=no(this.__views__),e},gi.prototype.reverse=function(){if(this.__filtered__){var e=new gi(this);e.__dir__=-1,e.__filtered__=!0}else(e=this.clone()).__dir__*=-1;return e},gi.prototype.value=function(){var e=this.__wrapped__.value(),t=this.__dir__,n=ga(e),i=t<0,r=n?e.length:0,o=function(e,t,n){for(var i=-1,r=n.length;++i=this.__values__.length;return{done:e,value:e?o:this.__values__[this.__index__++]}},fi.prototype.plant=function(e){for(var t,n=this;n instanceof mi;){var i=ds(n);i.__index__=0,i.__values__=o,t?r.__wrapped__=i:t=i;var r=i;n=n.__wrapped__}return r.__wrapped__=e,t},fi.prototype.reverse=function(){var e=this.__wrapped__;if(e instanceof gi){var t=e;return this.__actions__.length&&(t=new gi(this)),(t=t.reverse()).__actions__.push({func:zs,args:[Es],thisArg:o}),new vi(t,this.__chain__)}return this.thru(Es)},fi.prototype.toJSON=fi.prototype.valueOf=fi.prototype.value=function(){return Rr(this.__wrapped__,this.__actions__)},fi.prototype.first=fi.prototype.head,Vt&&(fi.prototype[Vt]=function(){return this}),fi}();Ot._=In,(r=function(){return In}.call(t,n,t,i))===o||(i.exports=r)}).call(this)}).call(this,n(37),n(89)(e))},function(e,t){var n=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(e,t){var n=/^(attrs|props|on|nativeOn|class|style|hook)$/;function i(e,t){return function(){e&&e.apply(this,arguments),t&&t.apply(this,arguments)}}e.exports=function(e){return e.reduce(function(e,t){var r,o,s,a,l;for(s in t)if(r=e[s],o=t[s],r&&n.test(s))if("class"===s&&("string"==typeof r&&(l=r,e[s]=r={},r[l]=!0),"string"==typeof o&&(l=o,t[s]=o={},o[l]=!0)),"on"===s||"nativeOn"===s||"hook"===s)for(a in o)r[a]=i(r[a],o[a]);else if(Array.isArray(r))e[s]=r.concat(o);else if(Array.isArray(o))e[s]=[r].concat(o);else for(a in o)r[a]=o[a];else e[s]=t[s];return e},{})}},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){"use strict";t.__esModule=!0;var i,r=n(57),o=(i=r)&&i.__esModule?i:{default:i};t.default=o.default||function(e){for(var t=1;t0?i:n)(e)}},function(e,t,n){var i=n(30)("keys"),r=n(23);e.exports=function(e){return i[e]||(i[e]=r(e))}},function(e,t,n){var i=n(15),r=n(6),o=r["__core-js_shared__"]||(r["__core-js_shared__"]={});(e.exports=function(e,t){return o[e]||(o[e]=void 0!==t?t:{})})("versions",[]).push({version:i.version,mode:n(22)?"pure":"global",copyright:"© 2019 Denis Pushkarev (zloirock.ru)"})},function(e,t){e.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t){e.exports={}},function(e,t,n){var i=n(11).f,r=n(8),o=n(14)("toStringTag");e.exports=function(e,t,n){e&&!r(e=n?e:e.prototype,o)&&i(e,o,{configurable:!0,value:t})}},function(e,t,n){t.f=n(14)},function(e,t,n){var i=n(6),r=n(15),o=n(22),s=n(35),a=n(11).f;e.exports=function(e){var t=r.Symbol||(r.Symbol=o?{}:i.Symbol||{});"_"==e.charAt(0)||e in t||a(t,e,{value:s.f(e)})}},function(e,t){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(e){"object"==typeof window&&(n=window)}e.exports=n},function(e,t,n){e.exports=!n(12)&&!n(17)(function(){return 7!=Object.defineProperty(n(39)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var i=n(16),r=n(6).document,o=i(r)&&i(r.createElement);e.exports=function(e){return o?r.createElement(e):{}}},function(e,t,n){var i=n(8),r=n(13),o=n(63)(!1),s=n(29)("IE_PROTO");e.exports=function(e,t){var n,a=r(e),l=0,u=[];for(n in a)n!=s&&i(a,n)&&u.push(n);for(;t.length>l;)i(a,n=t[l++])&&(~o(u,n)||u.push(n));return u}},function(e,t,n){var i=n(42);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==i(e)?e.split(""):Object(e)}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t,n){var i=n(27);e.exports=function(e){return Object(i(e))}},function(e,t,n){"use strict";var i=n(22),r=n(25),o=n(45),s=n(10),a=n(33),l=n(70),u=n(34),c=n(73),h=n(14)("iterator"),d=!([].keys&&"next"in[].keys()),f=function(){return this};e.exports=function(e,t,n,p,m,v,g){l(n,t,p);var y,b,_,w=function(e){if(!d&&e in S)return S[e];switch(e){case"keys":case"values":return function(){return new n(this,e)}}return function(){return new n(this,e)}},x=t+" Iterator",C="values"==m,k=!1,S=e.prototype,D=S[h]||S["@@iterator"]||m&&S[m],E=D||w(m),$=m?C?w("entries"):E:void 0,T="Array"==t&&S.entries||D;if(T&&(_=c(T.call(new e)))!==Object.prototype&&_.next&&(u(_,x,!0),i||"function"==typeof _[h]||s(_,h,f)),C&&D&&"values"!==D.name&&(k=!0,E=function(){return D.call(this)}),i&&!g||!d&&!k&&S[h]||s(S,h,E),a[t]=E,a[x]=f,m)if(y={values:C?E:w("values"),keys:v?E:w("keys"),entries:$},g)for(b in y)b in S||o(S,b,y[b]);else r(r.P+r.F*(d||k),t,y);return y}},function(e,t,n){e.exports=n(10)},function(e,t,n){var i=n(19),r=n(71),o=n(31),s=n(29)("IE_PROTO"),a=function(){},l=function(){var e,t=n(39)("iframe"),i=o.length;for(t.style.display="none",n(72).appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write(" + -
    - -
    -
    -
    -          

    软件许可协议

    - +
    + +
    + +

    欢迎使用 CRMEB开源版

    +
    +
    + +
    + 详细阅读并勾选同意 + 《软件使用协议》 +
    +
    + 开始安装
    + +
    +
    +
    +
    +          

    软件许可协议

    提示条款: -本协议是您与西安众邦网络科技有限公司共同签署。 -CRMEB客户管理+电商系统(以下称“CRMEB”),由西安众邦网络科技有限公司(以下称“众邦科技”)独创开发,版权所有Copyright (c)2014-2024,众邦科技保留所有权利。CRMEB是国内最稳定、最强大、最先进的互联网电商平台解决方案之一,CRMEB基于 PHP + MySQL 的技术,采用ThinkPHP框架开发。CRMEB官方对此拥有最终修改权和解释权。 +本协议是您因使用CRMEB开源商城系统软件与西安众邦网络科技有限公司所订立的有效合约。 +CRMEB是国内稳定、强大、先进的互联网电商平台解决方案之一,CRMEB基于 PHP + MySQL 的技术,采用ThinkPHP框架开发。 CRMEB官方网站:http://www.crmeb.com -在使用CRMEB客户管理+电商系统(以下称“许可软件”或“本软件”)之前,请您仔细阅读本协议,特别是法律适用和争议解决条款,此等条款将以粗体标识,您需要重点阅读。如您对协议有任何疑问,可向客服咨询。如果您已下载、复制、安装或以其他任何方式使用该软件,则视为已经接受本协议。如果您不接受本协议的全部或部分条款,您将无权使用本软件。请立即终止安装、或以其他方式使用该软件,删除您已经安装或保留的该软件的任何组件。 -由于互联网高速发展,您与我们签署的本协议列明的条款并不能完整罗列并覆盖您与我们所有权利与义务,现有的约定也不能保证完全符合未来发展的需求。 -因此,《版权声明》及其他规则均为本协议的补充协议,与本协议不可分割且具有同等法律效力。如您使用许可软件,视为您同意上述补充协议。我们如修改本协议或其补充协议,协议条款修改后,请您仔细阅读并接受修改后的协议后再继续使用许可软件。 +CRMEB开源商城系统(以下简称“CRMEB”或“许可软件”或“本软件”),由西安众邦网络科技有限公司(以下称“众邦科技”)自主独创开发,CRMEB官方网站:http://www.crmeb.com,您在使用CRMEB客户管理+电商系统(以下称“许可软件”或“本软件”)之前,请您仔细阅读本协议,特别是法律适用和争议解决条款,您需要重点阅读。如您对协议有任何疑问,可咨询CRMEB官方客服。如果您安装或以其他任何方式使用本软件,则视为已经接受本协议。如果您不接受本协议的全部或部分条款,您将无权使用本软件,请立即终止安装、或以其他方式使用该软件,删除您已经安装或保留的该软件的任何组件。
    一、定义 -软件(许可软件或本软件):本协议中的“软件”是指CRMEB客户管理+电商系统,由若干模块或功能组成的已经植入或即将植入众邦科技指定产品内的信息处理程序或支持文件,其中支持文件具体包括软件的源代码、目标码以及相关软件中所包含的图片、照片、图标、动画、录音、录像、音乐、文字、代码的全部或部分,还包括与许可软件或众邦产品相关的所有描述其功能、特点、内容、质量、测试、用户手册、用户许可协议等纸质或电子版的资料、技术文档等。 -您:本协议中的“您”是指取得众邦科技合法许可使用本软件权利的个人或单个法人实体,法人实体包括公司、企业、机构、组织或单位。 -我们:本协议中的“我们”即是CRMEB官方,是指众邦科技,即西安众邦网络科技有限公司及其关联公司。 -二次开发:本协议中的“二次开发”在现有的软件上进行定制修改,如对功能扩展,达到您想要的功能,原则不得改变本软件原有系统内核及系统设定的框架,我们允许的二次开发仅指对部分软件界面、功能删改或扩展,并非对内核及框架进行实质性修改。 +软件(许可软件或本软件):本协议中的“软件”是指CRMEB开源商城系统,由若干模块或功能组成的已经植入或即将植入众邦科技指定产品内的信息处理程序或支持文件,其中支持文件具体包括软件的源代码、目标码的全部或部分,还包括与本软件或众邦科技产品相关的所有描述其功能、特点、内容、质量、测试、用户手册、用户许可协议等纸质或电子版的资料、技术文档等。 +您:本协议中的“您”是指安装、使用本软件的个人或法人实体,法人实体包括公司、企业、机构、组织或单位。 +我们:本协议中的“我们”即是CRMEB官方,即指西安众邦网络科技有限公司及其关联公司。 +二次开发:本协议中的“二次开发”是指在本软件上进行定制修改、功能扩展。
    二、软件许可使用内容 -在您遵守本协议内容的前提下,您通过我们指定合法渠道购买软件商用许可后,众邦科技授予您的商用许可权利包括: -1、安装和使用权利:您可以为商用目的安装和使用本软件,使用本软件提供的全部功能。 -2、绑定唯一域名的权利:在安装本软件前,您应当自备一个域名并告知我们,以便我们将域名与本软件进行绑定。该绑定域名是商用许可软件的唯一指向。您应确保域名的唯一性、有效性,域名一经绑定,不得随意更换。您自备的域名可以是顶级、二级、或三级域名,您应对域名合法性、有效性承担责任。在使用本软件过程中,如需更换域名,应提前三个工作日以书面方式告知我们并如实告知被更换域名存在的问题,否则,我们有权利不予更换。 -3、申请商用授权码的权利:您在我们指定合法渠道购买软件商用许可后,凭借订单号可以在我们官网申请商用授权码,并通过我们官方网站下载授权证书。 -4、获取商用授权证书的权利:通过我们官方网站下载的商用授权证书是许可您将软件商用的合法凭证。该授权证书是授予您以本协议约定方式合法使用软件的永久授权,但我们不对授权作无限制使用的永久承诺。 -5、授权内容使用权:在取得我们许可后,您拥有使用本软件构建的网站全部内容使用权,并独立承担与之相关法律义务。您可以在协议规定的约束条件下和限制范围内修改 CRMEB 源代码或界面风格以适应您的网站要求,但应保留我们的版权信息。不管你的网站是否整体使用 CRMEB ,还是部份栏目使用 CRMEB,在你使用了 CRMEB 的网站主页上必须加上 CRMEB 官方网址(www.CRMEB.com)的链接。 -6、在获得商业授权之后,您才可以将本软件应用于商业用途,同时依据所购买的授权类型确定技术支持内容。商业授权用户享有反馈意见和提出建议的权力,相关意见和建议将在我们下一次软件升级中被优先考虑,但我们对此不作承诺或保证。 -7、CRMEB著作权已在中华人民共和国国家版权局注册(中国国家版权局著作权登记号 2018SR024463),著作权受到法律和国际公约保护。未经我们书面许可,不得删除网站底部及相应的官方链接。购买商业授权请联系众邦科技了解最新说明。 -8、本软件适用运营环境,在软件相关文档中已经明确提示,如因软件安装不符运营环境造成的故障,我们不承担任何责任。 +您在遵守本软件开源协议的相关约定前提下,通过我们指定合法渠道下载软件后,您需遵守的补充约定: +2.1 以自用为目的,您可将本软件用于盈利或非盈利项目上,且不受任何限制。 +2.2 以自用为目的,在保留版权标识的前提下您可任意修改程序源码。 +2.3 禁止以任何方式破坏CRMEB的商业授权机制(包括但不限于收集CRMEB源码后经营与CRMEB同类型、同性质服务等)。 +2.4 禁止利用CRMEB发表、传送、传播、储存违反国家法律、危害国家安全、社会稳定、公序良俗的内容,或任何不当的、侮辱诽谤的、淫秽的、暴力的及任何违反国家法律法规政策的内容。 +2.5 CRMEB著作权已在中华人民共和国国家版权局注册(中国国家版权局著作权登记号 2018SR024463),著作权受到法律和国际公约保护。未经我们书面许可,不得删除网站底部及相应的官方链接。购买商业版授权请联系众邦科技客服,了解最新说明。 +2.6 安装前请仔细阅读本软件帮助文档,查看本软件适用运营环境,在软件相关文档中已经明确提示,如因软件安装不符运营环境造成的故障,众邦科技不承担任何责任。 +2.7 保留本软件原有的许可声明和版权、专利、商标情况等标识;
    -三、权利限制 -1、单一使用限制:同一个域名,只允许绑定一次。您购买的许可,只允许您自己使用,不得再许可任何第三人使用。 -2、共享软件限制:您不得通过共享软件的全部或部分,允许多人使用软件的部分或全部功能。 -3、软件分解限制:您不得通过分解软件,把不同功能或把软件的不同部分嵌入到其他软件系统。 -4、软件完整性限制:您不得删除软件中的任何版权申明、提示,亦不得对软件中出现的任何商标或标识进行涂抹、修改或删除,除非已经获得我们的书面同意,您应将需要修改的标识等详细情况书面告知我们,以便我们评估您的需要。 -5、反向工程、反编译、反汇编限制:您不得对软件进行反向工程、反编译、反汇编,除非法律明确规定允许这些行为除外。 -6、转让限制:未经众邦科技的书面同意,您不得公开、转让、出租、出借、再许可、分发该软件的全部或任何部分或软件单一备份副本给第三方。 -7、保密限制:未经众邦科技书面同意,您不得将本软件的性能或其他任何评估、测试结果、技术秘密透露给任何第三方。 +三、CRMEB遵守的约定 +3.1 CRMEB保证遵循中国的法律法规及相关政策规范。 +3.2 除付费功能插件外,确保所有代码用户皆可阅读。 +3.3 确保用户在完成所有系统部署后,在不依赖CRMEB支持下也可永久运行。 +3.4 除商业版本付费授权相关功能插件外,禁止对源代码进行加密和混淆。 +3.5 禁止不经用户许可的情况下以任何方式自动安装加密代码。 +3.6 禁止不经用户许可的情况下以任何方式收集用户数据。 +3.7 确保本软件无后门。 +3.8 CRMEB不提供与任何开源软件有关的或软件中可能使用的、集成的或与共同提供的第三方技术有关的任何保证。
    四、权利保留 -1、 众邦科技依法保留未在本协议中明确授予给您的其他一切在法律上属于众邦科技的权利。 -2、本软件受著作权法、国际著作权条约和其他的知识产权法律或国际条约保护。根据本协议,在此仅许可您非独占性的、非排他性的一般许可使用该软件的权利,而不是出售或转让。 -3、商标权:本协议不授予您众邦科技或其供应商的任何商标或服务标志相关的任何权利。 -4、本软件所涉及到的一切知识产权,包括但不限于专利权、著作权、商标权、商业秘密、技术秘密,均属于各自内容拥有者的财产,众邦科技保留从其所拥有的知识产权获取利益的权利。 -5、未经我们书面许可,不得对本软件或与之关联的商业授权进行出租、出售、抵押或发放子许可证。 -6、未经我们书面许可,禁止在 CRMEB 的整体或任何部分基础上以发展任何派生版本、修改版本或第三方版本用于重新分发。 -7、您一旦开始确认本协议并安装 CRMEB,即被视为完全理解并接受本协议的各项条款,在享有上述条款授予的权力的同时,受到相关的约束和限制。协议许可范围以外的行为,将直接违反本授权协议并构成侵权,我们有权立即终止授权,责令停止损害,并保留追究相关责任的权力。 +4.1、众邦科技依法保留未在本协议中明确授予给您的其他一切在法律上属于众邦科技的权利。 +4.2、本软件受著作权法、国际著作权条约和其他的知识产权法律或国际条约保护。根据本协议,在此仅许可您非独占性的、非排他性的一般许可使用该软件的权利,而不是出售或转让。 +4.3、商标权:本协议不授予您众邦科技或其供应商的任何商标或服务标志相关的任何权利。 +4.4、本软件所涉及到的一切知识产权,包括但不限于专利权、著作权、商标权、商业秘密、技术秘密,均属于各自内容拥有者的财产,众邦科技保留从其所拥有的知识产权获取利益的权利。 +4.5、您一旦开始确认本协议并安装本软件,即被视为完全理解并接受本协议的各项条款,在享有上述条款授予的权力的同时,受到相关的约束和限制。协议许可范围以外的行为,将直接违反本授权协议并构成侵权,我们有权立即终止授权,责令停止损害,并保留追究相关责任的权力。
    五、知识产权 -1、我们拥有许可软件的著作权、商业秘密以及其他相关的知识产权,包括与许可软件有关的各种文档资料。许可软件的相关标识属于我们及我们的关联公司的知识产权,并受到相关法律法规的保护。 -2、在未获得我们明确同意前,您不得复制、模仿、使用或发布上述图标,也不得修改或删除应用产品中体现我们及其关联公司的任何标识、图标或身份信息。 -3、未经我们及我们的关联公司事先书面同意,您不得为任何营利性或非营利性的目的自行实施、利用、转让或许可任何第三方实施、利用、转让上述知识产权。 -4、除非在此明确地许可或授予,本协议并不涉及任何技术转让,软件里所包含和涉及所有权利,产权和利益属于我们独自所有。除非在此明确地许可,本合同并不将任何技术转让给您。 +5.1、我们拥有许可软件的著作权、商业秘密以及其他相关的知识产权,包括与许可软件有关的各种文档资料。许可软件的相关标识属于我们及我们的关联公司的知识产权,并受到相关法律法规的保护。 +5.2、在未获得我们明确同意前,您不得修改或删除应用产品中体现我们及其关联公司的任何标识、图标或身份信息。 +5.3、除非在此明确地许可或授予,本协议并不涉及任何技术转让,软件里所包含和涉及所有权利,产权和利益属于我们独自所有。除非在此明确地许可,本合同并不将任何技术转让给您。 +5.4、CRMEB欢迎并感谢您在保留CRMEB版权信息的前期下,将本软件原始系统发布在您的个人网站、企业官网或者其他的第三方网站。
    六、升级版本 -1、我们会根据需要在后续进行一系列免费升级操作,您只有在获得商业使用授权许可后,才享有软件免费升级权益。我们有权决定将升级包何时以何种方式发送给您。 -2、升级版本的许可:如果该软件经众邦科技同意升级,除非升级版本有替代的软件许可协议,否则升级版本仍应遵循本协议条款。 -3、不论软件是否升级,您必须遵守本协议。 +6.1、我们会根据需要在后续进行一系列免费升级操作,您只有在获得商业使用授权许可后,才享有软件免费升级权益。我们有权决定将升级包何时以何种方式发送给您。 +6.2、升级版本的许可:如果该软件经众邦科技同意升级,除非升级版本有替代的软件许可协议,否则升级版本仍应遵循本协议条款。 +6.3、不论软件是否升级,您必须遵守本协议。
    七、无担保和责任限制 -1、除众邦科技明确明示保证的事项以外,对其他任何默示、特定用途、适销性不做任何默示或明示的保证,由此引起的风险由您自己承担。 -2、有关本软件在使用过程中存在不适用性情况,您应当立即以书面方式反馈给我们,在我们现有技术可以解决的情况下,将依照众邦科技的软件产品标准保修政策规定。 +7.1 除众邦科技明确明示保证的事项以外,对其他任何默示、特定用途、适销性不做任何默示或明示的保证,由此引起的风险由您自己承担。 +7.2 有关本软件在使用过程中存在不适用性情况,您应当立即以书面方式反馈给我们,在我们现有技术可以解决的情况下,将依照众邦科技的软件产品标准保修政策规定。 1)众邦科技不对试用期及免费试用软件因使用而产生的损失承担任何明示或暗示的责任。 2)众邦科技承担的所有责任以您购买该软件所支付的价款为限。 -3、对因意外事故、滥用、错误使用、擅自修改所引起的软件使用问题,我们不承担任何责任,也不做任何保证。对因软件产品存在被攻击,或者自然灾害等不可抗力因素或非众邦科技原因导致软件不能使用,或造成损失的,我们不承担任何责任,也不做任何保证。 -4、对因使用软件引起的其他任何附带的、间接的或惩罚性的损失,包括但不限于商业利润的损失、信息或数据的丢失,众邦科技不承担任何责任,即使众邦科技已被告知存在此种损害的可能性也不例外。 -5、除法律法规有明确规定外,我们将尽最大努力确保许可软件及其所涉及的技术及信息安全、有效、准确、可靠,但受限于我们现有技术,您充分理解我们不能对此进行担保。您理解,对于因您自身、不可抗力及第三方原因导致的您的直接或间接损失,我们无法承担责任。 -6、由于您因下述任一情况所引起或与此有关的人身伤害或附带的、间接的损害赔偿,包括但不限于利润损失、资料损失、业务中断的损害赔偿或其他商业损害赔偿或损失,需由您自行承担:使用或未能使用许可软件;第三方未经批准的使用许可软件或更改您的数据;使用许可软件进行的行为产生的费用及损失;您对许可软件的误解;非因我们的原因而引起的与许可软件有关的其他损失。 -7、非经我们或我们授权开发并正式发布的其他任何由许可软件衍生的软件均属非法,下载、安装、使用此类软件,或未经绑定唯一指向域名,可能导致不可预知的风险,由此产生的法律责任与纠纷与我们无关,我们有权中止、终止使用许可和(或)其他一切服务。 -8、您与其他使用许可软件的用户之间通过许可软件进行时,因您受误导或欺骗而导致或可能导致的任何心理、生理上的伤害以及经济上的损失,均应由侵权方依法承担所有责任。 +7.3 对因意外事故、滥用、错误使用、擅自修改所引起的软件使用问题,我们不承担任何责任,也不做任何保证。对因软件产品存在被攻击,或者自然灾害等不可抗力因素或非众邦科技原因导致软件不能使用,或造成损失的,我们不承担任何责任,也不做任何保证。 +7.4 对因使用软件引起的其他任何附带的、间接的或惩罚性的损失,包括但不限于商业利润的损失、信息或数据的丢失,众邦科技不承担任何责任,即使众邦科技已被告知存在此种损害的可能性也不例外。 +7.5 除法律法规有明确规定外,我们将尽最大努力确保许可软件及其所涉及的技术及信息安全、有效、准确、可靠,但受限于我们现有技术,您充分理解我们不能对此进行担保。您理解,对于因您自身、不可抗力及第三方原因导致的您的直接或间接损失,我们无法承担责任。 +7.6 由于您因下述任一情况所引起或与此有关的人身伤害或附带的、间接的损害赔偿,包括但不限于利润损失、资料损失、业务中断的损害赔偿或其他商业损害赔偿或损失,需由您自行承担:使用或未能使用许可软件;第三方未经批准的使用许可软件或更改您的数据;使用许可软件进行的行为产生的费用及损失;您对许可软件的误解;非因我们的原因而引起的与许可软件有关的其他损失。 +7.7 您清楚互联网软件的特殊性,本软件与大多数互联网软件一样,受包括但不限于用户原因、网络服务质量、社会环境等因素的影响,可能受到各种安全问题的侵扰,如用户下载安装的其他软件或访问的其他网站中含有“木马”等病毒,威胁到用户的计算机信息和数据的安全,继而影响本软件的正常使用等,用户应加强信息安全及使用资料的保护,以免遭受损失。
    八、保密条款 双方都应为可能获知另一方的商业计划、客户方资料、技术、产品、代码、文档和其他作为该方商业秘密的秘密信息予以保密。秘密信息包括所有有形的或无形的、标明为秘密的信息。秘密信息归披露方所有,除非经披露方声明许可否则不得披露或使用。
    九、协议终止和违约责任 -1、如果您没有遵守本协议的部分或全部条款,众邦科技可以随时单方终止本协议。协议终止后,我们将取消对您的商用许可授权,同时您必须立即停止使用该软件,对已经安装的软件进行卸载,如果由于您违反了本协议的规定给众邦科技造成损失,应承担损失赔偿责任。 -2、您应理解按授权范围使用许可软件、尊重软件及软件包含内容的知识产权、按规范使用软件、按本协议约定履行义务是您获取我们授权使用软件的前提,如您违反本协议,我们有权终止使用许可。 -3、您对软件的使用有赖于我们及关联公司为您提供的配套服务,您违反与我们或我们关联公司的条款、协议、规则、通告等相关规定,我们有权终止使用许可。您违反了本协议的规定给众邦科技造成损失,应承担给我们造成损失的赔偿责任。 -4、您理解出于维护软件系统及软件平台秩序的目的,如果您向我们及(或)我们的关联公司作出任何形式的承诺,且相关公司已确认您违反了该承诺并通知我们依据您与其相关约定进行处理的,则我们可按您的承诺或协议约定的方式对您的使用许可及其他我们可控制的权益采取限制措施,包括中止或终止对您的使用许可,并追究您相关法律责任的权利。 -5、您如从获得我们授权认可的第三方取得许可软件,您需要遵守本协议及第三方对您使用许可软件方式与限制的约定,如果您违反本协议及与第三方约定,我们有权终止对您的使用许可,并追究您相关法律责任。 -6、您应对从本软件获得的代码、文档等技术信息保密,不得对源代码、文档及框架进行删改,不得破译加密部分,不得非法进行倒卖本软件,我们不对非法软件使用后果承担任何责任,并有权追究您的法律责任,您应当赔偿因您的侵权行为给我们造成的直接和间接损失。 -7、如您违反本协议规定的条款,则构成违约,应当承担软件销售价格十倍至五十倍不等的违约金,如给我们或其他用户造成损失的,您必须承担全部的赔偿责任(包括直接损失和间接损失),包括但不限于咨询费、诉讼费、执行费、保全费、保险费、律师费等费用。 +9.1、如果您没有遵守本协议的部分或全部条款,众邦科技可以随时单方终止本协议。协议终止后,您必须立即停止使用该软件,对已经安装的软件进行卸载,如果由于您违反了本协议的规定给众邦科技造成损失,应承担损失赔偿责任。 +9.2、您应理解按授权范围使用许可软件、尊重软件及软件包含内容的知识产权、按规范使用软件、按本协议约定履行义务是您获取我们授权使用软件的前提,如您违反本协议,我们有权终止使用许可。 +9.3、您对软件的使用有赖于我们及关联公司为您提供的配套服务,您违反与我们或我们关联公司的条款、协议、规则、通告等相关规定,我们有权终止使用许可。您违反了本协议的规定给众邦科技造成损失,应承担给我们造成损失的赔偿责任。 +9.4、您理解出于维护软件系统及软件平台秩序的目的,如果您向我们及(或)我们的关联公司作出任何形式的承诺,且相关公司已确认您违反了该承诺并通知我们依据您与其相关约定进行处理的,则我们可按您的承诺或协议约定的方式对您的使用许可及其他我们可控制的权益采取限制措施,包括中止或终止对您的使用许可,并追究您相关法律责任的权利。 +9.5、您如从获得我们授权认可的第三方取得许可软件,您需要遵守本协议及第三方对您使用许可软件方式与限制的约定,如果您违反本协议及与第三方约定,我们有权终止对您的使用许可,并追究您相关法律责任。 +9.6、您应对从本软件获得的代码、文档等技术信息保密,不得对源代码、文档及框架进行删改,不得破译加密部分,不得非法进行倒卖本软件,我们不对非法软件使用后果承担任何责任,并有权追究您的法律责任,您应当赔偿因您的侵权行为给我们造成的直接和间接损失。 +9.7、如您违反本协议规定的条款,则构成违约,必须立即停止使用本软件,如给我们或其他用户造成损失的,您必须承担全部的赔偿责任(包括直接损失和间接损失),包括但不限于咨询费、诉讼费、执行费、保全费、保险费、律师费等费用。
    十、管辖法律及可分割性 -1、本协议之效力、解释、变更、执行与争议解决均适用中华人民共和国法律,如无相关法律规定的,则应参照通用国际商业惯例和(或)行业惯例。本协议由您与我们于我们服务器所在地陕西省西安市莲湖区签署。因本协议产生或与本协议有关的争议,您可与我们以友好协商,协商不成时,提交西安仲裁委员会予以裁决。仲裁裁决是终局的,对双方均有拘束力。 -2、本协议任何条款被认定为无效的,不应影响其他条款或其任何部分的效力,您与我们仍应善意履行。 +10.1、本协议之效力、解释、变更、执行与争议解决均适用中华人民共和国法律,如无相关法律规定的,则应参照通用国际商业惯例和(或)行业惯例。本协议由您与我们于我们服务器所在地陕西省西安市莲湖区签署。因本协议产生或与本协议有关的争议,您可与我们以友好协商,协商不成时,提交西安仲裁委员会予以裁决。仲裁裁决是终局的,对双方均有拘束力。 +10.2、本协议任何条款被认定为无效的,不应影响其他条款或其任何部分的效力,您与我们仍应善意履行。
    -十一、其它说明 -1.CRMEB产品没有收集任何最终用户的个人隐私信息。 -2.为了保障您使用CRMEB的产品与/或服务稳定性和版权合法性我们需要收集您的设备信息(操作系统及软件版本、安装站点域名、IP地址、浏览器信息)。 -
    -十二、其它条款 -1、本协议未约定的,由双方另行商定。 -2、本协议的所有标题仅是为了醒目及阅读方便,本身并没有实际涵义,不能作为解释本协议涵义的依据。 +十一、其他 +11.1、本协议未约定的,由双方另行商定。 +11.2、本协议的所有标题仅是为了醒目及阅读方便,本身并没有实际涵义,不能作为解释本协议涵义的依据。(正文完) 西安众邦网络科技有限公司 +协议发布时间: 2017年08月01日 +版本最新更新: 2023年02月03日 By CRMEB + +CRMEB官方网站:http://www.crmeb.com +CRMEB演示站:http://demo.crmeb.com +----------------------------------------------------- +运营团队: 众邦科技 +电 话: 400-8888-794 +邮 箱: admin@xazbkj.com +网 址: http://www.xazbkj.com +
    +
    +
    我知道了
    - -
    - + + + \ No newline at end of file diff --git a/crmeb/public/install/templates/step2.php b/crmeb/public/install/templates/step2.php old mode 100644 new mode 100755 index 7ee9debd4..babc91e6d --- a/crmeb/public/install/templates/step2.php +++ b/crmeb/public/install/templates/step2.php @@ -4,218 +4,294 @@ <?php echo $Title; ?> - <?php echo $Powered; ?> + + + + + + + -
    - -
    -
    -
      -
    • 1检测环境
    • -
    • 2创建数据
    • -
    • 3完成安装
    • -
    +
    + +
    + 安装检测 +
    +
    + -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    环境检测推荐配置当前状态最低要求
    操作系统类UNIX√ 不限制
    服务器环境apache/nginx√ apache2.0以上/nginx1.6以上
    PHP版本>√ 以上
    附件上传>2M不限制
    session启用启用
    safe_mode基础配置启用
    GD库必须开启1.0以上
    redis必须开启启用
    mysqli必须开启启用
    curl_init必须扩展启用
    bcmath必须扩展启用
    openssl必须扩展启用
    fileinfo必须扩展启用
    - - - - - - - - √可写 '; - } else { - $w = '√不可写 '; - $err++; - } - - - if (is_readable($Testdir)) { - $r = '√可读'; - } else { - $r = '√不可读'; - $err++; - } - ?> +
    + + + + + + + +
    +
    目录、文件权限检查推荐配置写入读取
    - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    读写环境检测推荐配置最低要求当前状态
    操作系统类UNIX不限制
    对
    服务器环境apache/nginxapache2.0以上/nginx1.6以上
    对
    PHP版本>以上
    对
    附件上传>2M不限制
    session启用启用
    safe_mode基础配置启用
    GD库必须开启1.0以上
    mysqli必须开启启用
    curl_init必须扩展启用
    bcmath必须扩展启用
    openssl必须扩展启用
    + + + + + + + + - √可写 '; - } else { - $w = '√不可写 '; - $err++; + foreach ($folder as $dir) { + $Testdir = APP_DIR . $dir; + if (!is_file($Testdir)) { + if (!is_dir($Testdir)) { + dir_create($Testdir); + } + } + + if (testwrite($Testdir)) { + $w = '对可写 '; + } else { + $w = '错不可写 '; + } + + + if (is_readable($Testdir)) { + $r = '对可读'; + } else { + $r = '错不可读'; + } + ?> + + + + + + + √可读'; - } else { - $r = '√不可读'; - $err++; + ?> + 可写 '; + } else { + $w = '错不可写 '; + } + if (is_readable($filedir)) { + $r = '对可读'; + } else { + $r = '错不可读'; + } + ?> + + + + + + + + - - - - - - - +
    权限检查推荐配置写入读取
    读写 +
    +
    +
    +
    读写 +
    +
    +
    +
    读写
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
    +
    +
    + + 温馨提示:程序运行需配置伪静态,否则安装后会存在无法使用的情况 +
    +
    +
    - 重新检测 - 0) { ?> - 下一步 + + 下一步 - 下一步 +
    - +
    +
    + diff --git a/crmeb/public/install/templates/step3.php b/crmeb/public/install/templates/step3.php old mode 100644 new mode 100755 index ca661b10d..9222aed1f --- a/crmeb/public/install/templates/step3.php +++ b/crmeb/public/install/templates/step3.php @@ -4,41 +4,29 @@ <?php echo $Title; ?> - <?php echo $Powered; ?> + + + + + + + -
    - +
    +
    + 创建数据 +
    -
    -
      -
    • 1检测环境
    • -
    • 2创建数据
    • -
    • 3完成安装
    • -
    -
    - -
    +
    - - - - - - - - - - + @@ -46,68 +34,58 @@
    - - - - - - + - - - - - - - - - -
    数据库信息    
    数据库服务器: -
    数据库服务器地址,一般为127.0.0.1
    -
    数据库端口: -
    数据库服务器端口,一般为3306
    -
    数据库用户名:
    数据库密码: -
    -
    数据库名:
    数据库表前缀: -
    建议使用默认,同一数据库安装多个CRMEB时需修改
    -
    演示数据:
    - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + +
    redis数据库信息  
    服务器地址: -
    redis服务器地址,一般为127.0.0.1
    -
    端口号: - -
    redis端口,默认为6379
    -
    数据库: -
    redis数据库,默认为0,一般不做更改
    -
    数据库密码: -
    redis数据库密码
    +
    +
    高级设置: + + + +
    数据库服务器: +
    +
    数据库端口: +
    数据库表前缀:
    演示数据:
    @@ -117,14 +95,16 @@ - + - - +
    管理员帐号:
    管理员密码: +
    请输入至少6个字符密码
    @@ -132,17 +112,67 @@
    重复密码:
    - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    缓存设置  
    缓存方式: + 文件缓存 + redis缓存 +
    服务器地址: +
    redis服务器地址,一般为127.0.0.1
    +
    端口号: + +
    redis端口,默认为6379
    +
    数据库: + +
    redis数据库,默认为0,一般不做更改
    +
    数据库密码: +
    redis数据库密码
    +
    -
    上一步 - +
    +
    + 上一步 +
    +
    @@ -151,155 +181,201 @@
    diff --git a/crmeb/public/install/templates/step4.php b/crmeb/public/install/templates/step4.php old mode 100644 new mode 100755 index 8584e30fd..f031d3a31 --- a/crmeb/public/install/templates/step4.php +++ b/crmeb/public/install/templates/step4.php @@ -1,70 +1,108 @@ - -<?php echo $Title; ?> - <?php echo $Powered; ?> - - + + <?php echo $Title; ?> - <?php echo $Powered; ?> + + + + + + -
    - -
    -
    -
      -
    • 1检测环境
    • -
    • 2创建数据
    • -
    • 3完成安装
    • -
    +
    +
    + 安装进度
    -
    -
      -
    -
    - -
    - + }) +
    - + + \ No newline at end of file diff --git a/crmeb/public/install/templates/step5.php b/crmeb/public/install/templates/step5.php old mode 100644 new mode 100755 index 8da81a30e..832bedab6 --- a/crmeb/public/install/templates/step5.php +++ b/crmeb/public/install/templates/step5.php @@ -5,6 +5,8 @@ <?php echo $Title; ?> - <?php echo $Powered; ?> + +
    - +
    + 安装完成 +
    +
    -
    -
    安装完成,进入后台管理 -

    为了您站点的安全,安装完成后即可将网站根目录下的“install”文件夹下的所有文件删除,除install.lock文件外防止重复安装。

    +

    + +

    安装成功

    -
    - 进入前台 - 进入后台 +
    +
    + 为了您站点的安全,安装完成后即可将网站根目录下的“install”文件夹下的所有文件删除,防止重复安装。 +
    +
    + -