commit 58e3df1c040d195c42708fc0664ff82a35d6dfd0 Author: kaizheng(郑凯) Date: Sun Jan 26 21:07:26 2025 +0800 fix: 初始化 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3454886 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,14 @@ +# https://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +insert_final_newline = false +trim_trailing_whitespace = false diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..6eee888 --- /dev/null +++ b/.env.development @@ -0,0 +1,8 @@ +ENV = 'development' + +# 接口地址 +VUE_APP_BASE_API = 'https://lczqvideodev.test.upchina.com' +VUE_APP_WS_API = 'ws://localhost:8000' + +# 是否启用 babel-plugin-dynamic-import-node插件 +VUE_CLI_BABEL_TRANSPILE_MODULES = true diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..66da123 --- /dev/null +++ b/.env.production @@ -0,0 +1,7 @@ +ENV = 'production' + +# 如果使用 Nginx 代理后端接口,那么此处需要改为 '/',文件查看 Docker 部署篇,Nginx 配置 +# 接口地址,注意协议,如果你没有配置 ssl,需要将 https 改为 http +VUE_APP_BASE_API = 'https://eladmin.vip' +# 如果接口是 http 形式, wss 需要改为 ws +VUE_APP_WS_API = 'wss://eladmin.vip' diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..e6529fc --- /dev/null +++ b/.eslintignore @@ -0,0 +1,4 @@ +build/*.js +src/assets +public +dist diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..b495017 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,275 @@ +module.exports = { + root: true, + parserOptions: { + parser: "babel-eslint", + sourceType: "module" + }, + env: { + browser: true, + node: true, + es6: true + }, + extends: ["plugin:vue/recommended", "eslint:recommended"], + + // add your custom rules here + //it is base on https://github.com/vuejs/eslint-config-vue + rules: { + "vue/max-attributes-per-line": [ + 2, + { + singleline: 10, + multiline: { + max: 1, + allowFirstLine: false + } + } + ], + "vue/singleline-html-element-content-newline": "off", + "vue/multiline-html-element-content-newline": "off", + "vue/name-property-casing": ["error", "PascalCase"], + "vue/no-v-html": "off", + "accessor-pairs": 2, + "arrow-spacing": [ + 2, + { + before: true, + after: true + } + ], + "block-spacing": [2, "always"], + "brace-style": [ + 2, + "1tbs", + { + allowSingleLine: true + } + ], + camelcase: [ + 0, + { + properties: "always" + } + ], + "comma-dangle": [2, "never"], + "comma-spacing": [ + 2, + { + before: false, + after: true + } + ], + "comma-style": [2, "last"], + "constructor-super": 2, + curly: [2, "multi-line"], + "dot-location": [2, "property"], + "eol-last": 2, + eqeqeq: ["error", "always", { null: "ignore" }], + "generator-star-spacing": [ + 2, + { + before: true, + after: true + } + ], + "handle-callback-err": [2, "^(err|error)$"], + indent: [ + 2, + 2, + { + SwitchCase: 1 + } + ], + "jsx-quotes": [2, "prefer-single"], + "key-spacing": [ + 2, + { + beforeColon: false, + afterColon: true + } + ], + "keyword-spacing": [ + 2, + { + before: true, + after: true + } + ], + "new-cap": [ + 2, + { + newIsCap: true, + capIsNew: false + } + ], + "new-parens": 2, + "no-array-constructor": 2, + "no-caller": 2, + "no-console": "off", + "no-class-assign": 2, + "no-cond-assign": 2, + "no-const-assign": 2, + "no-control-regex": 0, + "no-delete-var": 2, + "no-dupe-args": 2, + "no-dupe-class-members": 2, + "no-dupe-keys": 2, + "no-duplicate-case": 2, + "no-empty-character-class": 2, + "no-empty-pattern": 2, + "no-eval": 2, + "no-ex-assign": 2, + "no-extend-native": 2, + "no-extra-bind": 2, + "no-extra-boolean-cast": 2, + "no-extra-parens": [2, "functions"], + "no-fallthrough": 2, + "no-floating-decimal": 2, + "no-func-assign": 2, + "no-implied-eval": 2, + "no-inner-declarations": [2, "functions"], + "no-invalid-regexp": 2, + "no-irregular-whitespace": 2, + "no-iterator": 2, + "no-label-var": 2, + "no-labels": [ + 2, + { + allowLoop: false, + allowSwitch: false + } + ], + "no-lone-blocks": 2, + "no-mixed-spaces-and-tabs": 2, + "no-multi-spaces": 2, + "no-multi-str": 2, + "no-multiple-empty-lines": [ + 2, + { + max: 1 + } + ], + "no-native-reassign": 2, + "no-negated-in-lhs": 2, + "no-new-object": 2, + "no-new-require": 2, + "no-new-symbol": 2, + "no-new-wrappers": 2, + "no-obj-calls": 2, + "no-octal": 2, + "no-octal-escape": 2, + "no-path-concat": 2, + "no-proto": 2, + "no-redeclare": 2, + "no-regex-spaces": 2, + "no-return-assign": [2, "except-parens"], + "no-self-assign": 2, + "no-self-compare": 2, + "no-sequences": 2, + "no-shadow-restricted-names": 2, + "no-spaced-func": 2, + "no-sparse-arrays": 2, + "no-this-before-super": 2, + "no-throw-literal": 2, + "no-trailing-spaces": 2, + "no-undef": 2, + "no-undef-init": 2, + "no-unexpected-multiline": 2, + "no-unmodified-loop-condition": 2, + "no-unneeded-ternary": [ + 2, + { + defaultAssignment: false + } + ], + "no-unreachable": 2, + "no-unsafe-finally": 2, + "no-unused-vars": [ + 2, + { + vars: "all", + args: "none" + } + ], + "no-useless-call": 2, + "no-useless-computed-key": 2, + "no-useless-constructor": 2, + "no-useless-escape": 0, + "no-whitespace-before-property": 2, + "no-with": 2, + "one-var": [ + 2, + { + initialized: "never" + } + ], + "operator-linebreak": [ + 2, + "after", + { + overrides: { + "?": "before", + ":": "before" + } + } + ], + "padded-blocks": [2, "never"], + quotes: [ + 0, + "single", + { + avoidEscape: true, + allowTemplateLiterals: true + } + ], + semi: [0, "never"], + "semi-spacing": [ + 2, + { + before: false, + after: true + } + ], + "space-before-blocks": [2, "always"], + "space-before-function-paren": [2, "never"], + "space-in-parens": [2, "never"], + "space-infix-ops": 2, + "space-unary-ops": [ + 2, + { + words: true, + nonwords: false + } + ], + "spaced-comment": [ + 2, + "always", + { + markers: [ + "global", + "globals", + "eslint", + "eslint-disable", + "*package", + "!", + "," + ] + } + ], + "template-curly-spacing": [2, "never"], + "use-isnan": 2, + "valid-typeof": 2, + "wrap-iife": [2, "any"], + "yield-star-spacing": [2, "both"], + yoda: [2, "never"], + "prefer-const": 2, + "no-debugger": process.env.NODE_ENV === "production" ? 2 : 0, + "object-curly-spacing": [ + 2, + "always", + { + objectsInObjects: false + } + ], + "array-bracket-spacing": [2, "never"] + } +}; diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1978bc2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +.DS_Store +node_modules/ +dist/ +demo/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +**/*.log + +tests/**/coverage/ +tests/e2e/reports +selenium-debug.log + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.local + +package-lock.json +yarn.lock diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..f4be7a0 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,5 @@ +language: node_js +node_js: 10 +script: npm run test +notifications: + email: false diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..78a36cb --- /dev/null +++ b/LICENSE @@ -0,0 +1,191 @@ +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, and +distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by the copyright +owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and all other entities +that control, are controlled by, or are under common control with that entity. +For the purposes of this definition, "control" means (i) the power, direct or +indirect, to cause the direction or management of such entity, whether by +contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the +outstanding shares, or (iii) beneficial ownership of such entity. + +"You" (or "Your") shall mean an individual or Legal Entity exercising +permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, including +but not limited to software source code, documentation source, and configuration +files. + +"Object" form shall mean any form resulting from mechanical transformation or +translation of a Source form, including but not limited to compiled object code, +generated documentation, and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, made +available under the License, as indicated by a copyright notice that is included +in or attached to the work (an example is provided in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, that +is based on (or derived from) the Work and for which the editorial revisions, +annotations, elaborations, or other modifications represent, as a whole, an +original work of authorship. For the purposes of this License, Derivative Works +shall not include works that remain separable from, or merely link (or bind by +name) to the interfaces of, the Work and Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original version +of the Work and any modifications or additions to that Work or Derivative Works +thereof, that is intentionally submitted to Licensor for inclusion in the Work +by the copyright owner or by an individual or Legal Entity authorized to submit +on behalf of the copyright owner. For the purposes of this definition, +"submitted" means any form of electronic, verbal, or written communication sent +to the Licensor or its representatives, including but not limited to +communication on electronic mailing lists, source code control systems, and +issue tracking systems that are managed by, or on behalf of, the Licensor for +the purpose of discussing and improving the Work, but excluding communication +that is conspicuously marked or otherwise designated in writing by the copyright +owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity on behalf +of whom a Contribution has been received by Licensor and subsequently +incorporated within the Work. + +2. Grant of Copyright License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the Work and such +Derivative Works in Source or Object form. + +3. Grant of Patent License. + +Subject to the terms and conditions of this License, each Contributor hereby +grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, +irrevocable (except as stated in this section) patent license to make, have +made, use, offer to sell, sell, import, and otherwise transfer the Work, where +such license applies only to those patent claims licensable by such Contributor +that are necessarily infringed by their Contribution(s) alone or by combination +of their Contribution(s) with the Work to which such Contribution(s) was +submitted. If You institute patent litigation against any entity (including a +cross-claim or counterclaim in a lawsuit) alleging that the Work or a +Contribution incorporated within the Work constitutes direct or contributory +patent infringement, then any patent licenses granted to You under this License +for that Work shall terminate as of the date such litigation is filed. + +4. Redistribution. + +You may reproduce and distribute copies of the Work or Derivative Works thereof +in any medium, with or without modifications, and in Source or Object form, +provided that You meet the following conditions: + +You must give any other recipients of the Work or Derivative Works a copy of +this License; and +You must cause any modified files to carry prominent notices stating that You +changed the files; and +You must retain, in the Source form of any Derivative Works that You distribute, +all copyright, patent, trademark, and attribution notices from the Source form +of the Work, excluding those notices that do not pertain to any part of the +Derivative Works; and +If the Work includes a "NOTICE" text file as part of its distribution, then any +Derivative Works that You distribute must include a readable copy of the +attribution notices contained within such NOTICE file, excluding those notices +that do not pertain to any part of the Derivative Works, in at least one of the +following places: within a NOTICE text file distributed as part of the +Derivative Works; within the Source form or documentation, if provided along +with the Derivative Works; or, within a display generated by the Derivative +Works, if and wherever such third-party notices normally appear. The contents of +the NOTICE file are for informational purposes only and do not modify the +License. You may add Your own attribution notices within Derivative Works that +You distribute, alongside or as an addendum to the NOTICE text from the Work, +provided that such additional attribution notices cannot be construed as +modifying the License. +You may add Your own copyright statement to Your modifications and may provide +additional or different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works as a whole, +provided Your use, reproduction, and distribution of the Work otherwise complies +with the conditions stated in this License. + +5. Submission of Contributions. + +Unless You explicitly state otherwise, any Contribution intentionally submitted +for inclusion in the Work by You to the Licensor shall be under the terms and +conditions of this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify the terms of +any separate license agreement you may have executed with Licensor regarding +such Contributions. + +6. Trademarks. + +This License does not grant permission to use the trade names, trademarks, +service marks, or product names of the Licensor, except as required for +reasonable and customary use in describing the origin of the Work and +reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. + +Unless required by applicable law or agreed to in writing, Licensor provides the +Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, +including, without limitation, any warranties or conditions of TITLE, +NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are +solely responsible for determining the appropriateness of using or +redistributing the Work and assume any risks associated with Your exercise of +permissions under this License. + +8. Limitation of Liability. + +In no event and under no legal theory, whether in tort (including negligence), +contract, or otherwise, unless required by applicable law (such as deliberate +and grossly negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, incidental, +or consequential damages of any character arising as a result of this License or +out of the use or inability to use the Work (including but not limited to +damages for loss of goodwill, work stoppage, computer failure or malfunction, or +any and all other commercial damages or losses), even if such Contributor has +been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. + +While redistributing the Work or Derivative Works thereof, You may choose to +offer, and charge a fee for, acceptance of support, warranty, indemnity, or +other liability obligations and/or rights consistent with this License. However, +in accepting such obligations, You may act only on Your own behalf and on Your +sole responsibility, not on behalf of any other Contributor, and only if You +agree to indemnify, defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason of your +accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work + +To apply the Apache License to your work, attach the following boilerplate +notice, with the fields enclosed by brackets "{}" replaced with your own +identifying information. (Don't include the brackets!) The text should be +enclosed in the appropriate comment syntax for the file format. We also +recommend that a file or class name and description of purpose be included on +the same "printed page" as the copyright notice for easier identification within +third-party archives. + + Copyright 2019 Zheng Jie + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000..8ac8fd3 --- /dev/null +++ b/README.md @@ -0,0 +1,84 @@ +# ELADMIN-WEB + +ELADMIN 前端源码 + +#### 项目源码 + +| | 后端源码 | 前端源码 | +|--- |--- | --- | +| github | https://github.com/elunez/eladmin | https://github.com/elunez/eladmin-web | +| 码云 | https://gitee.com/elunez/eladmin | https://gitee.com/elunez/eladmin-web | + +#### 开发文档 +[https://eladmin.vip](https://eladmin.vip) + +#### 体验地址 +[https://eladmin.vip/demo](https://eladmin.vip/demo) + +#### 前端模板 + +初始模板基于: [https://github.com/PanJiaChen/vue-element-admin](https://github.com/PanJiaChen/vue-element-admin) + +模板文档: [https://panjiachen.github.io/vue-element-admin-site/zh/guide/](https://panjiachen.github.io/vue-element-admin-site/zh/guide/) + +#### VPS推荐 + + + + +使用优惠码: `BWHCGLUKKB`,可获得 6.81% 的折扣, [查看介绍](https://bwhstock.in/) + +#### Build Setup +**推荐 node 版本:12-16** +``` bash +# 配置镜像加速 +https://www.ydyno.com/archives/1219.html + +# 安装依赖 +npm install + +# 启动服务 localhost:8013 +npm run dev + +# 构建生产环境 +npm run build:prod +``` + +#### 常见问题 + +1、linux 系统在安装依赖的时候会出现 node-sass 无法安装的问题 + +解决方案: +``` +1. 单独安装:npm install --unsafe-perm node-sass +2. 直接使用:npm install --unsafe-perm +``` + +2、加速node-sass安装 + +https://izlzl.com/archives/1219.html + +3、出现 No module named 'distutils' + +``` +需要安装 python,安装 pip 或者 pip3 +然后安装 pip install distutils / pip3 install distutils +``` + +#### 特别鸣谢 + +- 感谢 [JetBrains](https://www.jetbrains.com/) 提供的非商业开源软件开发授权 + +- 感谢 [PanJiaChen](https://github.com/PanJiaChen/vue-element-admin) 大佬提供的前端模板 + +- 感谢 [Moxun](https://github.com/moxun1639) 大佬提供的前端 Crud 通用组件 + +- 感谢 [zhy6599](https://gitee.com/zhy6599) 大佬提供的后端运维管理相关功能 + +- 感谢 [j.yao.SUSE](https://github.com/everhopingandwaiting) 大佬提供的匿名接口与Redis限流等功能 + +- 感谢 [d15801543974](https://github.com/d15801543974) 大佬提供的基于注解的通用查询方式 + +#### 反馈交流 + +- QQ交流群:891137268 、947578238、659622532 \ No newline at end of file diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..804632a --- /dev/null +++ b/babel.config.js @@ -0,0 +1,11 @@ +const plugins = ['@vue/babel-plugin-transform-vue-jsx'] +// 生产环境移除console +if (process.env.NODE_ENV === 'production') { + plugins.push('transform-remove-console') +} +module.exports = { + plugins: plugins, + presets: [ + '@vue/app' + ] +} diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..143cdc8 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,24 @@ +module.exports = { + moduleFileExtensions: ['js', 'jsx', 'json', 'vue'], + transform: { + '^.+\\.vue$': 'vue-jest', + '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': + 'jest-transform-stub', + '^.+\\.jsx?$': 'babel-jest' + }, + moduleNameMapper: { + '^@/(.*)$': '/src/$1' + }, + snapshotSerializers: ['jest-serializer-vue'], + testMatch: [ + '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' + ], + collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'], + coverageDirectory: '/tests/unit/coverage', + // 'collectCoverage': true, + 'coverageReporters': [ + 'lcov', + 'text-summary' + ], + testURL: 'http://localhost/' +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..64d63cd --- /dev/null +++ b/package.json @@ -0,0 +1,123 @@ +{ + "name": "eladmin-web", + "version": "2.7.0", + "description": "ELADMIN 前端源码", + "author": "Zheng Jie", + "license": "Apache-2.0", + "scripts": { + "dev": "vue-cli-service serve", + "build:prod": "vue-cli-service build", + "build:stage": "vue-cli-service build --mode staging", + "preview": "node build/index.js --preview", + "lint": "eslint --ext .js,.vue src", + "test:unit": "jest --clearCache && vue-cli-service test:unit", + "svgo": "svgo -f src/assets/icons/svg --config=src/assets/icons/svgo.yml", + "new": "plop" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "src/**/*.{js,vue}": [ + "eslint --fix", + "git add" + ] + }, + "repository": { + "type": "git", + "url": "https://github.com/elunez/eladmin-web.git" + }, + "bugs": { + "url": "https://github.com/elunez/eladmin/issues" + }, + "dependencies": { + "@riophae/vue-treeselect": "^0.4.0", + "@stomp/stompjs": "^6.1.2", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^1.0.2", + "axios": "1.7.4", + "babel-eslint": "^8.2.2", + "clipboard": "2.0.4", + "codemirror": "^5.49.2", + "core-js": "^2.6.12", + "crypto-js": "^4.2.0", + "dayjs": "^1.11.13", + "echarts": "^4.2.1", + "echarts-wordcloud": "^1.1.3", + "element-ui": "^2.15.8", + "file-saver": "1.3.8", + "fuse.js": "3.4.4", + "js-beautify": "^1.10.2", + "js-cookie": "2.2.0", + "jsencrypt": "^3.0.0-rc.1", + "jszip": "^3.7.1", + "mavon-editor": "^2.9.1", + "moment": "^2.30.1", + "normalize.css": "7.0.0", + "nprogress": "0.2.0", + "path-to-regexp": "8.0.0", + "qrcodejs2": "^0.0.2", + "qs": "^6.10.1", + "screenfull": "4.2.0", + "sortablejs": "1.8.4", + "vod-js-sdk-v6": "^1.7.1-beta.1", + "vue": "^2.6.14", + "vue-count-to": "^1.0.13", + "vue-cropper": "0.4.9", + "vue-echarts": "^5.0.0-beta.0", + "vue-image-crop-upload": "^2.5.0", + "vue-router": "3.0.2", + "vue-splitpane": "1.0.4", + "vuedraggable": "2.20.0", + "vuex": "3.1.0", + "wangeditor": "^4.7.11", + "webpack": "^4.47.0", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@babel/parser": "^7.7.4", + "@babel/register": "7.0.0", + "@vue/babel-plugin-transform-vue-jsx": "^1.2.1", + "@vue/cli-plugin-babel": "3.5.3", + "@vue/cli-plugin-eslint": "^3.9.1", + "@vue/cli-plugin-unit-jest": "3.5.3", + "@vue/cli-service": "3.5.3", + "@vue/test-utils": "1.0.0-beta.29", + "autoprefixer": "^9.5.1", + "babel-core": "7.0.0-bridge.0", + "babel-jest": "23.6.0", + "babel-plugin-dynamic-import-node": "2.3.0", + "babel-plugin-transform-remove-console": "^6.9.4", + "chalk": "2.4.2", + "chokidar": "2.1.5", + "compression-webpack-plugin": "5.0.2", + "connect": "3.6.6", + "eslint": "5.15.3", + "eslint-plugin-vue": "5.2.2", + "html-webpack-plugin": "3.2.0", + "http-proxy-middleware": "3.0.3", + "husky": "1.3.1", + "lint-staged": "8.1.5", + "plop": "2.3.0", + "sass": "1.32.13", + "sass-loader": "10.2.0", + "script-ext-html-webpack-plugin": "2.1.3", + "script-loader": "0.7.2", + "serve-static": "1.16.2", + "svg-sprite-loader": "4.1.3", + "svgo": "1.2.0", + "tasksfile": "^5.1.1", + "vue-template-compiler": "2.7.15", + "vue2-editor": "^2.10.3" + }, + "engines": { + "node": ">=8.9", + "npm": ">= 3.0.0" + }, + "browserslist": [ + "> 1%", + "last 2 versions" + ] +} diff --git a/plopfile.js b/plopfile.js new file mode 100644 index 0000000..9f3147e --- /dev/null +++ b/plopfile.js @@ -0,0 +1,7 @@ +const viewGenerator = require('./plop-templates/view/prompt') +const componentGenerator = require('./plop-templates/component/prompt') + +module.exports = function(plop) { + plop.setGenerator('view', viewGenerator) + plop.setGenerator('component', componentGenerator) +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..961986e --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,5 @@ +module.exports = { + plugins: { + autoprefixer: {} + } +} diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..fcb6999 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..0e4dc6a --- /dev/null +++ b/public/index.html @@ -0,0 +1,32 @@ + + + + + + + + + <%= webpackConfig.name %> + + + + + + + + + + + + + + + +
+ + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..77470cb --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/public/static/css/tcplayer.min.css b/public/static/css/tcplayer.min.css new file mode 100644 index 0000000..fc8e91d --- /dev/null +++ b/public/static/css/tcplayer.min.css @@ -0,0 +1 @@ +@charset "UTF-8";.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.video-js .vjs-modal-dialog,.vjs-button>.vjs-icon-placeholder:before,.vjs-modal-dialog .vjs-modal-dialog-content{position:absolute;top:0;left:0;width:100%;height:100%}.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.vjs-button>.vjs-icon-placeholder:before{text-align:center}@font-face{font-family:VideoJS;src:url(font/VideoJS.eot?#iefix) format("eot")}@font-face{font-family:VideoJS;src:url(data:application/font-woff;charset=utf-8;base64,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) format("woff"),url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwR1NVQiCLJXoAAAE4AAAAVE9TLzJRiV3RAAABjAAAAFZjbWFwOfT3xgAAAmgAAAMiZ2x5ZgMJ0sMAAAXQAAARCGhlYWQSy2hLAAAA4AAAADZoaGVhDgMHIQAAALwAAAAkaG10eOAAAAAAAAHkAAAAhGxvY2E9NEHGAAAFjAAAAERtYXhwATIAgQAAARgAAAAgbmFtZdXH9aAAABbYAAACCnBvc3RAAl/0AAAY5AAAAZ4AAQAABwAAAAAABwAAAP//BwEAAQAAAAAAAAAAAAAAAAAAACEAAQAAAAEAAFYfTwlfDzz1AAsHAAAAAADWVg6nAAAAANZWDqcAAAAABwEHAAAAAAgAAgAAAAAAAAABAAAAIQB1AAcAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAEGygGQAAUAAARxBOYAAAD6BHEE5gAAA1wAVwHOAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAQPEB8SAHAAAAAKEHAAAAAAAAAQAAAAAAAAAAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAcAAAAHAAAABwAAAAAAAAUAAAADAAAALAAAAAQAAAGSAAEAAAAAAIwAAwABAAAALAADAAoAAAGSAAQAYAAAAAQABAABAADxIP//AADxAf//AAAAAQAEAAAAAQACAAMABAAFAAYABwAIAAkACgALAAwADQAOAA8AEAARABIAEwAUABUAFgAXABgAGQAaABsAHAAdAB4AHwAgAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAGQAAAAAAAAACAAAPEBAADxAQAAAAEAAPECAADxAgAAAAIAAPEDAADxAwAAAAMAAPEEAADxBAAAAAQAAPEFAADxBQAAAAUAAPEGAADxBgAAAAYAAPEHAADxBwAAAAcAAPEIAADxCAAAAAgAAPEJAADxCQAAAAkAAPEKAADxCgAAAAoAAPELAADxCwAAAAsAAPEMAADxDAAAAAwAAPENAADxDQAAAA0AAPEOAADxDgAAAA4AAPEPAADxDwAAAA8AAPEQAADxEAAAABAAAPERAADxEQAAABEAAPESAADxEgAAABIAAPETAADxEwAAABMAAPEUAADxFAAAABQAAPEVAADxFQAAABUAAPEWAADxFgAAABYAAPEXAADxFwAAABcAAPEYAADxGAAAABgAAPEZAADxGQAAABkAAPEaAADxGgAAABoAAPEbAADxGwAAABsAAPEcAADxHAAAABwAAPEdAADxHQAAAB0AAPEeAADxHgAAAB4AAPEfAADxHwAAAB8AAPEgAADxIAAAACAAAAAAAAAADgBoAH4AzADgAQIBQgFsAZgBwgIYAlgCtALgAzADsAPeBDAElgTcBSQFZgWKBiAGZga0BuoHWAgSCFgIbgiEAAEAAAAABYsFiwACAAABEQECVQM2BYv76gILAAADAAAAAAZrBmsAAgAbADQAAAkCEyIHDgEHBhAXHgEXFiA3PgE3NhAnLgEnJgMiJy4BJyY0Nz4BNzYyFx4BFxYUBw4BBwYC6wHA/kCVmIuGzjk7OznOhosBMIuGzjk7OznOhouYeW9rpi0vLy2ma2/yb2umLS8vLaZrbwIwAVABUAGbOznOhov+0IuGzjk7OznOhosBMIuGzjk7+sAvLaZrb/Jva6YtLy8tpmtv8m9rpi0vAAACAAAAAAVABYsAAwAHAAABIREpAREhEQHAASv+1QJVASsBdQQW++oEFgAAAAQAAAAABiEGIAAHABcAJwAqAAABNCcmJxUXNjcUBxc2NTQnLgEnFR4BFxYBBwEhESEBEQEGBxU2Nxc3AQcXBNA0MlW4A7spcU1FQ+6VbKovMfu0XwFh/p8BKwF1AT5QWZl6mV/9YJycA4BhUlAqpbgYGGNicZKknYyHvSKaIJNlaQIsX/6f/kD+iwH2/sI9G5ojZJhfBJacnAAAAAEAAAAABKsF1gAFAAABESEBEQECCwEqAXb+igRg/kD+iwSq/osAAAACAAAAAAVmBdYACAAOAAABNCcmJxE2NzYBESEBEQEFZTQyVFQyNPwQASsBdf6LA4BhUlAq/aYqUFIBQf5A/osEqv6LAAMAAAAABiAGDwAFAA4AIgAAExEhAREBBTQnJicRNjc2AxUeARcWFAcOAQcVPgE3NhAnLgHgASsBdf6LAsU0MlVVMjS7bKovMTEvqmyV7kNFRUPuBGD+QP6LBKr+i+BhUlAq/aYqUFIC8Jogk2Vp6GllkyCaIr2HjAE6jIe9AAAABAAAAAAFiwWLAAUACwARABcAAAEjESE1IwMzNTM1IQEjFSERIwMVMxUzEQILlgF24JaW4P6KA4DgAXaW4OCWAuv+ipYCCuCW/ICWAXYCoJbgAXYABAAAAAAFiwWLAAUACwARABcAAAEzFTMRIRMjFSERIwEzNTM1IRM1IxEhNQF14Jb+iuDgAXaWAcCW4P6KlpYBdgJV4AF2AcCWAXb76uCWAcDg/oqWAAAAAAIAAAAABdYF1gATABcAAAEhIg4BFREUHgEzITI+ATURNC4BAyERIQVA/IApRCgoRCkDgClEKChEKfyAA4AF1ShEKfyAKUQoKEQpA4ApRCj76wOAAAYAAAAABmsGawAIAA0AFQAeACMALAAACQEmIyIHBgcBJS4BJwEFIQE2NzY1NAUBBgcGFRQXIQUeARcBMwEWMzI3NjcBAr4BZFJQhHt2YwESA44z7Z/+7gLl/dABel0zNfwS/t1dMzUPAjD95DPtnwESeP7dU0+Ee3Zj/u4D8AJoEy0rUf4nd6P6PP4nS/1zZn+Ej0tLAfhmf4SPS0pLo/o8Adn+CBMtK1EB2QAFAAAAAAZrBdYAEwAXABsAHwAjAAABISIOARURFB4BMyEyPgE1ETQuAQEhFSEBITUhBSE1ITUhNSEF1ftWKUUoKEUpBKopRSgoRfstASr+1gLq/RYC6gHA/tYBKv0WAuoF1ShEKfyAKUQoKEQpA4ApRCj9q5X+1ZWVlZaVAAAAAAMAAAAABiAF1gATACsAQwAAASEiDgEVERQeATMhMj4BNRE0LgEBIzUjFTM1MxUUBisBIiY1ETQ2OwEyFhUFIzUjFTM1MxUUBisBIiY1ETQ2OwEyFhUFi/vqKEUoKEUoBBYoRSgoRf2CcJWVcCsf4B8sLB/gHysCC3CVlXAsH+AfKysf4B8sBdUoRCn8gClEKChEKQOAKUQo/fYl4CVKHywsHwEqHywsH0ol4CVKHywsHwEqHywsHwAGAAAAAAYgBPYAAwAHAAsADwATABcAABMzNSMRMzUjETM1IwEhNSERITUhERUhNeCVlZWVlZUBKwQV++sEFfvrBBUDNZb+QJUBwJX+QJb+QJUCVZWVAAAAAQAAAAAGIQZsADEAAAEiBgcBNjQnAR4BMzI+ATQuASIOARUUFwEuASMiDgEUHgEzMjY3AQYVFB4BMj4BNC4BBUAqSx797AcHAg8eTys9Zzw8Z3pnPAf98R5PKz1nPDxnPStPHgIUBjtkdmQ7O2QCTx4cATcbMhsBNB0gPGd6Zzw8Zz0ZG/7NHCA8Z3pnPCAc/soZGDtkOjpkdmQ7AAAAAAIAAAAABlkGawBDAFAAAAE2NCc3PgEnAy4BDwEmLwEuASMhIgYPAQYHJyYGBwMGFh8BBhQXBw4BFxMeAT8BFh8BHgEzITI2PwE2NxcWNjcTNiYnBSIuATQ+ATIeARQOAQWrBQWeCgYHlgcaDLo8QhwDFQ7+1g4VAhxEOroNGgeVBwULnQUFnQsFB5UHGg26O0McAhUOASoOFQIcRDq6DRoHlQcFC/04R3hGRniOeEZGeAM3Kj4qewkbDAEDDAkFSy4bxg4SEg7GHC1LBQkM/v0MGwl7Kj4qewkbDP79DAkFSy4bxg4SEg7GHC1LBQkMAQMMGwlBRniOeEZGeI54RgABAAAAAAZrBmsAGAAAExQXHgEXFiA3PgE3NhAnLgEnJiAHDgEHBpU7Oc6GiwEwi4bOOTs7Oc6Gi/7Qi4bOOTsDgJiLhs45Ozs5zoaLATCLhs45Ozs5zoaLAAAAAAIAAAAABmsGawAYADEAAAEiBw4BBwYQFx4BFxYgNz4BNzYQJy4BJyYDIicuAScmNDc+ATc2MhceARcWFAcOAQcGA4CYi4bOOTs7Oc6GiwEwi4bOOTs7Oc6Gi5h5b2umLS8vLaZrb/Jva6YtLy8tpmtvBms7Oc6Gi/7Qi4bOOTs7Oc6GiwEwi4bOOTv6wC8tpmtv8m9rpi0vLy2ma2/yb2umLS8AAwAAAAAGawZrABgAMQA+AAABIgcOAQcGEBceARcWIDc+ATc2ECcuAScmAyInLgEnJjQ3PgE3NjIXHgEXFhQHDgEHBhMUDgEiLgE0PgEyHgEDgJiKhs85Ozs5z4aKATCKhs85Ozs5z4aKmHlva6YtLy8tpmtv8m9rpi0vLy2ma29nPGd6Zzw8Z3pnPAZrOznPhor+0IqGzzk7OznPhooBMIqGzzk7+sAvLaZrb/Jva6YtLy8tpmtv8m9rpi0vAlU9Zzw8Z3pnPDxnAAAABAAAAAAGIAYhABMAHwApAC0AAAEhIg4BFREUHgEzITI+ATURNC4BASM1IxUjETMVMzU7ASEyFhURFAYjITczNSMFi/vqKEUoKEUoBBYoRSgoRf2CcJVwcJVwlgEqHywsH/7WcJWVBiAoRSj76ihFKChFKAQWKEUo/ICVlQHAu7ssH/7WHyxw4AAAAAACAAAAAAZrBmsAGAAkAAABIgcOAQcGEBceARcWIDc+ATc2ECcuAScmEwcJAScJATcJARcBA4CYi4bOOTs7Oc6GiwEwi4bOOTs7Oc6Gi91p/vT+9GkBC/71aQEMAQxp/vUGazs5zoaL/tCLhs45Ozs5zoaLATCLhs45O/wJaQEL/vVpAQwBDGn+9QELaf70AAABAAAAAAXWBrYAJwAAAREJAREyFxYXFhQHBgcGIicmJyY1IxQXHgEXFjI3PgE3NjQnLgEnJgOA/osBdXpoZjs9PTtmaPRoZjs9lS8tpWtv9G9rpS0vLy2la28FiwEq/ov+iwEqPTtmaPNpZTw9PTxlaXl5b2umLS8vLaZrb/Nva6UuLwABAAAAAAU/BwAAFAAAAREjIgYdASEDIxEhESMRMzU0NjMyBT+dVjwBJSf+/s7//9Ctkwb0/vhISL3+2P0JAvcBKNq6zQAAAAAEAAAAAAaOBwAAMABFAGAAbAAAARQeAxUUBwYEIyImJyY1NDY3NiUuATU0NwYjIiY1NDY3PgEzIQcjHgEVFA4DJzI2NzY1NC4CIyIGBwYVFB4DEzI+AjU0LgEvASYvAiYjIg4DFRQeAgEzFSMVIzUjNTM1MwMfQFtaQDBI/uqfhOU5JVlKgwERIB8VLhaUy0g/TdNwAaKKg0pMMUVGMZImUBo1Ij9qQCpRGS8UKz1ZNjprWzcODxMeChwlThAgNWhvUzZGcX0Da9XVadTUaQPkJEVDUIBOWlN6c1NgPEdRii5SEipAKSQxBMGUUpo2QkBYP4xaSHNHO0A+IRs5ZjqGfVInITtlLmdnUjT8lxo0Xj4ZMCQYIwsXHTgCDiQ4XTtGazsdA2xs29ts2QADAAAAAAaABmwAAwAOACoAAAERIREBFgYrASImNDYyFgERIRE0JiMiBgcGFREhEhAvASEVIz4DMzIWAd3+tgFfAWdUAlJkZ6ZkBI/+t1FWP1UVC/63AgEBAUkCFCpHZz+r0ASP/CED3wEySWJik2Fh/N39yAISaXdFMx4z/dcBjwHwMDCQIDA4H+MAAAEAAAAABpQGAAAxAAABBgcWFRQCDgEEIyAnFjMyNy4BJxYzMjcuAT0BFhcuATU0NxYEFyY1NDYzMhc2NwYHNgaUQ18BTJvW/tKs/vHhIyvhsGmmHyEcKypwk0ROQk4seQFbxgi9hoxgbWAlaV0FaGJFDhyC/v3ut22RBIoCfWEFCxexdQQmAyyOU1hLlbMKJiSGvWYVOXM/CgAAAAEAAAAABYAHAAAiAAABFw4BBwYuAzURIzU+BDc+ATsBESEVIREUHgI3NgUwUBewWWitcE4hqEhyRDAUBQEHBPQBTf6yDSBDME4Bz+0jPgECOFx4eDoCINcaV11vVy0FB/5Y/P36HjQ1HgECAAEAAAAABoAGgABKAAABFAIEIyInNj8BHgEzMj4BNTQuASMiDgMVFBYXFj8BNjc2JyY1NDYzMhYVFAYjIiY3PgI1NCYjIgYVFBcDBhcmAjU0EiQgBBIGgM7+n9FvazsTNhRqPXm+aHfijmm2f1srUE0eCAgGAgYRM9Gpl6mJaz1KDgglFzYyPlYZYxEEzv7OAWEBogFhzgOA0f6fziBdR9MnOYnwlnLIfjpgfYZDaJ4gDCAfGAYXFD1al9mkg6ruVz0jdVkfMkJyVUkx/l5Ga1sBfOnRAWHOzv6fAAAHAAAAAAcBBM8AFwAhADgATwBmAHEAdAAAAREzNhcWFxYXFhcWBw4BBwYHBicmLwEmNxY2NzYuAQcRFAUWNzY/ATY3NjU2JyMGFxYfARYXFhcUFxY3Nj8BNjc2NzYnIwYXFh8BFhcWFRYXFjc2PwE2NzY3NicjBhcWHwEWFxYVFgUzPwEVMxEjBgsBARUnAxwcaC5MND0sTSsvCgdVREdTNWg1KgECq1JrCQcwYkABfhoSCxAKJBQXAX4dAQMCBgMnFxsBJBoSCxAKJBQWAQF+HgEEAgUEJxcbASMZEwsQCiQUFgEBfh4BBAIFBCcXGwH5Q+5B4arNDfHvAhaOAckC/QIBAwwPHzdcZXlZmC8xCAQBAQIDBMIDVkxCZDQF/pUHwgcTCyAUQEdPU8etCAgFCQZHTFxbwLoHEwsgFEBHT1PHrQgIBQkGR0xcW8C6BxMLIBRAR09Tx60ICAUJBkdMXFvAwGQBZQMMFf6D/oYB/fkBAAABAAAAAAYhBrYALAAAASIHDgEHBhURFB4BOwERITU0Nz4BNzYyFx4BFxYdASERMzI+ATURNCcuAScmA4CJfXi6MzU8Zz3g/tUpKJFeYdRhXpEoKf7V4D1nPDUzunh9BrU0M7t4fYn99j1nPAJVlWthXpAoKSkokF5ha5X9qzxnPQIKiX14uzM0AAAAAAIAAAAABUAFQAACAAYAAAkCIREzEQHAAnv9hQLrlQHAAcABwPyAA4AAAAAAAgAAAAAFQAVAAAMABgAAATMRIwkBEQHAlZUBBQJ7BUD8gAHA/kADgAAAAAAAABAAxgABAAAAAAABAAcAAAABAAAAAAACAAcABwABAAAAAAADAAcADgABAAAAAAAEAAcAFQABAAAAAAAFAAsAHAABAAAAAAAGAAcAJwABAAAAAAAKACsALgABAAAAAAALABMAWQADAAEECQABAA4AbAADAAEECQACAA4AegADAAEECQADAA4AiAADAAEECQAEAA4AlgADAAEECQAFABYApAADAAEECQAGAA4AugADAAEECQAKAFYAyAADAAEECQALACYBHlZpZGVvSlNSZWd1bGFyVmlkZW9KU1ZpZGVvSlNWZXJzaW9uIDEuMFZpZGVvSlNHZW5lcmF0ZWQgYnkgc3ZnMnR0ZiBmcm9tIEZvbnRlbGxvIHByb2plY3QuaHR0cDovL2ZvbnRlbGxvLmNvbQBWAGkAZABlAG8ASgBTAFIAZQBnAHUAbABhAHIAVgBpAGQAZQBvAEoAUwBWAGkAZABlAG8ASgBTAFYAZQByAHMAaQBvAG4AIAAxAC4AMABWAGkAZABlAG8ASgBTAEcAZQBuAGUAcgBhAHQAZQBkACAAYgB5ACAAcwB2AGcAMgB0AHQAZgAgAGYAcgBvAG0AIABGAG8AbgB0AGUAbABsAG8AIABwAHIAbwBqAGUAYwB0AC4AaAB0AHQAcAA6AC8ALwBmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQAAAAIAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIQECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgAEcGxheQtwbGF5LWNpcmNsZQVwYXVzZQt2b2x1bWUtbXV0ZQp2b2x1bWUtbG93CnZvbHVtZS1taWQLdm9sdW1lLWhpZ2gQZnVsbHNjcmVlbi1lbnRlcg9mdWxsc2NyZWVuLWV4aXQGc3F1YXJlB3NwaW5uZXIJc3VidGl0bGVzCGNhcHRpb25zCGNoYXB0ZXJzBXNoYXJlA2NvZwZjaXJjbGUOY2lyY2xlLW91dGxpbmUTY2lyY2xlLWlubmVyLWNpcmNsZQJoZAZjYW5jZWwGcmVwbGF5CGZhY2Vib29rBWdwbHVzCGxpbmtlZGluB3R3aXR0ZXIGdHVtYmxyCXBpbnRlcmVzdBFhdWRpby1kZXNjcmlwdGlvbgVhdWRpbwluZXh0LWl0ZW0NcHJldmlvdXMtaXRlbQAAAAA=) format("truetype");font-weight:400;font-style:normal}.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.video-js .vjs-play-control .vjs-icon-placeholder,.vjs-icon-play{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-big-play-button .vjs-icon-placeholder:before,.video-js .vjs-play-control .vjs-icon-placeholder:before,.vjs-icon-play:before{content:"\f101"}.vjs-icon-play-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-play-circle:before{content:"\f102"}.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder,.vjs-icon-pause{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before,.vjs-icon-pause:before{content:"\f103"}.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder,.vjs-icon-volume-mute{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before,.vjs-icon-volume-mute:before{content:"\f104"}.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder,.vjs-icon-volume-low{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before,.vjs-icon-volume-low:before{content:"\f105"}.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder,.vjs-icon-volume-mid{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before,.vjs-icon-volume-mid:before{content:"\f106"}.video-js .vjs-mute-control .vjs-icon-placeholder,.vjs-icon-volume-high{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-mute-control .vjs-icon-placeholder:before,.vjs-icon-volume-high:before{content:"\f107"}.video-js .vjs-fullscreen-control .vjs-icon-placeholder,.vjs-icon-fullscreen-enter{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-fullscreen-control .vjs-icon-placeholder:before,.vjs-icon-fullscreen-enter:before{content:"\f108"}.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder,.vjs-icon-fullscreen-exit{font-family:VideoJS;font-weight:400;font-style:normal}.video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before,.vjs-icon-fullscreen-exit:before{content:"\f109"}.vjs-icon-square{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-square:before{content:"\f10a"}.vjs-icon-spinner{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-spinner:before{content:"\f10b"}.video-js .vjs-subs-caps-button .vjs-icon-placeholder,.video-js .vjs-subtitles-button .vjs-icon-placeholder,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder,.vjs-icon-subtitles{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js .vjs-subtitles-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before,.vjs-icon-subtitles:before{content:"\f10c"}.video-js .vjs-captions-button .vjs-icon-placeholder,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder,.vjs-icon-captions{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-captions-button .vjs-icon-placeholder:before,.video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before,.vjs-icon-captions:before{content:"\f10d"}.video-js .vjs-chapters-button .vjs-icon-placeholder,.vjs-icon-chapters{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-chapters-button .vjs-icon-placeholder:before,.vjs-icon-chapters:before{content:"\f10e"}.vjs-icon-share{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-share:before{content:"\f10f"}.vjs-icon-cog{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-cog:before{content:"\f110"}.video-js .vjs-play-progress,.video-js .vjs-volume-level,.vjs-icon-circle{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-play-progress:before,.video-js .vjs-volume-level:before,.vjs-icon-circle:before{content:"\f111"}.vjs-icon-circle-outline{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-outline:before{content:"\f112"}.vjs-icon-circle-inner-circle{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-circle-inner-circle:before{content:"\f113"}.vjs-icon-hd{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-hd:before{content:"\f114"}.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder,.vjs-icon-cancel{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before,.vjs-icon-cancel:before{content:"\f115"}.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder,.vjs-icon-replay{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before,.vjs-icon-replay:before{content:"\f116"}.vjs-icon-facebook{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-facebook:before{content:"\f117"}.vjs-icon-gplus{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-gplus:before{content:"\f118"}.vjs-icon-linkedin{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-linkedin:before{content:"\f119"}.vjs-icon-twitter{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-twitter:before{content:"\f11a"}.vjs-icon-tumblr{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-tumblr:before{content:"\f11b"}.vjs-icon-pinterest{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-pinterest:before{content:"\f11c"}.video-js .vjs-descriptions-button .vjs-icon-placeholder,.vjs-icon-audio-description{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-descriptions-button .vjs-icon-placeholder:before,.vjs-icon-audio-description:before{content:"\f11d"}.video-js .vjs-audio-button .vjs-icon-placeholder,.vjs-icon-audio{font-family:VideoJS;font-weight:400;font-style:normal}.video-js .vjs-audio-button .vjs-icon-placeholder:before,.vjs-icon-audio:before{content:"\f11e"}.vjs-icon-next-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-next-item:before{content:"\f11f"}.vjs-icon-previous-item{font-family:VideoJS;font-weight:400;font-style:normal}.vjs-icon-previous-item:before{content:"\f120"}.video-js{display:block;vertical-align:top;box-sizing:border-box;color:#fff;background-color:#000;position:relative;padding:0;font-size:10px;line-height:1;font-weight:400;font-style:normal;font-family:Arial,Helvetica,sans-serif;word-break:initial}.video-js:-moz-full-screen{position:absolute}.video-js:-webkit-full-screen{width:100%!important;height:100%!important}.video-js[tabindex="-1"]{outline:0}.video-js *,.video-js :after,.video-js :before{box-sizing:inherit}.video-js ul{font-family:inherit;font-size:inherit;line-height:inherit;list-style-position:outside;margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.video-js.vjs-16-9,.video-js.vjs-4-3,.video-js.vjs-fluid{width:100%;max-width:100%;height:0}.video-js.vjs-16-9{padding-top:56.25%}.video-js.vjs-4-3{padding-top:75%}.video-js.vjs-fill{width:100%;height:100%}.video-js .vjs-tech{position:absolute;top:0;left:0;width:100%;height:100%}body.vjs-full-window{padding:0;margin:0;height:100%;overflow-y:auto}.vjs-full-window .video-js.vjs-fullscreen{position:fixed;overflow:hidden;z-index:1000;left:0;top:0;bottom:0;right:0}.video-js.vjs-fullscreen{width:100%!important;height:100%!important;padding-top:0!important}.video-js.vjs-fullscreen.vjs-user-inactive{cursor:none}.vjs-hidden{display:none!important}.vjs-disabled{opacity:.5;cursor:default}.video-js .vjs-offscreen{height:1px;left:-9999px;position:absolute;top:0;width:1px}.vjs-lock-showing{display:block!important;opacity:1;visibility:visible}.vjs-no-js{padding:20px;color:#fff;background-color:#000;font-size:18px;font-family:Arial,Helvetica,sans-serif;text-align:center;width:300px;height:150px;margin:0 auto}.vjs-no-js a,.vjs-no-js a:visited{color:#66a8cc}.video-js .vjs-big-play-button{font-size:3em;line-height:1.5em;height:1.5em;width:3em;display:block;position:absolute;top:10px;left:10px;padding:0;cursor:pointer;opacity:1;border:.06666em solid #fff;background-color:#2b333f;background-color:rgba(43,51,63,.7);-webkit-border-radius:.3em;-moz-border-radius:.3em;border-radius:.3em;-webkit-transition:all .4s;-moz-transition:all .4s;-ms-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-big-play-centered .vjs-big-play-button{top:50%;left:50%;margin-top:-.75em;margin-left:-1.5em}.video-js .vjs-big-play-button:focus,.video-js:hover .vjs-big-play-button{border-color:#fff;background-color:#73859f;background-color:rgba(115,133,159,.5);-webkit-transition:all 0s;-moz-transition:all 0s;-ms-transition:all 0s;-o-transition:all 0s;transition:all 0s}.vjs-controls-disabled .vjs-big-play-button,.vjs-error .vjs-big-play-button,.vjs-has-started .vjs-big-play-button,.vjs-using-native-controls .vjs-big-play-button{display:none}.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause .vjs-big-play-button{display:block}.video-js button{background:0 0;border:none;color:inherit;display:inline-block;overflow:visible;font-size:inherit;line-height:inherit;text-transform:none;text-decoration:none;transition:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.vjs-control .vjs-button{width:100%;height:100%}.video-js .vjs-control.vjs-close-button{cursor:pointer;height:3em;position:absolute;right:0;top:.5em;z-index:2}.video-js .vjs-modal-dialog{background:rgba(0,0,0,.8);background:-webkit-linear-gradient(-90deg,rgba(0,0,0,.8),rgba(255,255,255,0));background:linear-gradient(180deg,rgba(0,0,0,.8),rgba(255,255,255,0));overflow:auto;box-sizing:content-box}.video-js .vjs-modal-dialog>*{box-sizing:border-box}.vjs-modal-dialog .vjs-modal-dialog-content{font-size:1.2em;line-height:1.5;padding:20px 24px;z-index:1}.vjs-menu-button{cursor:pointer}.vjs-menu-button.vjs-disabled{cursor:default}.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu{display:none}.vjs-menu .vjs-menu-content{display:block;padding:0;margin:0;font-family:Arial,Helvetica,sans-serif;overflow:auto;box-sizing:content-box}.vjs-menu .vjs-menu-content>*{box-sizing:border-box}.vjs-scrubbing .vjs-menu-button:hover .vjs-menu{display:none}.vjs-menu li{list-style:none;margin:0;padding:.2em 0;line-height:1.4em;font-size:1.2em;text-align:center;text-transform:lowercase}.vjs-menu li.vjs-menu-item:focus,.vjs-menu li.vjs-menu-item:hover{background-color:#73859f;background-color:rgba(115,133,159,.5)}.vjs-menu li.vjs-selected,.vjs-menu li.vjs-selected:focus,.vjs-menu li.vjs-selected:hover{background-color:#fff;color:#2b333f}.vjs-menu li.vjs-menu-title{text-align:center;text-transform:uppercase;font-size:1em;line-height:2em;padding:0;margin:0 0 .3em 0;font-weight:700;cursor:default}.vjs-menu-button-popup .vjs-menu{display:none;position:absolute;bottom:0;width:10em;left:-3em;height:0;margin-bottom:1.5em;border-top-color:rgba(43,51,63,.7)}.vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#2b333f;background-color:rgba(43,51,63,.7);position:absolute;width:100%;bottom:1.5em;max-height:15em}.vjs-menu-button-popup .vjs-menu.vjs-lock-showing,.vjs-workinghover .vjs-menu-button-popup:hover .vjs-menu{display:block}.video-js .vjs-menu-button-inline{-webkit-transition:all .4s;-moz-transition:all .4s;-ms-transition:all .4s;-o-transition:all .4s;transition:all .4s;overflow:hidden}.video-js .vjs-menu-button-inline:before{width:2.222222222em}.video-js .vjs-menu-button-inline.vjs-slider-active,.video-js .vjs-menu-button-inline:focus,.video-js .vjs-menu-button-inline:hover,.video-js.vjs-no-flex .vjs-menu-button-inline{width:12em}.vjs-menu-button-inline .vjs-menu{opacity:0;height:100%;width:auto;position:absolute;left:4em;top:0;padding:0;margin:0;-webkit-transition:all .4s;-moz-transition:all .4s;-ms-transition:all .4s;-o-transition:all .4s;transition:all .4s}.vjs-menu-button-inline.vjs-slider-active .vjs-menu,.vjs-menu-button-inline:focus .vjs-menu,.vjs-menu-button-inline:hover .vjs-menu{display:block;opacity:1}.vjs-no-flex .vjs-menu-button-inline .vjs-menu{display:block;opacity:1;position:relative;width:auto}.vjs-no-flex .vjs-menu-button-inline.vjs-slider-active .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:focus .vjs-menu,.vjs-no-flex .vjs-menu-button-inline:hover .vjs-menu{width:auto}.vjs-menu-button-inline .vjs-menu-content{width:auto;height:100%;margin:0;overflow:hidden}.video-js .vjs-control-bar{display:none;width:100%;position:absolute;bottom:0;left:0;right:0;height:3em;background-color:#2b333f;background-color:rgba(43,51,63,.7)}.vjs-has-started .vjs-control-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;visibility:visible;opacity:1;-webkit-transition:visibility .1s,opacity .1s;-moz-transition:visibility .1s,opacity .1s;-ms-transition:visibility .1s,opacity .1s;-o-transition:visibility .1s,opacity .1s;transition:visibility .1s,opacity .1s}.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:visible;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-ms-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.vjs-controls-disabled .vjs-control-bar,.vjs-error .vjs-control-bar,.vjs-using-native-controls .vjs-control-bar{display:none!important}.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{opacity:1;visibility:visible}.vjs-has-started.vjs-no-flex .vjs-control-bar{display:table}.video-js .vjs-control{position:relative;text-align:center;margin:0;padding:0;height:100%;width:4em;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.vjs-button>.vjs-icon-placeholder:before{font-size:1.8em;line-height:1.67}.video-js .vjs-control:focus,.video-js .vjs-control:focus:before,.video-js .vjs-control:hover:before{text-shadow:0 0 1em #fff}.video-js .vjs-control-text{border:0;clip:rect(0 0 0 0);height:1px;overflow:hidden;padding:0;position:absolute;width:1px}.vjs-no-flex .vjs-control{display:table-cell;vertical-align:middle}.video-js .vjs-custom-control-spacer{display:none}.video-js .vjs-progress-control{cursor:pointer;-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;min-width:4em}.video-js .vjs-progress-control.disabled{cursor:default}.vjs-live .vjs-progress-control{display:none}.vjs-no-flex .vjs-progress-control{width:auto}.video-js .vjs-progress-holder{-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto;-webkit-transition:all .2s;-moz-transition:all .2s;-ms-transition:all .2s;-o-transition:all .2s;transition:all .2s;height:.3em}.video-js .vjs-progress-control .vjs-progress-holder{margin:0 10px}.video-js .vjs-progress-control:hover .vjs-progress-holder{font-size:1.666666666666666666em}.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled{font-size:1em}.video-js .vjs-progress-holder .vjs-load-progress,.video-js .vjs-progress-holder .vjs-load-progress div,.video-js .vjs-progress-holder .vjs-play-progress{position:absolute;display:block;height:100%;margin:0;padding:0;width:0;left:0;top:0}.video-js .vjs-play-progress{background-color:#fff}.video-js .vjs-play-progress:before{font-size:.9em;position:absolute;right:-.5em;top:-.333333333333333em;z-index:1}.video-js .vjs-load-progress{background:#bfc7d3;background:rgba(115,133,159,.5)}.video-js .vjs-load-progress div{background:#fff;background:rgba(115,133,159,.75)}.video-js .vjs-time-tooltip{background-color:#fff;background-color:rgba(255,255,255,.8);-webkit-border-radius:.3em;-moz-border-radius:.3em;border-radius:.3em;color:#000;float:right;font-family:Arial,Helvetica,sans-serif;font-size:1em;padding:6px 8px 8px 8px;pointer-events:none;position:relative;top:-3.4em;visibility:hidden;z-index:1}.video-js .vjs-progress-holder:focus .vjs-time-tooltip{display:none}.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip,.video-js .vjs-progress-control:hover .vjs-time-tooltip{display:block;font-size:.6em;visibility:visible}.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip{font-size:1em}.video-js .vjs-progress-control .vjs-mouse-display{display:none;position:absolute;width:1px;height:100%;background-color:#000;z-index:1}.vjs-no-flex .vjs-progress-control .vjs-mouse-display{z-index:0}.video-js .vjs-progress-control:hover .vjs-mouse-display{display:block}.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display{visibility:hidden;opacity:0;-webkit-transition:visibility 1s,opacity 1s;-moz-transition:visibility 1s,opacity 1s;-ms-transition:visibility 1s,opacity 1s;-o-transition:visibility 1s,opacity 1s;transition:visibility 1s,opacity 1s}.video-js.vjs-user-inactive.vjs-no-flex .vjs-progress-control .vjs-mouse-display{display:none}.vjs-mouse-display .vjs-time-tooltip{color:#fff;background-color:#000;background-color:rgba(0,0,0,.8)}.video-js .vjs-slider{position:relative;cursor:pointer;padding:0;margin:0 .45em 0 .45em;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#73859f;background-color:rgba(115,133,159,.5)}.video-js .vjs-slider.disabled{cursor:default}.video-js .vjs-slider:focus{text-shadow:0 0 1em #fff;-webkit-box-shadow:0 0 1em #fff;-moz-box-shadow:0 0 1em #fff;box-shadow:0 0 1em #fff}.video-js .vjs-mute-control{cursor:pointer;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none;padding-left:2em;padding-right:2em;padding-bottom:3em}.video-js .vjs-volume-control{cursor:pointer;margin-right:1em;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.video-js .vjs-volume-control.vjs-volume-horizontal{width:5em}.video-js .vjs-volume-panel .vjs-volume-control{visibility:visible;opacity:0;width:1px;height:1px;margin-left:-1px}.video-js .vjs-volume-panel.enable-volume-control{-webkit-transition:width 1s;-moz-transition:width 1s;-ms-transition:width 1s;-o-transition:width 1s;transition:width 1s}.video-js .vjs-volume-panel.enable-volume-control .vjs-mute-control:active~.vjs-volume-control,.video-js .vjs-volume-panel.enable-volume-control .vjs-mute-control:focus~.vjs-volume-control,.video-js .vjs-volume-panel.enable-volume-control .vjs-mute-control:hover~.vjs-volume-control,.video-js .vjs-volume-panel.enable-volume-control .vjs-volume-control.vjs-slider-active,.video-js .vjs-volume-panel.enable-volume-control .vjs-volume-control:active,.video-js .vjs-volume-panel.enable-volume-control .vjs-volume-control:focus,.video-js .vjs-volume-panel.enable-volume-control .vjs-volume-control:hover,.video-js .vjs-volume-panel.enable-volume-control:active .vjs-volume-control,.video-js .vjs-volume-panel.enable-volume-control:focus .vjs-volume-control,.video-js .vjs-volume-panel.enable-volume-control:hover .vjs-volume-control{visibility:visible;opacity:1;-webkit-transition:visibility .1s,opacity .1s,height .1s,width .1s,left 0s,top 0s;-moz-transition:visibility .1s,opacity .1s,height .1s,width .1s,left 0s,top 0s;-ms-transition:visibility .1s,opacity .1s,height .1s,width .1s,left 0s,top 0s;-o-transition:visibility .1s,opacity .1s,height .1s,width .1s,left 0s,top 0s;transition:visibility .1s,opacity .1s,height .1s,width .1s,left 0s,top 0s}.video-js .vjs-volume-panel.enable-volume-control .vjs-mute-control:active~.vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel.enable-volume-control .vjs-mute-control:focus~.vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel.enable-volume-control .vjs-mute-control:hover~.vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel.enable-volume-control .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal,.video-js .vjs-volume-panel.enable-volume-control .vjs-volume-control:active.vjs-volume-horizontal,.video-js .vjs-volume-panel.enable-volume-control .vjs-volume-control:focus.vjs-volume-horizontal,.video-js .vjs-volume-panel.enable-volume-control .vjs-volume-control:hover.vjs-volume-horizontal,.video-js .vjs-volume-panel.enable-volume-control:active .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel.enable-volume-control:focus .vjs-volume-control.vjs-volume-horizontal,.video-js .vjs-volume-panel.enable-volume-control:hover .vjs-volume-control.vjs-volume-horizontal{width:5em;height:3em;position:relative}.video-js .vjs-volume-panel.enable-volume-control.vjs-volume-panel-horizontal.vjs-slider-active,.video-js .vjs-volume-panel.enable-volume-control.vjs-volume-panel-horizontal:active,.video-js .vjs-volume-panel.enable-volume-control.vjs-volume-panel-horizontal:focus,.video-js .vjs-volume-panel.enable-volume-control.vjs-volume-panel-horizontal:hover{width:9em;-webkit-transition:width .1s;-moz-transition:width .1s;-ms-transition:width .1s;-o-transition:width .1s;transition:width .1s}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{height:8em;width:3em;left:-3.5em;-webkit-transition:visibility 1s,opacity 1s,height 1s 1s,width 1s 1s,left 1s 1s,top 1s 1s;-moz-transition:visibility 1s,opacity 1s,height 1s 1s,width 1s 1s,left 1s 1s,top 1s 1s;-ms-transition:visibility 1s,opacity 1s,height 1s 1s,width 1s 1s,left 1s 1s,top 1s 1s;-o-transition:visibility 1s,opacity 1s,height 1s 1s,width 1s 1s,left 1s 1s,top 1s 1s;transition:visibility 1s,opacity 1s,height 1s 1s,width 1s 1s,left 1s 1s,top 1s 1s}.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal{-webkit-transition:visibility 1s,opacity 1s,height 1s 1s,width 1s,left 1s 1s,top 1s 1s;-moz-transition:visibility 1s,opacity 1s,height 1s 1s,width 1s,left 1s 1s,top 1s 1s;-ms-transition:visibility 1s,opacity 1s,height 1s 1s,width 1s,left 1s 1s,top 1s 1s;-o-transition:visibility 1s,opacity 1s,height 1s 1s,width 1s,left 1s 1s,top 1s 1s;transition:visibility 1s,opacity 1s,height 1s 1s,width 1s,left 1s 1s,top 1s 1s}.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal{width:5em;height:3em;visibility:visible;opacity:1;position:relative;-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none}.video-js.vjs-no-flex .vjs-volume-control.vjs-volume-vertical,.video-js.vjs-no-flex .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{position:absolute;bottom:3em;left:.5em}.video-js .vjs-volume-panel{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.video-js .vjs-volume-bar{margin:1.35em .45em}.vjs-volume-bar.vjs-slider-horizontal{width:5em;height:.3em}.vjs-volume-bar.vjs-slider-vertical{width:.3em;height:5em;margin:1.35em auto}.video-js .vjs-volume-level{position:absolute;bottom:0;left:0;background-color:#fff}.video-js .vjs-volume-level:before{position:absolute;font-size:.9em}.vjs-slider-vertical .vjs-volume-level{width:.3em}.vjs-slider-vertical .vjs-volume-level:before{top:-.5em;left:-.3em}.vjs-slider-horizontal .vjs-volume-level{height:.3em}.vjs-slider-horizontal .vjs-volume-level:before{top:-.3em;right:-.5em}.video-js .vjs-volume-panel.vjs-volume-panel-vertical{width:4em}.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level{height:100%}.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level{width:100%}.video-js .vjs-volume-vertical{width:3em;height:8em;bottom:8em;background-color:#2b333f;background-color:rgba(43,51,63,.7)}.video-js .vjs-volume-horizontal .vjs-menu{left:-2em}.vjs-poster{display:inline-block;vertical-align:middle;background-repeat:no-repeat;background-position:50% 50%;background-size:contain;background-color:#000;cursor:pointer;margin:0;padding:0;position:absolute;top:0;right:0;bottom:0;left:0;height:100%}.vjs-poster img{display:block;vertical-align:middle;margin:0 auto;max-height:100%;padding:0;width:100%}.vjs-has-started .vjs-poster{display:none}.vjs-audio.vjs-has-started .vjs-poster{display:block}.vjs-using-native-controls .vjs-poster{display:none}.video-js .vjs-live-control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto;font-size:1em;line-height:3em}.vjs-no-flex .vjs-live-control{display:table-cell;width:auto;text-align:left}.video-js .vjs-time-control{-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none;font-size:1em;line-height:3em;min-width:2em;width:auto;padding-left:1em;padding-right:1em}.vjs-live .vjs-time-control{display:none}.video-js .vjs-current-time,.vjs-no-flex .vjs-current-time{display:none}.vjs-no-flex .vjs-remaining-time.vjs-time-control.vjs-control{width:0!important;white-space:nowrap}.video-js .vjs-duration,.vjs-no-flex .vjs-duration{display:none}.vjs-time-divider{display:none;line-height:3em}.vjs-live .vjs-time-divider{display:none}.video-js .vjs-play-control .vjs-icon-placeholder{cursor:pointer;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.vjs-text-track-display{position:absolute;bottom:3em;left:0;right:0;top:0;pointer-events:none}.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display{bottom:1em}.video-js .vjs-text-track{font-size:1.4em;text-align:center;margin-bottom:.1em;background-color:#000;background-color:rgba(0,0,0,.5)}.vjs-subtitles{color:#fff}.vjs-captions{color:#fc6}.vjs-tt-cue{display:block}video::-webkit-media-text-track-display{-moz-transform:translateY(-3em);-ms-transform:translateY(-3em);-o-transform:translateY(-3em);-webkit-transform:translateY(-3em);transform:translateY(-3em)}.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display{-moz-transform:translateY(-1.5em);-ms-transform:translateY(-1.5em);-o-transform:translateY(-1.5em);-webkit-transform:translateY(-1.5em);transform:translateY(-1.5em)}.video-js .vjs-fullscreen-control{cursor:pointer;-webkit-box-flex:none;-moz-box-flex:none;-webkit-flex:none;-ms-flex:none;flex:none}.vjs-live .vjs-playback-rate{display:none}.vjs-playback-rate .vjs-playback-rate-value,.vjs-playback-rate>.vjs-menu-button{position:absolute;top:0;left:0;width:100%;height:100%}.vjs-playback-rate .vjs-playback-rate-value{pointer-events:none;font-size:1.5em;line-height:2;text-align:center}.vjs-playback-rate .vjs-menu{width:4em;left:0}.vjs-error .vjs-error-display .vjs-modal-dialog-content{font-size:1.4em;text-align:center}.vjs-error .vjs-error-display:before{color:#fff;content:'X';font-family:Arial,Helvetica,sans-serif;font-size:4em;left:0;line-height:1;margin-top:-.5em;position:absolute;text-shadow:.05em .05em .1em #000;text-align:center;top:50%;vertical-align:middle;width:100%}.vjs-error .vjs-error-check-network{color:#fff;text-decoration:none;background:red;padding:5px;display:inline-block;border-radius:5px}.vjs-loading-spinner{display:none;position:absolute;top:50%;left:50%;margin:-25px 0 0 -25px;opacity:.85;text-align:left;border:6px solid rgba(43,51,63,.7);box-sizing:border-box;background-clip:padding-box;width:50px;height:50px;border-radius:25px;visibility:hidden}.vjs-seeking .vjs-loading-spinner,.vjs-waiting .vjs-loading-spinner{display:block;animation:0s linear .3s forwards vjs-spinner-show}.vjs-loading-spinner:after,.vjs-loading-spinner:before{content:"";position:absolute;margin:-6px;box-sizing:inherit;width:inherit;height:inherit;border-radius:inherit;opacity:1;border:inherit;border-color:transparent;border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:before{-webkit-animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite;animation:vjs-spinner-spin 1.1s cubic-bezier(.6,.2,0,.8) infinite,vjs-spinner-fade 1.1s linear infinite}.vjs-seeking .vjs-loading-spinner:before,.vjs-waiting .vjs-loading-spinner:before{border-top-color:#fff}.vjs-seeking .vjs-loading-spinner:after,.vjs-waiting .vjs-loading-spinner:after{border-top-color:#fff;-webkit-animation-delay:.44s;animation-delay:.44s}@keyframes vjs-spinner-show{to{visibility:visible}}@-webkit-keyframes vjs-spinner-show{to{visibility:visible}}@keyframes vjs-spinner-spin{100%{transform:rotate(360deg)}}@-webkit-keyframes vjs-spinner-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}100%{border-top-color:#73859f}}@-webkit-keyframes vjs-spinner-fade{0%{border-top-color:#73859f}20%{border-top-color:#73859f}35%{border-top-color:#fff}60%{border-top-color:#73859f}100%{border-top-color:#73859f}}.vjs-chapters-button .vjs-menu ul{width:24em}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder{position:absolute}.video-js .vjs-subs-caps-button+.vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before{font-family:VideoJS;content:"\f10d";font-size:1.5em;line-height:inherit}.video-js .vjs-audio-button .vjs-icon-placeholder:before{content:"";background:url(https://tcplayer-1306264703.cos.ap-nanjing.myqcloud.com/assets/audioTrack.png);background-size:contain;width:23px;height:15px;top:10px;left:15px}.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-custom-control-spacer{-webkit-box-flex:auto;-moz-box-flex:auto;-webkit-flex:auto;-ms-flex:auto;flex:auto}.video-js.vjs-layout-tiny:not(.vjs-fullscreen).vjs-no-flex .vjs-custom-control-spacer{width:auto}.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-audio-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-descriptions-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-progress-control,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-subtitles-button,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-tiny:not(.vjs-fullscreen) .vjs-volume-control{display:none}.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-audio-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-descriptions-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-subtitles-button,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-x-small:not(.vjs-fullscreen) .vjs-volume-control{display:none}.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-captions-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-chapters-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-current-time,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-descriptions-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-duration,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-mute-control,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-playback-rate,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-remaining-time,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-subtitles-button .vjs-audio-button,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-time-divider,.video-js.vjs-layout-small:not(.vjs-fullscreen) .vjs-volume-control{display:none}.vjs-modal-dialog.vjs-text-track-settings{background-color:#2b333f;background-color:rgba(43,51,63,.75);color:#fff;height:70%}.vjs-text-track-settings .vjs-modal-dialog-content{display:table}.vjs-text-track-settings .vjs-track-settings-colors,.vjs-text-track-settings .vjs-track-settings-controls,.vjs-text-track-settings .vjs-track-settings-font{display:table-cell}.vjs-text-track-settings .vjs-track-settings-controls{text-align:right;vertical-align:bottom}.vjs-text-track-settings fieldset{margin:5px;padding:3px;border:none}.vjs-text-track-settings fieldset span{display:inline-block;margin-left:5px}.vjs-text-track-settings legend{color:#fff;margin:0 0 5px 0}.vjs-text-track-settings .vjs-label{position:absolute;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);display:block;margin:0 0 5px 0;padding:0;border:0;height:1px;width:1px;overflow:hidden}.vjs-track-settings-controls button:active,.vjs-track-settings-controls button:focus{outline-style:solid;outline-width:medium;background-image:linear-gradient(0deg,#fff 88%,#73859f 100%)}.vjs-track-settings-controls button:hover{color:rgba(43,51,63,.75)}.vjs-track-settings-controls button{background-color:#fff;background-image:linear-gradient(-180deg,#fff 88%,#73859f 100%);color:#2b333f;cursor:pointer;border-radius:2px}.vjs-track-settings-controls .vjs-default-button{margin-right:1em}@media print{.video-js>:not(.vjs-tech):not(.vjs-poster){visibility:hidden}}div.vjs-control.vjs-button.tcp-dot-component{width:100%}.vjs-progress-control:hover .tcp-dot-basic-style{display:inline}.tcp-dot-basic-style{position:absolute;width:8px;height:100%;margin-left:-4px;border-radius:5px;background-color:#fff0ff;z-index:10;display:none}.tcp-dot-basic-style:hover{background-color:#fff}.tcp-triangle{display:block;content:' ';position:absolute;bottom:-10px;left:5%;width:0;height:0;border-width:5px;border-style:solid;transform:translateX(-50%);border-color:#000 transparent transparent}.tcp-triangle-both{display:block;content:' ';position:absolute;bottom:-10px;left:70px;width:0;height:0;border-width:5px;border-style:solid;transform:translateX(-50%);border-color:#000 transparent transparent}.tcp-dot-image{width:100%;height:80px;background-repeat:no-repeat;background-size:100% 100%;-moz-background-size:100% 100%}.tcp-image-in-container{width:100%;height:100%;height:-webkit-fill-available;height:-webkit-fill-available;height:-moz-fill-available;height:-moz-available;height:fill-available}.tcp-image-in-container-only-image{width:100%;height:80px}.vjs-time-tooltip.tcp-popup-container{position:absolute;width:140px;height:118px;background-color:#000;padding:0 0;top:-125px;max-height:120px;left:-65px}.vjs-time-tooltip.tcp-popup-container.tcp-only-gif{position:absolute;width:140px;height:80px;background-color:#000;padding:0 0;top:-87px;max-height:120px;left:-65px}.vjs-time-tooltip.tcp-popup-container.tcp-single-line{height:103px;top:-109px}.vjs-time-tooltip.tcp-popup-container.tcp-without-gif{position:absolute;width:110px;height:54px;background-color:#000;opacity:.8;padding:0 0;top:-60px;border-radius:5px;left:0}.vjs-time-tooltip.tcp-popup-container.tcp-without-gif.tcp-single-line{height:23px;top:-28px}.vjs-time-tooltip.tcp-popup-container.tcp-without-gif.tcp-two-lines{height:38px;top:-44px}.tcp-dot-comment{text-overflow:ellipsis;color:#fff;width:100%;height:38px;max-height:38px;font-size:12px;line-height:16px;overflow:hidden;background-color:#000;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;padding:5px 8px}.tcp-large-comment{text-overflow:ellipsis;color:#fff;width:100%;height:100%;max-height:100%;font-size:12px;line-height:16px;overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;padding:5px 8px}.tcp-dot-timestamp{display:block;font-weight:700;width:100%;height:20px;text-align:left;bottom:0;position:absolute;color:#fff;margin-left:10px}.vjs-dvr .tcp-dvr-progress-control .tcp-dvr-time-shift{background-color:transparent}.vjs-dvr .vjs-progress-control{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.vjs-dvr .vjs-live-control{flex:inherit;cursor:pointer}.vjs-dvr .vjs-live-control .vjs-tooltip{line-height:1em}.vjs-dvr-live .vjs-live-control .vjs-tooltip{display:none}.vjs-dvr-live .vjs-live-control{cursor:default}.vjs-dvr .vjs-live-display{margin:0 auto}.vjs-live .vjs-live-display:before{display:inline-block;width:6px;height:6px;margin-right:.4em;vertical-align:4%;background:#f51717;content:'';border-radius:50%}.vjs-dvr:not(.vjs-dvr-live) .vjs-live-display:before{background:#566377}.tcp-video-quality-switcher .tcp-quality-switcher-value{pointer-events:none;font-size:1.2em;display:table;text-align:center;position:absolute;top:0;left:0;width:100%;height:100%}.tcp-video-quality-switcher .tcp-quality-switcher-value p{display:table-cell;vertical-align:middle}.tcp-video-quality-switcher .vjs-menu{width:6em;left:50%;-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.tcp-video-quality-switcher .vjs-menu li{text-transform:none}.tcp-skin .tcp-logo{position:absolute}.tcp-skin .tcp-logo.left-top{top:0;left:0}.tcp-skin .tcp-logo.left-bottom{bottom:0;left:0}.tcp-skin .tcp-logo.right-top{top:0;right:0}.tcp-skin .tcp-logo.right-bottom{bottom:0;right:0}.tcp-skin .tcp-logo .tcp-logo-link{display:inline-block}.tcp-skin .vjs-big-play-button{height:4.8em;width:6.8em;left:50%;top:50%;margin-left:-3.4em;margin-top:-2.4em;font-size:1em;border:0;opacity:1;z-index:1}.tcp-skin .vjs-big-play-button:before{content:none}.tcp-skin .vjs-big-play-button .vjs-button-icon{height:4.8em;width:6.8em;fill:rgba(33,33,33,.5)}.tcp-skin .vjs-big-play-button .vjs-button-icon .draw-dash,.tcp-skin .vjs-big-play-button .vjs-button-icon .draw-line,.tcp-skin .vjs-big-play-button .vjs-button-icon .draw-lines{stroke-dasharray:1330px;stroke-dashoffset:1330px;stroke-linecap:round;stroke-linejoin:round;stroke-width:8px;stroke:#00a4ff}.tcp-skin .vjs-big-play-button:hover .vjs-button-icon .draw-fill{fill:#00a4ff}.tcp-skin .vjs-big-play-button:hover .vjs-button-icon .draw-line{-webkit-animation:draw-line .5s ease forwards;animation:draw-line .5s ease forwards}.tcp-skin .vjs-big-play-button:hover .vjs-button-icon .draw-lines{-webkit-animation:draw-lines 1s ease forwards;animation:draw-lines 1s ease forwards}.tcp-skin .vjs-big-play-button:hover .vjs-button-icon .draw-dash{-webkit-animation:draw-dash 1s ease forwards;animation:draw-dash 1s ease forwards}.tcp-skin .vjs-big-play-button .vjs-icon-placeholder{display:none}.tcp-skin .vjs-big-play-button,.tcp-skin .vjs-big-play-button:focus,.tcp-skin:hover .vjs-big-play-button,.tcp-skin:hover .vjs-big-play-button:focus{background:0 0}.tcp-skin.vjs-paused.vjs-pos-ended .vjs-big-play-button,.tcp-skin.vjs-paused.vjs-pos-ended .vjs-poster{display:block}.tcp-skin.vjs-ad-loading .vjs-big-play-button,.tcp-skin.vjs-ad-playing .vjs-big-play-button,.tcp-skin.vjs-seeking .vjs-big-play-button,.tcp-skin.vjs-using-native-controls .vjs-big-play-button,.tcp-skin.vjs-waiting .vjs-big-play-button{display:none!important}.tcp-skin .vjs-menu{z-index:1}.tcp-skin .vjs-control-bar{z-index:1;font-size:1.2em;background-color:rgba(0,0,0,.3);background:rgba(0,0,0,.666);background:-webkit-linear-gradient(bottom,rgba(0,0,0,.666) 0,rgba(0,0,0,.492) 19%,rgba(0,0,0,.36) 34%,rgba(0,0,0,.254) 47%,rgba(0,0,0,.185) 56.5%,rgba(0,0,0,.129) 65%,rgba(0,0,0,.084) 73%,rgba(0,0,0,.05) 80.2%,rgba(0,0,0,.028) 86.1%,rgba(0,0,0,.014) 91%,rgba(0,0,0,.005) 95.2%,rgba(0,0,0,.001) 98.2%,rgba(0,0,0,0) 100%);background:linear-gradient(to top,rgba(0,0,0,.666) 0,rgba(0,0,0,.492) 19%,rgba(0,0,0,.36) 34%,rgba(0,0,0,.254) 47%,rgba(0,0,0,.185) 56.5%,rgba(0,0,0,.129) 65%,rgba(0,0,0,.084) 73%,rgba(0,0,0,.05) 80.2%,rgba(0,0,0,.028) 86.1%,rgba(0,0,0,.014) 91%,rgba(0,0,0,.005) 95.2%,rgba(0,0,0,.001) 98.2%,rgba(0,0,0,0) 100%)}.tcp-skin .vjs-time-control{padding-left:0;padding-right:0}.tcp-skin:not(.vjs-live) .vjs-current-time,.tcp-skin:not(.vjs-live) .vjs-duration,.tcp-skin:not(.vjs-live) .vjs-time-divider{display:block}.tcp-skin .vjs-time-divider{min-width:0;padding-left:.3em;padding-right:.3em}.tcp-skin .vjs-current-time{padding-left:1em}.tcp-skin .vjs-duration{padding-right:1em}.tcp-skin .vjs-remaining-time{display:none}.tcp-skin .vjs-progress-control{position:absolute;width:100%;top:-.9em;left:0;height:1.5em}.tcp-skin .vjs-play-progress{background-color:#00a4ff}.tcp-skin .vjs-playback-rate .vjs-playback-rate-value{font-size:1.2em;line-height:2.57}.tcp-skin .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical{z-index:2;visibility:hidden;background-color:rgba(0,0,0,.7)}.tcp-skin .vjs-volume-panel .vjs-slider-horizontal .vjs-volume-level:before{top:-.33em}.tcp-skin .vjs-volume-panel .vjs-slider-vertical .vjs-volume-level:before{left:-.35em}.tcp-skin .vjs-volume-panel .vjs-volume-level{background-color:#00a4ff}.tcp-skin .vjs-custom-control-spacer{display:block;flex-grow:1}.tcp-skin .tcp-loading-spinner{box-sizing:border-box;background-clip:padding-box;width:50px;height:50px;display:none;position:absolute;top:50%;left:50%;margin:-25px 0 0 -25px;text-indent:-9999em}.tcp-skin .tcp-loading-spinner:before{content:"";display:block;width:100%;height:100%;margin-bottom:5px;border-radius:50%;border:3px solid rgba(255,255,255,0);border-left-color:#fff;border-right-color:#fff;-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0)}@-webkit-keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes load8{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.tcp-skin.vjs-seeking .tcp-loading-spinner,.tcp-skin.vjs-waiting .tcp-loading-spinner{display:block}.tcp-skin.vjs-seeking .tcp-loading-spinner:before,.tcp-skin.vjs-waiting .tcp-loading-spinner:before{-webkit-animation:load8 1.1s infinite linear;animation:load8 1.1s infinite linear}.tcp-skin .tcp-loading-spinner-animation{width:60px;height:45px;margin:0 auto 10px;background-repeat:no-repeat;animation-name:keyframes;animation-duration:2.625s;animation-delay:0s;animation-iteration-count:infinite;animation-fill-mode:forwards;animation-timing-function:steps(1)}@-webkit-keyframes keyframes{0%{width:60px;height:45px;background-position:-60px 0}1.33%{background-position:-2220px 0}2.67%{background-position:-120px 0}4.00%{background-position:-180px 0}5.33%{background-position:-240px 0}6.67%{background-position:-300px 0}8.00%{background-position:-360px 0}9.33%{background-position:-420px 0}10.67%{background-position:-480px 0}12.00%{background-position:-540px 0}13.33%{background-position:-600px 0}14.67%{background-position:-660px 0}16.00%{background-position:-720px 0}17.33%{background-position:-780px 0}18.67%{background-position:-840px 0}20.00%{background-position:-900px 0}21.33%{background-position:-960px 0}22.67%{background-position:-1020px 0}24.00%{background-position:-1080px 0}25.33%{background-position:-1140px 0}26.67%{background-position:-1200px 0}28.00%{background-position:-1260px 0}29.33%{background-position:-1320px 0}30.67%{background-position:-1380px 0}32.00%{background-position:-1440px 0}33.33%{background-position:-1500px 0}34.67%{background-position:-1560px 0}36.00%{background-position:-1620px 0}37.33%{background-position:-1680px 0}38.67%{background-position:-1740px 0}40.00%{background-position:-1800px 0}41.33%{background-position:-1860px 0}42.67%{background-position:-1920px 0}44.00%{background-position:-1980px 0}45.33%{background-position:-2040px 0}46.67%{background-position:-2100px 0}48.00%{background-position:-2160px 0}49.33%{background-position:0 0}50.67%{background-position:-2280px 0}52.00%{background-position:-2340px 0}53.33%{background-position:-2400px 0}54.67%{background-position:-2460px 0}56.00%{background-position:-2520px 0}57.33%{background-position:-2580px 0}58.67%{background-position:-2640px 0}60.00%{background-position:-2700px 0}61.33%{background-position:-2760px 0}62.67%{background-position:-2820px 0}64.00%{background-position:-2880px 0}65.33%{background-position:-2940px 0}66.67%{background-position:-3000px 0}68.00%{background-position:-3060px 0}69.33%{background-position:-3120px 0}70.67%{background-position:-3180px 0}72.00%{background-position:-3240px 0}73.33%{background-position:-3300px 0}74.67%{background-position:-3360px 0}76.00%{background-position:-3420px 0}77.33%{background-position:-3480px 0}78.67%{background-position:-3540px 0}80.00%{background-position:-3600px 0}81.33%{background-position:-3660px 0}82.67%{background-position:-3720px 0}84.00%{background-position:-3780px 0}85.33%{background-position:-3840px 0}86.67%{background-position:-3900px 0}88.00%{background-position:-3960px 0}89.33%{background-position:-4020px 0}90.67%{background-position:-4080px 0}92.00%{background-position:-4140px 0}93.33%{background-position:-4200px 0}94.67%{background-position:-4260px 0}96.00%{background-position:-4320px 0}97.33%{background-position:-4380px 0}100%,98.67%{background-position:-4440px 0}}.tcp-skin .vjs-menu-button-popup .vjs-menu .vjs-menu-content{background-color:#232833;background-color:rgba(0,0,0,.7)}@keyframes draw-line{0%{stroke-dashoffset:1350px}100%{stroke-dashoffset:0}}@keyframes draw-lines{0%{stroke-dasharray:0 1330px;stroke-dashoffset:1330px}100%{stroke-dasharray:1330px 0;stroke-dashoffset:0}}@keyframes draw-dash{0%{stroke-dasharray:100px 1330px}100%{stroke-dasharray:10px 0}}.tcp-continue-play-tips{position:absolute;left:0;bottom:4.5em;font-size:1.2em;height:2.08em;line-height:2.08em;padding:0 .5em 0 2.5em;background-color:#232833;background-color:rgba(0,0,0,.7)}.tcp-continue-play-tips .tcp-continue-play-buttom{cursor:pointer;color:#00a4ff;height:2.08em;padding:0 5px;margin:0}.tcp-continue-play-tips .vjs-control.vjs-close-button{width:2em;height:2.08em;top:0;right:initial;left:.5em;opacity:.7}.tcp-continue-play-tips .vjs-control.vjs-close-button .vjs-icon-placeholder:before{font-size:1.33em;line-height:1.55em}.tcp-skin .tcp-overlay{color:#fff;position:absolute;text-align:center}.tcp-skin .tcp-overlay-no-background{width:33%}.tcp-skin .tcp-overlay-background{background-color:#4e4e4e;background-color:rgba(0,0,0,.6);border-radius:3px;padding:10px;width:33%}.tcp-skin .tcp-overlay-top-left{top:5px;left:5px}.tcp-skin .tcp-overlay-top{left:50%;margin-left:-16.5%;top:5px}.tcp-skin .tcp-overlay-top-right{right:5px;top:5px}.tcp-skin .tcp-overlay-right{right:5px;top:50%;transform:translateY(-50%)}.tcp-skin .tcp-overlay-bottom-right{bottom:4em;right:5px}.tcp-skin .tcp-overlay-bottom{bottom:4em;left:50%;margin-left:-16.5%}.tcp-skin .tcp-overlay-bottom-left{bottom:4em;left:5px}.tcp-skin .tcp-overlay-left{left:5px;top:50%;transform:translateY(-50%)}.tcp-skin .tcp-overlay-center{left:50%;margin-left:-16.5%;top:50%;transform:translateY(-50%)}.tcp-skin .tcp-image-patch{width:100%;max-height:100%;margin:0;transform:translate(-50%,-50%);overflow:hidden}.tcp-skin .tcp-image-patch .tcp-overlay-link{display:inline-block;outline:0}.tcp-skin .tcp-image-patch .tcp-overlay-link:active,.tcp-skin .tcp-image-patch .tcp-overlay-link:focus,.tcp-skin .tcp-image-patch .tcp-overlay-link:link{outline:0}.tcp-skin .tcp-image-patch .tcp-overlay-img{max-width:100%;border:none}.tcp-skin.tcp-res-switching .tcp-image-patch{display:none}.tcp-skin .vjs-no-flex .tcp-overlay-center,.tcp-skin .vjs-no-flex .tcp-overlay-left,.tcp-skin .vjs-no-flex .tcp-overlay-right{margin-top:-15px}.tcp-skin .tcp-right-click-popup-menu{position:absolute;z-index:6;padding:0;white-space:nowrap;background-color:#1c1c1c;background-color:rgba(28,28,28,.9)}.tcp-skin .tcp-right-click-popup-menu .vjs-menu-item{line-height:2em;padding:0 1.5em}.tcp-skin .tcp-right-click-popup-menu .tc-menu-list{text-transform:none;padding:.5rem;text-align:left}.tcp-skin .tcp-right-click-popup-menu .vjs-menu-content li:not(:last-child){border-bottom:1px solid #fff}.tcp-skin .tcp-right-click-popup-menu .tc-menu-list,.tcp-skin .tcp-right-click-popup-menu .tc-menu-list:hover{cursor:default;outline:0}.tcp-skin .tcp-right-click-popup-menu .tcp-menu-item-select{color:#00a4ff}.tcp-skin .tcp-mirror{transform:rotateY(180deg)}.tcp-playlist{width:300px;height:100%;right:0;top:0;position:absolute}.tcp-playlist .tcp-playlist-toggle{position:absolute;width:12px;height:100px;line-height:100px;top:50%;transform:translateY(-50%);background-color:#00a4ff;border-radius:10px 0 0 10px;text-align:center;cursor:pointer}.tcp-playlist .tcp-playlist-box{position:absolute;background-color:#2b333f;overflow:scroll;overflow-x:hidden;width:100%;height:100%}.tcp-playlist .tcp-playlist-box .tcp-playlist-title{padding:1em;font-size:1.6em;color:#00a4ff}.tcp-playlist .tcp-playlist-box .tcp-playlist-item{padding:0 0 0 1em;margin-bottom:1em;width:100%;height:100px}.tcp-playlist .tcp-playlist-box .tcp-playlist-item .tcp-playlist-item-video{display:inline-block;float:left;position:relative;width:55%;height:100px;display:flex;justify-content:center;align-items:center;background:#000}.tcp-playlist .tcp-playlist-box .tcp-playlist-item .tcp-playlist-item-video .tcp-playlist-item-img{max-width:100%;max-height:100%}.tcp-playlist .tcp-playlist-box .tcp-playlist-item .tcp-playlist-item-video .tcp-playlist-item-duration{position:absolute;bottom:.5em;left:1em;background-color:#2b333f;padding:.5em;opacity:.8}.tcp-playlist .tcp-playlist-box .tcp-playlist-item .tcp-playlist-item-desc{display:inline-block;width:42%;padding:.5em;font-size:1.4em;overflow:hidden;height:100%}.tcp-playlist .tcp-playlist-box .tcp-playlist-item-active,.tcp-playlist .tcp-playlist-box .tcp-playlist-item:hover{cursor:pointer}.tcp-playlist .tcp-playlist-box .tcp-playlist-item-active .tcp-playlist-item-desc,.tcp-playlist .tcp-playlist-box .tcp-playlist-item:hover .tcp-playlist-item-desc{color:#00a4ff}.tcp-playlist-box::-webkit-scrollbar{width:.5em;box-sizing:border-box}.tcp-playlist-box::-webkit-scrollbar-button{display:none}.tcp-playlist-box::-webkit-scrollbar-thumb{background-color:#00a4ff;-webkit-border-radius:1em}.vjs-play-next:hover{cursor:pointer}.vjs-play-next{font-family:VideoJS}.vjs-play-next .vjs-icon-placeholder:before{content:"\f11f"}.tcp-playlist-open .tcp-playlist-toggle{right:300px}.tcp-playlist-open .tcp-playlist-box{display:block}.tcp-playlist-close .tcp-playlist-toggle{right:0}.tcp-playlist-close .tcp-playlist-box{display:none}.tcp-statistic{position:relative;z-index:5;top:10px;left:10px;font-size:12px;width:80%;max-height:80%;background:rgba(28,28,28,.8);border-radius:4px;color:#fff;opacity:.8;overflow:hidden}.tcp-statistic-wrapper{display:flex;flex-direction:column;width:100%;padding:10px}.tcp-statistic-line{display:block;width:100%;padding-bottom:4px}.tcp-statistic-title{width:30%;float:left;text-align:right;padding-right:20px}.tcp-statistic-data{width:70%}.tcp-statistic-close{position:absolute;right:10px;top:10px;width:20px;height:20px;color:#fff;cursor:pointer}.tcp-switch{position:absolute;display:flex;align-items:center;right:0;bottom:4.5em;font-size:1.2em;line-height:2.08em;padding:0 2.5em 0 .5em;background-color:rgba(0,0,0,.7)}.tcp-switch>.vjs-close-button{top:0!important;cursor:pointer;width:2em;height:1.5em;display:flex;justify-content:center;align-items:center;right:.3em!important;border-radius:50%;margin-left:.5em}.tcp-switch>.vjs-control .vjs-close-button{top:0;right:.3em!important}.tcp-switch>.vjs-button>.vjs-icon-placeholder:before{font-size:1.33em;line-height:inherit;opacity:.7}.vjs-error .vjs-error-display .vjs-modal-dialog-content{padding:0}.vjs-errors-dialog{text-align:center;overflow:hidden;position:absolute;top:0;bottom:0;left:0;right:0;background:rgba(24,24,24,.8);display:table;width:100%;height:100%}.vjs-errors-content-container{overflow:auto;display:table-cell;padding:35px}.vjs-errors-dialog .vjs-control.vjs-close-button{width:3em;height:3em;top:0}.vjs-errors-type{display:none}.tcp-vtt-thumbnail-container{position:absolute;overflow:hidden;bottom:2.3em;z-index:0}.tcp-vtt-thumbnail-container::before{content:"";position:absolute;top:0;bottom:0;left:0;right:0;-moz-box-shadow:0 0 3px 3px rgba(0,0,0,.3) inset;-webkit-box-shadow:0 0 3px 3px rgba(0,0,0,.3) inset;box-shadow:0 0 3px 3px rgba(0,0,0,.3) inset;z-index:1}.tcp-vtt-thumbnail-img{position:absolute;left:0;opacity:0;transition:opacity .2s ease;-webkit-transition:opacity .2s ease;-moz-transition:opacity .2s ease;-mz-transition:opacity .2s ease}.vjs-progress-control:active .tcp-vtt-thumbnail-img,.vjs-progress-control:hover .tcp-vtt-thumbnail-img{opacity:1}.tcp-dynamic-watermark-container{position:absolute;pointer-events:none}.tcp-dynamic-watermark-container .tcp-dynamic-watermark-content{position:absolute;max-width:30%;word-break:break-all;color:rgba(255,255,255,.5)}.tcp-skin.vjs-no-flex .vjs-poster{overflow:hidden}.tcp-skin.vjs-no-flex .vjs-poster div{width:100%;height:100%;display:table}.tcp-skin.vjs-no-flex .vjs-poster div span{display:table-cell;vertical-align:middle}.tcp-skin.vjs-no-flex .vjs-control-bar .vjs-current-time,.tcp-skin.vjs-no-flex .vjs-control-bar .vjs-duration,.tcp-skin.vjs-no-flex .vjs-control-bar .vjs-time-divider{display:inline-block}.tcp-skin.vjs-no-flex .vjs-control-bar .vjs-custom-control-spacer{display:none}.tcp-skin.vjs-no-flex .vjs-control-bar .tcp-video-quality-switcher .vjs-menu{margin-left:-3em}.tcp-skin.vjs-no-flex .vjs-control-bar .vjs-mouse-display{z-index:1}.tcp-skin.vjs-no-flex .vjs-control-bar .tcp-vtt-thumbnail-container{bottom:2.7em}.tcp-skin.vjs-no-flex.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:hidden}.tcp-skin.vjs-no-flex.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar .vjs-volume-control.vjs-volume-vertical{visibility:hidden}.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control .vjs-volume-control.vjs-volume-vertical{visibility:visible;opacity:1;display:none}.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control .vjs-mute-control:active~.vjs-volume-control.vjs-volume-vertical,.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control .vjs-mute-control:focus~.vjs-volume-control.vjs-volume-vertical,.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control .vjs-mute-control:hover~.vjs-volume-control.vjs-volume-vertical,.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control .vjs-volume-control.vjs-slider-active.vjs-volume-vertical,.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control .vjs-volume-control:active.vjs-volume-vertical,.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control .vjs-volume-control:focus.vjs-volume-vertical,.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control .vjs-volume-control:hover.vjs-volume-vertical,.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control:active .vjs-volume-control.vjs-volume-vertical,.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control:focus .vjs-volume-control.vjs-volume-vertical,.tcp-skin.vjs-no-flex .vjs-volume-panel.enable-volume-control:hover .vjs-volume-control.vjs-volume-vertical{display:block;position:absolute}@font-face{font-family:VideoJS;src:url(font/VideoJS.eot);font-weight:400;font-style:normal}@media screen\0{.tcp-logo-img{border:none}.tcp-continue-play-tips .vjs-control.vjs-close-button .vjs-icon-placeholder:before{font-size:16px;line-height:25px}}@media \0screen{.tcp-skin.vjs-no-flex .vjs-big-play-button{background-color:#2b333f}.tcp-skin.vjs-no-flex .vjs-big-play-button .vjs-button-icon:before{top:0;left:0;width:100%;height:100%;text-align:center;font-family:VideoJS;font-weight:400;font-style:normal;content:"\f101";font-size:5em;line-height:1em}.tcp-skin.vjs-no-flex .vjs-big-play-button:focus,.tcp-skin.vjs-no-flex .vjs-big-play-button:hover,.tcp-skin.vjs-no-flex:hover .vjs-big-play-button:focus,.tcp-skin.vjs-no-flex:hover .vjs-big-play-button:hover{background-color:#00a4ff}.tcp-skin .tcp-image-patch{width:100%;margin:0;left:0;right:0;top:0;bottom:0;transform:none;overflow:hidden}.tcp-skin .tcp-image-patch .tcp-overlay-table{display:table;width:100%;height:100%}.tcp-skin .tcp-image-patch .tcp-overlay-table .tcp-overlay-cell{width:100%;display:table-cell;vertical-align:middle}}button{outline:0}@media \0screen{.vjs-user-inactive.vjs-playing .vjs-control-bar :before{content:""}}@media \0screen{.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar{visibility:hidden}} \ No newline at end of file diff --git a/public/static/js/TXLivePlayer-1.2.3.min.js b/public/static/js/TXLivePlayer-1.2.3.min.js new file mode 100644 index 0000000..9082117 --- /dev/null +++ b/public/static/js/TXLivePlayer-1.2.3.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).TXLivePlayer=t()}(this,(function(){"use strict";function e(e,t){return t.forEach((function(t){t&&"string"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(r){if("default"!==r&&!(r in e)){var n=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,n.get?n:{enumerable:!0,get:function(){return t[r]}})}}))})),Object.freeze(e)}var t="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function r(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var n=function(e){try{return!!e()}catch(e){return!0}},i=!n((function(){var e=function(){}.bind();return"function"!=typeof e||e.hasOwnProperty("prototype")})),o=i,s=Function.prototype,a=s.bind,c=s.call,u=o&&a.bind(c,c),l=o?function(e){return e&&u(e)}:function(e){return e&&function(){return c.apply(e,arguments)}},d=l({}.isPrototypeOf),p=function(e){return e&&e.Math==Math&&e},f=p("object"==typeof globalThis&&globalThis)||p("object"==typeof window&&window)||p("object"==typeof self&&self)||p("object"==typeof t&&t)||function(){return this}()||Function("return this")(),h=i,v=Function.prototype,m=v.apply,y=v.call,g="object"==typeof Reflect&&Reflect.apply||(h?y.bind(m):function(){return y.apply(m,arguments)}),b=function(e){return"function"==typeof e},S={},T=!n((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),_=i,C=Function.prototype.call,w=_?C.bind(C):function(){return C.apply(C,arguments)},E={},R={}.propertyIsEnumerable,P=Object.getOwnPropertyDescriptor,A=P&&!R.call({1:2},1);E.f=A?function(e){var t=P(this,e);return!!t&&t.enumerable}:R;var M,k,O=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},D=l,I=D({}.toString),x=D("".slice),L=function(e){return x(I(e),8,-1)},N=n,F=L,j=Object,B=l("".split),V=N((function(){return!j("z").propertyIsEnumerable(0)}))?function(e){return"String"==F(e)?B(e,""):j(e)}:j,U=TypeError,z=function(e){if(null==e)throw U("Can't call method on "+e);return e},G=V,W=z,Y=function(e){return G(W(e))},q=b,H=function(e){return"object"==typeof e?null!==e:q(e)},J={},Q=J,K=f,Z=b,X=function(e){return Z(e)?e:void 0},$=function(e,t){return arguments.length<2?X(Q[e])||X(K[e]):Q[e]&&Q[e][t]||K[e]&&K[e][t]},ee=$("navigator","userAgent")||"",te=f,re=ee,ne=te.process,ie=te.Deno,oe=ne&&ne.versions||ie&&ie.version,se=oe&&oe.v8;se&&(k=(M=se.split("."))[0]>0&&M[0]<4?1:+(M[0]+M[1])),!k&&re&&(!(M=re.match(/Edge\/(\d+)/))||M[1]>=74)&&(M=re.match(/Chrome\/(\d+)/))&&(k=+M[1]);var ae=k,ce=ae,ue=n,le=!!Object.getOwnPropertySymbols&&!ue((function(){var e=Symbol();return!String(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&ce&&ce<41})),de=le&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,pe=$,fe=b,he=d,ve=Object,me=de?function(e){return"symbol"==typeof e}:function(e){var t=pe("Symbol");return fe(t)&&he(t.prototype,ve(e))},ye=String,ge=function(e){try{return ye(e)}catch(e){return"Object"}},be=b,Se=ge,Te=TypeError,_e=function(e){if(be(e))return e;throw Te(Se(e)+" is not a function")},Ce=_e,we=function(e,t){var r=e[t];return null==r?void 0:Ce(r)},Ee=w,Re=b,Pe=H,Ae=TypeError,Me={exports:{}},ke=f,Oe=Object.defineProperty,De=function(e,t){try{Oe(ke,e,{value:t,configurable:!0,writable:!0})}catch(r){ke[e]=t}return t},Ie="__core-js_shared__",xe=f[Ie]||De(Ie,{}),Le=xe;(Me.exports=function(e,t){return Le[e]||(Le[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.23.3",mode:"pure",copyright:"漏 2014-2022 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.23.3/LICENSE",source:"https://github.com/zloirock/core-js"});var Ne=z,Fe=Object,je=function(e){return Fe(Ne(e))},Be=je,Ve=l({}.hasOwnProperty),Ue=Object.hasOwn||function(e,t){return Ve(Be(e),t)},ze=l,Ge=0,We=Math.random(),Ye=ze(1..toString),qe=function(e){return"Symbol("+(void 0===e?"":e)+")_"+Ye(++Ge+We,36)},He=f,Je=Me.exports,Qe=Ue,Ke=qe,Ze=le,Xe=de,$e=Je("wks"),et=He.Symbol,tt=et&&et.for,rt=Xe?et:et&&et.withoutSetter||Ke,nt=function(e){if(!Qe($e,e)||!Ze&&"string"!=typeof $e[e]){var t="Symbol."+e;Ze&&Qe(et,e)?$e[e]=et[e]:$e[e]=Xe&&tt?tt(t):rt(t)}return $e[e]},it=w,ot=H,st=me,at=we,ct=function(e,t){var r,n;if("string"===t&&Re(r=e.toString)&&!Pe(n=Ee(r,e)))return n;if(Re(r=e.valueOf)&&!Pe(n=Ee(r,e)))return n;if("string"!==t&&Re(r=e.toString)&&!Pe(n=Ee(r,e)))return n;throw Ae("Can't convert object to primitive value")},ut=TypeError,lt=nt("toPrimitive"),dt=function(e,t){if(!ot(e)||st(e))return e;var r,n=at(e,lt);if(n){if(void 0===t&&(t="default"),r=it(n,e,t),!ot(r)||st(r))return r;throw ut("Can't convert object to primitive value")}return void 0===t&&(t="number"),ct(e,t)},pt=me,ft=function(e){var t=dt(e,"string");return pt(t)?t:t+""},ht=H,vt=f.document,mt=ht(vt)&&ht(vt.createElement),yt=function(e){return mt?vt.createElement(e):{}},gt=yt,bt=!T&&!n((function(){return 7!=Object.defineProperty(gt("div"),"a",{get:function(){return 7}}).a})),St=T,Tt=w,_t=E,Ct=O,wt=Y,Et=ft,Rt=Ue,Pt=bt,At=Object.getOwnPropertyDescriptor;S.f=St?At:function(e,t){if(e=wt(e),t=Et(t),Pt)try{return At(e,t)}catch(e){}if(Rt(e,t))return Ct(!Tt(_t.f,e,t),e[t])};var Mt=n,kt=b,Ot=/#|\.prototype\./,Dt=function(e,t){var r=xt[It(e)];return r==Nt||r!=Lt&&(kt(t)?Mt(t):!!t)},It=Dt.normalize=function(e){return String(e).replace(Ot,".").toLowerCase()},xt=Dt.data={},Lt=Dt.NATIVE="N",Nt=Dt.POLYFILL="P",Ft=Dt,jt=_e,Bt=i,Vt=l(l.bind),Ut=function(e,t){return jt(e),void 0===t?e:Bt?Vt(e,t):function(){return e.apply(t,arguments)}},zt={},Gt=T&&n((function(){return 42!=Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype})),Wt=H,Yt=String,qt=TypeError,Ht=function(e){if(Wt(e))return e;throw qt(Yt(e)+" is not an object")},Jt=T,Qt=bt,Kt=Gt,Zt=Ht,Xt=ft,$t=TypeError,er=Object.defineProperty,tr=Object.getOwnPropertyDescriptor,rr="enumerable",nr="configurable",ir="writable";zt.f=Jt?Kt?function(e,t,r){if(Zt(e),t=Xt(t),Zt(r),"function"==typeof e&&"prototype"===t&&"value"in r&&ir in r&&!r.writable){var n=tr(e,t);n&&n.writable&&(e[t]=r.value,r={configurable:nr in r?r.configurable:n.configurable,enumerable:rr in r?r.enumerable:n.enumerable,writable:!1})}return er(e,t,r)}:er:function(e,t,r){if(Zt(e),t=Xt(t),Zt(r),Qt)try{return er(e,t,r)}catch(e){}if("get"in r||"set"in r)throw $t("Accessors not supported");return"value"in r&&(e[t]=r.value),e};var or=zt,sr=O,ar=T?function(e,t,r){return or.f(e,t,sr(1,r))}:function(e,t,r){return e[t]=r,e},cr=f,ur=g,lr=l,dr=b,pr=S.f,fr=Ft,hr=J,vr=Ut,mr=ar,yr=Ue,gr=function(e){var t=function(r,n,i){if(this instanceof t){switch(arguments.length){case 0:return new e;case 1:return new e(r);case 2:return new e(r,n)}return new e(r,n,i)}return ur(e,this,arguments)};return t.prototype=e.prototype,t},br=function(e,t){var r,n,i,o,s,a,c,u,l=e.target,d=e.global,p=e.stat,f=e.proto,h=d?cr:p?cr[l]:(cr[l]||{}).prototype,v=d?hr:hr[l]||mr(hr,l,{})[l],m=v.prototype;for(i in t)r=!fr(d?i:l+(p?".":"#")+i,e.forced)&&h&&yr(h,i),s=v[i],r&&(a=e.dontCallGetSet?(u=pr(h,i))&&u.value:h[i]),o=r&&a?a:t[i],r&&typeof s==typeof o||(c=e.bind&&r?vr(o,cr):e.wrap&&r?gr(o):f&&dr(o)?lr(o):o,(e.sham||o&&o.sham||s&&s.sham)&&mr(c,"sham",!0),mr(v,i,c),f&&(yr(hr,n=l+"Prototype")||mr(hr,n,{}),mr(hr[n],i,o),e.real&&m&&!m[i]&&mr(m,i,o)))},Sr=l([].slice),Tr=l,_r=_e,Cr=H,wr=Ue,Er=Sr,Rr=i,Pr=Function,Ar=Tr([].concat),Mr=Tr([].join),kr={},Or=function(e,t,r){if(!wr(kr,t)){for(var n=[],i=0;i0?zr:Ur)(t)},Wr=function(e){var t=+e;return t!=t||0===t?0:Gr(t)},Yr=Wr,qr=Math.max,Hr=Math.min,Jr=function(e,t){var r=Yr(e);return r<0?qr(r+t,0):Hr(r,t)},Qr=Wr,Kr=Math.min,Zr=function(e){return e>0?Kr(Qr(e),9007199254740991):0},Xr=Zr,$r=function(e){return Xr(e.length)},en=Y,tn=Jr,rn=$r,nn=function(e){return function(t,r,n){var i,o=en(t),s=rn(o),a=tn(n,s);if(e&&r!=r){for(;s>a;)if((i=o[a++])!=i)return!0}else for(;s>a;a++)if((e||a in o)&&o[a]===r)return e||a||0;return!e&&-1}},on={includes:nn(!0),indexOf:nn(!1)},sn=on.includes;br({target:"Array",proto:!0,forced:n((function(){return!Array(1).includes()}))},{includes:function(e){return sn(this,e,arguments.length>1?arguments[1]:void 0)}});var an=Lr("Array").includes,cn=H,un=L,ln=nt("match"),dn=function(e){var t;return cn(e)&&(void 0!==(t=e[ln])?!!t:"RegExp"==un(e))},pn=TypeError,fn=function(e){if(dn(e))throw pn("The method doesn't accept regular expressions");return e},hn={};hn[nt("toStringTag")]="z";var vn="[object z]"===String(hn),mn=vn,yn=b,gn=L,bn=nt("toStringTag"),Sn=Object,Tn="Arguments"==gn(function(){return arguments}()),_n=mn?gn:function(e){var t,r,n;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(r=function(e,t){try{return e[t]}catch(e){}}(t=Sn(e),bn))?r:Tn?gn(t):"Object"==(n=gn(t))&&yn(t.callee)?"Arguments":n},Cn=_n,wn=String,En=function(e){if("Symbol"===Cn(e))throw TypeError("Cannot convert a Symbol value to a string");return wn(e)},Rn=nt("match"),Pn=function(e){var t=/./;try{"/./"[e](t)}catch(r){try{return t[Rn]=!1,"/./"[e](t)}catch(e){}}return!1},An=br,Mn=fn,kn=z,On=En,Dn=Pn,In=l("".indexOf);An({target:"String",proto:!0,forced:!Dn("includes")},{includes:function(e){return!!~In(On(kn(this)),On(Mn(e)),arguments.length>1?arguments[1]:void 0)}});var xn=Lr("String").includes,Ln=d,Nn=an,Fn=xn,jn=Array.prototype,Bn=String.prototype,Vn=function(e){var t=e.includes;return e===jn||Ln(jn,e)&&t===jn.includes?Nn:"string"==typeof e||e===Bn||Ln(Bn,e)&&t===Bn.includes?Fn:t},Un={},zn=b,Gn=xe,Wn=l(Function.toString);zn(Gn.inspectSource)||(Gn.inspectSource=function(e){return Wn(e)});var Yn,qn,Hn,Jn=Gn.inspectSource,Qn=b,Kn=Jn,Zn=f.WeakMap,Xn=Qn(Zn)&&/native code/.test(Kn(Zn)),$n=Me.exports,ei=qe,ti=$n("keys"),ri=function(e){return ti[e]||(ti[e]=ei(e))},ni={},ii=Xn,oi=f,si=l,ai=H,ci=ar,ui=Ue,li=xe,di=ri,pi=ni,fi="Object already initialized",hi=oi.TypeError,vi=oi.WeakMap;if(ii||li.state){var mi=li.state||(li.state=new vi),yi=si(mi.get),gi=si(mi.has),bi=si(mi.set);Yn=function(e,t){if(gi(mi,e))throw new hi(fi);return t.facade=e,bi(mi,e,t),t},qn=function(e){return yi(mi,e)||{}},Hn=function(e){return gi(mi,e)}}else{var Si=di("state");pi[Si]=!0,Yn=function(e,t){if(ui(e,Si))throw new hi(fi);return t.facade=e,ci(e,Si,t),t},qn=function(e){return ui(e,Si)?e[Si]:{}},Hn=function(e){return ui(e,Si)}}var Ti={set:Yn,get:qn,has:Hn,enforce:function(e){return Hn(e)?qn(e):Yn(e,{})},getterFor:function(e){return function(t){var r;if(!ai(t)||(r=qn(t)).type!==e)throw hi("Incompatible receiver, "+e+" required");return r}}},_i=T,Ci=Ue,wi=Function.prototype,Ei=_i&&Object.getOwnPropertyDescriptor,Ri=Ci(wi,"name"),Pi={EXISTS:Ri,PROPER:Ri&&"something"===function(){}.name,CONFIGURABLE:Ri&&(!_i||_i&&Ei(wi,"name").configurable)},Ai={},Mi=Ue,ki=Y,Oi=on.indexOf,Di=ni,Ii=l([].push),xi=function(e,t){var r,n=ki(e),i=0,o=[];for(r in n)!Mi(Di,r)&&Mi(n,r)&&Ii(o,r);for(;t.length>i;)Mi(n,r=t[i++])&&(~Oi(o,r)||Ii(o,r));return o},Li=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Ni=xi,Fi=Li,ji=Object.keys||function(e){return Ni(e,Fi)},Bi=T,Vi=Gt,Ui=zt,zi=Ht,Gi=Y,Wi=ji;Ai.f=Bi&&!Vi?Object.defineProperties:function(e,t){zi(e);for(var r,n=Gi(t),i=Wi(t),o=i.length,s=0;o>s;)Ui.f(e,r=i[s++],n[r]);return e};var Yi,qi=$("document","documentElement"),Hi=Ht,Ji=Ai,Qi=Li,Ki=ni,Zi=qi,Xi=yt,$i=ri("IE_PROTO"),eo=function(){},to=function(e){return"'; + }; + var dataToHtml = function (editor, dataIn) { + var data = global$2.extend({}, dataIn); + if (!data.source1) { + global$2.extend(data, HtmlToData.htmlToData(Settings.getScripts(editor), data.embed)); + if (!data.source1) { + return ''; + } + } + if (!data.source2) { + data.source2 = ''; + } + if (!data.poster) { + data.poster = ''; + } + data.source1 = editor.convertURL(data.source1, 'source'); + data.source2 = editor.convertURL(data.source2, 'source'); + data.source1mime = Mime.guess(data.source1); + data.source2mime = Mime.guess(data.source2); + data.poster = editor.convertURL(data.poster, 'poster'); + var pattern = matchPattern(data.source1); + if (pattern) { + data.source1 = pattern.url; + data.type = pattern.type; + data.allowFullscreen = pattern.allowFullscreen; + data.width = data.width || pattern.w; + data.height = data.height || pattern.h; + } + if (data.embed) { + return UpdateHtml.updateHtml(data.embed, data, true); + } else { + var videoScript = VideoScript.getVideoScriptMatch(Settings.getScripts(editor), data.source1); + if (videoScript) { + data.type = 'script'; + data.width = videoScript.width; + data.height = videoScript.height; + } + var audioTemplateCallback = Settings.getAudioTemplateCallback(editor); + var videoTemplateCallback = Settings.getVideoTemplateCallback(editor); + data.width = data.width || 300; + data.height = data.height || 150; + global$2.each(data, function (value, key) { + data[key] = editor.dom.encode(value); + }); + if (data.type === 'iframe') { + return getIframeHtml(data); + } else if (data.source1mime === 'application/x-shockwave-flash') { + return getFlashHtml(data); + } else if (data.source1mime.indexOf('audio') !== -1) { + return getAudioHtml(data, audioTemplateCallback); + } else if (data.type === 'script') { + return getScriptHtml(data); + } else { + return getVideoHtml(data, videoTemplateCallback); + } + } + }; + var DataToHtml = { dataToHtml: dataToHtml }; + + var cache = {}; + var embedPromise = function (data, dataToHtml, handler) { + return new global$5(function (res, rej) { + var wrappedResolve = function (response) { + if (response.html) { + cache[data.source1] = response; + } + return res({ + url: data.source1, + html: response.html ? response.html : dataToHtml(data) + }); + }; + if (cache[data.source1]) { + wrappedResolve(cache[data.source1]); + } else { + handler({ url: data.source1 }, wrappedResolve, rej); + } + }); + }; + var defaultPromise = function (data, dataToHtml) { + return new global$5(function (res) { + res({ + html: dataToHtml(data), + url: data.source1 + }); + }); + }; + var loadedData = function (editor) { + return function (data) { + return DataToHtml.dataToHtml(editor, data); + }; + }; + var getEmbedHtml = function (editor, data) { + var embedHandler = Settings.getUrlResolver(editor); + return embedHandler ? embedPromise(data, loadedData(editor), embedHandler) : defaultPromise(data, loadedData(editor)); + }; + var isCached = function (url) { + return cache.hasOwnProperty(url); + }; + var Service = { + getEmbedHtml: getEmbedHtml, + isCached: isCached + }; + + var trimPx$1 = function (value) { + return value.replace(/px$/, ''); + }; + var addPx$1 = function (value) { + return /^[0-9.]+$/.test(value) ? value + 'px' : value; + }; + var getSize = function (name) { + return function (elm) { + return elm ? trimPx$1(elm.style[name]) : ''; + }; + }; + var setSize = function (name) { + return function (elm, value) { + if (elm) { + elm.style[name] = addPx$1(value); + } + }; + }; + var Size = { + getMaxWidth: getSize('maxWidth'), + getMaxHeight: getSize('maxHeight'), + setMaxWidth: setSize('maxWidth'), + setMaxHeight: setSize('maxHeight') + }; + + var doSyncSize = function (widthCtrl, heightCtrl) { + widthCtrl.state.set('oldVal', widthCtrl.value()); + heightCtrl.state.set('oldVal', heightCtrl.value()); + }; + var doSizeControls = function (win, f) { + var widthCtrl = win.find('#width')[0]; + var heightCtrl = win.find('#height')[0]; + var constrained = win.find('#constrain')[0]; + if (widthCtrl && heightCtrl && constrained) { + f(widthCtrl, heightCtrl, constrained.checked()); + } + }; + var doUpdateSize = function (widthCtrl, heightCtrl, isContrained) { + var oldWidth = widthCtrl.state.get('oldVal'); + var oldHeight = heightCtrl.state.get('oldVal'); + var newWidth = widthCtrl.value(); + var newHeight = heightCtrl.value(); + if (isContrained && oldWidth && oldHeight && newWidth && newHeight) { + if (newWidth !== oldWidth) { + newHeight = Math.round(newWidth / oldWidth * newHeight); + if (!isNaN(newHeight)) { + heightCtrl.value(newHeight); + } + } else { + newWidth = Math.round(newHeight / oldHeight * newWidth); + if (!isNaN(newWidth)) { + widthCtrl.value(newWidth); + } + } + } + doSyncSize(widthCtrl, heightCtrl); + }; + var syncSize = function (win) { + doSizeControls(win, doSyncSize); + }; + var updateSize = function (win) { + doSizeControls(win, doUpdateSize); + }; + var createUi = function (onChange) { + var recalcSize = function () { + onChange(function (win) { + updateSize(win); + }); + }; + return { + type: 'container', + label: 'Dimensions', + layout: 'flex', + align: 'center', + spacing: 5, + items: [ + { + name: 'width', + type: 'textbox', + maxLength: 5, + size: 5, + onchange: recalcSize, + ariaLabel: 'Width' + }, + { + type: 'label', + text: 'x' + }, + { + name: 'height', + type: 'textbox', + maxLength: 5, + size: 5, + onchange: recalcSize, + ariaLabel: 'Height' + }, + { + name: 'constrain', + type: 'checkbox', + checked: true, + text: 'Constrain proportions' + } + ] + }; + }; + var SizeManager = { + createUi: createUi, + syncSize: syncSize, + updateSize: updateSize + }; + + var embedChange = global$1.ie && global$1.ie <= 8 ? 'onChange' : 'onInput'; + var handleError = function (editor) { + return function (error) { + var errorMessage = error && error.msg ? 'Media embed handler error: ' + error.msg : 'Media embed handler threw unknown error.'; + editor.notificationManager.open({ + type: 'error', + text: errorMessage + }); + }; + }; + var getData = function (editor) { + var element = editor.selection.getNode(); + var dataEmbed = element.getAttribute('data-ephox-embed-iri'); + if (dataEmbed) { + return { + 'source1': dataEmbed, + 'data-ephox-embed-iri': dataEmbed, + 'width': Size.getMaxWidth(element), + 'height': Size.getMaxHeight(element) + }; + } + return element.getAttribute('data-mce-object') ? HtmlToData.htmlToData(Settings.getScripts(editor), editor.serializer.serialize(element, { selection: true })) : {}; + }; + var getSource = function (editor) { + var elm = editor.selection.getNode(); + if (elm.getAttribute('data-mce-object') || elm.getAttribute('data-ephox-embed-iri')) { + return editor.selection.getContent(); + } + }; + var addEmbedHtml = function (win, editor) { + return function (response) { + var html = response.html; + var embed = win.find('#embed')[0]; + var data = global$2.extend(HtmlToData.htmlToData(Settings.getScripts(editor), html), { source1: response.url }); + win.fromJSON(data); + if (embed) { + embed.value(html); + SizeManager.updateSize(win); + } + }; + }; + var selectPlaceholder = function (editor, beforeObjects) { + var i; + var y; + var afterObjects = editor.dom.select('img[data-mce-object]'); + for (i = 0; i < beforeObjects.length; i++) { + for (y = afterObjects.length - 1; y >= 0; y--) { + if (beforeObjects[i] === afterObjects[y]) { + afterObjects.splice(y, 1); + } + } + } + editor.selection.select(afterObjects[0]); + }; + var handleInsert = function (editor, html) { + var beforeObjects = editor.dom.select('img[data-mce-object]'); + editor.insertContent(html); + selectPlaceholder(editor, beforeObjects); + editor.nodeChanged(); + }; + var submitForm = function (win, editor) { + var data = win.toJSON(); + data.embed = UpdateHtml.updateHtml(data.embed, data); + if (data.embed && Service.isCached(data.source1)) { + handleInsert(editor, data.embed); + } else { + Service.getEmbedHtml(editor, data).then(function (response) { + handleInsert(editor, response.html); + }).catch(handleError(editor)); + } + }; + var populateMeta = function (win, meta) { + global$2.each(meta, function (value, key) { + win.find('#' + key).value(value); + }); + }; + var showDialog = function (editor) { + var win; + var data; + var generalFormItems = [{ + name: 'source1', + type: 'filepicker', + filetype: 'media', + size: 40, + autofocus: true, + label: 'Source', + onpaste: function () { + setTimeout(function () { + Service.getEmbedHtml(editor, win.toJSON()).then(addEmbedHtml(win, editor)).catch(handleError(editor)); + }, 1); + }, + onchange: function (e) { + Service.getEmbedHtml(editor, win.toJSON()).then(addEmbedHtml(win, editor)).catch(handleError(editor)); + populateMeta(win, e.meta); + }, + onbeforecall: function (e) { + e.meta = win.toJSON(); + } + }]; + var advancedFormItems = []; + var reserialise = function (update) { + update(win); + data = win.toJSON(); + win.find('#embed').value(UpdateHtml.updateHtml(data.embed, data)); + }; + if (Settings.hasAltSource(editor)) { + advancedFormItems.push({ + name: 'source2', + type: 'filepicker', + filetype: 'media', + size: 40, + label: 'Alternative source' + }); + } + if (Settings.hasPoster(editor)) { + advancedFormItems.push({ + name: 'poster', + type: 'filepicker', + filetype: 'image', + size: 40, + label: 'Poster' + }); + } + if (Settings.hasDimensions(editor)) { + var control = SizeManager.createUi(reserialise); + generalFormItems.push(control); + } + data = getData(editor); + var embedTextBox = { + id: 'mcemediasource', + type: 'textbox', + flex: 1, + name: 'embed', + value: getSource(editor), + multiline: true, + rows: 5, + label: 'Source' + }; + var updateValueOnChange = function () { + data = global$2.extend({}, HtmlToData.htmlToData(Settings.getScripts(editor), this.value())); + this.parent().parent().fromJSON(data); + }; + embedTextBox[embedChange] = updateValueOnChange; + var body = [ + { + title: 'General', + type: 'form', + items: generalFormItems + }, + { + title: 'Embed', + type: 'container', + layout: 'flex', + direction: 'column', + align: 'stretch', + padding: 10, + spacing: 10, + items: [ + { + type: 'label', + text: 'Paste your embed code below:', + forId: 'mcemediasource' + }, + embedTextBox + ] + } + ]; + if (advancedFormItems.length > 0) { + body.push({ + title: 'Advanced', + type: 'form', + items: advancedFormItems + }); + } + win = editor.windowManager.open({ + title: 'Insert/edit media', + data: data, + bodyType: 'tabpanel', + body: body, + onSubmit: function () { + SizeManager.updateSize(win); + submitForm(win, editor); + } + }); + SizeManager.syncSize(win); + }; + var Dialog = { showDialog: showDialog }; + + var get$1 = function (editor) { + var showDialog = function () { + Dialog.showDialog(editor); + }; + return { showDialog: showDialog }; + }; + var Api = { get: get$1 }; + + var register = function (editor) { + var showDialog = function () { + Dialog.showDialog(editor); + }; + editor.addCommand('mceMedia', showDialog); + }; + var Commands = { register: register }; + + var global$8 = tinymce.util.Tools.resolve('tinymce.html.Node'); + + var sanitize = function (editor, html) { + if (Settings.shouldFilterHtml(editor) === false) { + return html; + } + var writer = global$7(); + var blocked; + global$4({ + validate: false, + allow_conditional_comments: false, + special: 'script,noscript', + comment: function (text) { + writer.comment(text); + }, + cdata: function (text) { + writer.cdata(text); + }, + text: function (text, raw) { + writer.text(text, raw); + }, + start: function (name, attrs, empty) { + blocked = true; + if (name === 'script' || name === 'noscript' || name === 'svg') { + return; + } + for (var i = attrs.length - 1; i >= 0; i--) { + var attrName = attrs[i].name; + if (attrName.indexOf('on') === 0) { + delete attrs.map[attrName]; + attrs.splice(i, 1); + } + if (attrName === 'style') { + attrs[i].value = editor.dom.serializeStyle(editor.dom.parseStyle(attrs[i].value), name); + } + } + writer.start(name, attrs, empty); + blocked = false; + }, + end: function (name) { + if (blocked) { + return; + } + writer.end(name); + } + }, global$6({})).parse(html); + return writer.getContent(); + }; + var Sanitize = { sanitize: sanitize }; + + var createPlaceholderNode = function (editor, node) { + var placeHolder; + var name = node.name; + placeHolder = new global$8('img', 1); + placeHolder.shortEnded = true; + retainAttributesAndInnerHtml(editor, node, placeHolder); + placeHolder.attr({ + 'width': node.attr('width') || '300', + 'height': node.attr('height') || (name === 'audio' ? '30' : '150'), + 'style': node.attr('style'), + 'src': global$1.transparentSrc, + 'data-mce-object': name, + 'class': 'mce-object mce-object-' + name + }); + return placeHolder; + }; + var createPreviewIframeNode = function (editor, node) { + var previewWrapper; + var previewNode; + var shimNode; + var name = node.name; + previewWrapper = new global$8('span', 1); + previewWrapper.attr({ + 'contentEditable': 'false', + 'style': node.attr('style'), + 'data-mce-object': name, + 'class': 'mce-preview-object mce-object-' + name + }); + retainAttributesAndInnerHtml(editor, node, previewWrapper); + previewNode = new global$8(name, 1); + previewNode.attr({ + src: node.attr('src'), + allowfullscreen: node.attr('allowfullscreen'), + style: node.attr('style'), + class: node.attr('class'), + width: node.attr('width'), + height: node.attr('height'), + frameborder: '0' + }); + shimNode = new global$8('span', 1); + shimNode.attr('class', 'mce-shim'); + previewWrapper.append(previewNode); + previewWrapper.append(shimNode); + return previewWrapper; + }; + var retainAttributesAndInnerHtml = function (editor, sourceNode, targetNode) { + var attrName; + var attrValue; + var attribs; + var ai; + var innerHtml; + attribs = sourceNode.attributes; + ai = attribs.length; + while (ai--) { + attrName = attribs[ai].name; + attrValue = attribs[ai].value; + if (attrName !== 'width' && attrName !== 'height' && attrName !== 'style') { + if (attrName === 'data' || attrName === 'src') { + attrValue = editor.convertURL(attrValue, attrName); + } + targetNode.attr('data-mce-p-' + attrName, attrValue); + } + } + innerHtml = sourceNode.firstChild && sourceNode.firstChild.value; + if (innerHtml) { + targetNode.attr('data-mce-html', escape(Sanitize.sanitize(editor, innerHtml))); + targetNode.firstChild = null; + } + }; + var isWithinEphoxEmbed = function (node) { + while (node = node.parent) { + if (node.attr('data-ephox-embed-iri')) { + return true; + } + } + return false; + }; + var placeHolderConverter = function (editor) { + return function (nodes) { + var i = nodes.length; + var node; + var videoScript; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + if (node.parent.attr('data-mce-object')) { + continue; + } + if (node.name === 'script') { + videoScript = VideoScript.getVideoScriptMatch(Settings.getScripts(editor), node.attr('src')); + if (!videoScript) { + continue; + } + } + if (videoScript) { + if (videoScript.width) { + node.attr('width', videoScript.width.toString()); + } + if (videoScript.height) { + node.attr('height', videoScript.height.toString()); + } + } + if (node.name === 'iframe' && Settings.hasLiveEmbeds(editor) && global$1.ceFalse) { + if (!isWithinEphoxEmbed(node)) { + node.replace(createPreviewIframeNode(editor, node)); + } + } else { + if (!isWithinEphoxEmbed(node)) { + node.replace(createPlaceholderNode(editor, node)); + } + } + } + }; + }; + var Nodes = { + createPreviewIframeNode: createPreviewIframeNode, + createPlaceholderNode: createPlaceholderNode, + placeHolderConverter: placeHolderConverter + }; + + var setup = function (editor) { + editor.on('preInit', function () { + var specialElements = editor.schema.getSpecialElements(); + global$2.each('video audio iframe object'.split(' '), function (name) { + specialElements[name] = new RegExp(']*>', 'gi'); + }); + var boolAttrs = editor.schema.getBoolAttrs(); + global$2.each('webkitallowfullscreen mozallowfullscreen allowfullscreen'.split(' '), function (name) { + boolAttrs[name] = {}; + }); + editor.parser.addNodeFilter('iframe,video,audio,object,embed,script', Nodes.placeHolderConverter(editor)); + editor.serializer.addAttributeFilter('data-mce-object', function (nodes, name) { + var i = nodes.length; + var node; + var realElm; + var ai; + var attribs; + var innerHtml; + var innerNode; + var realElmName; + var className; + while (i--) { + node = nodes[i]; + if (!node.parent) { + continue; + } + realElmName = node.attr(name); + realElm = new global$8(realElmName, 1); + if (realElmName !== 'audio' && realElmName !== 'script') { + className = node.attr('class'); + if (className && className.indexOf('mce-preview-object') !== -1) { + realElm.attr({ + width: node.firstChild.attr('width'), + height: node.firstChild.attr('height') + }); + } else { + realElm.attr({ + width: node.attr('width'), + height: node.attr('height') + }); + } + } + realElm.attr({ style: node.attr('style') }); + attribs = node.attributes; + ai = attribs.length; + while (ai--) { + var attrName = attribs[ai].name; + if (attrName.indexOf('data-mce-p-') === 0) { + realElm.attr(attrName.substr(11), attribs[ai].value); + } + } + if (realElmName === 'script') { + realElm.attr('type', 'text/javascript'); + } + innerHtml = node.attr('data-mce-html'); + if (innerHtml) { + innerNode = new global$8('#text', 3); + innerNode.raw = true; + innerNode.value = Sanitize.sanitize(editor, unescape(innerHtml)); + realElm.append(innerNode); + } + node.replace(realElm); + } + }); + }); + editor.on('setContent', function () { + editor.$('span.mce-preview-object').each(function (index, elm) { + var $elm = editor.$(elm); + if ($elm.find('span.mce-shim', elm).length === 0) { + $elm.append(''); + } + }); + }); + }; + var FilterContent = { setup: setup }; + + var setup$1 = function (editor) { + editor.on('ResolveName', function (e) { + var name; + if (e.target.nodeType === 1 && (name = e.target.getAttribute('data-mce-object'))) { + e.name = name; + } + }); + }; + var ResolveName = { setup: setup$1 }; + + var setup$2 = function (editor) { + editor.on('click keyup', function () { + var selectedNode = editor.selection.getNode(); + if (selectedNode && editor.dom.hasClass(selectedNode, 'mce-preview-object')) { + if (editor.dom.getAttrib(selectedNode, 'data-mce-selected')) { + selectedNode.setAttribute('data-mce-selected', '2'); + } + } + }); + editor.on('ObjectSelected', function (e) { + var objectType = e.target.getAttribute('data-mce-object'); + if (objectType === 'audio' || objectType === 'script') { + e.preventDefault(); + } + }); + editor.on('objectResized', function (e) { + var target = e.target; + var html; + if (target.getAttribute('data-mce-object')) { + html = target.getAttribute('data-mce-html'); + if (html) { + html = unescape(html); + target.setAttribute('data-mce-html', escape(UpdateHtml.updateHtml(html, { + width: e.width, + height: e.height + }))); + } + } + }); + }; + var Selection = { setup: setup$2 }; + + var register$1 = function (editor) { + editor.addButton('media', { + tooltip: 'Insert/edit media', + cmd: 'mceMedia', + stateSelector: [ + 'img[data-mce-object]', + 'span[data-mce-object]', + 'div[data-ephox-embed-iri]' + ] + }); + editor.addMenuItem('media', { + icon: 'media', + text: 'Media', + cmd: 'mceMedia', + context: 'insert', + prependToContext: true + }); + }; + var Buttons = { register: register$1 }; + + global.add('media', function (editor) { + Commands.register(editor); + Buttons.register(editor); + ResolveName.setup(editor); + FilterContent.setup(editor); + Selection.setup(editor); + return Api.get(editor); + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/public/static/tinymce/plugins/media/plugin.min.js b/public/static/tinymce/plugins/media/plugin.min.js new file mode 100644 index 0000000..e78d8ef --- /dev/null +++ b/public/static/tinymce/plugins/media/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var e,t,r,n,i=tinymce.util.Tools.resolve("tinymce.PluginManager"),o=tinymce.util.Tools.resolve("tinymce.Env"),v=tinymce.util.Tools.resolve("tinymce.util.Tools"),w=function(e){return e.getParam("media_scripts")},b=function(e){return e.getParam("audio_template_callback")},y=function(e){return e.getParam("video_template_callback")},a=function(e){return e.getParam("media_live_embeds",!0)},u=function(e){return e.getParam("media_filter_html",!0)},s=function(e){return e.getParam("media_url_resolver")},m=function(e){return e.getParam("media_alt_source",!0)},d=function(e){return e.getParam("media_poster",!0)},h=function(e){return e.getParam("media_dimensions",!0)},f=function(e){var t=e,r=function(){return t};return{get:r,set:function(e){t=e},clone:function(){return f(r())}}},c=function(){},l=function(e){return function(){return e}},p=l(!1),g=l(!0),x=function(){return O},O=(e=function(e){return e.isNone()},n={fold:function(e,t){return e()},is:p,isSome:p,isNone:g,getOr:r=function(e){return e},getOrThunk:t=function(e){return e()},getOrDie:function(e){throw new Error(e||"error: getOrDie called on none.")},getOrNull:l(null),getOrUndefined:l(undefined),or:r,orThunk:t,map:x,each:c,bind:x,exists:p,forall:g,filter:x,equals:e,equals_:e,toArray:function(){return[]},toString:l("none()")},Object.freeze&&Object.freeze(n),n),j=function(r){var e=l(r),t=function(){return i},n=function(e){return e(r)},i={fold:function(e,t){return t(r)},is:function(e){return r===e},isSome:g,isNone:p,getOr:e,getOrThunk:e,getOrDie:e,getOrNull:e,getOrUndefined:e,or:t,orThunk:t,map:function(e){return j(e(r))},each:function(e){e(r)},bind:n,exists:n,forall:n,filter:function(e){return e(r)?i:O},toArray:function(){return[r]},toString:function(){return"some("+r+")"},equals:function(e){return e.is(r)},equals_:function(e,t){return e.fold(p,function(e){return t(r,e)})}};return i},_=x,S=function(e){return null===e||e===undefined?O:j(e)},k=Object.hasOwnProperty,N=function(e,t){return M(e,t)?S(e[t]):_()},M=function(e,t){return k.call(e,t)},T=tinymce.util.Tools.resolve("tinymce.dom.DOMUtils"),z=tinymce.util.Tools.resolve("tinymce.html.SaxParser"),A=function(e,t){if(e)for(var r=0;r"):"application/x-shockwave-flash"===n.source1mime?(d='',m.poster&&(d+=''),d+=""):-1!==n.source1mime.indexOf("audio")?(s=n,(l=p)?l(s):'"):"script"===n.type?' '; + var dirAttr = editor.settings.directionality ? ' dir="' + editor.settings.directionality + '"' : ''; + previewHtml = '' + '' + '' + headHtml + '' + '' + editor.getContent() + preventClicksOnLinksScript + '' + ''; + return previewHtml; + }; + var injectIframeContent = function (editor, iframe, sandbox) { + var previewHtml = getPreviewHtml(editor); + if (!sandbox) { + var doc = iframe.contentWindow.document; + doc.open(); + doc.write(previewHtml); + doc.close(); + } else { + iframe.src = 'data:text/html;charset=utf-8,' + encodeURIComponent(previewHtml); + } + }; + var IframeContent = { + getPreviewHtml: getPreviewHtml, + injectIframeContent: injectIframeContent + }; + + var open = function (editor) { + var sandbox = !global$1.ie; + var dialogHtml = ''; + var dialogWidth = Settings.getPreviewDialogWidth(editor); + var dialogHeight = Settings.getPreviewDialogHeight(editor); + editor.windowManager.open({ + title: 'Preview', + width: dialogWidth, + height: dialogHeight, + html: dialogHtml, + buttons: { + text: 'Close', + onclick: function (e) { + e.control.parent().parent().close(); + } + }, + onPostRender: function (e) { + var iframeElm = e.control.getEl('body').firstChild; + IframeContent.injectIframeContent(editor, iframeElm, sandbox); + } + }); + }; + var Dialog = { open: open }; + + var register = function (editor) { + editor.addCommand('mcePreview', function () { + Dialog.open(editor); + }); + }; + var Commands = { register: register }; + + var register$1 = function (editor) { + editor.addButton('preview', { + title: 'Preview', + cmd: 'mcePreview' + }); + editor.addMenuItem('preview', { + text: 'Preview', + cmd: 'mcePreview', + context: 'view' + }); + }; + var Buttons = { register: register$1 }; + + global.add('preview', function (editor) { + Commands.register(editor); + Buttons.register(editor); + }); + function Plugin () { + } + + return Plugin; + +}()); +})(); diff --git a/public/static/tinymce/plugins/preview/plugin.min.js b/public/static/tinymce/plugins/preview/plugin.min.js new file mode 100644 index 0000000..9ec909d --- /dev/null +++ b/public/static/tinymce/plugins/preview/plugin.min.js @@ -0,0 +1 @@ +!function(){"use strict";var e=tinymce.util.Tools.resolve("tinymce.PluginManager"),r=tinymce.util.Tools.resolve("tinymce.Env"),c=function(e){return parseInt(e.getParam("plugin_preview_width","650"),10)},a=function(e){return parseInt(e.getParam("plugin_preview_height","500"),10)},s=function(e){return e.getParam("content_style","")},d=tinymce.util.Tools.resolve("tinymce.util.Tools"),l=function(t){var n="",i=t.dom.encode,e=s(t);n+='',e&&(n+='"),d.each(t.contentCSS,function(e){n+=''});var o=t.settings.body_id||"tinymce";-1!==o.indexOf("=")&&(o=(o=t.getParam("body_id","","hash"))[t.id]||o);var r=t.settings.body_class||"";-1!==r.indexOf("=")&&(r=(r=t.getParam("body_class","","hash"))[t.id]||"");var c=t.settings.directionality?' dir="'+t.settings.directionality+'"':"";return""+n+'"+t.getContent()+' diff --git a/src/api/adviser.js b/src/api/adviser.js new file mode 100644 index 0000000..e23004b --- /dev/null +++ b/src/api/adviser.js @@ -0,0 +1,27 @@ +import { post, get } from '@/utils/request' +// 公共接口 ------------------------------------------------------------------------------------------------ +// 文件接口 +export const upload = (params) => post('/admin/common/file/upload', params) +// 查询操作日志 +export const queryOperationLogList = (params) => post('/admin/operation/queryOperationLogList', params) + +// 投顾管理 ------------------------------------------------------------------------------------------------ +// 获取投顾列表 +export const tgList = (params) => post('/admin/advisor/info/list', params) + +// 修改投顾状态 +export const updateTgStatus = (params) => post('/admin/advisor/info/updateStatus', params) + +// 修改投顾信息 +export const saveTgInfo = (params) => post('/admin/advisor/info/update', params) + +// 查询投顾信息 +export const getTgInfo = (params) => get('/admin/advisor/info/detail', params) + +// 营业部 +export const getDept = (params) => post('/admin/rbac/dept/list', params) + +//后台查询首页Tab列表 +export const mainTabInfoList = (params) => post('/admin/mainTab/info/list', params) +//后台保存首页Tab +export const mainTabInfoSave = (params) => post('/admin/mainTab/info/save', params) diff --git a/src/api/channel.js b/src/api/channel.js new file mode 100644 index 0000000..3ac370e --- /dev/null +++ b/src/api/channel.js @@ -0,0 +1,58 @@ +import request from '@/utils/request' +export function getChannelList(data) { + return request({ + url: '/admin/system/channel/list', + method: 'post', + data + }) +} + +export function add(data) { + return request({ + url: '/admin/system/channel/save', + method: 'post', + data + }) +} + +export function edit(data) { + return request({ + url: '/admin/system/channel/update', + method: 'post', + data + }) +} + +export function updateStatus(data) { + return request({ + url: '/admin/system/channel/updateStatus', + method: 'post', + data + }) +} + +export function delDept(data) { + return request({ + url: '/admin/system/channel/delBusinessDept', + method: 'post', + data + }) +} + + +export function getDepts(data) { + return request({ + url: '/admin/rbac/dept/listAll', + method: 'get', + data + }) +} + + +export function saveDepts(data) { + return request({ + url: '/admin/system/channel/saveBusinessDept', + method: 'post', + data + }) +} \ No newline at end of file diff --git a/src/api/code.js b/src/api/code.js new file mode 100644 index 0000000..b127218 --- /dev/null +++ b/src/api/code.js @@ -0,0 +1,16 @@ +import request from '@/utils/request' + +export function resetEmail(data) { + return request({ + url: 'code/resetEmail', + method: 'post', + data + }) +} + +export function updatePass(pass) { + return request({ + url: `users/updatePass/${pass}`, + method: 'get' + }) +} diff --git a/src/api/common.js b/src/api/common.js new file mode 100644 index 0000000..3bca0d0 --- /dev/null +++ b/src/api/common.js @@ -0,0 +1,16 @@ +import { post, get } from '@/utils/request' + +// 文件接口 +export const uploadFile = (params) => post('/admin/common/file/upload', params) + +// 营业部 +export const getDept = (params) => get('/admin/rbac/dept/listAll', params) + +// 营业部 +export const getDeptList = (params) => get('/admin/rbac/dept/list', params) + +// 是否是交易时间 +export const isTradeTime = (params) => get('/app/basicHq/isTradeTime', params) + +// 查询整体提拥费率模板 +export const queryRateTemplateList = (params) => get('/admin/crm/queryRateTemplateList', params) diff --git a/src/api/coupon.js b/src/api/coupon.js new file mode 100644 index 0000000..e038436 --- /dev/null +++ b/src/api/coupon.js @@ -0,0 +1,65 @@ +import { post, get } from '@/utils/request' + +/** + * 获取订单列表 + */ +export const getCouponList = (params) => post('/backend/couponserver/coupon/couponinfo/query', params) +/** + * 新增卡券发送明细 + */ +export const sendcouponSend = (params) => post('/backend/couponserver/sendcoupon/send', params) + +/** + * 新增优惠券 + */ +export const createCouponInfo = (params) => post('/backend/couponserver/coupon/couponinfo/create', params) + +/** + * 选择产品 + */ +export const queryProList = (params) => post('/backend/couponserver/coupon/productinfo/query', params) + +/** + * 审核卡券发放 + */ +export const sendCouponCheck = (params) => post('/backend/couponserver/sendcoupon/check', params) + +/** + * 审核卡券上下架 + */ +export const couponStatusCheck = (params) => post('/backend/couponserver/coupon/couponinfo/updateStatus', params) + +/** + * 新增卡券发送明细 + */ +export const sendcoupon = (params) => post('/backend/couponserver/sendcoupon/send', params) + +/** + * 卡券发送明细分页 + */ +export const sendcouponList = (params) => post('/backend/couponserver/sendcoupon/list', params) + +/** + * 驳回后修改优惠券 + */ +export const editCouponInfo = (params) => post('/backend/couponserver/coupon/couponinfo/updateCoupon', params) + +/** + * 查看卡券发送用户 + */ +export const queryCouponUser = (params) => get('/backend/couponserver/sendcoupon/view', params) + +/** + * 卡券使用明细 + */ +export const queryUseCouponList = (params) => post('/backend/couponserver/logic/pageList', params) + + +export const customOrderList = (params) => get('/backend/order/customOrderList', params) + +export const createAndSave = (params) => post('/backend/couponserver/coupon/couponinfo/createAndSave', params) +// 后台-删除优惠券 +export const deleteCouponAndSend = (params) => post('/backend/couponserver/coupon/couponinfo/deleteCouponAndSend', params) +//后台-通知发送优惠券 + +export const liveSend = (params) => get('/backend/couponserver/coupon/couponinfo/liveSend', params) diff --git a/src/api/course.js b/src/api/course.js new file mode 100644 index 0000000..24aba05 --- /dev/null +++ b/src/api/course.js @@ -0,0 +1,50 @@ +import { post, get } from '@/utils/request' + +// 课程栏目管理 +// 后台查询课程栏目列表 +export const getCourseColumnList = (params) => post('/admin/course/column/list', params) +// 后台保存课程栏目 +export const saveCourseColumn = (params) => post('/admin/course/column/save', params) +// 后台更新课程栏目 +export const updateCourseColumn = (params) => post('/admin/course/column/update', params) +// 后台查询课程栏目详情 +export const getCourseColumnDetail = (params) => get('/admin/course/column/get', params) + +// 课程 +// 后台查询课程列表 +export const getCourseList = (params) => post('/admin/course/info/list', params) +// 后台保存课程 +export const saveCourse = (params) => post('/admin/course/info/save', params) +// 后台更新课程 +export const updateCourse = (params) => post('/admin/course/info/update', params) +// 后台更新课程状态 +export const updateCourseStatus = (params) => post('/admin/course/info/updateStatus', params) +// 后台查询课程详情 +export const getCourseDetails = (params) => get('/admin/course/info/get', params) + +export const getCourseContentList = (params) => post('/admin/course/content/list', params) +export const saveCourseContent = (params) => post('/admin/course/content/update', params) +export const getCourseContent = (params) => post('/admin/course/info/get', params) + +// 投资课堂 +// 后台查询投资课堂列表 +export const getCourseCollectionList = (params) => post('/admin/course/package/list', params) +// 后台保存投资课堂 +export const saveCourseCollection = (params) => post('/admin/course/package/save', params) +// 后台更新投资课堂 +export const updateCourseCollection = (params) => post('/admin/course/package/update', params) +// 后台更新投资课堂状态 +export const updateCourseCollectionStatus = (params) => post('/admin/course/package/updateStatus', params) +// 后台查询投资课堂详情 +export const getCourseCollectionDetails = (params) => get('/admin/course/package/get', params) +// 投资课堂查询课程列表 +export const queryByCourseCollection = (params) => post('/admin/course/info/queryByCoursePackage', params) +// 后台课程加入投资课堂 +export const addOrSubInCourseCollection = (params) => post('/admin/course/info/addOrSubInPackage', params) +// 后台修改在投资课堂内是否显示 +export const updateDisplayInPackage = (params) => post('/admin/course/info/updateDisplayInPackage', params) +// 修改投资课堂排序 +export const updateSort = (params) => post('/admin/course/info/updateSort', params) + +// 设置首页参数 +export const setMainPageParam = (params) => post('/admin/course/info/setMainPageParam', params) diff --git a/src/api/data.js b/src/api/data.js new file mode 100644 index 0000000..d975d75 --- /dev/null +++ b/src/api/data.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' +import qs from 'qs' + +export function initData(url, params) { + return request({ + url: url + '?' + qs.stringify(params, { indices: false }), + method: 'get' + }) +} + +export function download(url, params) { + return request({ + url: url + '?' + qs.stringify(params, { indices: false }), + method: 'get', + responseType: 'blob' + }) +} diff --git a/src/api/dept.js b/src/api/dept.js new file mode 100644 index 0000000..5ee00d5 --- /dev/null +++ b/src/api/dept.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +export function getDepts(params) { + return request({ + url: '/admin/rbac/dept/list', + method: 'get', + params + }) +} + +export function add(data) { + return request({ + url: '/admin/rbac/dept/save', + method: 'post', + data + }) +} + +export function del(data) { + return request({ + url: '/admin/rbac/dept/delete', + method: 'post', + data + }) +} + +export function edit(data) { + return request({ + url: '/admin/rbac/dept/update', + method: 'post', + data + }) +} diff --git a/src/api/generator/genConfig.js b/src/api/generator/genConfig.js new file mode 100644 index 0000000..e15b200 --- /dev/null +++ b/src/api/generator/genConfig.js @@ -0,0 +1,16 @@ +import request from '@/utils/request' + +export function get(tableName) { + return request({ + url: 'api/genConfig/' + tableName, + method: 'get' + }) +} + +export function update(data) { + return request({ + url: 'api/genConfig', + data, + method: 'put' + }) +} diff --git a/src/api/generator/generator.js b/src/api/generator/generator.js new file mode 100644 index 0000000..0c49718 --- /dev/null +++ b/src/api/generator/generator.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +export function getAllTable() { + return request({ + url: 'api/generator/tables/all', + method: 'get' + }) +} + +export function generator(tableName, type) { + return request({ + url: 'api/generator/' + tableName + '/' + type, + method: 'post', + responseType: type === 2 ? 'blob' : '' + }) +} + +export function save(data) { + return request({ + url: 'api/generator', + data, + method: 'put' + }) +} + +export function sync(tables) { + return request({ + url: 'api/generator/sync', + method: 'post', + data: tables + }) +} + diff --git a/src/api/guests.js b/src/api/guests.js new file mode 100644 index 0000000..fe29023 --- /dev/null +++ b/src/api/guests.js @@ -0,0 +1,10 @@ +import request from '@/utils/request' + +// 获取嘉宾推流地址 +export function getGuestPushUrl(data) { + return request({ + url: '/admin/video/mix/getGuestPushUrl', + method: 'post', + data + }) +} \ No newline at end of file diff --git a/src/api/index.js b/src/api/index.js new file mode 100644 index 0000000..547b13a --- /dev/null +++ b/src/api/index.js @@ -0,0 +1,16 @@ +import { post, get } from '@/utils/request' + +// 直播榜单 +export const liveRankDataList = params => + post('/admin/video/live/customer-read-rank-list', params) + +// 营销产品转化漏斗(统计配置了购物车的直播数据) +export const liveFunnelStatistic = params => + post('/admin/video/live/operation-funnel-statistic', params) + +// 运营员工统计 +export const liveOperationStatistic = params => + post('/admin/video/live/operation-statistic', params) +//直播榜单(投顾) +export const liveRankDataListTg = params => + post('/admin/video/live/customer-read-rank-list-advisor', params) diff --git a/src/api/login.js b/src/api/login.js new file mode 100644 index 0000000..288b07e --- /dev/null +++ b/src/api/login.js @@ -0,0 +1,74 @@ +import request from "@/utils/request"; + +// export const login= (params)=>post('/admin/user/tg-info/login',params) +// export const getCodeImg = (params)=>get('auth/vCode',params) + +export function login(loginName, password, captcha, uuid) { + console.log(loginName, password, captcha, uuid); + return request({ + url: "/admin/rbac/auth/login", + method: "post", + data: { + loginName, + password, + captcha, + uuid + } + }); +} + +export function getInfo() { + return request({ + url: "/admin/rbac/auth/info", + method: "post" + }); +} + +export function getCodeImg() { + return request({ + url: "/admin/rbac/auth/captcha", + method: "get" + }); +} + +export function loginPhone(params) { + return request({ + url: "/admin/rbac/auth/messageValid", + method: "get", + params + }); +} + +export function logout(params) { + return request({ + url: "/admin/rbac/auth/logout", + method: "post", + params + }); +} + +// up统一认证登录 +export function ldapLogin(data) { + return request({ + url: "/admin/rbac/auth/loginNew", + method: "post", + data + }); +} + +// 获取当前用户所属部门 +export function getUserDept() { + return request({ + url: "/admin/rbac/auth/selectDept", + method: "post" + }); +} + +// 登录部门 +export function loginDept(data) { + return request({ + url: "/admin/rbac/auth/loginDept", + method: "post", + data + }); +} diff --git a/src/api/maint/app.js b/src/api/maint/app.js new file mode 100644 index 0000000..2a27054 --- /dev/null +++ b/src/api/maint/app.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/app', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/app', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/app', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/src/api/maint/connect.js b/src/api/maint/connect.js new file mode 100644 index 0000000..1bbe90b --- /dev/null +++ b/src/api/maint/connect.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' + +export function testDbConnect(data) { + return request({ + url: 'api/database/testConnect', + method: 'post', + data + }) +} + +export function testServerConnect(data) { + return request({ + url: 'api/serverDeploy/testConnect', + method: 'post', + data + }) +} diff --git a/src/api/maint/database.js b/src/api/maint/database.js new file mode 100644 index 0000000..91797fb --- /dev/null +++ b/src/api/maint/database.js @@ -0,0 +1,35 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/database', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/database', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/database', + method: 'put', + data + }) +} + +export function testDbConnection(data) { + return request({ + url: 'api/database/testConnect', + method: 'post', + data + }) +} + +export default { add, edit, del, testDbConnection } diff --git a/src/api/maint/deploy.js b/src/api/maint/deploy.js new file mode 100644 index 0000000..c1475ea --- /dev/null +++ b/src/api/maint/deploy.js @@ -0,0 +1,77 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/deploy', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/deploy', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/deploy', + method: 'put', + data + }) +} + +export function getApps() { + return request({ + url: 'api/app', + method: 'get' + }) +} + +export function getServers() { + return request({ + url: 'api/serverDeploy', + method: 'get' + }) +} + +/** + * 启动服务 + * @param data 选中行 + */ +export function startServer(data) { + return request({ + url: 'api/deploy/startServer', + method: 'post', + data + }) +} + +/** + * 停止服务 + * @param data 选中行 + */ +export function stopServer(data) { + return request({ + url: 'api/deploy/stopServer', + method: 'post', + data + }) +} + +/** + * 停止服务 + * @param data 选中行 + */ +export function serverStatus(data) { + return request({ + url: 'api/deploy/serverStatus', + method: 'post', + data + }) +} + +export default { add, edit, del, stopServer, serverStatus, startServer, getServers, getApps } diff --git a/src/api/maint/deployHistory.js b/src/api/maint/deployHistory.js new file mode 100644 index 0000000..30335e4 --- /dev/null +++ b/src/api/maint/deployHistory.js @@ -0,0 +1,21 @@ +import request from '@/utils/request' + +export function del(ids) { + return request({ + url: 'api/deployHistory', + method: 'delete', + data: ids + }) +} + +/** + * 版本回退 + * @param data 选中行 + */ +export function reducte(data) { + return request({ + url: 'api/deploy/serverReduction', + method: 'post', + data + }) +} diff --git a/src/api/maint/serverDeploy.js b/src/api/maint/serverDeploy.js new file mode 100644 index 0000000..e796114 --- /dev/null +++ b/src/api/maint/serverDeploy.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/serverDeploy', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/serverDeploy', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/serverDeploy', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/src/api/menu.js b/src/api/menu.js new file mode 100644 index 0000000..33639ae --- /dev/null +++ b/src/api/menu.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +// 获取所有的菜单树 +export function getMenusTree(data) { + return request({ + url: '/admin/rbac/menu/list', + method: 'post', + data + }) +} + +export function buildMenus(data) { + return request({ + url: '/admin/rbac/menu/listByUser', + method: 'get' + }) +} + +export function add(data) { + return request({ + url: '/admin/rbac/menu/save', + method: 'post', + data + }) +} + +export function del(data) { + return request({ + url: `/admin/rbac/menu/delete`, + method: 'post', + data + }) +} + +export function edit(data) { + return request({ + url: '/admin/rbac/menu/update', + method: 'post', + data + }) +} diff --git a/src/api/monitor/log.js b/src/api/monitor/log.js new file mode 100644 index 0000000..13f0d39 --- /dev/null +++ b/src/api/monitor/log.js @@ -0,0 +1,22 @@ +import request from '@/utils/request' + +export function getErrDetail(id) { + return request({ + url: 'api/logs/error/' + id, + method: 'get' + }) +} + +export function delAllError() { + return request({ + url: 'api/logs/del/error', + method: 'delete' + }) +} + +export function delAllInfo() { + return request({ + url: 'api/logs/del/info', + method: 'delete' + }) +} diff --git a/src/api/monitor/online.js b/src/api/monitor/online.js new file mode 100644 index 0000000..057275b --- /dev/null +++ b/src/api/monitor/online.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function del(keys) { + return request({ + url: 'auth/online', + method: 'delete', + data: keys + }) +} diff --git a/src/api/order.js b/src/api/order.js new file mode 100644 index 0000000..fcf7f3f --- /dev/null +++ b/src/api/order.js @@ -0,0 +1,43 @@ +import { post, get } from '@/utils/request' + +// 订单管理 +// 订单退款 +export const refundOrder = (params) => post('/admin/crm/refundOrder', params) + +// vip资讯订单退款 +export const refundVipNewsOrder = (params) => post('/admin/crm/refundVipNewsOrder', params) + +// 查询订单列表 +// export const queryOrderList = (params) => post('/admin/crm/queryOrderList', params) + +// 查询签约协议 +export const queryContractList = (params) => get('/admin/crm/queryContractList', params) + +// 后台查询订单汇总 +export const queryOrderSummary = (params) => post('/admin/crm/order/orderSummary', params) + +// 营业部 +export const getDept = (params) => get('/admin/rbac/dept/listAll', params) +// 营业部列表 +export const getDeptList = (params) => get('/admin/rbac/dept/list', params) + +// 查询定价策略 +export const queryPricing = (params) => get('/system/queryPricingStrategyDetail', params) + +// 后台查询投顾列表 +export const queryTg = (params) => post('/admin/user/tg-info/list', params) + +// 单品提拥订单审核 +export const auditTyOrder = (params) => post('/admin/crm/auditTyOrder', params) + +// 查询保证金支付订单清算状态:true已清算,订单支持部分退 false未清算,订单不支持部分退,必须全部退 +export const queryMarginOrderStatus = (params) => get('/admin/crm/queryMarginOrderStatus', params) + +// 查询10个交易日低于签约门槛的佣金支付订单 +export const queryUnderOrderList = (params) => get('/admin/crm/queryUnderOrderList', params) + +export const queryOrderList = (params) => post('/backend/order/queryOrderList', params) +export const toRefundApplyCheck = (params) => post('/backend/order/refundApplyCheck', params) +export const toRefundApply = (params) => post('/backend/order/refundApply', params) +export const toRefundForce = (params) => post('/backend/order/refundForce', params) +export const unSubscribe = (params) => get('/backend/order/unSubscribe', params) \ No newline at end of file diff --git a/src/api/page.js b/src/api/page.js new file mode 100644 index 0000000..df56724 --- /dev/null +++ b/src/api/page.js @@ -0,0 +1,15 @@ +import { post } from '@/utils/request' + +// 后台查询落地页列表 +export const getPageList = (params) => post('/admin/page/info/list', params) + +// 后台保存落地页 +export const savePage = (params) => post('/admin/page/info/save', params) + +// 后台更新落地页 +export const updatePage = (params) => post('/admin/page/info/update', params) + +// 后台更新落地页状态 +export const updatePageStatus = (params) => post('/admin/page/info/updateStatus', params) + +export const getPageDetail = (params) => post('/admin/page/info/get', params) diff --git a/src/api/permission.js b/src/api/permission.js new file mode 100644 index 0000000..b10b298 --- /dev/null +++ b/src/api/permission.js @@ -0,0 +1,86 @@ +import request from '@/utils/request' + +// 获取所有的权限树 +export function getPermissionTree() { + return request({ + url: '/admin/rbac/permission/list', + method: 'get' + }) +} + +export function add(data) { + return request({ + url: '/admin/rbac/permission/save', + method: 'post', + data + }) +} + +export function del(data) { + return request({ + url: `/admin/rbac/permission/delete`, + method: 'post', + data + }) +} + +export function edit(data) { + return request({ + url: '/admin/rbac/permission/update', + method: 'post', + data + }) +} + +/** + * 获取按钮权限列表查询 + * + * @param queryParams + */ +export function queryPermissionList(queryParams) { + return request({ + url: '/admin/rbac/permission/list', + method: 'post', + data: queryParams + }) +} + +/** + * 保存权限 + */ +export function addPermission(data) { + return request({ + url: '/admin/rbac/permission/save', + method: 'post', + data: data + }) +} + +/** + * 更新权限 + * + * @param id + * @param data + */ +export function updatePermission(data) { + return request({ + url: '/admin/rbac/permission/update', + method: 'post', + data: data + }) +} + +/** + * 删除权限 + * + * @param id + */ +export function deletePermission(id) { + return request({ + url: '/admin/rbac/permission/delete', + method: 'post', + data: { + id + } + }) +} diff --git a/src/api/portfolio.js b/src/api/portfolio.js new file mode 100644 index 0000000..69bff9e --- /dev/null +++ b/src/api/portfolio.js @@ -0,0 +1,46 @@ +import { post, get } from '@/utils/request' + +// 投资组合列表 +// 查询投资组合列表 +export const getPortfolio = (params) => post('/admin/portfolio/queryPortfolioList', params) +// 查询投资组合列表详情 +export const getPortfolioDetail = (params) => get('/app/portfolio/queryPortfolioDetail', params) +// 查询菁英操盘 +// export const queryPortfolioList = (params) => post('/app/portfolio/queryPortfolioListForApp', params) +// 保存投资组合 +export const saveCombination = (params) => post('/admin/portfolio/savePortfolio', params) +// 投资组合收益曲线(图表) +export const getPortfolioHistory = (params) => post('/app/portfolio/queryHistoryProfitRate', params) +// 投资组合持仓数据 +export const getPositionHistory = (params) => get('/app/portfolio/queryPortfolioHold', params) +// 查询投资组合委托 +export const getEntrustHistory = (params) => get('/app/portfolio/queryPortfolioOrder', params) +// 查询投资组合成交 +export const getPortfolioTrade = (params) => post('/app/portfolio/queryPortfolioTrade', params) +// 投资组合调仓 +export const createPortfolioOrder = (params) => post('/admin/portfolio/savePortfolioOrder', params) +// 最大可买/卖查询 +export const getTradeMaxNum = (params) => post('/admin/portfolio/queryTradeMaxNum', params) +// 投资组合撤单 +export const createPortfolioCancel = (params) => get('/admin/portfolio/cancelPortfolioOrder', params) +// 查询金证统一收费平台提拥方案代码 +// export const queryPlanCode = (params) => post('/admin/portfolio/queryPlanCode', params) + +// 股票行情 +// 查询股票列表(股票键盘精灵) +export const querySuggestStock = (params) => post('/app/basicHq/querySuggestStock', params) +// 查询国债逆回购股票 +// export const queryBorrowStock = (params) => post('/app/basicHq/queryBuyBackStock', params) +// 查询股票基本信息 +export const queryStockHq = (params) => post('/app/basicHq/queryStockHq', params) +// 查询所有投资组合成交(调仓记录) +// export const getAllPortfolio = (params) => post('/admin/portfolio/queryAllPortfolioTrade', params) + +// 获取系统配置 +// export const queryConfig = (params) => get('/app/system/queryConfig', params) + +// 修改投资组合状态接口 +// export function updatePortfolioStatus(data) {} + +// 更新投资组合状态 +export const updateStatus = (params) => post('/admin/portfolio/updateStatus', params) diff --git a/src/api/role.js b/src/api/role.js new file mode 100644 index 0000000..c55e50b --- /dev/null +++ b/src/api/role.js @@ -0,0 +1,73 @@ +import request from '@/utils/request' + +// 获取所有的Role +export function getAll(data) { + return request({ + url: '/admin/rbac/role/list', + method: 'post', + data + }) +} + +export function getRoleByUserId(data) { + return request({ + url: '/admin/rbac/role/listByUserId', + method: 'post', + data + }) +} + +export function add(data) { + return request({ + url: '/admin/rbac/role/save', + method: 'post', + data + }) +} + +export function get(params) { + return request({ + url: '/admin/rbac/role/get', + method: 'post', + params + }) +} + +export function getLevel() { + return request({ + url: 'roles/level', + method: 'get' + }) +} + +export function del(data) { + return request({ + url: '/admin/rbac/role/delete', + method: 'post', + data + }) +} + +export function edit(data) { + return request({ + url: '/admin/rbac/role/update', + method: 'post', + data + }) +} + +export function editPermission(data) { + return request({ + url: '/admin/rbac/role/savePermissions', + method: 'post', + data + }) +} + +export function editMenu(data) { + return request({ + url: '/admin/rbac/role/saveMenus', + method: 'post', + data + }) +} diff --git a/src/api/sensitive.js b/src/api/sensitive.js new file mode 100644 index 0000000..d0d4e7d --- /dev/null +++ b/src/api/sensitive.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +export function addSensitive(data) { + return request({ + url: '/admin/common/sensitiveWord/save', + method: 'post', + data + }) +} + +export function getSensitiveList(data) { + return request({ + url: '/admin/common/sensitiveWord/list', + method: 'post', + data + }) +} + +export function delSensitive(data) { + return request({ + url: '/admin/common/sensitiveWord/delete', + method: 'post', + data + }) +} + +export function download(data) { + return request({ + url: '/admin/common/sensitiveWord/download', + method: 'get', + responseType: 'blob' + }) +} diff --git a/src/api/serial.js b/src/api/serial.js new file mode 100644 index 0000000..e1332cf --- /dev/null +++ b/src/api/serial.js @@ -0,0 +1,57 @@ +import request from "@/utils/request"; + +/** 后台查询合集列表 */ +export function getSerialList(data) { + return request({ + url: "/admin/serial/info/list", + method: "post", + data + }); +} + +export function saveSerial(data) { + return request({ + url: "/admin/serial/info/save", + method: "post", + data + }); +} + +export function updateSerial(data) { + return request({ + url: "/admin/serial/info/update", + method: "post", + data + }); +} + +export function updateSerialStatus(data) { + return request({ + url: "/admin/serial/info/updateStatus", + method: "post", + data + }); +} + +export function getSerialContentList(data) { + return request({ + url: "/admin/serial/content/list", + method: "post", + data + }); +} +export function saveSerialContent(data) { + return request({ + url: "/admin/serial/content/update", + method: "post", + data + }); +} + +export function getSerialContent(data) { + return request({ + url: "/admin/serial/info/get", + method: "post", + data + }); +} diff --git a/src/api/shortVideo.js b/src/api/shortVideo.js new file mode 100644 index 0000000..d802f48 --- /dev/null +++ b/src/api/shortVideo.js @@ -0,0 +1,127 @@ +import request from "@/utils/request"; + +/** 后台保存短视频 */ +export function shortVideoSave(data) { + return request({ + url: "/admin/shortVideo/info/save", + method: "post", + data + }); +} + +// 后台查询短视频详情 +export function queryShortVideoDetail(data) { + return request({ + url: "/admin/shortVideo/info/get", + method: "post", + data + }); +} + +// 后台获取上传签名 +export function uploadSign(data) { + return request({ + url: "/admin/shortVideo/file/uploadSign", + method: "get", + data + }); +} + +// 后台查询短视频列表 +export function queryShortVideoList(data) { + return request({ + url: "/admin/shortVideo/info/list", + method: "post", + data + }); +} + +// 后台更新短视频 +export function updateShortVideo(data) { + return request({ + url: "/admin/shortVideo/info/update", + method: "post", + data + }); +} + +// 后台更新短视频状态 +export function updateShortVideoStatus(data) { + return request({ + url: "/admin/shortVideo/info/updateStatus", + method: "post", + data + }); +} + +// 中台查询评论 +export function queryCommentList(data) { + return request({ + url: "/admin/comment/queryCommentList", + method: "post", + data + }); +} + +// 回复评论 +export function replyComment(data) { + return request({ + url: "/admin/comment/replyComment", + method: "post", + data + }); +} + +// 公开评论 +export function setCommentOpen(data) { + return request({ + url: "/admin/comment/setCommentOpen", + method: "post", + data + }); +} + +// 公开评论 +export function deleteComment(params) { + return request({ + url: "/admin/comment/deleteComment", + method: "get", + params + }); +} + +// 中台保存评论 +export function saveComment(data) { + return request({ + url: "/admin/comment/saveComment", + method: "post", + data + }); +} + +// 设置首页参数 +export function setMainPageParam(data) { + return request({ + url: '/admin/shortVideo/info/setMainPageParam', + method: 'post', + data + }) +} + +// 后台统计短视频数据汇总 +export function queryCollectData(data) { + return request({ + url: '/admin/shortVideo/collect/get', + method: 'post', + data + }) +} + +// 后台统计短视频数据明细 +export function queryCollectDataList(data) { + return request({ + url: '/admin/shortVideo/collect/list', + method: 'post', + data + }) +} diff --git a/src/api/system/code.js b/src/api/system/code.js new file mode 100644 index 0000000..0d2e4c2 --- /dev/null +++ b/src/api/system/code.js @@ -0,0 +1,15 @@ +import request from '@/utils/request' + +export function resetEmail(data) { + return request({ + url: 'api/code/resetEmail?email=' + data, + method: 'post' + }) +} + +export function updatePass(pass) { + return request({ + url: 'api/users/updatePass/' + pass, + method: 'get' + }) +} diff --git a/src/api/system/dept.js b/src/api/system/dept.js new file mode 100644 index 0000000..4217f77 --- /dev/null +++ b/src/api/system/dept.js @@ -0,0 +1,45 @@ +import request from '@/utils/request' + +export function getDepts(params) { + return request({ + url: 'api/dept', + method: 'get', + params + }) +} + +export function getDeptSuperior(ids, exclude) { + exclude = exclude !== undefined ? exclude : false + const data = Array.isArray(ids) ? ids : [ids] + return request({ + url: 'api/dept/superior?exclude=' + exclude, + method: 'post', + data + }) +} + +export function add(data) { + return request({ + url: 'api/dept', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/dept', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/dept', + method: 'put', + data + }) +} + +export default { add, edit, del, getDepts, getDeptSuperior } diff --git a/src/api/system/dict.js b/src/api/system/dict.js new file mode 100644 index 0000000..99170f7 --- /dev/null +++ b/src/api/system/dict.js @@ -0,0 +1,34 @@ +import request from '@/utils/request' + +export function getDicts() { + return request({ + url: 'api/dict/all', + method: 'get' + }) +} + +export function add(data) { + return request({ + url: 'api/dict', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/dict/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/dict', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/src/api/system/dictDetail.js b/src/api/system/dictDetail.js new file mode 100644 index 0000000..e8dc512 --- /dev/null +++ b/src/api/system/dictDetail.js @@ -0,0 +1,52 @@ +import request from '@/utils/request' + +export function get(dictName) { + const params = { + dictName, + page: 0, + size: 9999 + } + return request({ + url: 'api/dictDetail', + method: 'get', + params + }) +} + +export function getDictMap(dictName) { + const params = { + dictName, + page: 0, + size: 9999 + } + return request({ + url: 'api/dictDetail/map', + method: 'get', + params + }) +} + +export function add(data) { + return request({ + url: 'api/dictDetail', + method: 'post', + data + }) +} + +export function del(id) { + return request({ + url: 'api/dictDetail/' + id, + method: 'delete' + }) +} + +export function edit(data) { + return request({ + url: 'api/dictDetail', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/src/api/system/job.js b/src/api/system/job.js new file mode 100644 index 0000000..a00630e --- /dev/null +++ b/src/api/system/job.js @@ -0,0 +1,40 @@ +import request from '@/utils/request' + +export function getAllJob() { + const params = { + page: 0, + size: 9999, + enabled: true + } + return request({ + url: 'api/job', + method: 'get', + params + }) +} + +export function add(data) { + return request({ + url: 'api/job', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/job', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/job', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/src/api/system/menu.js b/src/api/system/menu.js new file mode 100644 index 0000000..8135dcb --- /dev/null +++ b/src/api/system/menu.js @@ -0,0 +1,41 @@ +import request from "@/utils/request"; + +// 获取所有的菜单树 +export function getMenusTree(data) { + return request({ + url: "/admin/rbac/menu/list", + method: "post", + data + }); +} + +export function buildMenus(data) { + return request({ + url: "/admin/rbac/menu/listByUser", + method: "get" + }); +} + +export function add(data) { + return request({ + url: "/admin/rbac/menu/save", + method: "post", + data + }); +} + +export function del(data) { + return request({ + url: `/admin/rbac/menu/delete`, + method: "post", + data + }); +} + +export function edit(data) { + return request({ + url: "/admin/rbac/menu/update", + method: "post", + data + }); +} diff --git a/src/api/system/role.js b/src/api/system/role.js new file mode 100644 index 0000000..1f7bc1e --- /dev/null +++ b/src/api/system/role.js @@ -0,0 +1,57 @@ +import request from '@/utils/request' + +// 获取所有的Role +export function getAll() { + return request({ + url: 'api/roles/all', + method: 'get' + }) +} + +export function add(data) { + return request({ + url: 'api/roles', + method: 'post', + data + }) +} + +export function get(id) { + return request({ + url: 'api/roles/' + id, + method: 'get' + }) +} + +export function getLevel() { + return request({ + url: 'api/roles/level', + method: 'get' + }) +} + +export function del(ids) { + return request({ + url: 'api/roles', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/roles', + method: 'put', + data + }) +} + +export function editMenu(data) { + return request({ + url: 'api/roles/menu', + method: 'put', + data + }) +} + +export default { add, edit, del, get, editMenu, getLevel } diff --git a/src/api/system/timing.js b/src/api/system/timing.js new file mode 100644 index 0000000..613e15f --- /dev/null +++ b/src/api/system/timing.js @@ -0,0 +1,41 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/jobs', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/jobs', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/jobs', + method: 'put', + data + }) +} + +export function updateIsPause(id) { + return request({ + url: 'api/jobs/' + id, + method: 'put' + }) +} + +export function execution(id) { + return request({ + url: 'api/jobs/exec/' + id, + method: 'put' + }) +} + +export default { del, updateIsPause, execution, add, edit } diff --git a/src/api/system/user.js b/src/api/system/user.js new file mode 100644 index 0000000..c14df11 --- /dev/null +++ b/src/api/system/user.js @@ -0,0 +1,69 @@ +import request from '@/utils/request' +import { encrypt } from '@/utils/rsaEncrypt' + +export function add(data) { + return request({ + url: 'api/users', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/users', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/users', + method: 'put', + data + }) +} + +export function editUser(data) { + return request({ + url: 'api/users/center', + method: 'put', + data + }) +} + +export function updatePass(user) { + const data = { + oldPass: encrypt(user.oldPass), + newPass: encrypt(user.newPass) + } + return request({ + url: 'api/users/updatePass/', + method: 'post', + data + }) +} + +export function resetPwd(ids) { + return request({ + url: 'api/users/resetPwd', + method: 'put', + data: ids + }) +} + +export function updateEmail(form) { + const data = { + password: encrypt(form.pass), + email: form.email + } + return request({ + url: 'api/users/updateEmail/' + form.code, + method: 'post', + data + }) +} + +export default { add, edit, del, resetPwd } + diff --git a/src/api/systemSafety.js b/src/api/systemSafety.js new file mode 100644 index 0000000..0cde094 --- /dev/null +++ b/src/api/systemSafety.js @@ -0,0 +1,11 @@ +import { get, post } from '@/utils/request' + +// 查询短信白名单用户 +export const queryMessageWhite = (params) => get('/admin/rbac/user/queryMessageWhite', params) +// 系统安全设置-查询 +export const querySafety = (params) => get('/admin/common/safety/config/query', params) +// 系统安全设置-保存 +export const saveSafety = (params) => post('/admin/common/safety/config/save', params) + +// 发送短信 +export const sendMessage = (params) => post('/admin/rbac/auth/sendMessage', params) diff --git a/src/api/tag.js b/src/api/tag.js new file mode 100644 index 0000000..8ac9f3e --- /dev/null +++ b/src/api/tag.js @@ -0,0 +1,15 @@ +import { post, get } from '@/utils/request' + +// 获取标签列表 +export const queryTagList = (params) => post('/admin/common/tag/list', params) + +// 保存标签 +export const tagSave = (params) => post('/admin/common/tag/save', params) + +// 修改标签 +export const tagUpdate = (params) => post('/admin/common/tag/update', params) + +// 删除标签 +export const tagRemove = (id) => get(`/admin/common/tag/remove?id=${id}`) + +export const updateStatus = (params) => post(`/admin/common/tag/updateStatus`, params) diff --git a/src/api/tools/alipay.js b/src/api/tools/alipay.js new file mode 100644 index 0000000..54090f5 --- /dev/null +++ b/src/api/tools/alipay.js @@ -0,0 +1,25 @@ +import request from '@/utils/request' + +export function get() { + return request({ + url: 'api/aliPay', + method: 'get' + }) +} + +export function update(data) { + return request({ + url: 'api/aliPay', + data, + method: 'put' + }) +} + +// 支付 +export function toAliPay(url, data) { + return request({ + url: 'api/' + url, + data, + method: 'post' + }) +} diff --git a/src/api/tools/email.js b/src/api/tools/email.js new file mode 100644 index 0000000..af030cb --- /dev/null +++ b/src/api/tools/email.js @@ -0,0 +1,24 @@ +import request from '@/utils/request' + +export function get() { + return request({ + url: 'api/email', + method: 'get' + }) +} + +export function update(data) { + return request({ + url: 'api/email', + data, + method: 'put' + }) +} + +export function send(data) { + return request({ + url: 'api/email', + data, + method: 'post' + }) +} diff --git a/src/api/tools/localStorage.js b/src/api/tools/localStorage.js new file mode 100644 index 0000000..63ebe2b --- /dev/null +++ b/src/api/tools/localStorage.js @@ -0,0 +1,27 @@ +import request from '@/utils/request' + +export function add(data) { + return request({ + url: 'api/localStorage', + method: 'post', + data + }) +} + +export function del(ids) { + return request({ + url: 'api/localStorage/', + method: 'delete', + data: ids + }) +} + +export function edit(data) { + return request({ + url: 'api/localStorage', + method: 'put', + data + }) +} + +export default { add, edit, del } diff --git a/src/api/tools/qiniu.js b/src/api/tools/qiniu.js new file mode 100644 index 0000000..6d56771 --- /dev/null +++ b/src/api/tools/qiniu.js @@ -0,0 +1,40 @@ +import request from '@/utils/request' + +export function get() { + return request({ + url: 'api/qiNiuContent/config', + method: 'get' + }) +} + +export function update(data) { + return request({ + url: 'api/qiNiuContent/config', + data, + method: 'put' + }) +} + +export function download(id) { + return request({ + url: 'api/qiNiuContent/download/' + id, + method: 'get' + }) +} + +export function sync() { + return request({ + url: 'api/qiNiuContent/synchronize', + method: 'post' + }) +} + +export function del(ids) { + return request({ + url: 'api/qiNiuContent', + method: 'delete', + data: ids + }) +} + +export default { del, download, sync } diff --git a/src/api/upload.js b/src/api/upload.js new file mode 100644 index 0000000..196641c --- /dev/null +++ b/src/api/upload.js @@ -0,0 +1,4 @@ +import { post } from "@/utils/request"; + +// 获取标签列表 +export const fileUpload = params => post("/admin/common/file/upload", params); diff --git a/src/api/user.js b/src/api/user.js new file mode 100644 index 0000000..cd63492 --- /dev/null +++ b/src/api/user.js @@ -0,0 +1,125 @@ +import request from '@/utils/request' +export function list(data) { + return request({ + url: '/admin/rbac/user/list', + method: 'post', + data + }) +} + +export function changeStatus(data) { + return request({ + url: '/admin/rbac/user/updateStatus', + method: 'post', + data + }) +} + +// 重置密码 +export function resetPassword(data) { + return request({ + url: `/admin/rbac/user/resetUserPassword`, + method: 'post', + data + }) +} + +export function add(data) { + return request({ + url: '/admin/rbac/user/save', + method: 'post', + data + }) +} + +// 更新审核状态 +export function audit(data) { + return request({ + url: '/admin/rbac/user/updateAuditStatus', + method: 'post', + data + }) +} +// 更改用户类型 +export function convertToTg(data) { + return request({ + url: '/admin/rbac/user/convertToTg', + method: 'post', + data + }) +} + +export function del(id) { + return request({ + url: `users/${id}`, + method: 'post' + }) +} +// 更新用户信息 +export function updateUserInfo(data) { + return request({ + url: '/admin/rbac/user/update', + method: 'post', + data + }) +} + +export function updatePass(data) { + return request({ + url: '/admin/rbac/auth/changePassword', + method: 'post', + data + }) +} + +export function updateEmail(code, data) { + return request({ + url: `users/updateEmail/${code}`, + method: 'post', + data + }) +} + +// 修改用户手机号 +export function changeMobile(data) { + return request({ + url: `/admin/rbac/auth/changeMobile`, + method: 'post', + data + }) +} +// 后台查询投顾列表 +export function advisorList(data) { + return request({ + url: `/admin/advisor/info/list`, + method: 'post', + data + }) +} + +// 后台查询用户部门列表 +export function listUserDept(data) { + return request({ + url: `/admin/rbac/user/listUserDept`, + method: 'post', + data + }) +} + +// 后台新增用户部门 +export function saveUserDept(data) { + return request({ + url: `/admin/rbac/user/saveUserDept`, + method: 'post', + data + }) +} + +// 后台更新用户部门 +export function updateUserDept(data) { + return request({ + url: `/admin/rbac/user/updateUserDept`, + method: 'post', + data + }) +} \ No newline at end of file diff --git a/src/api/videoLive.js b/src/api/videoLive.js new file mode 100644 index 0000000..958f755 --- /dev/null +++ b/src/api/videoLive.js @@ -0,0 +1,654 @@ +import request from '@/utils/request' + +// +export function getInfoList(data) { + return request({ + url: '/admin/video/live/info/list', + method: 'post', + data + }) +} +// 后台查询专栏列表 +export function getColumnList(data) { + return request({ + url: '/admin/video/live/column/list', + method: 'post', + data + }) +} + +// 后台创建视频直播 +export function save(data) { + return request({ + url: '/admin/video/live/info/save', + method: 'post', + data + }) +} + +export function batchSave(data) { + return request({ + url: '/admin/video/live/info/batchSave', + method: 'post', + data + }) +} + +// 后台更新视频信息 +export function update(data) { + return request({ + url: '/admin/video/live/info/update', + method: 'post', + data + }) +} + +// 后台标签列表 +export function tagList(data) { + return request({ + url: '/admin/common/tag/list', + method: 'post', + data + }) +} +// 后台标签列表 +export function uploadSign(data) { + return request({ + url: '/admin/video/live/uploadSign', + method: 'get', + data + }) +} + +// 后台标签列表 +export function librarySave(data) { + return request({ + url: '/admin/video/live/library/save', + method: 'post', + data + }) +} +// 后台标签列表 +export function livePlayInfo(params) { + return request({ + url: '/admin/video/live/playInfo', + method: 'get', + params + }) +} + +// 后台标签列表 +export function infoSubmit(data) { + return request({ + url: '/admin/video/live/info/submit', + method: 'post', + data + }) +} +// 行为数据统计 +export function cartList(params) { + return request({ + url: '/app/video/live/cartList', + method: 'get', + params + }) +} + +export function infoGet(params) { + return request({ + url: '/admin/video/live/info/get', + method: 'get', + params + }) +} +// 后台撤回操作 +export function infoRecall(data) { + return request({ + url: '/admin/video/live/info/recall', + method: 'post', + data + }) +} + +export function behaviorStatistic(params) { + return request({ + url: '/admin/video/live/behavior-statistic', + method: 'get', + params + }) +} +// 客户数据统计 +export function behaviorUser(data) { + return request({ + url: '/admin/video/live/behavior-user-of-one', + method: 'post', + data + }) +} + +// 行为数据统计详情(某直播客户统计) +export function behaviorStaff(data) { + return request({ + url: '/admin/video/live/behavior-staff-of-one', + method: 'post', + data + }) +} +// 后台审核视频直播 +export function updateStatus(data) { + return request({ + url: '/admin/video/live/info/updateStatus', + method: 'post', + data + }) +} + +// 后台保存推荐位 +export function recommendSave(data) { + return request({ + url: '/admin/video/live/info/recommend', + method: 'post', + data + }) +} + +// 后台保存推荐位 +export function rLiveWsConfig(params) { + return request({ + url: '/admin/common/getWebSocketConf', + method: 'get', + params + }) +} + +export function uVideoControl(data) { + return request({ + url: '/admin/video/live/info/control', + method: 'post', + data + }) +} + +export function getPlayerSign(data) { + return request({ + url: '/admin/video/playerSign', + method: 'post', + data + }) +} +export function videoMessage(data) { + return request({ + url: '/admin/video/live/message/list', + method: 'post', + data + }) +} +// 后台删除互动消息 +export function messageDelete(data) { + return request({ + url: '/admin/video/live/message/delete', + method: 'post', + data + }) +} +// 后台发送互动消息 +export function messageSend(data) { + return request({ + url: '/admin/video/live/message/send', + method: 'post', + data + }) +} +// 添加用户禁言 +export function addCommentBlack(data) { + return request({ + url: '/admin/comment/addCommentBlack', + method: 'post', + data + }) +} +// 解除用户禁言 +export function removeCommentBlack(params) { + return request({ + url: '/admin/comment/removeCommentBlack', + method: 'get', + params + }) +} + +// 购物车上下架 +export function cartUpdateStatus(data) { + return request({ + url: '/admin/video/live/cart/updateStatus', + method: 'post', + data + }) +} +// 购物车修改可销售数量 +export function updateSaleLimit(data) { + return request({ + url: '/admin/video/live/cart/updateSaleLimit', + method: 'post', + data + }) +} + +// 后台停止互动 +export function messageForbidden(data) { + return request({ + url: '/admin/video/live/message/forbidden', + method: 'post', + data + }) +} +// 后台查询观点包列表 +export function packageList(data) { + return request({ + url: '/admin/view/package/list', + method: 'post', + data + }) +} +// 购物车推荐 +export function cartRecommend(data) { + return request({ + url: '/admin/video/live/cart/recommend', + method: 'post', + data + }) +} +// 后台推荐产品消息 +export function productMessage(data) { + return request({ + url: '/admin/video/live/message/productMessage', + method: 'post', + data + }) +} +// 后台查询专栏详情 +export function columnGet(params) { + return request({ + url: '/admin/video/live/column/get', + method: 'get', + params + }) +} +// 后台查询专栏列表 +export function columnList(data) { + return request({ + url: '/admin/video/live/column/list', + method: 'post', + data + }) +} +// 后台创建视频专栏 +export function columnSave(data) { + return request({ + url: '/admin/video/live/column/save', + method: 'post', + data + }) +} +// 后台推荐视频专栏 +export function columnRecommend(data) { + return request({ + url: '/admin/video/live/column/recommend', + method: 'post', + data + }) +} +// 专栏状态修改 +export function columnUpdateStatus(data) { + return request({ + url: '/admin/video/live/column/updateStatus', + method: 'post', + data + }) +} + +// 风控列表 +export function riskList(data) { + return request({ + url: '/admin/video/live/risk-list', + method: 'post', + data + }) +} +// 直播活动列表 +export function activityList(data) { + return request({ + url: '/admin/video/live/activity/list', + method: 'post', + data + }) +} +// 新增活动 +export function activitySave(data) { + return request({ + url: '/admin/video/live/activity/save', + method: 'post', + data + }) +} +// 活动状态修改 +export function activityUpdateStatus(data) { + return request({ + url: '/admin/video/live/activity/updateStatus', + method: 'post', + data + }) +} +// 后台部门(营业部、分公司)列表查询 +export function deptColumnList(params) { + return request({ + url: '/admin/rbac/dept/common/list', + method: 'get', + params + }) +} +// 视频直播数据概况(已对接订单) +export function dataOverview(params) { + return request({ + url: '/admin/video/live/data-overview', + method: 'get', + params + }) +} + +// 视频直播实时趋势 +export function nowTrend(params) { + return request({ + url: '/admin/video/live/nowTrend', + method: 'get', + params + }) +} +// 客户管理列表 +export function customerList(data) { + return request({ + url: '/admin/video/live/customer/list', + method: 'post', + data + }) +} +// 客户详情 +export function customerDetails(params) { + return request({ + url: '/admin/video/live/customer/details', + method: 'get', + params + }) +} +// 直播观看记录 +export function videoReadRecord(data) { + return request({ + url: '/admin/video/live/customer/video-read-record', + method: 'post', + data + }) +} +// 公开、关闭消息 +export function messageOpen(data) { + return request({ + url: '/admin/chat/message/open', + method: 'post', + data + }) +} +// 关键行为提醒列表 +export function notifyList(data) { + return request({ + url: '/admin/video/live/behavior/notify/list', + method: 'post', + data + }) +} +// 创建问卷 +export function questionSave(data) { + return request({ + url: '/admin/video/live/question/save', + method: 'post', + data + }) +} +// 问卷列表 +export function questionList(data) { + return request({ + url: '/admin/video/live/question/list', + method: 'post', + data + }) +} +// 问卷状态修改 +export function questionUpdateStatus(data) { + return request({ + url: '/admin/video/live/question/updateStatus', + method: 'post', + data + }) +} +// 问卷详情 +export function questionDetails(params) { + return request({ + url: '/admin/video/live/question/details', + method: 'get', + params + }) +} + +// 问卷导出 +export function questionExport(params) { + return request({ + url: '/admin/video/live/question/export', + method: 'get', + params + }) +} +// 视频直播开启消息审核 +export function openMessAudit(data) { + return request({ + url: '/admin/video/live/openMessAudit', + method: 'post', + data + }) +} + +// 生成短链 +export function urlResize(data) { + return request({ + url: '/admin/url/resize', + method: 'post', + data + }) +} +// 查询历史消息数 +export function messageCountApi(params) { + return request({ + url: '/admin/chat/message/count', + method: 'get', + params + }) +} +// 查询腾讯云在线人数 +export function txonline(params) { + return request({ + url: '/admin/video/live/txonline', + method: 'get', + params + }) +} +// 点击转码直播视频 +export function liveProcess(params) { + return request({ + url: '/admin/video/live/process', + method: 'get', + params + }) +} +// 转码视频下载地址 +export function videoDownload(params) { + return request({ + url: '/admin/video/download', + method: 'get', + params + }) +} + +// 查询视频转码进度 +export function videoDownProgress(params) { + return request({ + url: '/admin/video/live/download/progress', + method: 'get', + params + }) +} +// 获取投顾互动消息 +export function advisorMessageList(data) { + return request({ + url: '/admin/video/live/advisorMessage/list', + method: 'post', + data + }) +} + +// 后台查询课程列表 +export function courseInfoList(data) { + return request({ + url: '/admin/course/info/list', + method: 'post', + data + }) +} +// 后台查询合集列表 +export function serialInfoList(data) { + return request({ + url: '/admin/serial/info/list', + method: 'post', + data + }) +} + +// 修改互动类型 +export function updateInteractType(data) { + return request({ + url: '/admin/video/live/updateInteractType', + method: 'post', + data + }) +} +// 设置首页参数 +export function setMainPageParam(data) { + return request({ + url: '/admin/video/live/setMainPageParam', + method: 'post', + data + }) +} + +// 修改二维码开关 +export function updateQWParam(data) { + return request({ + url: '/admin/video/live/updateQWParam', + method: 'post', + data + }) +} + +// 购物车产品推送 +export function cartPush(data) { + return request({ + url: '/admin/video/live/cart/push', + method: 'post', + data + }) +} + +// 终端类型统计 +export function queryUserClientType(params) { + return request({ + url: '/admin/video/live/clientType', + method: 'get', + params + }) +} + +// 查询上次转推信息 +export function getLastPush(params) { + return request({ + url: '/admin/video/live/getLastPush', + method: 'get', + params + }) +} + +// 删除转推信息 +export function deletePush(data) { + return request({ + url: '/admin/video/live/deletePush', + method: 'post', + data + }) +} + +// 保存转推信息 +export function savePush(data) { + return request({ + url: '/admin/video/live/savePush', + method: 'post', + data + }) +} + +// 保存转推信息 +export function cancelPush(params) { + return request({ + url: '/admin/video/live/cart/cancelPush', + method: 'get', + params + }) +} + +// 查询混流详情 +export function getMixData(data) { + return request({ + url: '/admin/video/mix/get', + method: 'post', + data + }) +} + +// 保存混流信息 +export function saveMixData(data) { + return request({ + url: '/admin/video/mix/save', + method: 'post', + data + }) +} + +// 修改混流主画面显示 +export function updateMixShowMain(data) { + return request({ + url: '/admin/video/mix/updateShowMain', + method: 'post', + data + }) +} + +// 修改混流连麦状态 +export function updateMixStatus(data) { + return request({ + url: '/admin/video/mix/updateStatus', + method: 'post', + data + }) +} + +// 修改是否显示完整昵称 +export function showNickname(data) { + return request({ + url: '/admin/video/live/showNickname', + method: 'post', + data + }) +} \ No newline at end of file diff --git a/src/assets/401_images/401.gif b/src/assets/401_images/401.gif new file mode 100644 index 0000000..cd6e0d9 Binary files /dev/null and b/src/assets/401_images/401.gif differ diff --git a/src/assets/404_images/404.png b/src/assets/404_images/404.png new file mode 100644 index 0000000..3d8e230 Binary files /dev/null and b/src/assets/404_images/404.png differ diff --git a/src/assets/404_images/404_cloud.png b/src/assets/404_images/404_cloud.png new file mode 100644 index 0000000..c6281d0 Binary files /dev/null and b/src/assets/404_images/404_cloud.png differ diff --git a/src/assets/icons/index.js b/src/assets/icons/index.js new file mode 100644 index 0000000..2c6b309 --- /dev/null +++ b/src/assets/icons/index.js @@ -0,0 +1,9 @@ +import Vue from 'vue' +import SvgIcon from '@/components/SvgIcon'// svg component + +// register globally +Vue.component('svg-icon', SvgIcon) + +const req = require.context('./svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys().map(requireContext) +requireAll(req) diff --git a/src/assets/icons/svg/Steve-Jobs.svg b/src/assets/icons/svg/Steve-Jobs.svg new file mode 100644 index 0000000..53843e2 --- /dev/null +++ b/src/assets/icons/svg/Steve-Jobs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/alipay.svg b/src/assets/icons/svg/alipay.svg new file mode 100644 index 0000000..9138981 --- /dev/null +++ b/src/assets/icons/svg/alipay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/anq.svg b/src/assets/icons/svg/anq.svg new file mode 100644 index 0000000..a466608 --- /dev/null +++ b/src/assets/icons/svg/anq.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/app.svg b/src/assets/icons/svg/app.svg new file mode 100644 index 0000000..0796da3 --- /dev/null +++ b/src/assets/icons/svg/app.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/backup.svg b/src/assets/icons/svg/backup.svg new file mode 100644 index 0000000..a3272a4 --- /dev/null +++ b/src/assets/icons/svg/backup.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/blog.svg b/src/assets/icons/svg/blog.svg new file mode 100644 index 0000000..a990eba --- /dev/null +++ b/src/assets/icons/svg/blog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/chain.svg b/src/assets/icons/svg/chain.svg new file mode 100644 index 0000000..ed3317f --- /dev/null +++ b/src/assets/icons/svg/chain.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/chart.svg b/src/assets/icons/svg/chart.svg new file mode 100644 index 0000000..27728fb --- /dev/null +++ b/src/assets/icons/svg/chart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/codeConsole.svg b/src/assets/icons/svg/codeConsole.svg new file mode 100644 index 0000000..672ec6e --- /dev/null +++ b/src/assets/icons/svg/codeConsole.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/dashboard.svg b/src/assets/icons/svg/dashboard.svg new file mode 100644 index 0000000..5317d37 --- /dev/null +++ b/src/assets/icons/svg/dashboard.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/database.svg b/src/assets/icons/svg/database.svg new file mode 100644 index 0000000..7fbad9b --- /dev/null +++ b/src/assets/icons/svg/database.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/date.svg b/src/assets/icons/svg/date.svg new file mode 100644 index 0000000..0540e99 --- /dev/null +++ b/src/assets/icons/svg/date.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/deploy.svg b/src/assets/icons/svg/deploy.svg new file mode 100644 index 0000000..f4a1c56 --- /dev/null +++ b/src/assets/icons/svg/deploy.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/dept.svg b/src/assets/icons/svg/dept.svg new file mode 100644 index 0000000..894e4bf --- /dev/null +++ b/src/assets/icons/svg/dept.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/dev.svg b/src/assets/icons/svg/dev.svg new file mode 100644 index 0000000..ed4d23c --- /dev/null +++ b/src/assets/icons/svg/dev.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/develop.svg b/src/assets/icons/svg/develop.svg new file mode 100644 index 0000000..e189223 --- /dev/null +++ b/src/assets/icons/svg/develop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/dictionary.svg b/src/assets/icons/svg/dictionary.svg new file mode 100644 index 0000000..6e83c43 --- /dev/null +++ b/src/assets/icons/svg/dictionary.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/doc.svg b/src/assets/icons/svg/doc.svg new file mode 100644 index 0000000..9160de8 --- /dev/null +++ b/src/assets/icons/svg/doc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/download.svg b/src/assets/icons/svg/download.svg new file mode 100644 index 0000000..0243c6a --- /dev/null +++ b/src/assets/icons/svg/download.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/edit.svg b/src/assets/icons/svg/edit.svg new file mode 100644 index 0000000..d26101f --- /dev/null +++ b/src/assets/icons/svg/edit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/education.svg b/src/assets/icons/svg/education.svg new file mode 100644 index 0000000..7bfb01d --- /dev/null +++ b/src/assets/icons/svg/education.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/email.svg b/src/assets/icons/svg/email.svg new file mode 100644 index 0000000..f1cf3ae --- /dev/null +++ b/src/assets/icons/svg/email.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/error.svg b/src/assets/icons/svg/error.svg new file mode 100644 index 0000000..fd935da --- /dev/null +++ b/src/assets/icons/svg/error.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/exit-fullscreen.svg b/src/assets/icons/svg/exit-fullscreen.svg new file mode 100644 index 0000000..485c128 --- /dev/null +++ b/src/assets/icons/svg/exit-fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/fullscreen.svg b/src/assets/icons/svg/fullscreen.svg new file mode 100644 index 0000000..0e86b6f --- /dev/null +++ b/src/assets/icons/svg/fullscreen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/fwb.svg b/src/assets/icons/svg/fwb.svg new file mode 100644 index 0000000..59933fc --- /dev/null +++ b/src/assets/icons/svg/fwb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/github.svg b/src/assets/icons/svg/github.svg new file mode 100644 index 0000000..8145e95 --- /dev/null +++ b/src/assets/icons/svg/github.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/gonggao.svg b/src/assets/icons/svg/gonggao.svg new file mode 100644 index 0000000..22aed08 --- /dev/null +++ b/src/assets/icons/svg/gonggao.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/icon.svg b/src/assets/icons/svg/icon.svg new file mode 100644 index 0000000..82fbdd9 --- /dev/null +++ b/src/assets/icons/svg/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/image.svg b/src/assets/icons/svg/image.svg new file mode 100644 index 0000000..16d572f --- /dev/null +++ b/src/assets/icons/svg/image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/index.svg b/src/assets/icons/svg/index.svg new file mode 100644 index 0000000..fdb3826 --- /dev/null +++ b/src/assets/icons/svg/index.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/international.svg b/src/assets/icons/svg/international.svg new file mode 100644 index 0000000..e9b56ee --- /dev/null +++ b/src/assets/icons/svg/international.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/ipvisits.svg b/src/assets/icons/svg/ipvisits.svg new file mode 100644 index 0000000..4ca473d --- /dev/null +++ b/src/assets/icons/svg/ipvisits.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/java.svg b/src/assets/icons/svg/java.svg new file mode 100644 index 0000000..e2effbb --- /dev/null +++ b/src/assets/icons/svg/java.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/link.svg b/src/assets/icons/svg/link.svg new file mode 100644 index 0000000..48197ba --- /dev/null +++ b/src/assets/icons/svg/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/list.svg b/src/assets/icons/svg/list.svg new file mode 100644 index 0000000..20259ed --- /dev/null +++ b/src/assets/icons/svg/list.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/lock.svg b/src/assets/icons/svg/lock.svg new file mode 100644 index 0000000..0f842ea --- /dev/null +++ b/src/assets/icons/svg/lock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/log.svg b/src/assets/icons/svg/log.svg new file mode 100644 index 0000000..4fefe74 --- /dev/null +++ b/src/assets/icons/svg/log.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/login.svg b/src/assets/icons/svg/login.svg new file mode 100644 index 0000000..cc5a854 --- /dev/null +++ b/src/assets/icons/svg/login.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/markdown.svg b/src/assets/icons/svg/markdown.svg new file mode 100644 index 0000000..7cd6747 --- /dev/null +++ b/src/assets/icons/svg/markdown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/menu.svg b/src/assets/icons/svg/menu.svg new file mode 100644 index 0000000..e4360a0 --- /dev/null +++ b/src/assets/icons/svg/menu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/message.svg b/src/assets/icons/svg/message.svg new file mode 100644 index 0000000..14ca817 --- /dev/null +++ b/src/assets/icons/svg/message.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/mnt.svg b/src/assets/icons/svg/mnt.svg new file mode 100644 index 0000000..936ce29 --- /dev/null +++ b/src/assets/icons/svg/mnt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/money.svg b/src/assets/icons/svg/money.svg new file mode 100644 index 0000000..c1580de --- /dev/null +++ b/src/assets/icons/svg/money.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/monitor.svg b/src/assets/icons/svg/monitor.svg new file mode 100644 index 0000000..339370a --- /dev/null +++ b/src/assets/icons/svg/monitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/nested.svg b/src/assets/icons/svg/nested.svg new file mode 100644 index 0000000..06713a8 --- /dev/null +++ b/src/assets/icons/svg/nested.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/password.svg b/src/assets/icons/svg/password.svg new file mode 100644 index 0000000..4ab451f --- /dev/null +++ b/src/assets/icons/svg/password.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/people.svg b/src/assets/icons/svg/people.svg new file mode 100644 index 0000000..2bd54ae --- /dev/null +++ b/src/assets/icons/svg/people.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/peoples.svg b/src/assets/icons/svg/peoples.svg new file mode 100644 index 0000000..2c91161 --- /dev/null +++ b/src/assets/icons/svg/peoples.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/permission.svg b/src/assets/icons/svg/permission.svg new file mode 100644 index 0000000..c4c7409 --- /dev/null +++ b/src/assets/icons/svg/permission.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/phone.svg b/src/assets/icons/svg/phone.svg new file mode 100644 index 0000000..da339f9 --- /dev/null +++ b/src/assets/icons/svg/phone.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/qiniu.svg b/src/assets/icons/svg/qiniu.svg new file mode 100644 index 0000000..c2f9f8b --- /dev/null +++ b/src/assets/icons/svg/qiniu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/redis.svg b/src/assets/icons/svg/redis.svg new file mode 100644 index 0000000..bef111b --- /dev/null +++ b/src/assets/icons/svg/redis.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/role.svg b/src/assets/icons/svg/role.svg new file mode 100644 index 0000000..76cb18f --- /dev/null +++ b/src/assets/icons/svg/role.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/search.svg b/src/assets/icons/svg/search.svg new file mode 100644 index 0000000..84233dd --- /dev/null +++ b/src/assets/icons/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/server.svg b/src/assets/icons/svg/server.svg new file mode 100644 index 0000000..db6dcdf --- /dev/null +++ b/src/assets/icons/svg/server.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/shopping.svg b/src/assets/icons/svg/shopping.svg new file mode 100644 index 0000000..87513e7 --- /dev/null +++ b/src/assets/icons/svg/shopping.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/size.svg b/src/assets/icons/svg/size.svg new file mode 100644 index 0000000..ddb25b8 --- /dev/null +++ b/src/assets/icons/svg/size.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/skill.svg b/src/assets/icons/svg/skill.svg new file mode 100644 index 0000000..a3b7312 --- /dev/null +++ b/src/assets/icons/svg/skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/source.svg b/src/assets/icons/svg/source.svg new file mode 100644 index 0000000..1c3a038 --- /dev/null +++ b/src/assets/icons/svg/source.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/sqlMonitor.svg b/src/assets/icons/svg/sqlMonitor.svg new file mode 100644 index 0000000..950a430 --- /dev/null +++ b/src/assets/icons/svg/sqlMonitor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/swagger.svg b/src/assets/icons/svg/swagger.svg new file mode 100644 index 0000000..ded7de8 --- /dev/null +++ b/src/assets/icons/svg/swagger.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/sys-tools.svg b/src/assets/icons/svg/sys-tools.svg new file mode 100644 index 0000000..8f9055e --- /dev/null +++ b/src/assets/icons/svg/sys-tools.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/system.svg b/src/assets/icons/svg/system.svg new file mode 100644 index 0000000..9333c60 --- /dev/null +++ b/src/assets/icons/svg/system.svg @@ -0,0 +1 @@ + diff --git a/src/assets/icons/svg/system1.svg b/src/assets/icons/svg/system1.svg new file mode 100644 index 0000000..37b0a0a --- /dev/null +++ b/src/assets/icons/svg/system1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tab.svg b/src/assets/icons/svg/tab.svg new file mode 100644 index 0000000..b4b48e4 --- /dev/null +++ b/src/assets/icons/svg/tab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/theme.svg b/src/assets/icons/svg/theme.svg new file mode 100644 index 0000000..5982a2f --- /dev/null +++ b/src/assets/icons/svg/theme.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/timing.svg b/src/assets/icons/svg/timing.svg new file mode 100644 index 0000000..f8fdc6d --- /dev/null +++ b/src/assets/icons/svg/timing.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tools.svg b/src/assets/icons/svg/tools.svg new file mode 100644 index 0000000..aba1a40 --- /dev/null +++ b/src/assets/icons/svg/tools.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tree-table.svg b/src/assets/icons/svg/tree-table.svg new file mode 100644 index 0000000..8aafdb8 --- /dev/null +++ b/src/assets/icons/svg/tree-table.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/tree.svg b/src/assets/icons/svg/tree.svg new file mode 100644 index 0000000..dd4b7dd --- /dev/null +++ b/src/assets/icons/svg/tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/unlock.svg b/src/assets/icons/svg/unlock.svg new file mode 100644 index 0000000..1219e41 --- /dev/null +++ b/src/assets/icons/svg/unlock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/user.svg b/src/assets/icons/svg/user.svg new file mode 100644 index 0000000..09d7a81 --- /dev/null +++ b/src/assets/icons/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/user1.svg b/src/assets/icons/svg/user1.svg new file mode 100644 index 0000000..14ca51e --- /dev/null +++ b/src/assets/icons/svg/user1.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/validCode.svg b/src/assets/icons/svg/validCode.svg new file mode 100644 index 0000000..a1feb74 --- /dev/null +++ b/src/assets/icons/svg/validCode.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/visits.svg b/src/assets/icons/svg/visits.svg new file mode 100644 index 0000000..8425662 --- /dev/null +++ b/src/assets/icons/svg/visits.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/web.svg b/src/assets/icons/svg/web.svg new file mode 100644 index 0000000..9c57415 --- /dev/null +++ b/src/assets/icons/svg/web.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/wechat.svg b/src/assets/icons/svg/wechat.svg new file mode 100644 index 0000000..c586e55 --- /dev/null +++ b/src/assets/icons/svg/wechat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/weixin.svg b/src/assets/icons/svg/weixin.svg new file mode 100644 index 0000000..8dbcfa5 --- /dev/null +++ b/src/assets/icons/svg/weixin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/zujian.svg b/src/assets/icons/svg/zujian.svg new file mode 100644 index 0000000..2aba32f --- /dev/null +++ b/src/assets/icons/svg/zujian.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svgo.yml b/src/assets/icons/svgo.yml new file mode 100644 index 0000000..d11906a --- /dev/null +++ b/src/assets/icons/svgo.yml @@ -0,0 +1,22 @@ +# replace default config + +# multipass: true +# full: true + +plugins: + + # - name + # + # or: + # - name: false + # - name: true + # + # or: + # - name: + # param1: 1 + # param2: 2 + +- removeAttrs: + attrs: + - 'fill' + - 'fill-rule' diff --git a/src/assets/images/avatar.png b/src/assets/images/avatar.png new file mode 100644 index 0000000..997732a Binary files /dev/null and b/src/assets/images/avatar.png differ diff --git a/src/assets/images/background.jpeg b/src/assets/images/background.jpeg new file mode 100644 index 0000000..d7f30e3 Binary files /dev/null and b/src/assets/images/background.jpeg differ diff --git a/src/assets/images/data.png b/src/assets/images/data.png new file mode 100644 index 0000000..6367783 Binary files /dev/null and b/src/assets/images/data.png differ diff --git a/src/assets/images/logo.png b/src/assets/images/logo.png new file mode 100644 index 0000000..f757710 Binary files /dev/null and b/src/assets/images/logo.png differ diff --git a/src/assets/images/template/10.png b/src/assets/images/template/10.png new file mode 100644 index 0000000..b97c7c2 Binary files /dev/null and b/src/assets/images/template/10.png differ diff --git a/src/assets/images/template/20.png b/src/assets/images/template/20.png new file mode 100644 index 0000000..0900cac Binary files /dev/null and b/src/assets/images/template/20.png differ diff --git a/src/assets/images/template/30.png b/src/assets/images/template/30.png new file mode 100644 index 0000000..2d6e105 Binary files /dev/null and b/src/assets/images/template/30.png differ diff --git a/src/assets/images/template/40.png b/src/assets/images/template/40.png new file mode 100644 index 0000000..1ee0006 Binary files /dev/null and b/src/assets/images/template/40.png differ diff --git a/src/assets/images/transBg.png b/src/assets/images/transBg.png new file mode 100644 index 0000000..4188cb1 Binary files /dev/null and b/src/assets/images/transBg.png differ diff --git a/src/assets/images/trumpet.png b/src/assets/images/trumpet.png new file mode 100644 index 0000000..6c37ca4 Binary files /dev/null and b/src/assets/images/trumpet.png differ diff --git a/src/assets/logo/people.png b/src/assets/logo/people.png new file mode 100644 index 0000000..605c2eb Binary files /dev/null and b/src/assets/logo/people.png differ diff --git a/src/assets/logo/userDefault.png b/src/assets/logo/userDefault.png new file mode 100644 index 0000000..0ca31d9 Binary files /dev/null and b/src/assets/logo/userDefault.png differ diff --git a/src/assets/logo/wait.png b/src/assets/logo/wait.png new file mode 100644 index 0000000..3dd2ab9 Binary files /dev/null and b/src/assets/logo/wait.png differ diff --git a/src/assets/logo/默认头像.png b/src/assets/logo/默认头像.png new file mode 100644 index 0000000..4281af9 Binary files /dev/null and b/src/assets/logo/默认头像.png differ diff --git a/src/assets/styles/btn.scss b/src/assets/styles/btn.scss new file mode 100644 index 0000000..8f47f2c --- /dev/null +++ b/src/assets/styles/btn.scss @@ -0,0 +1,99 @@ +@import 'variables'; + +@mixin colorBtn($color) { + background: $color; + + &:hover { + color: $color; + + &:before, + &:after { + background: $color; + } + } +} + +.blue-btn { + @include colorBtn($blue) +} + +.light-blue-btn { + @include colorBtn($light-blue) +} + +.red-btn { + @include colorBtn($red) +} + +.pink-btn { + @include colorBtn($pink) +} + +.green-btn { + @include colorBtn($green) +} + +.tiffany-btn { + @include colorBtn($tiffany) +} + +.yellow-btn { + @include colorBtn($yellow) +} + +.pan-btn { + font-size: 14px; + color: #fff; + padding: 14px 36px; + border-radius: 8px; + border: none; + outline: none; + transition: 600ms ease all; + position: relative; + display: inline-block; + + &:hover { + background: #fff; + + &:before, + &:after { + width: 100%; + transition: 600ms ease all; + } + } + + &:before, + &:after { + content: ''; + position: absolute; + top: 0; + right: 0; + height: 2px; + width: 0; + transition: 400ms ease all; + } + + &::after { + right: inherit; + top: inherit; + left: 0; + bottom: 0; + } +} + +.custom-button { + display: inline-block; + line-height: 1; + white-space: nowrap; + cursor: pointer; + background: #fff; + color: #fff; + -webkit-appearance: none; + text-align: center; + box-sizing: border-box; + outline: 0; + margin: 0; + padding: 10px 15px; + font-size: 14px; + border-radius: 4px; +} diff --git a/src/assets/styles/eladmin.scss b/src/assets/styles/eladmin.scss new file mode 100644 index 0000000..e1e0195 --- /dev/null +++ b/src/assets/styles/eladmin.scss @@ -0,0 +1,117 @@ +.head-container { + padding-bottom: 10px; + .filter-item { + display: inline-block; + vertical-align: middle; + margin: 0 3px 10px 0; + input { + height: 30.5px; + line-height: 30.5px; + } + } + .el-form-item-label { + margin: 0 3px 9px 0; + display: inline-block; + text-align: right; + vertical-align: middle; + font-size: 14px; + color: #606266; + line-height: 30.5px; + padding: 0 7px 0 7px; + } + .el-button+.el-button { + margin-left: 0 !important; + } + .el-select__caret.el-input__icon.el-icon-arrow-up{ + line-height: 30.5px; + } + .date-item { + display: inline-block; + vertical-align: middle; + margin-bottom: 10px; + height: 30.5px !important; + width: 230px !important; + } +} +.el-avatar { + display: inline-block; + text-align: center; + background: #ccc; + color: #fff; + white-space: nowrap; + position: relative; + overflow: hidden; + vertical-align: middle; + width: 32px; + height: 32px; + line-height: 32px; + border-radius: 16px; +} + +.logo-con{ + height: 60px; + padding: 13px 0 0; + img{ + height: 32px; + width: 135px; + display: block; + //margin: 0 auto; + } +} + +#el-login-footer { + height: 40px; + line-height: 40px; + position: fixed; + bottom: 0; + width: 100%; + text-align: center; + color: #fff; + font-family: Arial, serif; + font-size: 12px; + letter-spacing: 1px; +} + +#el-main-footer { + background: none repeat scroll 0 0 white; + border-top: 1px solid #e7eaec; + overflow: hidden; + padding: 10px 6px 0 6px; + height: 33px; + font-size: 0.7rem !important; + color: #7a8b9a; + letter-spacing: 0.8px; + font-family: Arial, sans-serif !important; + position: fixed; + bottom: 0; + z-index: 99; + width: 100%; +} +.eladmin-upload { + border: 1px dashed #c0ccda; + border-radius: 5px; + height: 45px; + line-height: 45px; + width: 368px; +} +.my-blockquote{ + margin: 0 0 10px; + padding: 15px; + line-height: 22px; + border-left: 5px solid #00437B; + border-radius: 0 2px 2px 0; + background-color: #f2f2f2; +} +.my-code{ + position: relative; + padding: 15px; + line-height: 20px; + border-left: 5px solid #ddd; + color: #333; + font-family: Courier New, serif; + font-size: 12px +} + +.el-tabs{ + margin-bottom: 25px; +} diff --git a/src/assets/styles/element-ui.scss b/src/assets/styles/element-ui.scss new file mode 100644 index 0000000..8f7881c --- /dev/null +++ b/src/assets/styles/element-ui.scss @@ -0,0 +1,79 @@ +// cover some element-ui styles + +.el-breadcrumb__inner, +.el-breadcrumb__inner a { + font-weight: 400 !important; +} + +.el-upload { + input[type="file"] { + display: none !important; + } +} + +.el-upload__input { + display: none; +} + +.cell { + .el-tag { + margin-right: 0; + } +} + +.small-padding { + .cell { + padding-left: 5px; + padding-right: 5px; + } +} + +.fixed-width { + .el-button--mini { + padding: 7px 10px; + width: 60px; + } +} + +.status-col { + .cell { + padding: 0 10px; + text-align: center; + + .el-tag { + margin-right: 0; + } + } +} + +// to fixed https://github.com/ElemeFE/element/issues/2461 +.el-dialog { + transform: none; + left: 0; + position: relative; + margin: 0 auto; +} + +// refine element ui upload +.upload-container { + .el-upload { + width: 100%; + + .el-upload-dragger { + width: 100%; + height: 200px; + } + } +} + +// dropdown +.el-dropdown-menu { + a { + display: block + } +} + +// fix date-picker ui bug in filter-item +.el-range-editor.el-input__inner { + display: inline-flex !important; +} diff --git a/src/assets/styles/element-variables.scss b/src/assets/styles/element-variables.scss new file mode 100644 index 0000000..a4f8c4a --- /dev/null +++ b/src/assets/styles/element-variables.scss @@ -0,0 +1,31 @@ +/** +* I think element-ui's default theme color is too light for long-term use. +* So I modified the default color and you can modify it to your liking. +**/ + +/* theme color */ +$--color-primary: #1890ff; +$--color-success: #13ce66; +$--color-warning: #FFBA00; +$--color-danger: #ff4949; +// $--color-info: #1E1E1E; + +$--button-font-weight: 400; + +// $--color-text-regular: #1f2d3d; + +$--border-color-light: #dfe4ed; +$--border-color-lighter: #e6ebf5; + +$--table-border:1px solid#dfe6ec; + +/* icon font path, required */ +$--font-path: '~element-ui/lib/theme-chalk/fonts'; + +@import "../../../node_modules/element-ui/packages/theme-chalk/src/index"; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + theme: $--color-primary; +} diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss new file mode 100644 index 0000000..cb80548 --- /dev/null +++ b/src/assets/styles/index.scss @@ -0,0 +1,193 @@ +@import "variables"; +@import "mixin"; +@import "transition"; +@import "element-ui"; +@import "sidebar"; +@import "btn"; +@import "eladmin"; + +body { + height: 100%; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; + font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, + Microsoft YaHei, Arial, sans-serif; +} + +label { + font-weight: 700; +} + +html { + height: 100%; + box-sizing: border-box; +} + +#app { + height: 100%; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +.no-padding { + padding: 0 !important; +} + +.padding-content { + padding: 4px 0; +} + +a:focus, +a:active { + outline: none; +} + +a, +a:focus, +a:hover { + cursor: pointer; + color: inherit; + text-decoration: none; +} + +div:focus { + outline: none; +} + +.fr { + float: right; +} + +.fl { + float: left; +} + +.pr-5 { + padding-right: 5px; +} + +.pl-5 { + padding-left: 5px; +} + +.block { + display: block; +} + +.pointer { + cursor: pointer; +} + +.inlineBlock { + display: block; +} + +.clearfix { + &:after { + visibility: hidden; + display: block; + font-size: 0; + content: " "; + clear: both; + height: 0; + } +} + +aside { + background: #eef1f6; + padding: 8px 24px; + margin-bottom: 20px; + border-radius: 2px; + display: block; + line-height: 32px; + font-size: 16px; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, + Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif; + color: #2c3e50; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + a { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } + } +} + +//main-container全局样式 +.app-container { + padding: 20px 20px 45px 20px; + background: #fff; + margin: 10px; + box-shadow: 0px 0px 10px #888888; +} + +.components-container { + margin: 30px 50px; + position: relative; +} + +.pagination-container { + margin-top: 30px; +} + +.text-center { + text-align: center; +} + +.sub-navbar { + height: 50px; + line-height: 50px; + position: relative; + width: 100%; + text-align: right; + padding-right: 20px; + transition: 600ms ease position; + background: linear-gradient( + 90deg, + rgba(32, 182, 249, 1) 0%, + rgba(32, 182, 249, 1) 0%, + rgba(33, 120, 241, 1) 100%, + rgba(33, 120, 241, 1) 100% + ); + + .subtitle { + font-size: 20px; + color: #fff; + } + + &.draft { + background: #d0d0d0; + } + + &.deleted { + background: #d0d0d0; + } +} + +.link-type, +.link-type:focus { + color: #337ab7; + cursor: pointer; + + &:hover { + color: rgb(32, 160, 255); + } +} + +//refine vue-multiselect plugin +.multiselect { + line-height: 16px; +} + +.multiselect--active { + z-index: 1000 !important; +} diff --git a/src/assets/styles/mixin.scss b/src/assets/styles/mixin.scss new file mode 100644 index 0000000..06fa061 --- /dev/null +++ b/src/assets/styles/mixin.scss @@ -0,0 +1,66 @@ +@mixin clearfix { + &:after { + content: ""; + display: table; + clear: both; + } +} + +@mixin scrollBar { + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } +} + +@mixin relative { + position: relative; + width: 100%; + height: 100%; +} + +@mixin pct($pct) { + width: #{$pct}; + position: relative; + margin: 0 auto; +} + +@mixin triangle($width, $height, $color, $direction) { + $width: $width/2; + $color-border-style: $height solid $color; + $transparent-border-style: $width solid transparent; + height: 0; + width: 0; + + @if $direction==up { + border-bottom: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==right { + border-left: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } + + @else if $direction==down { + border-top: $color-border-style; + border-left: $transparent-border-style; + border-right: $transparent-border-style; + } + + @else if $direction==left { + border-right: $color-border-style; + border-top: $transparent-border-style; + border-bottom: $transparent-border-style; + } +} diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss new file mode 100644 index 0000000..64fcfd8 --- /dev/null +++ b/src/assets/styles/sidebar.scss @@ -0,0 +1,208 @@ +#app { + .main-container { + min-height: 100%; + transition: margin-left 0.28s; + margin-left: $sideBarWidth; + position: relative; + } + + .sidebar-container { + transition: width 0.28s; + width: $sideBarWidth !important; + background-color: $menuBg; + height: 100%; + position: fixed; + font-size: 0; + top: 0; + bottom: 0; + left: 0; + z-index: 1001; + overflow: hidden; + + // reset element-ui css + .horizontal-collapse-transition { + transition: 0s width ease-in-out, 0s padding-left ease-in-out, + 0s padding-right ease-in-out; + } + + .scrollbar-wrapper { + overflow-x: hidden !important; + } + + .el-scrollbar__bar.is-vertical { + right: 0; + } + + .el-scrollbar { + height: 100%; + } + + &.has-logo { + .el-scrollbar { + height: calc(100% - 50px); + } + } + + .is-horizontal { + display: none; + } + + a { + display: inline-block; + width: 100%; + overflow: hidden; + } + + .svg-icon { + margin-right: 16px; + } + + .el-menu { + border: none; + height: 100%; + width: 100% !important; + } + + // menu hover + .submenu-title-noDropdown, + .el-submenu__title { + &:hover { + background-color: $menuHover !important; + } + } + + .is-active > .el-submenu__title { + color: $subMenuActiveText !important; + } + + & .nest-menu .el-submenu > .el-submenu__title, + & .el-submenu .el-menu-item { + min-width: $sideBarWidth !important; + background-color: $subMenuBg; + + &:hover { + background-color: $subMenuHover !important; + } + } + } + + .hideSidebar { + .sidebar-container { + width: 54px !important; + } + + .main-container { + margin-left: 54px; + } + + .submenu-title-noDropdown { + padding: 0 !important; + position: relative; + + .el-tooltip { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + } + } + + .el-submenu { + overflow: hidden; + + & > .el-submenu__title { + padding: 0 !important; + + .svg-icon { + margin-left: 20px; + } + + .el-submenu__icon-arrow { + display: none; + } + } + } + + .el-menu--collapse { + .el-submenu { + & > .el-submenu__title { + & > span { + height: 0; + width: 0; + overflow: hidden; + visibility: hidden; + display: inline-block; + } + } + } + } + } + + .el-menu--collapse .el-menu .el-submenu { + min-width: $sideBarWidth !important; + } + + // mobile responsive + .mobile { + .main-container { + margin-left: 0; + } + + .sidebar-container { + transition: transform 0.28s; + width: $sideBarWidth !important; + } + + &.hideSidebar { + .sidebar-container { + pointer-events: none; + transition-duration: 0.3s; + transform: translate3d(-$sideBarWidth, 0, 0); + } + } + } + + .withoutAnimation { + .main-container, + .sidebar-container { + transition: none; + } + } +} + +// when menu collapsed +.el-menu--vertical { + & > .el-menu { + .svg-icon { + margin-right: 16px; + } + } + + .nest-menu .el-submenu > .el-submenu__title, + .el-menu-item { + &:hover { + // you can use $subMenuHover + background-color: $menuHover !important; + } + } + + // the scroll bar appears when the subMenu is too long + > .el-menu--popup { + max-height: 100vh; + overflow-y: auto; + + &::-webkit-scrollbar-track-piece { + background: #d3dce6; + } + + &::-webkit-scrollbar { + width: 6px; + } + + &::-webkit-scrollbar-thumb { + background: #99a9bf; + border-radius: 20px; + } + } +} diff --git a/src/assets/styles/transition.scss b/src/assets/styles/transition.scss new file mode 100644 index 0000000..4cb27cc --- /dev/null +++ b/src/assets/styles/transition.scss @@ -0,0 +1,48 @@ +// global transition css + +/* fade */ +.fade-enter-active, +.fade-leave-active { + transition: opacity 0.28s; +} + +.fade-enter, +.fade-leave-active { + opacity: 0; +} + +/* fade-transform */ +.fade-transform-leave-active, +.fade-transform-enter-active { + transition: all .5s; +} + +.fade-transform-enter { + opacity: 0; + transform: translateX(-30px); +} + +.fade-transform-leave-to { + opacity: 0; + transform: translateX(30px); +} + +/* breadcrumb transition */ +.breadcrumb-enter-active, +.breadcrumb-leave-active { + transition: all .5s; +} + +.breadcrumb-enter, +.breadcrumb-leave-active { + opacity: 0; + transform: translateX(20px); +} + +.breadcrumb-move { + transition: all .5s; +} + +.breadcrumb-leave-active { + position: absolute; +} diff --git a/src/assets/styles/variables.scss b/src/assets/styles/variables.scss new file mode 100644 index 0000000..df6ac20 --- /dev/null +++ b/src/assets/styles/variables.scss @@ -0,0 +1,35 @@ +// base color +$blue: #324157; +$light-blue: #3a71a8; +$red: #c03639; +$pink: #e65d6e; +$green: #30b08f; +$tiffany: #4ab7bd; +$yellow: #fec171; +$panGreen: #30b08f; + +// sidebar +$menuText: #333; +$menuActiveText: #409eff; +$subMenuActiveText: #333; // https://github.com/ElemeFE/element/issues/12951 + +$menuBg: #fff; +$menuHover: rgb(232, 243, 255); + +$subMenuBg: #fff; +$subMenuHover: rgb(232, 243, 255); + +$sideBarWidth: 205px; + +// the :export directive is the magic sauce for webpack +// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass +:export { + menuText: $menuText; + menuActiveText: $menuActiveText; + subMenuActiveText: $subMenuActiveText; + menuBg: $menuBg; + menuHover: $menuHover; + subMenuBg: $subMenuBg; + subMenuHover: $subMenuHover; + sideBarWidth: $sideBarWidth; +} diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue new file mode 100644 index 0000000..204ea59 --- /dev/null +++ b/src/components/Breadcrumb/index.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/src/components/CountDown/index.vue b/src/components/CountDown/index.vue new file mode 100644 index 0000000..80d0d8b --- /dev/null +++ b/src/components/CountDown/index.vue @@ -0,0 +1,170 @@ + + + + + \ No newline at end of file diff --git a/src/components/Crud/CRUD.operation.vue b/src/components/Crud/CRUD.operation.vue new file mode 100644 index 0000000..33d2077 --- /dev/null +++ b/src/components/Crud/CRUD.operation.vue @@ -0,0 +1,268 @@ + + + + diff --git a/src/components/Crud/Pagination.vue b/src/components/Crud/Pagination.vue new file mode 100644 index 0000000..d4482fb --- /dev/null +++ b/src/components/Crud/Pagination.vue @@ -0,0 +1,18 @@ + + + diff --git a/src/components/Crud/RR.operation.vue b/src/components/Crud/RR.operation.vue new file mode 100644 index 0000000..df2c138 --- /dev/null +++ b/src/components/Crud/RR.operation.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components/Crud/UD.operation.vue b/src/components/Crud/UD.operation.vue new file mode 100644 index 0000000..221a4ef --- /dev/null +++ b/src/components/Crud/UD.operation.vue @@ -0,0 +1,71 @@ + + diff --git a/src/components/Crud/crud.js b/src/components/Crud/crud.js new file mode 100644 index 0000000..630dabf --- /dev/null +++ b/src/components/Crud/crud.js @@ -0,0 +1,868 @@ +import { initData, download } from '@/api/data' +import { parseTime, downloadFile } from '@/utils/index' +import Vue from 'vue' + +/** + * CRUD配置 + * @author moxun + * @param {*} options
+ * @return crud instance. + * @example + * 要使用多crud时,请在关联crud的组件处使用crud-tag进行标记,如: + */ +function CRUD(options) { + const defaultOptions = { + tag: 'default', + // id字段名 + idField: 'id', + // 标题 + title: '', + // 请求数据的url + url: '', + // 表格数据 + data: [], + // 选择项 + selections: [], + // 待查询的对象 + query: {}, + // 查询数据的参数 + params: {}, + // Form 表单 + form: {}, + // 重置表单 + defaultForm: () => {}, + // 排序规则,默认 id 降序, 支持多字段排序 ['id,desc', 'createTime,asc'] + sort: ['id,desc'], + // 等待时间 + time: 0, + // CRUD Method + crudMethod: { + add: (form) => {}, + del: (id) => {}, + edit: (form) => {}, + get: (id) => {} + }, + // 主页操作栏显示哪些按钮 + optShow: { + add: true, + edit: true, + del: true, + download: true, + reset: true + }, + // 自定义一些扩展属性 + props: {}, + // 在主页准备 + queryOnPresenterCreated: true, + // 调试开关 + debug: false + } + options = mergeOptions(defaultOptions, options) + const data = { + ...options, + // 记录数据状态 + dataStatus: {}, + status: { + add: CRUD.STATUS.NORMAL, + edit: CRUD.STATUS.NORMAL, + // 添加或编辑状态 + get cu() { + if (this.add === CRUD.STATUS.NORMAL && this.edit === CRUD.STATUS.NORMAL) { + return CRUD.STATUS.NORMAL + } else if (this.add === CRUD.STATUS.PREPARED || this.edit === CRUD.STATUS.PREPARED) { + return CRUD.STATUS.PREPARED + } else if (this.add === CRUD.STATUS.PROCESSING || this.edit === CRUD.STATUS.PROCESSING) { + return CRUD.STATUS.PROCESSING + } + throw new Error('wrong crud\'s cu status') + }, + // 标题 + get title() { + return this.add > CRUD.STATUS.NORMAL ? `新增${crud.title}` : this.edit > CRUD.STATUS.NORMAL ? `编辑${crud.title}` : crud.title + } + }, + msg: { + submit: '提交成功', + add: '新增成功', + edit: '编辑成功', + del: '删除成功' + }, + page: { + // 页码 + page: 0, + // 每页数据条数 + size: 10, + // 总数据条数 + total: 0 + }, + // 整体loading + loading: false, + // 导出的 Loading + downloadLoading: false, + // 删除的 Loading + delAllLoading: false + } + const methods = { + /** + * 通用的提示 + */ + submitSuccessNotify() { + crud.notify(crud.msg.submit, CRUD.NOTIFICATION_TYPE.SUCCESS) + }, + addSuccessNotify() { + crud.notify(crud.msg.add, CRUD.NOTIFICATION_TYPE.SUCCESS) + }, + editSuccessNotify() { + crud.notify(crud.msg.edit, CRUD.NOTIFICATION_TYPE.SUCCESS) + }, + delSuccessNotify() { + crud.notify(crud.msg.del, CRUD.NOTIFICATION_TYPE.SUCCESS) + }, + // 搜索 + toQuery() { + crud.page.page = 1 + crud.refresh() + }, + // 刷新 + refresh() { + if (!callVmHook(crud, CRUD.HOOK.beforeRefresh)) { + return + } + return new Promise((resolve, reject) => { + crud.loading = true + // 请求数据 + initData(crud.url, crud.getQueryParams()).then(data => { + const table = crud.getTable() + if (table && table.lazy) { // 懒加载子节点数据,清掉已加载的数据 + table.store.states.treeData = {} + table.store.states.lazyTreeNodeMap = {} + } + crud.page.total = data.totalElements + crud.data = data.content + crud.resetDataStatus() + // time 毫秒后显示表格 + setTimeout(() => { + crud.loading = false + callVmHook(crud, CRUD.HOOK.afterRefresh) + }, crud.time) + resolve(data) + }).catch(err => { + crud.loading = false + reject(err) + }) + }) + }, + /** + * 启动添加 + */ + toAdd() { + crud.resetForm() + if (!(callVmHook(crud, CRUD.HOOK.beforeToAdd, crud.form) && callVmHook(crud, CRUD.HOOK.beforeToCU, crud.form))) { + return + } + crud.status.add = CRUD.STATUS.PREPARED + callVmHook(crud, CRUD.HOOK.afterToAdd, crud.form) + callVmHook(crud, CRUD.HOOK.afterToCU, crud.form) + }, + /** + * 启动编辑 + * @param {*} data 数据项 + */ + toEdit(data) { + crud.resetForm(JSON.parse(JSON.stringify(data))) + if (!(callVmHook(crud, CRUD.HOOK.beforeToEdit, crud.form) && callVmHook(crud, CRUD.HOOK.beforeToCU, crud.form))) { + return + } + crud.status.edit = CRUD.STATUS.PREPARED + crud.getDataStatus(crud.getDataId(data)).edit = CRUD.STATUS.PREPARED + callVmHook(crud, CRUD.HOOK.afterToEdit, crud.form) + callVmHook(crud, CRUD.HOOK.afterToCU, crud.form) + }, + /** + * 启动删除 + * @param {*} data 数据项 + */ + toDelete(data) { + crud.getDataStatus(crud.getDataId(data)).delete = CRUD.STATUS.PREPARED + }, + /** + * 取消删除 + * @param {*} data 数据项 + */ + cancelDelete(data) { + if (!callVmHook(crud, CRUD.HOOK.beforeDeleteCancel, data)) { + return + } + crud.getDataStatus(crud.getDataId(data)).delete = CRUD.STATUS.NORMAL + callVmHook(crud, CRUD.HOOK.afterDeleteCancel, data) + }, + /** + * 取消新增/编辑 + */ + cancelCU() { + const addStatus = crud.status.add + const editStatus = crud.status.edit + if (addStatus === CRUD.STATUS.PREPARED) { + if (!callVmHook(crud, CRUD.HOOK.beforeAddCancel, crud.form)) { + return + } + crud.status.add = CRUD.STATUS.NORMAL + } + if (editStatus === CRUD.STATUS.PREPARED) { + if (!callVmHook(crud, CRUD.HOOK.beforeEditCancel, crud.form)) { + return + } + crud.status.edit = CRUD.STATUS.NORMAL + crud.getDataStatus(crud.getDataId(crud.form)).edit = CRUD.STATUS.NORMAL + } + crud.resetForm() + if (addStatus === CRUD.STATUS.PREPARED) { + callVmHook(crud, CRUD.HOOK.afterAddCancel, crud.form) + } + if (editStatus === CRUD.STATUS.PREPARED) { + callVmHook(crud, CRUD.HOOK.afterEditCancel, crud.form) + } + // 清除表单验证 + if (crud.findVM('form').$refs['form']) { + crud.findVM('form').$refs['form'].clearValidate() + } + }, + /** + * 提交新增/编辑 + */ + submitCU() { + if (!callVmHook(crud, CRUD.HOOK.beforeValidateCU)) { + return + } + crud.findVM('form').$refs['form'].validate(valid => { + if (!valid) { + return + } + if (!callVmHook(crud, CRUD.HOOK.afterValidateCU)) { + return + } + if (crud.status.add === CRUD.STATUS.PREPARED) { + crud.doAdd() + } else if (crud.status.edit === CRUD.STATUS.PREPARED) { + crud.doEdit() + } + }) + }, + /** + * 执行添加 + */ + doAdd() { + if (!callVmHook(crud, CRUD.HOOK.beforeSubmit)) { + return + } + crud.status.add = CRUD.STATUS.PROCESSING + crud.crudMethod.add(crud.form).then(() => { + crud.status.add = CRUD.STATUS.NORMAL + crud.resetForm() + crud.addSuccessNotify() + callVmHook(crud, CRUD.HOOK.afterSubmit) + crud.toQuery() + }).catch(() => { + crud.status.add = CRUD.STATUS.PREPARED + callVmHook(crud, CRUD.HOOK.afterAddError) + }) + }, + /** + * 执行编辑 + */ + doEdit() { + if (!callVmHook(crud, CRUD.HOOK.beforeSubmit)) { + return + } + crud.status.edit = CRUD.STATUS.PROCESSING + crud.crudMethod.edit(crud.form).then(() => { + crud.status.edit = CRUD.STATUS.NORMAL + crud.getDataStatus(crud.getDataId(crud.form)).edit = CRUD.STATUS.NORMAL + crud.editSuccessNotify() + crud.resetForm() + callVmHook(crud, CRUD.HOOK.afterSubmit) + crud.refresh() + }).catch(() => { + crud.status.edit = CRUD.STATUS.PREPARED + callVmHook(crud, CRUD.HOOK.afterEditError) + }) + }, + /** + * 执行删除 + * @param {*} data 数据项 + */ + doDelete(data) { + let delAll = false + let dataStatus + const ids = [] + if (data instanceof Array) { + delAll = true + data.forEach(val => { + ids.push(this.getDataId(val)) + }) + } else { + ids.push(this.getDataId(data)) + dataStatus = crud.getDataStatus(this.getDataId(data)) + } + if (!callVmHook(crud, CRUD.HOOK.beforeDelete, data)) { + return + } + if (!delAll) { + dataStatus.delete = CRUD.STATUS.PROCESSING + } + return crud.crudMethod.del(ids).then(() => { + if (delAll) { + crud.delAllLoading = false + } else dataStatus.delete = CRUD.STATUS.PREPARED + crud.dleChangePage(1) + crud.delSuccessNotify() + callVmHook(crud, CRUD.HOOK.afterDelete, data) + crud.refresh() + }).catch(() => { + if (delAll) { + crud.delAllLoading = false + } else dataStatus.delete = CRUD.STATUS.PREPARED + }) + }, + /** + * 通用导出 + */ + doExport() { + crud.downloadLoading = true + download(crud.url + '/download', crud.getQueryParams()).then(result => { + downloadFile(result, crud.title + '数据', 'xlsx') + crud.downloadLoading = false + }).catch(() => { + crud.downloadLoading = false + }) + }, + /** + * 获取查询参数 + */ + getQueryParams: function() { + // 清除参数无值的情况 + Object.keys(crud.query).length !== 0 && Object.keys(crud.query).forEach(item => { + if (crud.query[item] === null || crud.query[item] === '') crud.query[item] = undefined + }) + Object.keys(crud.params).length !== 0 && Object.keys(crud.params).forEach(item => { + if (crud.params[item] === null || crud.params[item] === '') crud.params[item] = undefined + }) + return { + page: crud.page.page - 1, + size: crud.page.size, + sort: crud.sort, + ...crud.query, + ...crud.params + } + }, + // 当前页改变 + pageChangeHandler(e) { + crud.page.page = e + crud.refresh() + }, + // 每页条数改变 + sizeChangeHandler(e) { + crud.page.size = e + crud.page.page = 1 + crud.refresh() + }, + // 预防删除第二页最后一条数据时,或者多选删除第二页的数据时,页码错误导致请求无数据 + dleChangePage(size) { + if (crud.data.length === size && crud.page.page !== 1) { + crud.page.page -= 1 + } + }, + // 选择改变 + selectionChangeHandler(val) { + crud.selections = val + }, + /** + * 重置查询参数 + * @param {Boolean} toQuery 重置后进行查询操作 + */ + resetQuery(toQuery = true) { + const defaultQuery = JSON.parse(JSON.stringify(crud.defaultQuery)) + const query = crud.query + Object.keys(query).forEach(key => { + query[key] = defaultQuery[key] + }) + // 重置参数 + this.params = {} + if (toQuery) { + crud.toQuery() + } + }, + /** + * 重置表单 + * @param {Array} data 数据 + */ + resetForm(data) { + delete crud.form['createTime'] + delete crud.form['updateTime'] + delete crud.form['createBy'] + delete crud.form['updateBy'] + const form = data || (typeof crud.defaultForm === 'object' ? JSON.parse(JSON.stringify(crud.defaultForm)) : crud.defaultForm.apply(crud.findVM('form'))) + const crudFrom = crud.form + for (const key in form) { + if (crudFrom.hasOwnProperty(key)) { + crudFrom[key] = form[key] + } else { + Vue.set(crudFrom, key, form[key]) + } + } + // add by ghl 2020-10-04 页面重复添加信息时,下拉框的校验会存在,需要找工取消 + if (crud.findVM('form').$refs['form']) { + crud.findVM('form').$refs['form'].clearValidate() + } + }, + /** + * 重置数据状态 + */ + resetDataStatus() { + const dataStatus = {} + function resetStatus(datas) { + datas.forEach(e => { + dataStatus[crud.getDataId(e)] = { + delete: 0, + edit: 0 + } + if (e.children) { + resetStatus(e.children) + } + }) + } + resetStatus(crud.data) + crud.dataStatus = dataStatus + }, + /** + * 获取数据状态 + * @param {Number | String} id 数据项id + */ + getDataStatus(id) { + return crud.dataStatus[id] + }, + /** + * 用于树形表格多选, 选中所有 + * @param selection + */ + selectAllChange(selection) { + // 如果选中的数目与请求到的数目相同就选中子节点,否则就清空选中 + if (selection && selection.length === crud.data.length) { + selection.forEach(val => { + crud.selectChange(selection, val) + }) + } else { + crud.getTable().clearSelection() + } + }, + /** + * 用于树形表格多选,单选的封装 + * @param selection + * @param row + */ + selectChange(selection, row) { + // 如果selection中存在row代表是选中,否则是取消选中 + if (selection.find(val => { return crud.getDataId(val) === crud.getDataId(row) })) { + if (row.children) { + row.children.forEach(val => { + crud.getTable().toggleRowSelection(val, true) + selection.push(val) + if (val.children) { + crud.selectChange(selection, val) + } + }) + } + } else { + crud.toggleRowSelection(selection, row) + } + }, + /** + * 切换选中状态 + * @param selection + * @param data + */ + toggleRowSelection(selection, data) { + if (data.children) { + data.children.forEach(val => { + selection.splice(selection.findIndex(item => this.getDataId(item) === this.getDataId(val)), 1) + crud.getTable().toggleRowSelection(val, false) + if (val.children) { + crud.toggleRowSelection(selection, val) + } + }) + } + }, + findVM(type) { + return crud.vms.find(vm => vm && vm.type === type).vm + }, + notify(title, type = CRUD.NOTIFICATION_TYPE.INFO) { + crud.vms[0].vm.$notify({ + title, + type, + duration: 2500 + }) + }, + updateProp(name, value) { + Vue.set(crud.props, name, value) + }, + getDataId(data) { + return data[this.idField] + }, + getTable() { + return this.findVM('presenter').$refs.table + }, + attchTable() { + const table = this.getTable() + this.updateProp('table', table) + const that = this + table.$on('expand-change', (row, expanded) => { + if (!expanded) { + return + } + const lazyTreeNodeMap = table.store.states.lazyTreeNodeMap + row.children = lazyTreeNodeMap[crud.getDataId(row)] + if (row.children) { + row.children.forEach(ele => { + const id = crud.getDataId(ele) + if (that.dataStatus[id] === undefined) { + that.dataStatus[id] = { + delete: 0, + edit: 0 + } + } + }) + } + }) + } + } + const crud = Object.assign({}, data) + // 可观测化 + Vue.observable(crud) + // 附加方法 + Object.assign(crud, methods) + // 记录初始默认的查询参数,后续重置查询时使用 + Object.assign(crud, { + defaultQuery: JSON.parse(JSON.stringify(data.query)), + // 预留4位存储:组件 主页、头部、分页、表单,调试查看也方便找 + vms: Array(4), + /** + * 注册组件实例 + * @param {String} type 类型 + * @param {*} vm 组件实例 + * @param {Number} index 该参数内部使用 + */ + registerVM(type, vm, index = -1) { + const vmObj = { + type, + vm: vm + } + if (index < 0) { + this.vms.push(vmObj) + return + } + if (index < 4) { // 内置预留vm数 + this.vms[index] = vmObj + return + } + this.vms.length = Math.max(this.vms.length, index) + this.vms.splice(index, 1, vmObj) + }, + /** + * 取消注册组件实例 + * @param {*} vm 组件实例 + */ + unregisterVM(type, vm) { + for (let i = this.vms.length - 1; i >= 0; i--) { + if (this.vms[i] === undefined) { + continue + } + if (this.vms[i].type === type && this.vms[i].vm === vm) { + if (i < 4) { // 内置预留vm数 + this.vms[i] = undefined + } else { + this.vms.splice(i, 1) + } + break + } + } + } + }) + // 冻结处理,需要扩展数据的话,使用crud.updateProp(name, value),以crud.props.name形式访问,这个是响应式的,可以做数据绑定 + Object.freeze(crud) + return crud +} + +// hook VM +function callVmHook(crud, hook) { + if (crud.debug) { + console.log('callVmHook: ' + hook) + } + const tagHook = crud.tag ? hook + '$' + crud.tag : null + let ret = true + const nargs = [crud] + for (let i = 2; i < arguments.length; ++i) { + nargs.push(arguments[i]) + } + // 有些组件扮演了多个角色,调用钩子时,需要去重 + const vmSet = new Set() + crud.vms.forEach(vm => vm && vmSet.add(vm.vm)) + vmSet.forEach(vm => { + if (vm[hook]) { + ret = vm[hook].apply(vm, nargs) !== false && ret + } + if (tagHook && vm[tagHook]) { + ret = vm[tagHook].apply(vm, nargs) !== false && ret + } + }) + return ret +} + +function mergeOptions(src, opts) { + const optsRet = { + ...src + } + for (const key in src) { + if (opts.hasOwnProperty(key)) { + optsRet[key] = opts[key] + } + } + return optsRet +} + +/** + * 查找crud + * @param {*} vm + * @param {string} tag + */ +function lookupCrud(vm, tag) { + tag = tag || vm.$attrs['crud-tag'] || 'default' + // function lookupCrud(vm, tag) { + if (vm.$crud) { + const ret = vm.$crud[tag] + if (ret) { + return ret + } + } + return vm.$parent ? lookupCrud(vm.$parent, tag) : undefined +} + +/** + * crud主页 + */ +function presenter(crud) { + if (crud) { + console.warn('[CRUD warn]: ' + 'please use $options.cruds() { return CRUD(...) or [CRUD(...), ...] }') + } + return { + data() { + // 在data中返回crud,是为了将crud与当前实例关联,组件观测crud相关属性变化 + return { + crud: this.crud + } + }, + beforeCreate() { + this.$crud = this.$crud || {} + let cruds = this.$options.cruds instanceof Function ? this.$options.cruds() : crud + if (!(cruds instanceof Array)) { + cruds = [cruds] + } + cruds.forEach(ele => { + if (this.$crud[ele.tag]) { + console.error('[CRUD error]: ' + 'crud with tag [' + ele.tag + ' is already exist') + } + this.$crud[ele.tag] = ele + ele.registerVM('presenter', this, 0) + }) + this.crud = this.$crud['defalut'] || cruds[0] + }, + methods: { + parseTime + }, + created() { + for (const k in this.$crud) { + if (this.$crud[k].queryOnPresenterCreated) { + this.$crud[k].toQuery() + } + } + }, + destroyed() { + for (const k in this.$crud) { + this.$crud[k].unregisterVM('presenter', this) + } + }, + mounted() { + // 如果table未实例化(例如使用了v-if),请稍后在适当时机crud.attchTable刷新table信息 + if (this.$refs.table !== undefined) { + this.crud.attchTable() + } + } + } +} + +/** + * 头部 + */ +function header() { + return { + data() { + return { + crud: this.crud, + query: this.crud.query + } + }, + beforeCreate() { + this.crud = lookupCrud(this) + this.crud.registerVM('header', this, 1) + }, + destroyed() { + this.crud.unregisterVM('header', this) + } + } +} + +/** + * 分页 + */ +function pagination() { + return { + data() { + return { + crud: this.crud, + page: this.crud.page + } + }, + beforeCreate() { + this.crud = lookupCrud(this) + this.crud.registerVM('pagination', this, 2) + }, + destroyed() { + this.crud.unregisterVM('pagination', this) + } + } +} + +/** + * 表单 + */ +function form(defaultForm) { + return { + data() { + return { + crud: this.crud, + form: this.crud.form + } + }, + beforeCreate() { + this.crud = lookupCrud(this) + this.crud.registerVM('form', this, 3) + }, + created() { + this.crud.defaultForm = defaultForm + this.crud.resetForm() + }, + destroyed() { + this.crud.unregisterVM('form', this) + } + } +} + +/** + * crud + */ +function crud(options = {}) { + const defaultOptions = { + type: undefined + } + options = mergeOptions(defaultOptions, options) + return { + data() { + return { + crud: this.crud + } + }, + beforeCreate() { + this.crud = lookupCrud(this) + this.crud.registerVM(options.type, this) + }, + destroyed() { + this.crud.unregisterVM(options.type, this) + } + } +} + +/** + * CRUD钩子 + */ +CRUD.HOOK = { + /** 刷新 - 之前 */ + beforeRefresh: 'beforeCrudRefresh', + /** 刷新 - 之后 */ + afterRefresh: 'afterCrudRefresh', + /** 删除 - 之前 */ + beforeDelete: 'beforeCrudDelete', + /** 删除 - 之后 */ + afterDelete: 'afterCrudDelete', + /** 删除取消 - 之前 */ + beforeDeleteCancel: 'beforeCrudDeleteCancel', + /** 删除取消 - 之后 */ + afterDeleteCancel: 'afterCrudDeleteCancel', + /** 新建 - 之前 */ + beforeToAdd: 'beforeCrudToAdd', + /** 新建 - 之后 */ + afterToAdd: 'afterCrudToAdd', + /** 编辑 - 之前 */ + beforeToEdit: 'beforeCrudToEdit', + /** 编辑 - 之后 */ + afterToEdit: 'afterCrudToEdit', + /** 开始 "新建/编辑" - 之前 */ + beforeToCU: 'beforeCrudToCU', + /** 开始 "新建/编辑" - 之后 */ + afterToCU: 'afterCrudToCU', + /** "新建/编辑" 验证 - 之前 */ + beforeValidateCU: 'beforeCrudValidateCU', + /** "新建/编辑" 验证 - 之后 */ + afterValidateCU: 'afterCrudValidateCU', + /** 添加取消 - 之前 */ + beforeAddCancel: 'beforeCrudAddCancel', + /** 添加取消 - 之后 */ + afterAddCancel: 'afterCrudAddCancel', + /** 编辑取消 - 之前 */ + beforeEditCancel: 'beforeCrudEditCancel', + /** 编辑取消 - 之后 */ + afterEditCancel: 'afterCrudEditCancel', + /** 提交 - 之前 */ + beforeSubmit: 'beforeCrudSubmitCU', + /** 提交 - 之后 */ + afterSubmit: 'afterCrudSubmitCU', + afterAddError: 'afterCrudAddError', + afterEditError: 'afterCrudEditError' +} + +/** + * CRUD状态 + */ +CRUD.STATUS = { + NORMAL: 0, + PREPARED: 1, + PROCESSING: 2 +} + +/** + * CRUD通知类型 + */ +CRUD.NOTIFICATION_TYPE = { + SUCCESS: 'success', + WARNING: 'warning', + INFO: 'info', + ERROR: 'error' +} + +export default CRUD + +export { + presenter, + header, + form, + pagination, + crud +} diff --git a/src/components/DateRangePicker/index.vue b/src/components/DateRangePicker/index.vue new file mode 100644 index 0000000..8feea56 --- /dev/null +++ b/src/components/DateRangePicker/index.vue @@ -0,0 +1,45 @@ + diff --git a/src/components/Dict/Dict.js b/src/components/Dict/Dict.js new file mode 100644 index 0000000..48554de --- /dev/null +++ b/src/components/Dict/Dict.js @@ -0,0 +1,29 @@ +import Vue from 'vue' +import { get as getDictDetail } from '@/api/system/dictDetail' + +export default class Dict { + constructor(dict) { + this.dict = dict + } + + async init(names, completeCallback) { + if (names === undefined || name === null) { + throw new Error('need Dict names') + } + const ps = [] + names.forEach(n => { + Vue.set(this.dict.dict, n, {}) + Vue.set(this.dict.label, n, {}) + Vue.set(this.dict, n, []) + ps.push(getDictDetail(n).then(data => { + this.dict[n].splice(0, 0, ...data.content) + data.content.forEach(d => { + Vue.set(this.dict.dict[n], d.value, d) + Vue.set(this.dict.label[n], d.value, d.label) + }) + })) + }) + await Promise.all(ps) + completeCallback() + } +} diff --git a/src/components/Dict/index.js b/src/components/Dict/index.js new file mode 100644 index 0000000..0952f43 --- /dev/null +++ b/src/components/Dict/index.js @@ -0,0 +1,29 @@ +import Dict from './Dict' + +const install = function(Vue) { + Vue.mixin({ + data() { + if (this.$options.dicts instanceof Array) { + const dict = { + dict: {}, + label: {} + } + return { + dict + } + } + return {} + }, + created() { + if (this.$options.dicts instanceof Array) { + new Dict(this.dict).init(this.$options.dicts, () => { + this.$nextTick(() => { + this.$emit('dictReady') + }) + }) + } + } + }) +} + +export default { install } diff --git a/src/components/Doc/index.vue b/src/components/Doc/index.vue new file mode 100644 index 0000000..8c59930 --- /dev/null +++ b/src/components/Doc/index.vue @@ -0,0 +1,16 @@ + + + diff --git a/src/components/Echarts/BarChart.vue b/src/components/Echarts/BarChart.vue new file mode 100644 index 0000000..fa265ef --- /dev/null +++ b/src/components/Echarts/BarChart.vue @@ -0,0 +1,106 @@ + + + diff --git a/src/components/Echarts/Category.vue b/src/components/Echarts/Category.vue new file mode 100644 index 0000000..5859114 --- /dev/null +++ b/src/components/Echarts/Category.vue @@ -0,0 +1,438 @@ + + + diff --git a/src/components/Echarts/Funnel.vue b/src/components/Echarts/Funnel.vue new file mode 100644 index 0000000..380b373 --- /dev/null +++ b/src/components/Echarts/Funnel.vue @@ -0,0 +1,120 @@ + + + diff --git a/src/components/Echarts/Gauge.vue b/src/components/Echarts/Gauge.vue new file mode 100644 index 0000000..40ce775 --- /dev/null +++ b/src/components/Echarts/Gauge.vue @@ -0,0 +1,74 @@ + + + diff --git a/src/components/Echarts/Graph.vue b/src/components/Echarts/Graph.vue new file mode 100644 index 0000000..a5a88b3 --- /dev/null +++ b/src/components/Echarts/Graph.vue @@ -0,0 +1,101 @@ + + + diff --git a/src/components/Echarts/HeatMap.vue b/src/components/Echarts/HeatMap.vue new file mode 100644 index 0000000..6606278 --- /dev/null +++ b/src/components/Echarts/HeatMap.vue @@ -0,0 +1,105 @@ + + + diff --git a/src/components/Echarts/PieChart.vue b/src/components/Echarts/PieChart.vue new file mode 100644 index 0000000..ff1bc52 --- /dev/null +++ b/src/components/Echarts/PieChart.vue @@ -0,0 +1,84 @@ + + + diff --git a/src/components/Echarts/Point.vue b/src/components/Echarts/Point.vue new file mode 100644 index 0000000..5a6c777 --- /dev/null +++ b/src/components/Echarts/Point.vue @@ -0,0 +1,149 @@ + + + diff --git a/src/components/Echarts/RadarChart.vue b/src/components/Echarts/RadarChart.vue new file mode 100644 index 0000000..de70e52 --- /dev/null +++ b/src/components/Echarts/RadarChart.vue @@ -0,0 +1,120 @@ + + + diff --git a/src/components/Echarts/Rich.vue b/src/components/Echarts/Rich.vue new file mode 100644 index 0000000..1cf6bf2 --- /dev/null +++ b/src/components/Echarts/Rich.vue @@ -0,0 +1,149 @@ + + + diff --git a/src/components/Echarts/Sankey.vue b/src/components/Echarts/Sankey.vue new file mode 100644 index 0000000..49968c4 --- /dev/null +++ b/src/components/Echarts/Sankey.vue @@ -0,0 +1,100 @@ + + + diff --git a/src/components/Echarts/Scatter.vue b/src/components/Echarts/Scatter.vue new file mode 100644 index 0000000..b776efb --- /dev/null +++ b/src/components/Echarts/Scatter.vue @@ -0,0 +1,143 @@ + + + diff --git a/src/components/Echarts/Sunburst.vue b/src/components/Echarts/Sunburst.vue new file mode 100644 index 0000000..fafc1a8 --- /dev/null +++ b/src/components/Echarts/Sunburst.vue @@ -0,0 +1,107 @@ + + + diff --git a/src/components/Echarts/ThemeRiver.vue b/src/components/Echarts/ThemeRiver.vue new file mode 100644 index 0000000..967fc05 --- /dev/null +++ b/src/components/Echarts/ThemeRiver.vue @@ -0,0 +1,148 @@ + + + diff --git a/src/components/GithubCorner/index.vue b/src/components/GithubCorner/index.vue new file mode 100644 index 0000000..fd77324 --- /dev/null +++ b/src/components/GithubCorner/index.vue @@ -0,0 +1,54 @@ + + + diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue new file mode 100644 index 0000000..368b002 --- /dev/null +++ b/src/components/Hamburger/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue new file mode 100644 index 0000000..c713efc --- /dev/null +++ b/src/components/HeaderSearch/index.vue @@ -0,0 +1,188 @@ + + + + + diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue new file mode 100644 index 0000000..b0ec9fa --- /dev/null +++ b/src/components/IconSelect/index.vue @@ -0,0 +1,68 @@ + + + + + + diff --git a/src/components/IconSelect/requireIcons.js b/src/components/IconSelect/requireIcons.js new file mode 100644 index 0000000..99e5c54 --- /dev/null +++ b/src/components/IconSelect/requireIcons.js @@ -0,0 +1,11 @@ + +const req = require.context('../../assets/icons/svg', false, /\.svg$/) +const requireAll = requireContext => requireContext.keys() + +const re = /\.\/(.*)\.svg/ + +const icons = requireAll(req).map(i => { + return i.match(re)[1] +}) + +export default icons diff --git a/src/components/Iframe/index.vue b/src/components/Iframe/index.vue new file mode 100644 index 0000000..cdd612b --- /dev/null +++ b/src/components/Iframe/index.vue @@ -0,0 +1,30 @@ + + + + diff --git a/src/views/liveBroadcast/manage/components/DownVideo.vue b/src/views/liveBroadcast/manage/components/DownVideo.vue new file mode 100644 index 0000000..824641c --- /dev/null +++ b/src/views/liveBroadcast/manage/components/DownVideo.vue @@ -0,0 +1,153 @@ + + + \ No newline at end of file diff --git a/src/views/liveBroadcast/manage/components/PieChart.vue b/src/views/liveBroadcast/manage/components/PieChart.vue new file mode 100644 index 0000000..e5280ba --- /dev/null +++ b/src/views/liveBroadcast/manage/components/PieChart.vue @@ -0,0 +1,178 @@ + + + diff --git a/src/views/liveBroadcast/manage/components/detail.vue b/src/views/liveBroadcast/manage/components/detail.vue new file mode 100644 index 0000000..0911ee3 --- /dev/null +++ b/src/views/liveBroadcast/manage/components/detail.vue @@ -0,0 +1,1424 @@ + + + + diff --git a/src/views/liveBroadcast/manage/components/marketing.vue b/src/views/liveBroadcast/manage/components/marketing.vue new file mode 100644 index 0000000..d096d55 --- /dev/null +++ b/src/views/liveBroadcast/manage/components/marketing.vue @@ -0,0 +1,564 @@ + + + + diff --git a/src/views/liveBroadcast/manage/config.js b/src/views/liveBroadcast/manage/config.js new file mode 100644 index 0000000..ac94972 --- /dev/null +++ b/src/views/liveBroadcast/manage/config.js @@ -0,0 +1,27 @@ +import Clipboard from 'clipboard'; +import { Message } from 'element-ui' + + +export function handleClipboard(text,event, currentTarget){ + + const clipboard = new Clipboard('.tag',{ + text:()=>text + }) + clipboard.on('success',() => { + Message({ + message: '复制成功', + showClose: true, + type: 'success' + }) + clipboard.destroy() + }) + clipboard.on('error',() =>{ + Message({ + message: '复制失败', + showClose: true, + type: 'error' + }) + clipboard.destroy() + }) + clipboard.onClick({currentTarget}) +} diff --git a/src/views/liveBroadcast/manage/echarts/PortfolioCharts.vue b/src/views/liveBroadcast/manage/echarts/PortfolioCharts.vue new file mode 100644 index 0000000..b708f27 --- /dev/null +++ b/src/views/liveBroadcast/manage/echarts/PortfolioCharts.vue @@ -0,0 +1,239 @@ + + diff --git a/src/views/liveBroadcast/manage/echarts/esresize.js b/src/views/liveBroadcast/manage/echarts/esresize.js new file mode 100644 index 0000000..c3d3091 --- /dev/null +++ b/src/views/liveBroadcast/manage/echarts/esresize.js @@ -0,0 +1,105 @@ +var EleResize = { + _handleResize: function(e) { + var ele = e.target || e.srcElement + var trigger = ele.__resizeTrigger__ + if (trigger) { + var handlers = trigger.__z_resizeListeners + if (handlers) { + var size = handlers.length + for (var i = 0; i < size; i++) { + var h = handlers[i] + var handler = h.handler + var context = h.context + handler.apply(context, [e]) + } + } + } + }, + _removeHandler: function(ele, handler, context) { + var handlers = ele.__z_resizeListeners + if (handlers) { + var size = handlers.length + for (var i = 0; i < size; i++) { + var h = handlers[i] + if (h.handler === handler && h.context === context) { + handlers.splice(i, 1) + return + } + } + } + }, + _createResizeTrigger: function(ele) { + var obj = document.createElement('object') + obj.setAttribute('style', + 'display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden;opacity: 0; pointer-events: none; z-index: -1;') + obj.onload = EleResize._handleObjectLoad + obj.type = 'text/html' + ele.appendChild(obj) + obj.data = 'about:blank' + return obj + }, + _handleObjectLoad: function(evt) { + this.contentDocument.defaultView.__resizeTrigger__ = this.__resizeElement__ + this.contentDocument.defaultView.addEventListener('resize', EleResize._handleResize) + } +} +if (document.attachEvent) { // ie9-10 + EleResize.on = function(ele, handler, context) { + var handlers = ele.__z_resizeListeners + if (!handlers) { + handlers = [] + ele.__z_resizeListeners = handlers + ele.__resizeTrigger__ = ele + ele.attachEvent('onresize', EleResize._handleResize) + } + handlers.push({ + handler: handler, + context: context + }) + } + EleResize.off = function(ele, handler, context) { + var handlers = ele.__z_resizeListeners + if (handlers) { + EleResize._removeHandler(ele, handler, context) + if (handlers.length === 0) { + ele.detachEvent('onresize', EleResize._handleResize) + delete ele.__z_resizeListeners + } + } + } +} else { + EleResize.on = function(ele, handler, context) { + var handlers = ele.__z_resizeListeners + if (!handlers) { + handlers = [] + ele.__z_resizeListeners = handlers + + if (getComputedStyle(ele, null).position === 'static') { + ele.style.position = 'relative' + } + var obj = EleResize._createResizeTrigger(ele) + ele.__resizeTrigger__ = obj + obj.__resizeElement__ = ele + } + handlers.push({ + handler: handler, + context: context + }) + } + EleResize.off = function(ele, handler, context) { + var handlers = ele.__z_resizeListeners + if (handlers) { + EleResize._removeHandler(ele, handler, context) + if (handlers.length === 0) { + var trigger = ele.__resizeTrigger__ + if (trigger) { + trigger.contentDocument.defaultView.removeEventListener('resize', EleResize._handleResize) + ele.removeChild(trigger) + delete ele.__resizeTrigger__ + } + delete ele.__z_resizeListeners + } + } + } +} +export { EleResize } diff --git a/src/views/liveBroadcast/manage/echarts/lineCharts.vue b/src/views/liveBroadcast/manage/echarts/lineCharts.vue new file mode 100644 index 0000000..963fff5 --- /dev/null +++ b/src/views/liveBroadcast/manage/echarts/lineCharts.vue @@ -0,0 +1,134 @@ + + diff --git a/src/views/liveBroadcast/manage/echarts/lineChartsTwo.vue b/src/views/liveBroadcast/manage/echarts/lineChartsTwo.vue new file mode 100644 index 0000000..3e16095 --- /dev/null +++ b/src/views/liveBroadcast/manage/echarts/lineChartsTwo.vue @@ -0,0 +1,133 @@ + + diff --git a/src/views/liveBroadcast/manage/index.vue b/src/views/liveBroadcast/manage/index.vue new file mode 100644 index 0000000..b59d9c6 --- /dev/null +++ b/src/views/liveBroadcast/manage/index.vue @@ -0,0 +1,853 @@ + + + + diff --git a/src/views/liveBroadcast/manage/indexYx.vue b/src/views/liveBroadcast/manage/indexYx.vue new file mode 100644 index 0000000..80c88fe --- /dev/null +++ b/src/views/liveBroadcast/manage/indexYx.vue @@ -0,0 +1,771 @@ + + + + diff --git a/src/views/liveBroadcast/marketing/components/TableData.vue b/src/views/liveBroadcast/marketing/components/TableData.vue new file mode 100644 index 0000000..92697c8 --- /dev/null +++ b/src/views/liveBroadcast/marketing/components/TableData.vue @@ -0,0 +1,286 @@ + + + + diff --git a/src/views/liveBroadcast/marketing/data.vue b/src/views/liveBroadcast/marketing/data.vue new file mode 100644 index 0000000..eca2590 --- /dev/null +++ b/src/views/liveBroadcast/marketing/data.vue @@ -0,0 +1,154 @@ + + + + diff --git a/src/views/liveBroadcast/marketing/index.vue b/src/views/liveBroadcast/marketing/index.vue new file mode 100644 index 0000000..310000e --- /dev/null +++ b/src/views/liveBroadcast/marketing/index.vue @@ -0,0 +1,247 @@ + + + + diff --git a/src/views/liveBroadcast/tags/index.vue b/src/views/liveBroadcast/tags/index.vue new file mode 100644 index 0000000..ad96c51 --- /dev/null +++ b/src/views/liveBroadcast/tags/index.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/src/views/login.vue b/src/views/login.vue new file mode 100644 index 0000000..c0274d6 --- /dev/null +++ b/src/views/login.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/src/views/operationManage/components/DataTable.vue b/src/views/operationManage/components/DataTable.vue new file mode 100644 index 0000000..d8973e6 --- /dev/null +++ b/src/views/operationManage/components/DataTable.vue @@ -0,0 +1,168 @@ + + + diff --git a/src/views/operationManage/components/DataTableTg.vue b/src/views/operationManage/components/DataTableTg.vue new file mode 100644 index 0000000..b641046 --- /dev/null +++ b/src/views/operationManage/components/DataTableTg.vue @@ -0,0 +1,172 @@ + + + diff --git a/src/views/operationManage/config.js b/src/views/operationManage/config.js new file mode 100644 index 0000000..4b246b6 --- /dev/null +++ b/src/views/operationManage/config.js @@ -0,0 +1,162 @@ +export function setFunnelOptions() { + var colors = ['#5583f7', '#8400ff', '#35b63d', '#f77736'] + var url = '' + + var lineargroup = [ + { + value: 80, + name: '目标', + oriname: '意向', + number: 98756, + color: ['rgba(29,211,137,0.8)', 'rgba(29,211,137,0)'] + }, + { + value: 60, + name: '方案率', + oriname: '方案', + number: 98756, + color: ['rgba(102,142,255,0.7)', 'rgba(102,142,255,0)'] + }, + { + value: 40, + name: '商務率', + oriname: '商務', + number: 78756, + color: ['rgba(255,198,82,0.6)', 'rgba(255,198,82,0)'] + }, + { + value: 20, + name: '成交率', + oriname: '即將成交', + number: 68756, + color: ['rgba(255,110,115,0.5)', 'rgba(255,110,115,0)'] + } + ] + + var data1 = [] + + for (var i = 0; i < lineargroup.length; i++) { + var obj1 = { + value: lineargroup[i].value, + num: '', + name: lineargroup[i].oriname + } + + data1.push(obj1) + } + + var option = { + backgroundColor: '#ffffff', + color: colors, + grid: { + top: '0', + left: '0', + right: 0 + }, + xAxis: { + show: false + }, + yAxis: [ + { + show: false + } + ], + series: [ + { + top: 0, + type: 'funnel', + height: '400', + gap: 20, + minSize: 150, + left: '20%', + width: '60%', + label: { + show: true, + position: 'inside', + fontSize: '18', + formatter: function(d) { + var ins = d.name + '{aa|}\n' + d.data.num + return ins + }, + rich: { + aa: { + padding: [8, 0, 6, 0] + } + } + }, + data: data1 + }, + { + type: 'pictorialBar', + name: '', + symbolSize: ['32', '0'], + symbolPosition: 'center', + animation: true, + symbolClip: true, + z: 10, + data: [ + { + value: 100 + }, + { + value: 100 + }, + { + value: 100 + }, + { + value: 100 + } + ] + } + ] + } + return option +} + +export function setLineOptions({ xData, seriesData, unit = '' }) { + const option = { + tooltip: { + trigger: 'axis', + formatter: (item)=>{ + let label = '' + if( unit==='%'){ + label = item[0].name + "
" + (item[0].value * 100).toFixed(2) + unit + }else if(unit==='分'){ + label = item[0].name + "
" + (item[0].value / 100).toFixed(2) + '元' + }else{ + label = item[0].name + "
" + item[0].value + unit + } + return label + } + }, + xAxis: { + type: 'category', + data: xData + }, + yAxis: { + type: 'value', + axisLabel: { + formatter: (value)=>{ + let label = '' + if(unit==='%'){ + label = (value * 100).toFixed(2) + unit + }else if(unit==='分'){ + label = (value / 100).toFixed(2) + '元' + }else{ + label = value + unit + } + return label + } + } + }, + series: [ + { + data: seriesData, + type: 'line', + smooth: true, + } + ] + } + return option +} diff --git a/src/views/operationManage/index.vue b/src/views/operationManage/index.vue new file mode 100644 index 0000000..e1e68af --- /dev/null +++ b/src/views/operationManage/index.vue @@ -0,0 +1,796 @@ + + + + diff --git a/src/views/operationManage/indexTg.vue b/src/views/operationManage/indexTg.vue new file mode 100644 index 0000000..03ada0f --- /dev/null +++ b/src/views/operationManage/indexTg.vue @@ -0,0 +1,794 @@ + + + + diff --git a/src/views/page/components/select.vue b/src/views/page/components/select.vue new file mode 100644 index 0000000..10b9441 --- /dev/null +++ b/src/views/page/components/select.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/src/views/page/detail/index.vue b/src/views/page/detail/index.vue new file mode 100644 index 0000000..8c84650 --- /dev/null +++ b/src/views/page/detail/index.vue @@ -0,0 +1,405 @@ + + + + diff --git a/src/views/page/detail/upload.vue b/src/views/page/detail/upload.vue new file mode 100644 index 0000000..c7e9042 --- /dev/null +++ b/src/views/page/detail/upload.vue @@ -0,0 +1,185 @@ + + + diff --git a/src/views/page/list/index.vue b/src/views/page/list/index.vue new file mode 100644 index 0000000..c8673a5 --- /dev/null +++ b/src/views/page/list/index.vue @@ -0,0 +1,317 @@ + + + + + diff --git a/src/views/questionnaire/index.vue b/src/views/questionnaire/index.vue new file mode 100644 index 0000000..74c177d --- /dev/null +++ b/src/views/questionnaire/index.vue @@ -0,0 +1,236 @@ + + + + diff --git a/src/views/risk/index.vue b/src/views/risk/index.vue new file mode 100644 index 0000000..bba2834 --- /dev/null +++ b/src/views/risk/index.vue @@ -0,0 +1,668 @@ + + + + diff --git a/src/views/serial/components/select.vue b/src/views/serial/components/select.vue new file mode 100644 index 0000000..eb2931a --- /dev/null +++ b/src/views/serial/components/select.vue @@ -0,0 +1,80 @@ + + + diff --git a/src/views/serial/components/select2.vue b/src/views/serial/components/select2.vue new file mode 100644 index 0000000..feec7d1 --- /dev/null +++ b/src/views/serial/components/select2.vue @@ -0,0 +1,61 @@ + + + diff --git a/src/views/serial/detail/index.vue b/src/views/serial/detail/index.vue new file mode 100644 index 0000000..4ac7950 --- /dev/null +++ b/src/views/serial/detail/index.vue @@ -0,0 +1,636 @@ + + + + + diff --git a/src/views/serial/list/index.vue b/src/views/serial/list/index.vue new file mode 100644 index 0000000..19019e9 --- /dev/null +++ b/src/views/serial/list/index.vue @@ -0,0 +1,695 @@ + + + + + diff --git a/src/views/serial/list/indexTg.vue b/src/views/serial/list/indexTg.vue new file mode 100644 index 0000000..d924f7e --- /dev/null +++ b/src/views/serial/list/indexTg.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/serial/list/indexYx.vue b/src/views/serial/list/indexYx.vue new file mode 100644 index 0000000..8b65dd8 --- /dev/null +++ b/src/views/serial/list/indexYx.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/serial/list/indexYy.vue b/src/views/serial/list/indexYy.vue new file mode 100644 index 0000000..5f06b78 --- /dev/null +++ b/src/views/serial/list/indexYy.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/serial/list/indexZj.vue b/src/views/serial/list/indexZj.vue new file mode 100644 index 0000000..f5edd52 --- /dev/null +++ b/src/views/serial/list/indexZj.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/system/dept/addedForm.vue b/src/views/system/dept/addedForm.vue new file mode 100644 index 0000000..4cda358 --- /dev/null +++ b/src/views/system/dept/addedForm.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/src/views/system/dept/form.vue b/src/views/system/dept/form.vue new file mode 100644 index 0000000..7d5fb90 --- /dev/null +++ b/src/views/system/dept/form.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue new file mode 100644 index 0000000..b16f990 --- /dev/null +++ b/src/views/system/dept/index.vue @@ -0,0 +1,161 @@ + + + + + diff --git a/src/views/system/menu/form.vue b/src/views/system/menu/form.vue new file mode 100644 index 0000000..c2eafe6 --- /dev/null +++ b/src/views/system/menu/form.vue @@ -0,0 +1,283 @@ + + + + + diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue new file mode 100644 index 0000000..1cbda8a --- /dev/null +++ b/src/views/system/menu/index.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/src/views/system/permission/index.vue b/src/views/system/permission/index.vue new file mode 100644 index 0000000..7af1833 --- /dev/null +++ b/src/views/system/permission/index.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/src/views/system/role/form.vue b/src/views/system/role/form.vue new file mode 100644 index 0000000..86dcabf --- /dev/null +++ b/src/views/system/role/form.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue new file mode 100644 index 0000000..3182d0c --- /dev/null +++ b/src/views/system/role/index.vue @@ -0,0 +1,446 @@ + + + + + + + diff --git a/src/views/system/user/center.vue b/src/views/system/user/center.vue new file mode 100644 index 0000000..d9c4747 --- /dev/null +++ b/src/views/system/user/center.vue @@ -0,0 +1,517 @@ + + + + + diff --git a/src/views/system/user/center/personalCenter.vue b/src/views/system/user/center/personalCenter.vue new file mode 100644 index 0000000..c6eb177 --- /dev/null +++ b/src/views/system/user/center/personalCenter.vue @@ -0,0 +1,84 @@ + + + + diff --git a/src/views/system/user/center/updateEmail.vue b/src/views/system/user/center/updateEmail.vue new file mode 100644 index 0000000..0143e3a --- /dev/null +++ b/src/views/system/user/center/updateEmail.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/src/views/system/user/center/updatePass.vue b/src/views/system/user/center/updatePass.vue new file mode 100644 index 0000000..7cbe4b9 --- /dev/null +++ b/src/views/system/user/center/updatePass.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/src/views/system/user/components/DeptConfig.vue b/src/views/system/user/components/DeptConfig.vue new file mode 100644 index 0000000..33e03f4 --- /dev/null +++ b/src/views/system/user/components/DeptConfig.vue @@ -0,0 +1,204 @@ + + \ No newline at end of file diff --git a/src/views/system/user/form.vue b/src/views/system/user/form.vue new file mode 100644 index 0000000..e3c4a8b --- /dev/null +++ b/src/views/system/user/form.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue new file mode 100644 index 0000000..e53048b --- /dev/null +++ b/src/views/system/user/index.vue @@ -0,0 +1,629 @@ + + + + + diff --git a/src/views/system/user/userForm.vue b/src/views/system/user/userForm.vue new file mode 100644 index 0000000..6c59e4a --- /dev/null +++ b/src/views/system/user/userForm.vue @@ -0,0 +1,247 @@ + + + + + diff --git a/vue.config.js b/vue.config.js new file mode 100644 index 0000000..af993d6 --- /dev/null +++ b/vue.config.js @@ -0,0 +1,142 @@ +"use strict"; +const path = require("path"); +const defaultSettings = require("./src/settings.js"); +const CompressionPlugin = require("compression-webpack-plugin"); + +function resolve(dir) { + return path.join(__dirname, dir); +} + +const name = defaultSettings.title; // 网址标题 +const port = 8013; // 端口配置 + +// All configuration item explanations can be find in https://cli.vuejs.org/config/ +module.exports = { + // hash 模式下可使用 + // publicPath: process.env.NODE_ENV === 'development' ? '/' : './', + publicPath: "/", + outputDir: "dist", + assetsDir: "static", + lintOnSave: process.env.NODE_ENV === "development", + productionSourceMap: false, + devServer: { + port: port, + open: true, + overlay: { + warnings: false, + errors: true + }, + proxy: { + "/admin": { + target: process.env.VUE_APP_BASE_API, + changeOrigin: true, + pathRewrite: { + "^/admin": "admin" + } + }, + "/auth": { + target: process.env.VUE_APP_BASE_API, + changeOrigin: true, + pathRewrite: { + "^/auth": "auth" + } + } + } + }, + configureWebpack: { + // provide the app's title in webpack's name field, so that + // it can be accessed in index.html to inject the correct title. + name: name, + resolve: { + alias: { + "@": resolve("src"), + "@crud": resolve("src/components/Crud") + } + }, + plugins: [ + // https://www.ydyno.com/archives/1260.html 使用gzip解压缩静态文件 + new CompressionPlugin({ + test: /\.(js|css|html)?$/i, // 压缩文件格式 + filename: "[path].gz[query]", // 压缩后的文件名 + algorithm: "gzip", // 使用gzip压缩 + minRatio: 0.8 // 压缩率小于1才会压缩 + }) + ] + }, + chainWebpack(config) { + config.plugins.delete("preload"); // TODO: need test + config.plugins.delete("prefetch"); // TODO: need test + + // set svg-sprite-loader + config.module + .rule("svg") + .exclude.add(resolve("src/assets/icons")) + .end(); + config.module + .rule("icons") + .test(/\.svg$/) + .include.add(resolve("src/assets/icons")) + .end() + .use("svg-sprite-loader") + .loader("svg-sprite-loader") + .options({ + symbolId: "icon-[name]" + }) + .end(); + + // set preserveWhitespace + config.module + .rule("vue") + .use("vue-loader") + .loader("vue-loader") + .tap(options => { + options.compilerOptions.preserveWhitespace = true; + return options; + }) + .end(); + + config + // https://webpack.js.org/configuration/devtool/#development + .when(process.env.NODE_ENV === "development", config => + config.devtool("cheap-source-map") + ); + + config.when(process.env.NODE_ENV !== "development", config => { + config + .plugin("ScriptExtHtmlWebpackPlugin") + .after("html") + .use("script-ext-html-webpack-plugin", [ + { + // `runtime` must same as runtimeChunk name. default is `runtime` + inline: /runtime\..*\.js$/ + } + ]) + .end(); + config.optimization.splitChunks({ + chunks: "all", + cacheGroups: { + libs: { + name: "chunk-libs", + test: /[\\/]node_modules[\\/]/, + priority: 10, + chunks: "initial" // only package third parties that are initially dependent + }, + elementUI: { + name: "chunk-elementUI", // split elementUI into a single package + priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app + test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm + }, + commons: { + name: "chunk-commons", + test: resolve("src/components"), // can customize your rules + minChunks: 3, // minimum common number + priority: 5, + reuseExistingChunk: true + } + } + }); + config.optimization.runtimeChunk("single"); + }); + }, + transpileDependencies: ["vue-echarts", "resize-detector"] +};