commit 6a23132628145b698541f579a1e7a24e62866e07 Author: xwj Date: Mon Jan 26 14:37:40 2026 +0800 项目初始化 diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..214388f --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,3 @@ +> 1% +last 2 versions +not dead diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7053c49 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,5 @@ +[*.{js,jsx,ts,tsx,vue}] +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true +insert_final_newline = true diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..0235c61 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,7 @@ +/src/util/map/*.js +/src/util/map/*.ts +/src/util/dialog/*.js +/src/util/filters/*.js +/src/api/data-analysis/** +/node_modules +/dist diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..9ba8d47 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,41 @@ +module.exports = { + root: true, + env: { + node: true + }, + extends: ['plugin:vue/essential', '@vue/standard', '@vue/typescript/recommended'], + parserOptions: { + ecmaVersion: 2020, + sourceType: 'module' + }, + rules: { + // 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', + semi: 0, + 'comma-spacing': 0, + 'object-curly-spacing': 0, + indent: 0, + quotes: 0, + 'quote-props': 0, + 'key-spacing': 0, + 'object-curly-newline': 0, + 'object-property-newline': 0, + 'eol-last': 0, + noConsole: 0, + '@typescript-eslint/no-explicit-any': 0, + 'padded-blocks': 0, + 'no-trailing-spaces': 0, + '@typescript-eslint/no-unused-vars': 0, + '@typescript-eslint/ban-ts-comment': 0, + 'dot-notation': 'off', + 'prefer-const': 0, + 'spaced-comment': 0, + 'new-cap': 0, + "no-useless-escape": 0, + 'lines-between-class-members': 0, // 类成员之间应该空行 + '@typescript-eslint/no-non-null-assertion': 0, + '@typescript-eslint/no-var-requires': 0, + 'space-before-function-paren': 0, + 'no-multi-spaces': 0 + } +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..651689a Binary files /dev/null and b/logo.png differ diff --git a/package.json b/package.json new file mode 100644 index 0000000..ce5f6ba --- /dev/null +++ b/package.json @@ -0,0 +1,61 @@ +{ + "name": "myships_base", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint" + }, + "dependencies": { + "@types/jquery": "^3.3.1", + "axios": "^0.26.1", + "core-js": "^3.21.1", + "crypto-js": "^4.0.0", + "dayjs": "^1.11.4", + "default-passive-events": "^2.0.0", + "echarts": "^5.3.3", + "element-resize-detector": "^1.2.4", + "element-ui": "2.15.8", + "file-saver": "^2.0.5", + "jquery": "^3.5.1", + "md5": "^2.3.0", + "moment": "^2.29.2", + "ol": "^6.13.0", + "proj4": "^2.7.2", + "toastr": "^2.1.4", + "vue": "2.6.14", + "vue-class-component": "^7.2.3", + "vue-i18n": "^8.27.2", + "vue-property-decorator": "^9.1.2", + "vue-router": "^3.5.1", + "vuex": "^3.6.2", + "vxe-table": "^3.5.9", + "weatherv": "^0.1.12", + "xe-utils": "^3.5.6", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@types/crypto-js": "^4.1.1", + "@types/file-saver": "^2.0.5", + "@types/md5": "^2.3.2", + "@typescript-eslint/eslint-plugin": "^5.4.0", + "@typescript-eslint/parser": "^5.4.0", + "@vue/cli-plugin-eslint": "~5.0.0", + "@vue/cli-plugin-router": "~5.0.0", + "@vue/cli-plugin-typescript": "~5.0.0", + "@vue/cli-plugin-vuex": "~5.0.0", + "@vue/cli-service": "~5.0.0", + "@vue/eslint-config-standard": "^6.1.0", + "@vue/eslint-config-typescript": "^9.1.0", + "eslint": "^7.32.0", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-promise": "^5.1.0", + "eslint-plugin-vue": "^8.0.3", + "sass": "^1.32.7", + "sass-loader": "^12.0.0", + "typescript": "~4.5.5", + "vue-template-compiler": "2.6.14" + } +} diff --git a/public/config/echartTest.json b/public/config/echartTest.json new file mode 100644 index 0000000..925dc4b --- /dev/null +++ b/public/config/echartTest.json @@ -0,0 +1,3604 @@ +{ + "data": [ + [ + "2015-10-16", + 18.4, + 18.58, + 18.33, + 18.79, + 67.00, + 1, + 0.04, + 0.11, + 0.09 + ], + [ + "2015-10-19", + 18.56, + 18.25, + 18.19, + 18.56, + 55.00, + 0, + -0.00, + 0.08, + 0.09 + ], + [ + "2015-10-20", + 18.3, + 18.22, + 18.05, + 18.41, + 37.00, + 0, + 0.01, + 0.09, + 0.09 + ], + [ + "2015-10-21", + 18.18, + 18.69, + 18.02, + 18.98, + 89.00, + 0, + 0.03, + 0.10, + 0.08 + ], + [ + "2015-10-22", + 18.42, + 18.29, + 18.22, + 18.48, + 43.00, + 0, + -0.06, + 0.05, + 0.08 + ], + [ + "2015-10-23", + 18.26, + 18.19, + 18.08, + 18.36, + 46.00, + 0, + -0.10, + 0.03, + 0.09 + ], + [ + "2015-10-26", + 18.33, + 18.07, + 17.98, + 18.35, + 65.00, + 0, + -0.15, + 0.03, + 0.10 + ], + [ + "2015-10-27", + 18.08, + 18.04, + 17.88, + 18.13, + 37.00, + 0, + -0.19, + 0.03, + 0.12 + ], + [ + "2015-10-28", + 17.96, + 17.86, + 17.82, + 17.99, + 35.00, + 0, + -0.24, + 0.03, + 0.15 + ], + [ + "2015-10-29", + 17.85, + 17.81, + 17.8, + 17.93, + 27.00, + 0, + -0.24, + 0.06, + 0.18 + ], + [ + "2015-10-30", + 17.79, + 17.93, + 17.78, + 18.08, + 43.00, + 0, + -0.22, + 0.11, + 0.22 + ], + [ + "2015-11-02", + 17.78, + 17.83, + 17.78, + 18.04, + 27.00, + 0, + -0.20, + 0.15, + 0.25 + ], + [ + "2015-11-03", + 17.84, + 17.9, + 17.84, + 18.06, + 34.00, + 0, + -0.12, + 0.22, + 0.28 + ], + [ + "2015-11-04", + 17.97, + 18.36, + 17.85, + 18.39, + 62.00, + 0, + -0.00, + 0.30, + 0.30 + ], + [ + "2015-11-05", + 18.3, + 18.57, + 18.18, + 19.08, + 177.00, + 0, + 0.07, + 0.33, + 0.30 + ], + [ + "2015-11-06", + 18.53, + 18.68, + 18.3, + 18.71, + 95.00, + 0, + 0.12, + 0.35, + 0.29 + ], + [ + "2015-11-09", + 18.75, + 19.08, + 18.75, + 19.98, + 202.00, + 1, + 0.16, + 0.35, + 0.27 + ], + [ + "2015-11-10", + 18.85, + 18.64, + 18.56, + 18.99, + 85.00, + 0, + 0.09, + 0.29, + 0.25 + ], + [ + "2015-11-11", + 18.64, + 18.44, + 18.31, + 18.64, + 50.00, + 0, + 0.06, + 0.27, + 0.23 + ], + [ + "2015-11-12", + 18.55, + 18.27, + 18.17, + 18.57, + 43.00, + 0, + 0.05, + 0.25, + 0.23 + ], + [ + "2015-11-13", + 18.13, + 18.14, + 18.09, + 18.34, + 35.00, + 0, + 0.05, + 0.24, + 0.22 + ], + [ + "2015-11-16", + 18.01, + 18.1, + 17.93, + 18.17, + 34.00, + 0, + 0.07, + 0.25, + 0.21 + ], + [ + "2015-11-17", + 18.2, + 18.14, + 18.08, + 18.45, + 58.00, + 0, + 0.11, + 0.25, + 0.20 + ], + [ + "2015-11-18", + 18.23, + 18.16, + 18.0, + 18.45, + 47.00, + 0, + 0.13, + 0.25, + 0.19 + ], + [ + "2015-11-19", + 18.08, + 18.2, + 18.05, + 18.25, + 32.00, + 0, + 0.15, + 0.24, + 0.17 + ], + [ + "2015-11-20", + 18.15, + 18.15, + 18.11, + 18.29, + 36.00, + 0, + 0.13, + 0.21, + 0.15 + ], + [ + "2015-11-23", + 18.16, + 18.19, + 18.12, + 18.34, + 47.00, + 0, + 0.11, + 0.18, + 0.13 + ], + [ + "2015-11-24", + 18.23, + 17.88, + 17.7, + 18.23, + 62.00, + 0, + 0.03, + 0.13, + 0.11 + ], + [ + "2015-11-25", + 17.85, + 17.73, + 17.56, + 17.85, + 66.00, + 0, + -0.03, + 0.09, + 0.11 + ], + [ + "2015-11-26", + 17.79, + 17.53, + 17.5, + 17.92, + 63.00, + 0, + -0.10, + 0.06, + 0.11 + ], + [ + "2015-11-27", + 17.51, + 17.04, + 16.9, + 17.51, + 67.00, + 0, + -0.16, + 0.05, + 0.13 + ], + [ + "2015-11-30", + 17.07, + 17.2, + 16.98, + 17.32, + 55.00, + 0, + -0.12, + 0.09, + 0.15 + ], + [ + "2015-12-01", + 17.28, + 17.11, + 16.91, + 17.28, + 39.00, + 0, + -0.09, + 0.12, + 0.16 + ], + [ + "2015-12-02", + 17.13, + 17.91, + 17.05, + 17.99, + 102.00, + 0, + -0.01, + 0.17, + 0.18 + ], + [ + "2015-12-03", + 17.8, + 17.78, + 17.61, + 17.98, + 71.00, + 0, + -0.09, + 0.14, + 0.18 + ], + [ + "2015-12-04", + 17.6, + 17.25, + 17.13, + 17.69, + 51.00, + 0, + -0.18, + 0.10, + 0.19 + ], + [ + "2015-12-07", + 17.2, + 17.39, + 17.15, + 17.45, + 43.00, + 0, + -0.19, + 0.12, + 0.22 + ], + [ + "2015-12-08", + 17.3, + 17.42, + 17.18, + 17.62, + 45.00, + 0, + -0.23, + 0.13, + 0.24 + ], + [ + "2015-12-09", + 17.33, + 17.39, + 17.32, + 17.59, + 44.00, + 0, + -0.29, + 0.13, + 0.28 + ], + [ + "2015-12-10", + 17.39, + 17.26, + 17.21, + 17.65, + 44.00, + 0, + -0.37, + 0.13, + 0.32 + ], + [ + "2015-12-11", + 17.23, + 16.92, + 16.66, + 17.26, + 114.00, + 1, + -0.44, + 0.15, + 0.37 + ], + [ + "2015-12-14", + 16.75, + 17.06, + 16.5, + 17.09, + 94.00, + 0, + -0.44, + 0.21, + 0.44 + ], + [ + "2015-12-15", + 17.03, + 17.03, + 16.9, + 17.06, + 46.00, + 0, + -0.44, + 0.28, + 0.50 + ], + [ + "2015-12-16", + 17.08, + 16.96, + 16.87, + 17.09, + 30.00, + 0, + -0.40, + 0.36, + 0.56 + ], + [ + "2015-12-17", + 17.0, + 17.1, + 16.95, + 17.12, + 50.00, + 0, + -0.30, + 0.47, + 0.62 + ], + [ + "2015-12-18", + 17.09, + 17.52, + 17.04, + 18.06, + 156.00, + 0, + -0.14, + 0.59, + 0.66 + ], + [ + "2015-12-21", + 17.43, + 18.23, + 17.35, + 18.45, + 152.00, + 1, + 0.02, + 0.69, + 0.68 + ], + [ + "2015-12-22", + 18.14, + 18.27, + 18.06, + 18.32, + 94.00, + 0, + 0.08, + 0.72, + 0.68 + ], + [ + "2015-12-23", + 18.28, + 18.19, + 18.17, + 18.71, + 108.00, + 0, + 0.13, + 0.73, + 0.67 + ], + [ + "2015-12-24", + 18.18, + 18.14, + 18.01, + 18.31, + 37.00, + 0, + 0.19, + 0.74, + 0.65 + ], + [ + "2015-12-25", + 18.22, + 18.33, + 18.2, + 18.36, + 48.00, + 0, + 0.26, + 0.75, + 0.62 + ], + [ + "2015-12-28", + 18.35, + 17.84, + 17.8, + 18.39, + 48.00, + 0, + 0.27, + 0.72, + 0.59 + ], + [ + "2015-12-29", + 17.83, + 17.94, + 17.71, + 17.97, + 36.00, + 0, + 0.36, + 0.73, + 0.55 + ], + [ + "2015-12-30", + 17.9, + 18.26, + 17.55, + 18.3, + 71.00, + 1, + 0.43, + 0.71, + 0.50 + ], + [ + "2015-12-31", + 18.12, + 17.99, + 17.91, + 18.33, + 72.00, + 0, + 0.40, + 0.63, + 0.43 + ], + [ + "2016-01-04", + 17.91, + 17.28, + 17.16, + 17.95, + 37.00, + 1, + 0.34, + 0.55, + 0.38 + ], + [ + "2016-01-05", + 17.17, + 17.23, + 17.0, + 17.55, + 51.00, + 0, + 0.37, + 0.51, + 0.33 + ], + [ + "2016-01-06", + 17.2, + 17.31, + 17.06, + 17.33, + 31.00, + 0, + 0.37, + 0.46, + 0.28 + ], + [ + "2016-01-07", + 17.15, + 16.67, + 16.51, + 17.15, + 19.00, + 0, + 0.30, + 0.37, + 0.22 + ], + [ + "2016-01-08", + 16.8, + 16.81, + 16.61, + 17.06, + 60.00, + 0, + 0.29, + 0.32, + 0.18 + ], + [ + "2016-01-11", + 16.68, + 16.04, + 16.0, + 16.68, + 65.00, + 0, + 0.20, + 0.24, + 0.14 + ], + [ + "2016-01-12", + 16.03, + 15.98, + 15.88, + 16.25, + 46.00, + 0, + 0.20, + 0.21, + 0.11 + ], + [ + "2016-01-13", + 16.21, + 15.87, + 15.78, + 16.21, + 57.00, + 0, + 0.20, + 0.18, + 0.08 + ], + [ + "2016-01-14", + 15.55, + 15.89, + 15.52, + 15.96, + 42.00, + 0, + 0.20, + 0.16, + 0.05 + ], + [ + "2016-01-15", + 15.87, + 15.48, + 15.45, + 15.92, + 34.00, + 1, + 0.17, + 0.11, + 0.02 + ], + [ + "2016-01-18", + 15.39, + 15.42, + 15.36, + 15.7, + 26.00, + 0, + 0.21, + 0.10, + -0.00 + ], + [ + "2016-01-19", + 15.58, + 15.71, + 15.35, + 15.77, + 38.00, + 0, + 0.25, + 0.09, + -0.03 + ], + [ + "2016-01-20", + 15.56, + 15.52, + 15.24, + 15.68, + 38.00, + 0, + 0.23, + 0.05, + -0.07 + ], + [ + "2016-01-21", + 15.41, + 15.3, + 15.28, + 15.68, + 35.00, + 0, + 0.21, + 0.00, + -0.10 + ], + [ + "2016-01-22", + 15.48, + 15.28, + 15.13, + 15.49, + 30.00, + 0, + 0.21, + -0.02, + -0.13 + ], + [ + "2016-01-25", + 15.29, + 15.48, + 15.2, + 15.49, + 21.00, + 0, + 0.20, + -0.06, + -0.16 + ], + [ + "2016-01-26", + 15.33, + 14.86, + 14.78, + 15.39, + 30.00, + 0, + 0.12, + -0.13, + -0.19 + ], + [ + "2016-01-27", + 14.96, + 15.0, + 14.84, + 15.22, + 51.00, + 0, + 0.13, + -0.14, + -0.20 + ], + [ + "2016-01-28", + 14.96, + 14.72, + 14.62, + 15.06, + 25.00, + 0, + 0.10, + -0.17, + -0.22 + ], + [ + "2016-01-29", + 14.75, + 14.99, + 14.62, + 15.08, + 36.00, + 0, + 0.13, + -0.17, + -0.24 + ], + [ + "2016-02-01", + 14.98, + 14.72, + 14.48, + 15.18, + 27.00, + 0, + 0.10, + -0.21, + -0.26 + ], + [ + "2016-02-02", + 14.65, + 14.85, + 14.65, + 14.95, + 18.00, + 0, + 0.11, + -0.21, + -0.27 + ], + [ + "2016-02-03", + 14.72, + 14.67, + 14.55, + 14.8, + 23.00, + 0, + 0.10, + -0.24, + -0.29 + ], + [ + "2016-02-04", + 14.79, + 14.88, + 14.69, + 14.93, + 22.00, + 0, + 0.13, + -0.24, + -0.30 + ], + [ + "2016-02-05", + 14.9, + 14.86, + 14.78, + 14.93, + 16.00, + 0, + 0.12, + -0.26, + -0.32 + ], + [ + "2016-02-15", + 14.5, + 14.66, + 14.47, + 14.82, + 19.00, + 0, + 0.11, + -0.28, + -0.34 + ], + [ + "2016-02-16", + 14.77, + 14.94, + 14.72, + 15.05, + 26.00, + 0, + 0.14, + -0.28, + -0.35 + ], + [ + "2016-02-17", + 14.95, + 15.03, + 14.88, + 15.07, + 38.00, + 0, + 0.12, + -0.31, + -0.37 + ], + [ + "2016-02-18", + 14.95, + 14.9, + 14.87, + 15.06, + 28.00, + 0, + 0.07, + -0.35, + -0.39 + ], + [ + "2016-02-19", + 14.9, + 14.75, + 14.68, + 14.94, + 22.00, + 0, + 0.03, + -0.38, + -0.40 + ], + [ + "2016-02-22", + 14.88, + 15.01, + 14.79, + 15.11, + 38.00, + 1, + 0.01, + -0.40, + -0.40 + ], + [ + "2016-02-23", + 15.01, + 14.83, + 14.72, + 15.01, + 24.00, + 0, + -0.09, + -0.45, + -0.40 + ], + [ + "2016-02-24", + 14.75, + 14.81, + 14.67, + 14.87, + 21.00, + 0, + -0.17, + -0.48, + -0.39 + ], + [ + "2016-02-25", + 14.81, + 14.25, + 14.21, + 14.81, + 51.00, + 1, + -0.27, + -0.50, + -0.37 + ], + [ + "2016-02-26", + 14.35, + 14.45, + 14.28, + 14.57, + 28.00, + 0, + -0.26, + -0.46, + -0.33 + ], + [ + "2016-02-29", + 14.43, + 14.56, + 14.04, + 14.6, + 48.00, + 0, + -0.25, + -0.41, + -0.29 + ], + [ + "2016-03-01", + 14.56, + 14.65, + 14.36, + 14.78, + 32.00, + 0, + -0.21, + -0.36, + -0.25 + ], + [ + "2016-03-02", + 14.79, + 14.96, + 14.72, + 14.97, + 60.00, + 0, + -0.13, + -0.29, + -0.22 + ], + [ + "2016-03-03", + 14.95, + 15.15, + 14.91, + 15.19, + 53.00, + 1, + -0.05, + -0.23, + -0.21 + ], + [ + "2016-03-04", + 15.14, + 15.97, + 15.02, + 16.02, + 164.00, + 1, + 0.06, + -0.17, + -0.20 + ], + [ + "2016-03-07", + 15.9, + 15.78, + 15.65, + 16.0, + 41.00, + 0, + 0.04, + -0.19, + -0.21 + ], + [ + "2016-03-08", + 15.78, + 15.96, + 15.21, + 15.99, + 45.00, + 0, + 0.05, + -0.19, + -0.21 + ], + [ + "2016-03-09", + 15.73, + 16.05, + 15.41, + 16.08, + 74.00, + 0, + 0.03, + -0.20, + -0.22 + ], + [ + "2016-03-10", + 15.82, + 15.66, + 15.65, + 15.98, + 19.00, + 0, + -0.02, + -0.23, + -0.22 + ], + [ + "2016-03-11", + 15.59, + 15.76, + 15.42, + 15.78, + 32.00, + 0, + 0.01, + -0.22, + -0.22 + ], + [ + "2016-03-14", + 15.78, + 15.72, + 15.65, + 16.04, + 31.00, + 0, + 0.03, + -0.20, + -0.22 + ], + [ + "2016-03-15", + 15.81, + 15.86, + 15.6, + 15.99, + 35.00, + 0, + 0.10, + -0.18, + -0.23 + ], + [ + "2016-03-16", + 15.88, + 16.42, + 15.79, + 16.45, + 123.00, + 0, + 0.17, + -0.16, + -0.24 + ], + [ + "2016-03-17", + 16.39, + 16.23, + 16.11, + 16.4, + 46.00, + 0, + 0.14, + -0.20, + -0.26 + ], + [ + "2016-03-18", + 16.39, + 16.17, + 16.04, + 16.4, + 59.00, + 0, + 0.13, + -0.22, + -0.28 + ], + [ + "2016-03-21", + 16.21, + 16.22, + 16.11, + 16.44, + 50.00, + 0, + 0.12, + -0.24, + -0.30 + ], + [ + "2016-03-22", + 16.27, + 16.19, + 16.16, + 16.42, + 33.00, + 0, + 0.10, + -0.27, + -0.32 + ], + [ + "2016-03-23", + 16.26, + 16.18, + 16.18, + 16.29, + 19.00, + 0, + 0.08, + -0.30, + -0.33 + ], + [ + "2016-03-24", + 16.18, + 16.11, + 16.01, + 16.23, + 23.00, + 0, + 0.04, + -0.33, + -0.35 + ], + [ + "2016-03-25", + 16.12, + 16.13, + 16.1, + 16.2, + 15.00, + 0, + 0.00, + -0.35, + -0.35 + ], + [ + "2016-03-28", + 16.15, + 15.85, + 15.81, + 16.2, + 22.00, + 0, + -0.06, + -0.38, + -0.35 + ], + [ + "2016-03-29", + 15.9, + 15.79, + 15.76, + 16.05, + 19.00, + 0, + -0.06, + -0.37, + -0.34 + ], + [ + "2016-03-30", + 15.79, + 16.24, + 15.78, + 16.3, + 29.00, + 0, + -0.03, + -0.35, + -0.33 + ], + [ + "2016-03-31", + 16.3, + 16.09, + 16.02, + 16.35, + 25.00, + 0, + -0.07, + -0.37, + -0.33 + ], + [ + "2016-04-01", + 16.18, + 16.27, + 15.98, + 16.3, + 38.00, + 0, + -0.08, + -0.36, + -0.32 + ], + [ + "2016-04-05", + 16.13, + 16.34, + 16.07, + 16.37, + 39.00, + 0, + -0.13, + -0.37, + -0.31 + ], + [ + "2016-04-06", + 16.21, + 16.26, + 16.19, + 16.35, + 30.00, + 0, + -0.20, + -0.39, + -0.29 + ], + [ + "2016-04-07", + 16.32, + 16.1, + 16.05, + 16.35, + 29.00, + 1, + -0.26, + -0.39, + -0.26 + ], + [ + "2016-04-08", + 16.0, + 16.16, + 15.98, + 16.21, + 22.00, + 0, + -0.28, + -0.37, + -0.23 + ], + [ + "2016-04-11", + 16.16, + 16.31, + 16.15, + 16.57, + 31.00, + 0, + -0.30, + -0.33, + -0.19 + ], + [ + "2016-04-12", + 16.41, + 16.29, + 16.12, + 16.41, + 17.00, + 0, + -0.31, + -0.30, + -0.14 + ], + [ + "2016-04-13", + 16.39, + 16.48, + 16.0, + 16.68, + 40.00, + 0, + -0.30, + -0.25, + -0.10 + ], + [ + "2016-04-14", + 16.5, + 16.46, + 16.37, + 16.68, + 22.00, + 0, + -0.27, + -0.19, + -0.06 + ], + [ + "2016-04-15", + 16.56, + 16.93, + 16.46, + 17.04, + 58.00, + 0, + -0.20, + -0.12, + -0.02 + ], + [ + "2016-04-18", + 16.76, + 17.06, + 16.72, + 17.27, + 50.00, + 0, + -0.16, + -0.07, + 0.01 + ], + [ + "2016-04-19", + 17.21, + 17.11, + 17.02, + 17.23, + 30.00, + 0, + -0.12, + -0.02, + 0.03 + ], + [ + "2016-04-20", + 17.11, + 17.33, + 16.8, + 17.36, + 78.00, + 0, + -0.04, + 0.03, + 0.05 + ], + [ + "2016-04-21", + 17.27, + 17.69, + 17.17, + 17.93, + 79.00, + 0, + 0.05, + 0.08, + 0.06 + ], + [ + "2016-04-22", + 17.6, + 17.87, + 17.56, + 18.02, + 55.00, + 0, + 0.09, + 0.10, + 0.05 + ], + [ + "2016-04-25", + 17.75, + 17.9, + 17.41, + 17.96, + 39.00, + 1, + 0.11, + 0.09, + 0.04 + ], + [ + "2016-04-26", + 17.81, + 17.91, + 17.6, + 17.95, + 39.00, + 0, + 0.12, + 0.08, + 0.02 + ], + [ + "2016-04-27", + 17.9, + 17.88, + 17.81, + 17.95, + 25.00, + 0, + 0.12, + 0.06, + 0.00 + ], + [ + "2016-04-28", + 17.93, + 17.88, + 17.67, + 17.93, + 28.00, + 0, + 0.11, + 0.04, + -0.01 + ], + [ + "2016-04-29", + 17.87, + 17.75, + 17.73, + 17.92, + 19.00, + 0, + 0.08, + 0.01, + -0.03 + ], + [ + "2016-05-03", + 17.79, + 17.7, + 17.56, + 17.85, + 35.00, + 0, + 0.05, + -0.01, + -0.04 + ], + [ + "2016-05-04", + 17.7, + 17.65, + 17.59, + 17.71, + 24.00, + 0, + 0.02, + -0.04, + -0.05 + ], + [ + "2016-05-05", + 17.65, + 17.62, + 17.46, + 17.7, + 20.00, + 0, + -0.03, + -0.06, + -0.05 + ], + [ + "2016-05-06", + 17.62, + 17.32, + 17.3, + 17.65, + 29.00, + 0, + -0.10, + -0.09, + -0.05 + ], + [ + "2016-05-09", + 17.33, + 17.3, + 17.21, + 17.45, + 23.00, + 0, + -0.13, + -0.10, + -0.03 + ], + [ + "2016-05-10", + 17.11, + 17.04, + 16.98, + 17.41, + 28.00, + 0, + -0.15, + -0.09, + -0.01 + ], + [ + "2016-05-11", + 17.06, + 17.15, + 17.06, + 17.32, + 20.00, + 0, + -0.12, + -0.05, + 0.01 + ], + [ + "2016-05-12", + 17.02, + 17.46, + 17.02, + 17.58, + 26.00, + 0, + -0.07, + -0.01, + 0.03 + ], + [ + "2016-05-13", + 17.41, + 17.57, + 17.34, + 17.62, + 23.00, + 0, + -0.06, + 0.01, + 0.03 + ], + [ + "2016-05-16", + 17.55, + 17.5, + 17.48, + 17.64, + 37.00, + 0, + -0.06, + 0.01, + 0.04 + ], + [ + "2016-05-17", + 17.49, + 17.48, + 17.39, + 17.53, + 13.00, + 0, + -0.03, + 0.03, + 0.05 + ], + [ + "2016-05-18", + 17.41, + 17.82, + 17.39, + 17.87, + 46.00, + 0, + 0.01, + 0.06, + 0.06 + ], + [ + "2016-05-19", + 17.74, + 17.81, + 17.67, + 17.86, + 17.00, + 0, + -0.01, + 0.05, + 0.05 + ], + [ + "2016-05-20", + 17.76, + 17.88, + 17.7, + 17.93, + 14.00, + 0, + -0.03, + 0.04, + 0.06 + ], + [ + "2016-05-23", + 17.88, + 17.52, + 17.48, + 17.97, + 16.00, + 0, + -0.09, + 0.02, + 0.06 + ], + [ + "2016-05-24", + 17.51, + 17.33, + 17.32, + 17.51, + 8.00, + 0, + -0.09, + 0.03, + 0.07 + ], + [ + "2016-05-25", + 17.59, + 17.55, + 17.44, + 17.59, + 10.00, + 0, + -0.03, + 0.07, + 0.08 + ], + [ + "2016-05-26", + 17.5, + 17.69, + 17.5, + 17.8, + 12.00, + 0, + 0.00, + 0.09, + 0.09 + ], + [ + "2016-05-27", + 17.77, + 17.66, + 17.62, + 17.77, + 7.00, + 0, + 0.03, + 0.10, + 0.09 + ], + [ + "2016-05-30", + 17.75, + 17.84, + 17.62, + 17.87, + 20.00, + 0, + 0.08, + 0.12, + 0.08 + ], + [ + "2016-05-31", + 17.88, + 18.0, + 17.81, + 18.03, + 41.00, + 0, + 0.10, + 0.12, + 0.07 + ], + [ + "2016-06-01", + 18.09, + 17.83, + 17.73, + 18.09, + 22.00, + 0, + 0.08, + 0.10, + 0.06 + ], + [ + "2016-06-02", + 17.82, + 17.73, + 17.66, + 17.88, + 10.00, + 0, + 0.07, + 0.08, + 0.05 + ], + [ + "2016-06-03", + 17.8, + 17.78, + 17.71, + 17.83, + 9.00, + 0, + 0.08, + 0.08, + 0.04 + ], + [ + "2016-06-06", + 17.73, + 17.64, + 17.56, + 17.83, + 12.00, + 0, + 0.07, + 0.06, + 0.03 + ], + [ + "2016-06-07", + 17.76, + 17.8, + 17.59, + 17.87, + 11.00, + 0, + 0.08, + 0.06, + 0.02 + ], + [ + "2016-06-08", + 17.75, + 17.77, + 17.65, + 17.84, + 9.00, + 0, + 0.04, + 0.03, + 0.01 + ], + [ + "2016-06-13", + 17.58, + 17.32, + 17.29, + 17.79, + 16.00, + 0, + -0.02, + -0.01, + 0.00 + ], + [ + "2016-06-14", + 17.33, + 17.38, + 17.29, + 17.5, + 10.00, + 0, + -0.01, + 0.00, + 0.00 + ], + [ + "2016-06-15", + 17.25, + 17.39, + 17.25, + 17.46, + 18.00, + 0, + 0.00, + 0.01, + 0.00 + ], + [ + "2016-06-16", + 17.26, + 17.4, + 17.26, + 17.46, + 22.00, + 0, + 0.01, + 0.01, + 0.00 + ], + [ + "2016-06-17", + 17.38, + 17.5, + 17.37, + 17.67, + 13.00, + 0, + 0.03, + 0.02, + 0.00 + ], + [ + "2016-06-20", + 17.62, + 17.51, + 17.42, + 17.63, + 15.00, + 0, + 0.03, + 0.01, + -0.00 + ], + [ + "2016-06-21", + 17.53, + 17.54, + 17.5, + 17.7, + 11.00, + 0, + 0.02, + 0.00, + -0.01 + ], + [ + "2016-06-22", + 17.5, + 17.5, + 17.46, + 17.6, + 10.00, + 0, + -0.01, + -0.01, + -0.01 + ], + [ + "2016-06-23", + 17.52, + 17.26, + 17.24, + 17.53, + 16.00, + 0, + -0.04, + -0.03, + -0.01 + ], + [ + "2016-06-24", + 17.26, + 17.25, + 17.18, + 17.38, + 60.00, + 0, + -0.03, + -0.02, + -0.00 + ], + [ + "2016-06-27", + 17.25, + 17.28, + 17.18, + 17.33, + 19.00, + 0, + -0.01, + -0.00, + 0.00 + ], + [ + "2016-06-28", + 17.25, + 17.29, + 17.21, + 17.32, + 13.00, + 0, + 0.02, + 0.01, + 0.00 + ], + [ + "2016-06-29", + 17.31, + 17.45, + 17.27, + 17.49, + 21.00, + 0, + 0.07, + 0.04, + 0.00 + ], + [ + "2016-06-30", + 17.47, + 17.5, + 17.39, + 17.55, + 17.00, + 0, + 0.11, + 0.04, + -0.01 + ], + [ + "2016-07-01", + 17.5, + 17.63, + 17.49, + 17.66, + 10.00, + 0, + 0.14, + 0.05, + -0.03 + ], + [ + "2016-07-04", + 17.63, + 17.72, + 17.63, + 17.92, + 17.00, + 0, + 0.16, + 0.03, + -0.05 + ], + [ + "2016-07-05", + 17.79, + 17.56, + 17.45, + 17.79, + 18.00, + 0, + 0.14, + 0.00, + -0.07 + ], + [ + "2016-07-06", + 17.53, + 17.42, + 17.31, + 17.54, + 20.00, + 0, + 0.14, + -0.02, + -0.09 + ], + [ + "2016-07-07", + 17.41, + 17.51, + 17.35, + 17.52, + 15.00, + 0, + 0.16, + -0.03, + -0.11 + ], + [ + "2016-07-08", + 17.5, + 17.39, + 17.35, + 17.51, + 15.00, + 0, + 0.16, + -0.05, + -0.13 + ], + [ + "2016-07-11", + 17.49, + 17.48, + 17.4, + 17.55, + 16.00, + 0, + 0.17, + -0.07, + -0.15 + ], + [ + "2016-07-12", + 17.48, + 17.71, + 17.46, + 17.75, + 25.00, + 0, + 0.16, + -0.10, + -0.18 + ], + [ + "2016-07-13", + 17.13, + 17.05, + 17.02, + 17.39, + 28.00, + 0, + 0.07, + -0.17, + -0.20 + ], + [ + "2016-07-14", + 17.07, + 17.09, + 17.0, + 17.16, + 12.00, + 0, + 0.08, + -0.17, + -0.21 + ], + [ + "2016-07-15", + 17.08, + 17.14, + 17.08, + 17.17, + 11.00, + 0, + 0.09, + -0.18, + -0.22 + ], + [ + "2016-07-18", + 17.15, + 17.26, + 17.13, + 17.49, + 24.00, + 0, + 0.10, + -0.19, + -0.23 + ], + [ + "2016-07-19", + 17.26, + 17.12, + 17.09, + 17.33, + 13.00, + 0, + 0.07, + -0.21, + -0.25 + ], + [ + "2016-07-20", + 17.1, + 17.07, + 17.02, + 17.14, + 11.00, + 0, + 0.06, + -0.23, + -0.26 + ], + [ + "2016-07-21", + 17.07, + 17.24, + 17.07, + 17.27, + 14.00, + 0, + 0.07, + -0.23, + -0.27 + ], + [ + "2016-07-22", + 17.25, + 17.08, + 17.03, + 17.25, + 10.00, + 0, + 0.04, + -0.26, + -0.28 + ], + [ + "2016-07-25", + 17.09, + 17.12, + 17.01, + 17.18, + 8.00, + 0, + 0.04, + -0.26, + -0.28 + ], + [ + "2016-07-26", + 17.05, + 17.17, + 17.05, + 17.2, + 11.00, + 0, + 0.04, + -0.27, + -0.29 + ], + [ + "2016-07-27", + 17.2, + 17.37, + 16.89, + 17.38, + 32.00, + 0, + 0.02, + -0.28, + -0.29 + ], + [ + "2016-07-28", + 17.19, + 17.14, + 17.09, + 17.29, + 19.00, + 0, + -0.04, + -0.32, + -0.30 + ], + [ + "2016-07-29", + 17.15, + 17.16, + 17.04, + 17.23, + 12.00, + 0, + -0.08, + -0.33, + -0.29 + ], + [ + "2016-08-01", + 17.15, + 17.18, + 17.1, + 17.24, + 19.00, + 0, + -0.13, + -0.34, + -0.28 + ], + [ + "2016-08-02", + 17.21, + 17.15, + 17.12, + 17.25, + 9.00, + 0, + -0.19, + -0.36, + -0.26 + ], + [ + "2016-08-03", + 17.08, + 17.07, + 17.01, + 17.16, + 9.00, + 0, + -0.25, + -0.36, + -0.24 + ], + [ + "2016-08-04", + 17.11, + 17.06, + 16.98, + 17.12, + 11.00, + 1, + -0.29, + -0.35, + -0.20 + ], + [ + "2016-08-05", + 17.06, + 17.1, + 17.05, + 17.15, + 16.00, + 0, + -0.33, + -0.32, + -0.16 + ], + [ + "2016-08-08", + 17.14, + 17.13, + 17.07, + 17.15, + 13.00, + 0, + -0.35, + -0.29, + -0.11 + ], + [ + "2016-08-09", + 17.13, + 17.17, + 17.1, + 17.2, + 25.00, + 0, + -0.35, + -0.24, + -0.06 + ], + [ + "2016-08-10", + 17.17, + 17.28, + 17.15, + 17.29, + 18.00, + 0, + -0.31, + -0.17, + -0.01 + ], + [ + "2016-08-11", + 17.3, + 17.45, + 17.26, + 17.87, + 31.00, + 0, + -0.24, + -0.09, + 0.03 + ], + [ + "2016-08-12", + 17.51, + 17.99, + 17.47, + 18.0, + 44.00, + 0, + -0.14, + -0.00, + 0.07 + ], + [ + "2016-08-15", + 18.1, + 18.42, + 18.02, + 18.99, + 81.00, + 0, + -0.09, + 0.04, + 0.09 + ], + [ + "2016-08-16", + 18.64, + 18.31, + 18.12, + 18.87, + 60.00, + 0, + -0.10, + 0.05, + 0.10 + ], + [ + "2016-08-17", + 18.43, + 18.4, + 18.31, + 18.68, + 21.00, + 0, + -0.08, + 0.08, + 0.11 + ], + [ + "2016-08-18", + 18.33, + 18.23, + 18.13, + 18.65, + 32.00, + 0, + -0.07, + 0.09, + 0.13 + ], + [ + "2016-08-19", + 18.34, + 18.62, + 18.31, + 18.75, + 39.00, + 0, + 0.00, + 0.14, + 0.14 + ], + [ + "2016-08-22", + 18.62, + 18.69, + 18.51, + 18.8, + 20.00, + 0, + 0.01, + 0.14, + 0.13 + ], + [ + "2016-08-23", + 18.61, + 18.66, + 18.52, + 19.0, + 28.00, + 0, + 0.01, + 0.14, + 0.13 + ], + [ + "2016-08-24", + 18.66, + 18.62, + 18.43, + 18.7, + 19.00, + 0, + 0.00, + 0.13, + 0.13 + ], + [ + "2016-08-25", + 18.57, + 18.51, + 18.19, + 18.64, + 19.00, + 0, + -0.00, + 0.13, + 0.13 + ], + [ + "2016-08-26", + 18.49, + 18.55, + 18.44, + 18.6, + 16.00, + 0, + 0.01, + 0.13, + 0.13 + ], + [ + "2016-08-29", + 18.46, + 18.27, + 18.03, + 18.48, + 20.00, + 0, + 0.01, + 0.13, + 0.13 + ], + [ + "2016-08-30", + 18.24, + 18.44, + 18.23, + 18.52, + 19.00, + 0, + 0.07, + 0.17, + 0.13 + ], + [ + "2016-08-31", + 18.36, + 18.63, + 18.36, + 18.76, + 15.00, + 0, + 0.13, + 0.18, + 0.12 + ], + [ + "2016-09-01", + 18.6, + 18.62, + 18.55, + 18.78, + 15.00, + 0, + 0.16, + 0.18, + 0.10 + ], + [ + "2016-09-02", + 18.52, + 18.68, + 18.48, + 18.72, + 17.00, + 0, + 0.19, + 0.17, + 0.08 + ], + [ + "2016-09-05", + 18.68, + 18.75, + 18.57, + 18.82, + 19.00, + 0, + 0.20, + 0.15, + 0.05 + ], + [ + "2016-09-06", + 18.75, + 18.51, + 18.43, + 18.78, + 17.00, + 0, + 0.18, + 0.11, + 0.02 + ], + [ + "2016-09-07", + 18.51, + 18.56, + 18.4, + 18.62, + 17.00, + 0, + 0.17, + 0.08, + -0.00 + ], + [ + "2016-09-08", + 18.58, + 18.53, + 18.48, + 18.63, + 8.00, + 0, + 0.13, + 0.04, + -0.03 + ], + [ + "2016-09-09", + 18.52, + 18.33, + 18.31, + 18.57, + 8.00, + 0, + 0.06, + -0.02, + -0.05 + ], + [ + "2016-09-12", + 18.16, + 17.9, + 17.81, + 18.18, + 28.00, + 0, + -0.02, + -0.07, + -0.06 + ], + [ + "2016-09-13", + 17.91, + 17.91, + 17.9, + 18.08, + 13.00, + 0, + -0.05, + -0.08, + -0.05 + ], + [ + "2016-09-14", + 17.99, + 17.54, + 17.48, + 17.99, + 22.00, + 0, + -0.09, + -0.09, + -0.05 + ], + [ + "2016-09-19", + 17.55, + 17.81, + 17.55, + 17.88, + 16.00, + 0, + -0.06, + -0.06, + -0.03 + ], + [ + "2016-09-20", + 17.8, + 17.74, + 17.67, + 17.85, + 10.00, + 0, + -0.06, + -0.05, + -0.02 + ], + [ + "2016-09-21", + 17.75, + 17.88, + 17.75, + 17.95, + 7.00, + 0, + -0.03, + -0.03, + -0.02 + ], + [ + "2016-09-22", + 17.99, + 17.97, + 17.88, + 18.17, + 12.00, + 0, + -0.02, + -0.02, + -0.01 + ], + [ + "2016-09-23", + 17.99, + 17.98, + 17.93, + 18.09, + 13.00, + 0, + -0.01, + -0.01, + -0.01 + ], + [ + "2016-09-26", + 17.91, + 18.0, + 17.85, + 18.09, + 14.00, + 0, + -0.00, + -0.01, + -0.01 + ], + [ + "2016-09-27", + 17.97, + 18.07, + 17.94, + 18.1, + 10.00, + 0, + 0.00, + -0.01, + -0.01 + ], + [ + "2016-09-28", + 18.06, + 17.89, + 17.83, + 18.06, + 10.00, + 0, + -0.00, + -0.01, + -0.01 + ], + [ + "2016-09-29", + 17.96, + 18.0, + 17.92, + 18.07, + 10.00, + 0, + 0.03, + 0.01, + -0.01 + ], + [ + "2016-09-30", + 17.96, + 18.0, + 17.95, + 18.1, + 8.00, + 0, + 0.06, + 0.02, + -0.01 + ], + [ + "2016-10-10", + 18.03, + 18.3, + 18.03, + 18.38, + 19.00, + 0, + 0.11, + 0.04, + -0.02 + ], + [ + "2016-10-11", + 18.33, + 18.33, + 18.26, + 18.49, + 12.00, + 0, + 0.10, + 0.02, + -0.04 + ], + [ + "2016-10-12", + 18.28, + 18.15, + 18.1, + 18.31, + 10.00, + 0, + 0.07, + -0.02, + -0.05 + ], + [ + "2016-10-13", + 18.15, + 18.09, + 18.05, + 18.21, + 10.00, + 0, + 0.06, + -0.03, + -0.06 + ], + [ + "2016-10-14", + 18.1, + 18.1, + 18.0, + 18.15, + 12.00, + 0, + 0.04, + -0.05, + -0.07 + ], + [ + "2016-10-17", + 18.07, + 17.86, + 17.83, + 18.1, + 12.00, + 0, + 0.01, + -0.07, + -0.08 + ], + [ + "2016-10-18", + 17.86, + 17.93, + 17.84, + 17.99, + 14.00, + 0, + 0.03, + -0.07, + -0.08 + ], + [ + "2016-10-19", + 17.93, + 17.88, + 17.83, + 18.05, + 11.00, + 0, + 0.03, + -0.07, + -0.08 + ], + [ + "2016-10-20", + 17.9, + 17.89, + 17.83, + 17.98, + 12.00, + 0, + 0.05, + -0.06, + -0.09 + ], + [ + "2016-10-21", + 17.91, + 17.91, + 17.82, + 17.93, + 12.00, + 0, + 0.07, + -0.06, + -0.09 + ], + [ + "2016-10-24", + 17.93, + 18.31, + 17.86, + 18.42, + 29.00, + 0, + 0.11, + -0.05, + -0.10 + ], + [ + "2016-10-25", + 18.31, + 18.13, + 18.09, + 18.46, + 19.00, + 0, + 0.06, + -0.09, + -0.12 + ], + [ + "2016-10-26", + 18.12, + 17.97, + 17.95, + 18.15, + 14.00, + 0, + 0.02, + -0.12, + -0.13 + ], + [ + "2016-10-27", + 18.06, + 17.81, + 17.77, + 18.06, + 21.00, + 0, + -0.01, + -0.13, + -0.13 + ], + [ + "2016-10-28", + 17.8, + 17.9, + 17.8, + 18.05, + 20.00, + 0, + -0.01, + -0.13, + -0.13 + ], + [ + "2016-10-31", + 17.87, + 17.86, + 17.72, + 17.96, + 12.00, + 0, + -0.02, + -0.14, + -0.13 + ], + [ + "2016-11-01", + 17.87, + 17.98, + 17.79, + 17.99, + 18.00, + 0, + -0.03, + -0.14, + -0.12 + ], + [ + "2016-11-02", + 17.86, + 17.84, + 17.76, + 17.94, + 30.00, + 0, + -0.06, + -0.15, + -0.12 + ], + [ + "2016-11-03", + 17.83, + 17.93, + 17.79, + 17.97, + 27.00, + 0, + -0.07, + -0.14, + -0.11 + ], + [ + "2016-11-04", + 17.9, + 17.91, + 17.87, + 18.0, + 26.00, + 0, + -0.09, + -0.15, + -0.10 + ], + [ + "2016-11-07", + 17.91, + 17.89, + 17.85, + 17.93, + 20.00, + 0, + -0.11, + -0.14, + -0.09 + ], + [ + "2016-11-08", + 17.92, + 17.99, + 17.89, + 18.06, + 26.00, + 0, + -0.12, + -0.13, + -0.07 + ], + [ + "2016-11-09", + 18.0, + 17.89, + 17.77, + 18.08, + 34.00, + 0, + -0.15, + -0.13, + -0.06 + ], + [ + "2016-11-10", + 17.95, + 18.0, + 17.94, + 18.11, + 27.00, + 0, + -0.15, + -0.11, + -0.03 + ], + [ + "2016-11-11", + 17.95, + 18.02, + 17.93, + 18.08, + 27.00, + 0, + -0.17, + -0.10, + -0.01 + ], + [ + "2016-11-14", + 18.0, + 18.04, + 17.95, + 18.25, + 35.00, + 0, + -0.18, + -0.08, + 0.01 + ], + [ + "2016-11-15", + 18.1, + 18.18, + 18.03, + 18.24, + 25.00, + 0, + -0.18, + -0.06, + 0.04 + ], + [ + "2016-11-16", + 18.23, + 18.12, + 18.05, + 18.29, + 23.00, + 0, + -0.21, + -0.04, + 0.06 + ], + [ + "2016-11-17", + 18.11, + 18.12, + 18.01, + 18.14, + 27.00, + 0, + -0.21, + -0.01, + 0.09 + ], + [ + "2016-11-18", + 18.12, + 18.1, + 18.03, + 18.16, + 18.00, + 0, + -0.19, + 0.03, + 0.12 + ], + [ + "2016-11-21", + 18.08, + 18.34, + 18.08, + 18.68, + 41.00, + 0, + -0.13, + 0.08, + 0.15 + ], + [ + "2016-11-22", + 18.37, + 18.37, + 18.28, + 18.49, + 52.00, + 0, + -0.09, + 0.12, + 0.17 + ], + [ + "2016-11-23", + 18.4, + 18.84, + 18.37, + 18.9, + 66.00, + 0, + -0.02, + 0.17, + 0.18 + ], + [ + "2016-11-24", + 18.77, + 18.74, + 18.61, + 18.97, + 26.00, + 0, + -0.02, + 0.17, + 0.18 + ], + [ + "2016-11-25", + 18.8, + 18.99, + 18.66, + 19.02, + 40.00, + 0, + -0.01, + 0.18, + 0.19 + ], + [ + "2016-11-28", + 19.1, + 18.65, + 18.52, + 19.2, + 85.00, + 0, + -0.06, + 0.16, + 0.19 + ], + [ + "2016-11-29", + 18.65, + 18.75, + 18.51, + 18.76, + 49.00, + 0, + -0.06, + 0.17, + 0.20 + ], + [ + "2016-11-30", + 18.76, + 18.55, + 18.47, + 18.82, + 39.00, + 0, + -0.08, + 0.17, + 0.21 + ], + [ + "2016-12-01", + 18.55, + 18.49, + 18.41, + 18.64, + 53.00, + 0, + -0.06, + 0.19, + 0.22 + ], + [ + "2016-12-02", + 18.53, + 18.49, + 18.24, + 18.54, + 48.00, + 0, + -0.02, + 0.21, + 0.23 + ], + [ + "2016-12-05", + 18.39, + 18.66, + 18.34, + 18.67, + 50.00, + 0, + 0.03, + 0.25, + 0.23 + ], + [ + "2016-12-06", + 18.66, + 18.6, + 18.57, + 18.78, + 31.00, + 0, + 0.08, + 0.26, + 0.23 + ], + [ + "2016-12-07", + 18.65, + 18.62, + 18.58, + 18.71, + 12.00, + 0, + 0.15, + 0.29, + 0.21 + ], + [ + "2016-12-08", + 18.67, + 18.76, + 18.62, + 18.88, + 26.00, + 0, + 0.25, + 0.32, + 0.19 + ], + [ + "2016-12-09", + 18.76, + 19.2, + 18.75, + 19.34, + 62.00, + 0, + 0.34, + 0.33, + 0.16 + ], + [ + "2016-12-12", + 19.16, + 19.25, + 18.9, + 19.65, + 79.00, + 1, + 0.34, + 0.28, + 0.11 + ], + [ + "2016-12-13", + 19.09, + 18.88, + 18.81, + 19.2, + 24.00, + 0, + 0.27, + 0.20, + 0.06 + ], + [ + "2016-12-14", + 18.8, + 18.82, + 18.8, + 19.14, + 32.00, + 0, + 0.23, + 0.13, + 0.02 + ], + [ + "2016-12-15", + 18.73, + 18.24, + 18.2, + 18.73, + 36.00, + 0, + 0.13, + 0.05, + -0.01 + ], + [ + "2016-12-16", + 18.24, + 18.18, + 18.12, + 18.4, + 24.00, + 0, + 0.10, + 0.02, + -0.03 + ], + [ + "2016-12-19", + 18.15, + 18.01, + 17.93, + 18.18, + 24.00, + 0, + 0.06, + -0.02, + -0.05 + ], + [ + "2016-12-20", + 17.99, + 17.79, + 17.7, + 17.99, + 29.00, + 1, + 0.02, + -0.05, + -0.05 + ], + [ + "2016-12-21", + 17.83, + 17.81, + 17.77, + 17.98, + 30.00, + 0, + 0.00, + -0.05, + -0.06 + ], + [ + "2016-12-22", + 17.85, + 17.72, + 17.65, + 17.85, + 21.00, + 0, + -0.03, + -0.07, + -0.06 + ], + [ + "2016-12-23", + 17.77, + 17.6, + 17.54, + 17.77, + 18.00, + 0, + -0.04, + -0.08, + -0.05 + ], + [ + "2016-12-26", + 17.56, + 17.75, + 17.39, + 17.77, + 16.00, + 0, + -0.04, + -0.07, + -0.05 + ], + [ + "2016-12-27", + 17.73, + 17.71, + 17.65, + 17.82, + 10.00, + 0, + -0.06, + -0.07, + -0.04 + ], + [ + "2016-12-28", + 17.72, + 17.62, + 17.49, + 17.77, + 26.00, + 0, + -0.09, + -0.07, + -0.03 + ], + [ + "2016-12-29", + 17.6, + 17.49, + 17.43, + 17.62, + 28.00, + 0, + -0.09, + -0.06, + -0.02 + ], + [ + "2016-12-30", + 17.53, + 17.6, + 17.47, + 17.61, + 22.00, + 0, + -0.05, + -0.03, + -0.01 + ], + [ + "2017-01-03", + 17.6, + 17.92, + 17.57, + 17.98, + 28.00, + 1, + 0.00, + 0.00, + 0.00 + ] + ] +} diff --git a/public/config/jzx.json b/public/config/jzx.json new file mode 100644 index 0000000..eb41f90 --- /dev/null +++ b/public/config/jzx.json @@ -0,0 +1,194 @@ +{ + "status": "success", + "message": "OK", + "data": { + "locations": [ + { + "id": 1, + "name": "Corinto", + "state": "Departamento de Chinandega", + "country": "Nicaragua", + "country_code": "NI", + "locode": null, + "lat": 12.4825, + "lng": -87.17304 + }, + { + "id": 2, + "name": "Managua", + "state": "Departamento de Managua", + "country": "Nicaragua", + "country_code": "NI", + "locode": "NIMGA", + "lat": 12.13282, + "lng": -86.2504 + }, + { + "id": 3, + "name": "Shekou", + "state": "Guangdong Sheng", + "country": "China", + "country_code": "CN", + "locode": "CNSHK", + "lat": 22.49359, + "lng": 113.9156 + }, + { + "id": 4, + "name": "Manzanillo", + "state": "Estado de Colima", + "country": "Mexico", + "country_code": "MX", + "locode": "MXZLO", + "lat": 19.11695, + "lng": -104.34214 + }, + { + "id": 5, + "name": "Balboa", + "state": "Provincia de Panama", + "country": "Panama", + "country_code": "PA", + "locode": "PABLB", + "lat": 8.94814, + "lng": -79.56672 + } + ], + "vessels": [ + { + "id": 1, + "name": "MSC PHOENIX", + "imo": "9267649", + "call_sign": "D5HF8", + "mmsi": "636016672", + "flag": "LR" + }, + { + "id": 2, + "name": "MELBOURNE STRAIT", + "imo": "9362736", + "call_sign": "D5GX2", + "mmsi": "636016590", + "flag": "LR" + }, + { + "id": 3, + "name": "VARAMO", + "imo": "9395044", + "call_sign": "C4SQ2", + "mmsi": "210950000", + "flag": "CY" + } + ], + "container": { + "number": "MSCU4634930", + "iso_code": "42V0", + "events": [ + { + "id": 1, + "location": 3, + "description": "Empty to Shipper", + "status": "CEP", + "date": "2021-10-22T00:00:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "id": 2, + "location": 3, + "description": "Export received at CY", + "status": "LTS", + "date": "2021-10-24T00:00:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "id": 3, + "location": 3, + "description": "Export Loaded on Vessel", + "status": "CLL", + "date": "2021-11-04T00:00:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "XA142A", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "id": 4, + "location": 4, + "description": "Full Transshipment Discharged", + "status": "CDT", + "date": "2021-11-28T00:00:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "XA142A", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "id": 5, + "location": 4, + "description": "Full Transshipment Loaded", + "status": "CLT", + "date": "2021-12-20T00:00:00", + "actual": true, + "type": "sea", + "vessel": 2, + "voyage": "419S", + "vesselCompliance": 1, + "locationCompliance": 0 + }, + { + "id": 6, + "location": 5, + "description": "Full Transshipment Discharged", + "status": "CDT", + "date": "2022-01-03T00:00:00", + "actual": true, + "type": "sea", + "vessel": 2, + "voyage": "419N", + "vesselCompliance": 1, + "locationCompliance": 0 + }, + { + "id": 7, + "location": 5, + "description": "Full Transshipment Loaded", + "status": "CLT", + "date": "2022-01-04T00:00:00", + "actual": true, + "type": "sea", + "vessel": 3, + "voyage": "21025N", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "id": 8, + "location": 1, + "description": "Import Discharged from Vessel", + "status": "CDD", + "date": "2022-01-10T00:00:00", + "actual": true, + "type": "sea", + "vessel": 3, + "voyage": "21025R", + "vesselCompliance": 0, + "locationCompliance": 0 + } + ] + } + } +} diff --git a/public/config/menu.json b/public/config/menu.json new file mode 100644 index 0000000..dac54b3 --- /dev/null +++ b/public/config/menu.json @@ -0,0 +1,165 @@ +{ + "menu": [ + { + "index": "1", + "name": "轨迹记录", + "nameEn": "Voyage History", + "title": "轨迹记录", + "icon": "/img/Voyage-History.png", + "type": "TrackRecordLogTemp", + "open": false, + "children": [] + }, + { + "index": "2", + "name": "区域列表", + "nameEn": "Area List", + "title": "区域列表", + "icon": "/menu-icon/areaList.svg", + "type": "AreaListTemp", + "open": true, + "children": [] + }, + { + "index": "3", + "name": "搜索记录", + "nameEn": "Search History", + "title": "搜索记录", + "icon": "/img/Search-History.png", + "type": "SearchListTemp", + "open": false, + "children": [] + }, + { + "index": "4", + "name": "数据分析", + "nameEn": "Data Analysis", + "title": "数据分析", + "icon": "/menu-icon/dataAnalysis.svg", + "type": "DataAnalysisTemp", + "open": false, + "children": [] + }, + { + "index": "5", + "name": "地图工具", + "nameEn": "Map Selection", + "title": "地图工具", + "icon": "/img/Map-Selection.png", + "type": "MapToolTemp", + "open": false, + "children": [] + }, + { + "index": "6", + "name": "全部船队", + "nameEn": "My Fleets", + "title": "全部船队", + "icon": "/img/All-Fleets.png", + "type": "ShipRanksTemp", + "open": true, + "children": [] + }, + { + "index": "7", + "name": "海况天气", + "nameEn": "Marine Weather", + "title": "海况天气", + "icon": "/img/Weather.png", + "type": "WeatherTemp", + "open": false, + "children": [] + }, + { + "index": "8", + "name": "航线查询", + "nameEn": "Voyage", + "title": "航线查询", + "icon": "/img/Voyage.png", + "type": "RouteQueryTemp", + "open": false, + "children": [] + }, + { + "index": "9", + "name": "集装箱查询", + "nameEn": "Container Module", + "title": "集装箱查询", + "icon": "/menu-icon/jizhuangxiang.png", + "type": "ContainerQueryTemp", + "open": false, + "children": [] + }, + { + "index": "10", + "name": "港口信息", + "nameEn": "Ship Movement", + "title": "在港动态", + "icon": "/img/Ship-Movement.png", + "type": "ArriveLeaveQueryTemp", + "open": false, + "children": [ + { + "index": "10-3", + "name": "预计到港", + "nameEn": "Arriving", + "title": "预计到港", + "icon": "/menu-icon/port4.png", + "type": "ExpectedArrivalTemp", + "open": true, + "children": [] + }, + { + "index": "10-1", + "name": "到港查询", + "nameEn": "Arrived", + "title": "到港查询", + "icon": "/menu-icon/port4.png", + "type": "ArriveLeaveQueryTemp", + "open": true, + "children": [] + }, + { + "index": "10-2", + "name": "离港查询", + "nameEn": "Departured", + "title": "离港查询", + "icon": "/menu-icon/port4.png", + "type": "DepartureInquiryTemp", + "open": true, + "children": [] + }, + { + "index": "10-5", + "name": "在泊统计", + "nameEn": "Ship at Berths", + "title": "在泊统计", + "icon": "/menu-icon/mapTool.svg", + "type": "NumberOfBerthsTemp", + "open": true, + "children": [] + }, + { + "index": "10-4", + "name": "原油港口", + "nameEn": "Crude Oil Port", + "title": "原油港口", + "icon": "/menu-icon/mapTool.svg", + "type": "ArriveLeaveQueryTemp", + "open": false, + "children": [] + } + ] + }, + { + "index": "11", + "name": "航行通告", + "nameEn": "Voyage Notices", + "title": "航行通告", + "icon": "/menu-icon/port3.png", + "type": "NotanTemp", + "open": false, + "children": [] + } + ] +} diff --git a/public/config/sys-config.json b/public/config/sys-config.json new file mode 100644 index 0000000..acad9a8 --- /dev/null +++ b/public/config/sys-config.json @@ -0,0 +1,10 @@ +{ + "projectName": "zero2", + "title": "海南零关税交通工具监管系统", + "appKey": "4b9d580cc20f41398959c18ac1561350", + "publicKey": "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKSETfiTgz/BfdoOHsalLwT9Ovyb4eLL8OLLcs7c5pEaL3/FQG44L806IyWBzKlkYZHzb/qXC4I6paaW3hRIXYrurdAd7Yh72Rk4s/+k/M7kbQllaFs+xbHRfQr0ztuk2ezPNJP4LlBsyPlOYU0fD3hDS2WVH27gUECZhTgxk58dAgMBAAECgYA3B9KVDbLfhre0UvjUdbiusI4kpXf/xzxCgM9chuPRMbMlyDNvKvhCa+oJx8tP9jX0/js81X2SCFAU025h1nsDTX64p7VqfZyiknQVDzapBLpkYT16EjOJ4Fj640IoGjLEmVNkuq/QJxG2QSSDFqSIlhmJMDpWuNZ3b57r7kBQQQJBAOxChIa9JN1AVlnJKaJlrBf1/mlqfhSXJQnwy8TfoeJ1NMiTwKa2QXZsrA/YMiO4ZwyYMevr1eDGfvz5MOv+pekCQQCyQz0g5HU9rnTTxOOQhnUWXmnJ60ftOnvTH0dh2z2h2VjZ2xLSLMwP0dWtZTSK6TY5jEbEvkWO+VKOD/gTtwsVAkBcpPzY5SSmigsSbDqiTuI8Bx97cOH96wMAMeeFzPfrGHDZUm8SMJfc+2JBWFLZBP+LxcaVr8YPvWaghorzj8i5AkBWTy3iphqJ0dToz7Rqvl8khHPt+sfpeV6ImuVh4NfXbDeTy3kyX9QxeKRfftfQxhemB2AgVAuzrM2m0N6JFR/9AkAU9WQUI5wK5DkQxxinQf7bWt7adORSMPK7dANUtWeTAog985g9bwXhiYHrvA3DW0Ca3DVZkfqMdblekciO9XSH", + "defaultLanguage": "Chinese", + "map": { + "weatherLayerOpacity": 0.8 + } +} diff --git a/public/config/td.json b/public/config/td.json new file mode 100644 index 0000000..d3217db --- /dev/null +++ b/public/config/td.json @@ -0,0 +1,756 @@ +{ + "status": "success", + "message": "OK", + "data": { + "locations": [ + { + "id": 1, + "name": "Busan", + "state": "Busan", + "country": "South Korea", + "country_code": "KR", + "locode": "KRPUS", + "lat": 35.10168, + "lng": 129.03004 + }, + { + "id": 2, + "name": "Shanghai", + "state": "Shanghai Shi", + "country": "China", + "country_code": "CN", + "locode": "CNSHG", + "lat": 31.366365, + "lng": 121.61475 + }, + { + "id": 3, + "name": "Gumi", + "state": "Gyeongsangbuk-do", + "country": "South Korea", + "country_code": "KR", + "locode": "KRKUI", + "lat": 36.1136, + "lng": 128.336 + } + ], + "vessels": [ + { + "id": 1, + "name": "SEABREEZE", + "imo": "9472579", + "call_sign": "5LCI2", + "mmsi": "636021108", + "flag": "LR" + } + ], + "containers": [ + { + "number": "BSIU9807691", + "iso_code": "42V0", + "events": [ + { + "location": 3, + "description": "Empty Container Release to Shipper", + "status": "CEP", + "date": "2021-12-20T13:39:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Gate In to Outbound Terminal", + "status": "CGI", + "date": "2021-12-29T21:00:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Loaded on at Port of Loading", + "status": "CLL", + "date": "2021-12-31T16:14:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Departure from Port of Loading", + "status": "VDL", + "date": "2022-01-01T00:00:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Arrival at Port of Discharging", + "status": "VAD", + "date": "2022-01-02T04:30:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "POD Berthing Destination", + "status": "UNK", + "date": "2022-01-02T09:30:00", + "actual": true, + "type": "land", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Unloaded from at Port of Discharging", + "status": "CDD", + "date": "2022-01-02T10:22:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Gate Out from Inbound Terminal for Delivery to Consignee (or Port Shuttle)", + "status": "CGO", + "date": "2022-01-07T06:38:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Empty Container Returned from Customer", + "status": "CER", + "date": "2022-01-07T12:49:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + } + ] + }, + { + "number": "GAOU6639366", + "iso_code": "42V0", + "events": [ + { + "location": 3, + "description": "Empty Container Release to Shipper", + "status": "CEP", + "date": "2021-12-17T11:37:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Gate In to Outbound Terminal", + "status": "CGI", + "date": "2021-12-29T16:53:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Loaded on at Port of Loading", + "status": "CLL", + "date": "2021-12-31T16:51:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Departure from Port of Loading", + "status": "VDL", + "date": "2022-01-01T00:00:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Arrival at Port of Discharging", + "status": "VAD", + "date": "2022-01-02T04:30:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "POD Berthing Destination", + "status": "UNK", + "date": "2022-01-02T09:30:00", + "actual": true, + "type": "land", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Unloaded from at Port of Discharging", + "status": "CDD", + "date": "2022-01-02T10:00:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Gate Out from Inbound Terminal for Delivery to Consignee (or Port Shuttle)", + "status": "CGO", + "date": "2022-01-08T05:56:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Empty Container Returned from Customer", + "status": "CER", + "date": "2022-01-08T11:28:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + } + ] + }, + { + "number": "TRHU8216084", + "iso_code": "42V0", + "events": [ + { + "location": 3, + "description": "Empty Container Release to Shipper", + "status": "CEP", + "date": "2021-12-17T11:37:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Gate In to Outbound Terminal", + "status": "CGI", + "date": "2021-12-29T18:21:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Loaded on at Port of Loading", + "status": "CLL", + "date": "2021-12-31T16:57:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Departure from Port of Loading", + "status": "VDL", + "date": "2022-01-01T00:00:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Arrival at Port of Discharging", + "status": "VAD", + "date": "2022-01-02T04:30:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "POD Berthing Destination", + "status": "UNK", + "date": "2022-01-02T09:30:00", + "actual": true, + "type": "land", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Unloaded from at Port of Discharging", + "status": "CDD", + "date": "2022-01-02T09:57:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Gate Out from Inbound Terminal for Delivery to Consignee (or Port Shuttle)", + "status": "CGO", + "date": "2022-01-08T09:28:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Empty Container Returned from Customer", + "status": "CER", + "date": "2022-01-08T14:08:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + } + ] + }, + { + "number": "TRHU7278950", + "iso_code": "42V0", + "events": [ + { + "location": 3, + "description": "Empty Container Release to Shipper", + "status": "CEP", + "date": "2021-12-20T13:40:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Gate In to Outbound Terminal", + "status": "CGI", + "date": "2021-12-29T21:28:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Loaded on at Port of Loading", + "status": "CLL", + "date": "2021-12-31T16:05:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Departure from Port of Loading", + "status": "VDL", + "date": "2022-01-01T00:00:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Arrival at Port of Discharging", + "status": "VAD", + "date": "2022-01-02T04:30:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "POD Berthing Destination", + "status": "UNK", + "date": "2022-01-02T09:30:00", + "actual": true, + "type": "land", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Unloaded from at Port of Discharging", + "status": "CDD", + "date": "2022-01-02T10:26:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Gate Out from Inbound Terminal for Delivery to Consignee (or Port Shuttle)", + "status": "CGO", + "date": "2022-01-08T06:54:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Empty Container Returned from Customer", + "status": "CER", + "date": "2022-01-08T13:29:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + } + ] + }, + { + "number": "TRHU8041896", + "iso_code": "42V0", + "events": [ + { + "location": 3, + "description": "Empty Container Release to Shipper", + "status": "CEP", + "date": "2021-12-17T11:37:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Gate In to Outbound Terminal", + "status": "CGI", + "date": "2021-12-29T17:41:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Loaded on at Port of Loading", + "status": "CLL", + "date": "2021-12-31T19:29:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Departure from Port of Loading", + "status": "VDL", + "date": "2022-01-01T00:00:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Arrival at Port of Discharging", + "status": "VAD", + "date": "2022-01-02T04:30:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "POD Berthing Destination", + "status": "UNK", + "date": "2022-01-02T09:30:00", + "actual": true, + "type": "land", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Unloaded from at Port of Discharging", + "status": "CDD", + "date": "2022-01-02T10:30:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Gate Out from Inbound Terminal for Delivery to Consignee (or Port Shuttle)", + "status": "CGO", + "date": "2022-01-07T14:30:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Empty Container Returned from Customer", + "status": "CER", + "date": "2022-01-08T06:57:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + } + ] + }, + { + "number": "TGBU5312141", + "iso_code": "42V0", + "events": [ + { + "location": 3, + "description": "Empty Container Release to Shipper", + "status": "CEP", + "date": "2021-12-20T13:39:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Gate In to Outbound Terminal", + "status": "CGI", + "date": "2021-12-29T19:27:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Loaded on at Port of Loading", + "status": "CLL", + "date": "2021-12-31T16:43:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 1, + "description": "Departure from Port of Loading", + "status": "VDL", + "date": "2022-01-01T00:00:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Arrival at Port of Discharging", + "status": "VAD", + "date": "2022-01-02T04:30:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "POD Berthing Destination", + "status": "UNK", + "date": "2022-01-02T09:30:00", + "actual": true, + "type": "land", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Unloaded from at Port of Discharging", + "status": "CDD", + "date": "2022-01-02T10:06:00", + "actual": true, + "type": "sea", + "vessel": 1, + "voyage": "170S", + "vesselCompliance": 0, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Gate Out from Inbound Terminal for Delivery to Consignee (or Port Shuttle)", + "status": "CGO", + "date": "2022-01-07T07:28:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + }, + { + "location": 2, + "description": "Empty Container Returned from Customer", + "status": "CER", + "date": "2022-01-07T12:49:00", + "actual": true, + "type": "land", + "vessel": null, + "voyage": null, + "vesselCompliance": null, + "locationCompliance": 0 + } + ] + } + ], + "route": { + "prepol": { + "location": 3, + "date": "2021-12-20T13:39:00", + "actual": true + }, + "pol": { + "location": 1, + "date": "2022-01-01T00:00:00", + "actual": true + }, + "pod": { + "location": 2, + "date": "2022-01-02T04:30:00", + "actual": true + }, + "postpod": { + "location": 2, + "date": "2022-01-02T04:30:00", + "actual": true + } + } + } +} diff --git a/public/country-img/AFG.png b/public/country-img/AFG.png new file mode 100644 index 0000000..8f43ed9 Binary files /dev/null and b/public/country-img/AFG.png differ diff --git a/public/country-img/AGO.png b/public/country-img/AGO.png new file mode 100644 index 0000000..8e09c35 Binary files /dev/null and b/public/country-img/AGO.png differ diff --git a/public/country-img/AIA.png b/public/country-img/AIA.png new file mode 100644 index 0000000..bcae48c Binary files /dev/null and b/public/country-img/AIA.png differ diff --git a/public/country-img/AKU.png b/public/country-img/AKU.png new file mode 100644 index 0000000..2a4ab52 Binary files /dev/null and b/public/country-img/AKU.png differ diff --git a/public/country-img/ALB.png b/public/country-img/ALB.png new file mode 100644 index 0000000..e9349a0 Binary files /dev/null and b/public/country-img/ALB.png differ diff --git a/public/country-img/AND.png b/public/country-img/AND.png new file mode 100644 index 0000000..bb535ee Binary files /dev/null and b/public/country-img/AND.png differ diff --git a/public/country-img/ARE.png b/public/country-img/ARE.png new file mode 100644 index 0000000..8ff7122 Binary files /dev/null and b/public/country-img/ARE.png differ diff --git a/public/country-img/ARG.png b/public/country-img/ARG.png new file mode 100644 index 0000000..a409835 Binary files /dev/null and b/public/country-img/ARG.png differ diff --git a/public/country-img/ARM.png b/public/country-img/ARM.png new file mode 100644 index 0000000..eba1add Binary files /dev/null and b/public/country-img/ARM.png differ diff --git a/public/country-img/ASM.png b/public/country-img/ASM.png new file mode 100644 index 0000000..354bf3a Binary files /dev/null and b/public/country-img/ASM.png differ diff --git a/public/country-img/ATG.png b/public/country-img/ATG.png new file mode 100644 index 0000000..3570ae9 Binary files /dev/null and b/public/country-img/ATG.png differ diff --git a/public/country-img/AUS.png b/public/country-img/AUS.png new file mode 100644 index 0000000..e53a48f Binary files /dev/null and b/public/country-img/AUS.png differ diff --git a/public/country-img/AUT.png b/public/country-img/AUT.png new file mode 100644 index 0000000..f56ac25 Binary files /dev/null and b/public/country-img/AUT.png differ diff --git a/public/country-img/AZE.png b/public/country-img/AZE.png new file mode 100644 index 0000000..29da885 Binary files /dev/null and b/public/country-img/AZE.png differ diff --git a/public/country-img/BDI.png b/public/country-img/BDI.png new file mode 100644 index 0000000..43d1708 Binary files /dev/null and b/public/country-img/BDI.png differ diff --git a/public/country-img/BEL.png b/public/country-img/BEL.png new file mode 100644 index 0000000..cff0bfd Binary files /dev/null and b/public/country-img/BEL.png differ diff --git a/public/country-img/BEN.png b/public/country-img/BEN.png new file mode 100644 index 0000000..7469631 Binary files /dev/null and b/public/country-img/BEN.png differ diff --git a/public/country-img/BFA.png b/public/country-img/BFA.png new file mode 100644 index 0000000..0f2961d Binary files /dev/null and b/public/country-img/BFA.png differ diff --git a/public/country-img/BGD.png b/public/country-img/BGD.png new file mode 100644 index 0000000..3e6fcbf Binary files /dev/null and b/public/country-img/BGD.png differ diff --git a/public/country-img/BGR.png b/public/country-img/BGR.png new file mode 100644 index 0000000..68d8cc0 Binary files /dev/null and b/public/country-img/BGR.png differ diff --git a/public/country-img/BHR.png b/public/country-img/BHR.png new file mode 100644 index 0000000..f8b7631 Binary files /dev/null and b/public/country-img/BHR.png differ diff --git a/public/country-img/BHS.png b/public/country-img/BHS.png new file mode 100644 index 0000000..7774859 Binary files /dev/null and b/public/country-img/BHS.png differ diff --git a/public/country-img/BIH.png b/public/country-img/BIH.png new file mode 100644 index 0000000..aeb1125 Binary files /dev/null and b/public/country-img/BIH.png differ diff --git a/public/country-img/BLR.png b/public/country-img/BLR.png new file mode 100644 index 0000000..00f0ebf Binary files /dev/null and b/public/country-img/BLR.png differ diff --git a/public/country-img/BLZ.png b/public/country-img/BLZ.png new file mode 100644 index 0000000..9fe8af0 Binary files /dev/null and b/public/country-img/BLZ.png differ diff --git a/public/country-img/BMU.png b/public/country-img/BMU.png new file mode 100644 index 0000000..8ce6d07 Binary files /dev/null and b/public/country-img/BMU.png differ diff --git a/public/country-img/BOL.png b/public/country-img/BOL.png new file mode 100644 index 0000000..374f126 Binary files /dev/null and b/public/country-img/BOL.png differ diff --git a/public/country-img/BRA.png b/public/country-img/BRA.png new file mode 100644 index 0000000..c963963 Binary files /dev/null and b/public/country-img/BRA.png differ diff --git a/public/country-img/BRB.png b/public/country-img/BRB.png new file mode 100644 index 0000000..afc1465 Binary files /dev/null and b/public/country-img/BRB.png differ diff --git a/public/country-img/BRN.png b/public/country-img/BRN.png new file mode 100644 index 0000000..6b430f2 Binary files /dev/null and b/public/country-img/BRN.png differ diff --git a/public/country-img/BTN.png b/public/country-img/BTN.png new file mode 100644 index 0000000..4169b4c Binary files /dev/null and b/public/country-img/BTN.png differ diff --git a/public/country-img/BWA.png b/public/country-img/BWA.png new file mode 100644 index 0000000..5d6b631 Binary files /dev/null and b/public/country-img/BWA.png differ diff --git a/public/country-img/CAF.png b/public/country-img/CAF.png new file mode 100644 index 0000000..b62ab6b Binary files /dev/null and b/public/country-img/CAF.png differ diff --git a/public/country-img/CAN.png b/public/country-img/CAN.png new file mode 100644 index 0000000..ae26c25 Binary files /dev/null and b/public/country-img/CAN.png differ diff --git a/public/country-img/CCK.png b/public/country-img/CCK.png new file mode 100644 index 0000000..74dffa0 Binary files /dev/null and b/public/country-img/CCK.png differ diff --git a/public/country-img/CHA.png b/public/country-img/CHA.png new file mode 100644 index 0000000..3b4e5e2 Binary files /dev/null and b/public/country-img/CHA.png differ diff --git a/public/country-img/CHE.png b/public/country-img/CHE.png new file mode 100644 index 0000000..73d5fbb Binary files /dev/null and b/public/country-img/CHE.png differ diff --git a/public/country-img/CHL.png b/public/country-img/CHL.png new file mode 100644 index 0000000..100ccbf Binary files /dev/null and b/public/country-img/CHL.png differ diff --git a/public/country-img/CHN.gif b/public/country-img/CHN.gif new file mode 100644 index 0000000..e988c01 Binary files /dev/null and b/public/country-img/CHN.gif differ diff --git a/public/country-img/CHN.png b/public/country-img/CHN.png new file mode 100644 index 0000000..01e4057 Binary files /dev/null and b/public/country-img/CHN.png differ diff --git a/public/country-img/CIV.png b/public/country-img/CIV.png new file mode 100644 index 0000000..a29da60 Binary files /dev/null and b/public/country-img/CIV.png differ diff --git a/public/country-img/CMR.png b/public/country-img/CMR.png new file mode 100644 index 0000000..23c973e Binary files /dev/null and b/public/country-img/CMR.png differ diff --git a/public/country-img/COD.png b/public/country-img/COD.png new file mode 100644 index 0000000..e5bcb10 Binary files /dev/null and b/public/country-img/COD.png differ diff --git a/public/country-img/COG.png b/public/country-img/COG.png new file mode 100644 index 0000000..7ec4022 Binary files /dev/null and b/public/country-img/COG.png differ diff --git a/public/country-img/COK.png b/public/country-img/COK.png new file mode 100644 index 0000000..13a3ff1 Binary files /dev/null and b/public/country-img/COK.png differ diff --git a/public/country-img/COL.png b/public/country-img/COL.png new file mode 100644 index 0000000..732da94 Binary files /dev/null and b/public/country-img/COL.png differ diff --git a/public/country-img/COM.png b/public/country-img/COM.png new file mode 100644 index 0000000..44b68c1 Binary files /dev/null and b/public/country-img/COM.png differ diff --git a/public/country-img/CPV.png b/public/country-img/CPV.png new file mode 100644 index 0000000..c78637f Binary files /dev/null and b/public/country-img/CPV.png differ diff --git a/public/country-img/CRI.png b/public/country-img/CRI.png new file mode 100644 index 0000000..2c3cecc Binary files /dev/null and b/public/country-img/CRI.png differ diff --git a/public/country-img/CUB.png b/public/country-img/CUB.png new file mode 100644 index 0000000..bf15a77 Binary files /dev/null and b/public/country-img/CUB.png differ diff --git a/public/country-img/CXI.png b/public/country-img/CXI.png new file mode 100644 index 0000000..fc8551c Binary files /dev/null and b/public/country-img/CXI.png differ diff --git a/public/country-img/CYM.png b/public/country-img/CYM.png new file mode 100644 index 0000000..d7ab562 Binary files /dev/null and b/public/country-img/CYM.png differ diff --git a/public/country-img/CYP.png b/public/country-img/CYP.png new file mode 100644 index 0000000..8ca3b27 Binary files /dev/null and b/public/country-img/CYP.png differ diff --git a/public/country-img/CZE.png b/public/country-img/CZE.png new file mode 100644 index 0000000..b02840a Binary files /dev/null and b/public/country-img/CZE.png differ diff --git a/public/country-img/DEU.png b/public/country-img/DEU.png new file mode 100644 index 0000000..8b5003c Binary files /dev/null and b/public/country-img/DEU.png differ diff --git a/public/country-img/DJI.png b/public/country-img/DJI.png new file mode 100644 index 0000000..237aca4 Binary files /dev/null and b/public/country-img/DJI.png differ diff --git a/public/country-img/DMA.png b/public/country-img/DMA.png new file mode 100644 index 0000000..c6723e9 Binary files /dev/null and b/public/country-img/DMA.png differ diff --git a/public/country-img/DNK.png b/public/country-img/DNK.png new file mode 100644 index 0000000..dbb703e Binary files /dev/null and b/public/country-img/DNK.png differ diff --git a/public/country-img/DOM.png b/public/country-img/DOM.png new file mode 100644 index 0000000..b3f7da2 Binary files /dev/null and b/public/country-img/DOM.png differ diff --git a/public/country-img/DZA.png b/public/country-img/DZA.png new file mode 100644 index 0000000..d921c08 Binary files /dev/null and b/public/country-img/DZA.png differ diff --git a/public/country-img/ECU.png b/public/country-img/ECU.png new file mode 100644 index 0000000..4a56ffd Binary files /dev/null and b/public/country-img/ECU.png differ diff --git a/public/country-img/EGY.png b/public/country-img/EGY.png new file mode 100644 index 0000000..597d381 Binary files /dev/null and b/public/country-img/EGY.png differ diff --git a/public/country-img/ERI.png b/public/country-img/ERI.png new file mode 100644 index 0000000..635cf09 Binary files /dev/null and b/public/country-img/ERI.png differ diff --git a/public/country-img/ESH.png b/public/country-img/ESH.png new file mode 100644 index 0000000..42bc3ba Binary files /dev/null and b/public/country-img/ESH.png differ diff --git a/public/country-img/ESP.png b/public/country-img/ESP.png new file mode 100644 index 0000000..73b7e47 Binary files /dev/null and b/public/country-img/ESP.png differ diff --git a/public/country-img/EST.png b/public/country-img/EST.png new file mode 100644 index 0000000..697a46b Binary files /dev/null and b/public/country-img/EST.png differ diff --git a/public/country-img/ETH.png b/public/country-img/ETH.png new file mode 100644 index 0000000..fa99311 Binary files /dev/null and b/public/country-img/ETH.png differ diff --git a/public/country-img/FIN.png b/public/country-img/FIN.png new file mode 100644 index 0000000..b0884cb Binary files /dev/null and b/public/country-img/FIN.png differ diff --git a/public/country-img/FJI.png b/public/country-img/FJI.png new file mode 100644 index 0000000..9f9d49c Binary files /dev/null and b/public/country-img/FJI.png differ diff --git a/public/country-img/FLK.png b/public/country-img/FLK.png new file mode 100644 index 0000000..3048d51 Binary files /dev/null and b/public/country-img/FLK.png differ diff --git a/public/country-img/FRA.png b/public/country-img/FRA.png new file mode 100644 index 0000000..22e2365 Binary files /dev/null and b/public/country-img/FRA.png differ diff --git a/public/country-img/FRO.png b/public/country-img/FRO.png new file mode 100644 index 0000000..2c2a6c7 Binary files /dev/null and b/public/country-img/FRO.png differ diff --git a/public/country-img/FSM.png b/public/country-img/FSM.png new file mode 100644 index 0000000..2f4d6aa Binary files /dev/null and b/public/country-img/FSM.png differ diff --git a/public/country-img/GAB.png b/public/country-img/GAB.png new file mode 100644 index 0000000..5366f4b Binary files /dev/null and b/public/country-img/GAB.png differ diff --git a/public/country-img/GAF.png b/public/country-img/GAF.png new file mode 100644 index 0000000..ffcec45 Binary files /dev/null and b/public/country-img/GAF.png differ diff --git a/public/country-img/GBR.png b/public/country-img/GBR.png new file mode 100644 index 0000000..47c03e4 Binary files /dev/null and b/public/country-img/GBR.png differ diff --git a/public/country-img/GEO.png b/public/country-img/GEO.png new file mode 100644 index 0000000..80cbd12 Binary files /dev/null and b/public/country-img/GEO.png differ diff --git a/public/country-img/GHA.png b/public/country-img/GHA.png new file mode 100644 index 0000000..a4f71aa Binary files /dev/null and b/public/country-img/GHA.png differ diff --git a/public/country-img/GIB.png b/public/country-img/GIB.png new file mode 100644 index 0000000..f49a6ce Binary files /dev/null and b/public/country-img/GIB.png differ diff --git a/public/country-img/GIN.png b/public/country-img/GIN.png new file mode 100644 index 0000000..af10b0f Binary files /dev/null and b/public/country-img/GIN.png differ diff --git a/public/country-img/GLP.png b/public/country-img/GLP.png new file mode 100644 index 0000000..d31ef7e Binary files /dev/null and b/public/country-img/GLP.png differ diff --git a/public/country-img/GLP1.png b/public/country-img/GLP1.png new file mode 100644 index 0000000..1b76808 Binary files /dev/null and b/public/country-img/GLP1.png differ diff --git a/public/country-img/GMB.png b/public/country-img/GMB.png new file mode 100644 index 0000000..e897a19 Binary files /dev/null and b/public/country-img/GMB.png differ diff --git a/public/country-img/GNB.png b/public/country-img/GNB.png new file mode 100644 index 0000000..76828f1 Binary files /dev/null and b/public/country-img/GNB.png differ diff --git a/public/country-img/GNQ.png b/public/country-img/GNQ.png new file mode 100644 index 0000000..cec9e4f Binary files /dev/null and b/public/country-img/GNQ.png differ diff --git a/public/country-img/GRC.png b/public/country-img/GRC.png new file mode 100644 index 0000000..ad5f6bd Binary files /dev/null and b/public/country-img/GRC.png differ diff --git a/public/country-img/GRD.png b/public/country-img/GRD.png new file mode 100644 index 0000000..2a0e975 Binary files /dev/null and b/public/country-img/GRD.png differ diff --git a/public/country-img/GRL.png b/public/country-img/GRL.png new file mode 100644 index 0000000..c3323e8 Binary files /dev/null and b/public/country-img/GRL.png differ diff --git a/public/country-img/GTM.png b/public/country-img/GTM.png new file mode 100644 index 0000000..9b721a1 Binary files /dev/null and b/public/country-img/GTM.png differ diff --git a/public/country-img/GUY.png b/public/country-img/GUY.png new file mode 100644 index 0000000..f5ff1a0 Binary files /dev/null and b/public/country-img/GUY.png differ diff --git a/public/country-img/HKG.png b/public/country-img/HKG.png new file mode 100644 index 0000000..910ccac Binary files /dev/null and b/public/country-img/HKG.png differ diff --git a/public/country-img/HND.png b/public/country-img/HND.png new file mode 100644 index 0000000..14f001a Binary files /dev/null and b/public/country-img/HND.png differ diff --git a/public/country-img/HRV.png b/public/country-img/HRV.png new file mode 100644 index 0000000..730360b Binary files /dev/null and b/public/country-img/HRV.png differ diff --git a/public/country-img/HTI.png b/public/country-img/HTI.png new file mode 100644 index 0000000..1472a69 Binary files /dev/null and b/public/country-img/HTI.png differ diff --git a/public/country-img/HUN.png b/public/country-img/HUN.png new file mode 100644 index 0000000..35c5a05 Binary files /dev/null and b/public/country-img/HUN.png differ diff --git a/public/country-img/IDN.png b/public/country-img/IDN.png new file mode 100644 index 0000000..6edc05d Binary files /dev/null and b/public/country-img/IDN.png differ diff --git a/public/country-img/IND.png b/public/country-img/IND.png new file mode 100644 index 0000000..5ad57a6 Binary files /dev/null and b/public/country-img/IND.png differ diff --git a/public/country-img/IRL.png b/public/country-img/IRL.png new file mode 100644 index 0000000..7d93b1c Binary files /dev/null and b/public/country-img/IRL.png differ diff --git a/public/country-img/IRN.png b/public/country-img/IRN.png new file mode 100644 index 0000000..77183ed Binary files /dev/null and b/public/country-img/IRN.png differ diff --git a/public/country-img/IRQ.png b/public/country-img/IRQ.png new file mode 100644 index 0000000..e77952e Binary files /dev/null and b/public/country-img/IRQ.png differ diff --git a/public/country-img/ISL.png b/public/country-img/ISL.png new file mode 100644 index 0000000..c326339 Binary files /dev/null and b/public/country-img/ISL.png differ diff --git a/public/country-img/ISR.png b/public/country-img/ISR.png new file mode 100644 index 0000000..e21c7f3 Binary files /dev/null and b/public/country-img/ISR.png differ diff --git a/public/country-img/ITA.png b/public/country-img/ITA.png new file mode 100644 index 0000000..351de90 Binary files /dev/null and b/public/country-img/ITA.png differ diff --git a/public/country-img/JAM.png b/public/country-img/JAM.png new file mode 100644 index 0000000..a63cc0f Binary files /dev/null and b/public/country-img/JAM.png differ diff --git a/public/country-img/JOR.png b/public/country-img/JOR.png new file mode 100644 index 0000000..08579d4 Binary files /dev/null and b/public/country-img/JOR.png differ diff --git a/public/country-img/JPN.png b/public/country-img/JPN.png new file mode 100644 index 0000000..59817b3 Binary files /dev/null and b/public/country-img/JPN.png differ diff --git a/public/country-img/KAZ.png b/public/country-img/KAZ.png new file mode 100644 index 0000000..4624989 Binary files /dev/null and b/public/country-img/KAZ.png differ diff --git a/public/country-img/KEN.png b/public/country-img/KEN.png new file mode 100644 index 0000000..f9e8b75 Binary files /dev/null and b/public/country-img/KEN.png differ diff --git a/public/country-img/KGZ.png b/public/country-img/KGZ.png new file mode 100644 index 0000000..11dfce7 Binary files /dev/null and b/public/country-img/KGZ.png differ diff --git a/public/country-img/KHM.png b/public/country-img/KHM.png new file mode 100644 index 0000000..5244a58 Binary files /dev/null and b/public/country-img/KHM.png differ diff --git a/public/country-img/KIR.png b/public/country-img/KIR.png new file mode 100644 index 0000000..758f441 Binary files /dev/null and b/public/country-img/KIR.png differ diff --git a/public/country-img/KNA.png b/public/country-img/KNA.png new file mode 100644 index 0000000..fb72698 Binary files /dev/null and b/public/country-img/KNA.png differ diff --git a/public/country-img/KOR.png b/public/country-img/KOR.png new file mode 100644 index 0000000..bcc44bf Binary files /dev/null and b/public/country-img/KOR.png differ diff --git a/public/country-img/KWT.png b/public/country-img/KWT.png new file mode 100644 index 0000000..3ae0f24 Binary files /dev/null and b/public/country-img/KWT.png differ diff --git a/public/country-img/LAO.png b/public/country-img/LAO.png new file mode 100644 index 0000000..242dbdc Binary files /dev/null and b/public/country-img/LAO.png differ diff --git a/public/country-img/LBN.png b/public/country-img/LBN.png new file mode 100644 index 0000000..c98880e Binary files /dev/null and b/public/country-img/LBN.png differ diff --git a/public/country-img/LBR.png b/public/country-img/LBR.png new file mode 100644 index 0000000..86e18b9 Binary files /dev/null and b/public/country-img/LBR.png differ diff --git a/public/country-img/LBY.png b/public/country-img/LBY.png new file mode 100644 index 0000000..13b396b Binary files /dev/null and b/public/country-img/LBY.png differ diff --git a/public/country-img/LCA.png b/public/country-img/LCA.png new file mode 100644 index 0000000..250031d Binary files /dev/null and b/public/country-img/LCA.png differ diff --git a/public/country-img/LIE.png b/public/country-img/LIE.png new file mode 100644 index 0000000..1ca09e6 Binary files /dev/null and b/public/country-img/LIE.png differ diff --git a/public/country-img/LKA.png b/public/country-img/LKA.png new file mode 100644 index 0000000..2f148e8 Binary files /dev/null and b/public/country-img/LKA.png differ diff --git a/public/country-img/LSO.png b/public/country-img/LSO.png new file mode 100644 index 0000000..722bd68 Binary files /dev/null and b/public/country-img/LSO.png differ diff --git a/public/country-img/LTU.png b/public/country-img/LTU.png new file mode 100644 index 0000000..da23d8d Binary files /dev/null and b/public/country-img/LTU.png differ diff --git a/public/country-img/LUX.png b/public/country-img/LUX.png new file mode 100644 index 0000000..b88e7ff Binary files /dev/null and b/public/country-img/LUX.png differ diff --git a/public/country-img/LVA.png b/public/country-img/LVA.png new file mode 100644 index 0000000..1632b00 Binary files /dev/null and b/public/country-img/LVA.png differ diff --git a/public/country-img/MAC.png b/public/country-img/MAC.png new file mode 100644 index 0000000..181ee9c Binary files /dev/null and b/public/country-img/MAC.png differ diff --git a/public/country-img/MAR.png b/public/country-img/MAR.png new file mode 100644 index 0000000..5a91386 Binary files /dev/null and b/public/country-img/MAR.png differ diff --git a/public/country-img/MCO.png b/public/country-img/MCO.png new file mode 100644 index 0000000..3afba93 Binary files /dev/null and b/public/country-img/MCO.png differ diff --git a/public/country-img/MDA.png b/public/country-img/MDA.png new file mode 100644 index 0000000..a67d145 Binary files /dev/null and b/public/country-img/MDA.png differ diff --git a/public/country-img/MDG.png b/public/country-img/MDG.png new file mode 100644 index 0000000..84829ae Binary files /dev/null and b/public/country-img/MDG.png differ diff --git a/public/country-img/MDV.png b/public/country-img/MDV.png new file mode 100644 index 0000000..fa04158 Binary files /dev/null and b/public/country-img/MDV.png differ diff --git a/public/country-img/MEX.png b/public/country-img/MEX.png new file mode 100644 index 0000000..e75824e Binary files /dev/null and b/public/country-img/MEX.png differ diff --git a/public/country-img/MHL.png b/public/country-img/MHL.png new file mode 100644 index 0000000..9f90102 Binary files /dev/null and b/public/country-img/MHL.png differ diff --git a/public/country-img/MKD.png b/public/country-img/MKD.png new file mode 100644 index 0000000..bdc3ca2 Binary files /dev/null and b/public/country-img/MKD.png differ diff --git a/public/country-img/MKD1.png b/public/country-img/MKD1.png new file mode 100644 index 0000000..41287c6 Binary files /dev/null and b/public/country-img/MKD1.png differ diff --git a/public/country-img/MLI.png b/public/country-img/MLI.png new file mode 100644 index 0000000..68e645c Binary files /dev/null and b/public/country-img/MLI.png differ diff --git a/public/country-img/MLT.png b/public/country-img/MLT.png new file mode 100644 index 0000000..10d292e Binary files /dev/null and b/public/country-img/MLT.png differ diff --git a/public/country-img/MMR.png b/public/country-img/MMR.png new file mode 100644 index 0000000..81ed701 Binary files /dev/null and b/public/country-img/MMR.png differ diff --git a/public/country-img/MNE.png b/public/country-img/MNE.png new file mode 100644 index 0000000..c40f04e Binary files /dev/null and b/public/country-img/MNE.png differ diff --git a/public/country-img/MNG.png b/public/country-img/MNG.png new file mode 100644 index 0000000..e87100c Binary files /dev/null and b/public/country-img/MNG.png differ diff --git a/public/country-img/MNP.png b/public/country-img/MNP.png new file mode 100644 index 0000000..792e9a0 Binary files /dev/null and b/public/country-img/MNP.png differ diff --git a/public/country-img/MOZ.png b/public/country-img/MOZ.png new file mode 100644 index 0000000..3101694 Binary files /dev/null and b/public/country-img/MOZ.png differ diff --git a/public/country-img/MRT.png b/public/country-img/MRT.png new file mode 100644 index 0000000..a74b58f Binary files /dev/null and b/public/country-img/MRT.png differ diff --git a/public/country-img/MSR.png b/public/country-img/MSR.png new file mode 100644 index 0000000..e32bd50 Binary files /dev/null and b/public/country-img/MSR.png differ diff --git a/public/country-img/MTQ.png b/public/country-img/MTQ.png new file mode 100644 index 0000000..78c0e6a Binary files /dev/null and b/public/country-img/MTQ.png differ diff --git a/public/country-img/MUS.png b/public/country-img/MUS.png new file mode 100644 index 0000000..6425543 Binary files /dev/null and b/public/country-img/MUS.png differ diff --git a/public/country-img/MWI.png b/public/country-img/MWI.png new file mode 100644 index 0000000..81efcd4 Binary files /dev/null and b/public/country-img/MWI.png differ diff --git a/public/country-img/MYS.png b/public/country-img/MYS.png new file mode 100644 index 0000000..509ef75 Binary files /dev/null and b/public/country-img/MYS.png differ diff --git a/public/country-img/NAM.png b/public/country-img/NAM.png new file mode 100644 index 0000000..7bc9bfd Binary files /dev/null and b/public/country-img/NAM.png differ diff --git a/public/country-img/NCL.png b/public/country-img/NCL.png new file mode 100644 index 0000000..0b36248 Binary files /dev/null and b/public/country-img/NCL.png differ diff --git a/public/country-img/NER.png b/public/country-img/NER.png new file mode 100644 index 0000000..a566f12 Binary files /dev/null and b/public/country-img/NER.png differ diff --git a/public/country-img/NGA.png b/public/country-img/NGA.png new file mode 100644 index 0000000..17d192b Binary files /dev/null and b/public/country-img/NGA.png differ diff --git a/public/country-img/NIC.png b/public/country-img/NIC.png new file mode 100644 index 0000000..5b8b25c Binary files /dev/null and b/public/country-img/NIC.png differ diff --git a/public/country-img/NIU.png b/public/country-img/NIU.png new file mode 100644 index 0000000..d533114 Binary files /dev/null and b/public/country-img/NIU.png differ diff --git a/public/country-img/NLD.png b/public/country-img/NLD.png new file mode 100644 index 0000000..d5afde5 Binary files /dev/null and b/public/country-img/NLD.png differ diff --git a/public/country-img/NOR.png b/public/country-img/NOR.png new file mode 100644 index 0000000..4cb0988 Binary files /dev/null and b/public/country-img/NOR.png differ diff --git a/public/country-img/NPL.png b/public/country-img/NPL.png new file mode 100644 index 0000000..584079d Binary files /dev/null and b/public/country-img/NPL.png differ diff --git a/public/country-img/NRU.png b/public/country-img/NRU.png new file mode 100644 index 0000000..3241de4 Binary files /dev/null and b/public/country-img/NRU.png differ diff --git a/public/country-img/NZL.png b/public/country-img/NZL.png new file mode 100644 index 0000000..4ac78b2 Binary files /dev/null and b/public/country-img/NZL.png differ diff --git a/public/country-img/OMN.png b/public/country-img/OMN.png new file mode 100644 index 0000000..19aea9e Binary files /dev/null and b/public/country-img/OMN.png differ diff --git a/public/country-img/PAK.png b/public/country-img/PAK.png new file mode 100644 index 0000000..09d670f Binary files /dev/null and b/public/country-img/PAK.png differ diff --git a/public/country-img/PAN.png b/public/country-img/PAN.png new file mode 100644 index 0000000..30287ed Binary files /dev/null and b/public/country-img/PAN.png differ diff --git a/public/country-img/PCN.png b/public/country-img/PCN.png new file mode 100644 index 0000000..221e74e Binary files /dev/null and b/public/country-img/PCN.png differ diff --git a/public/country-img/PER.png b/public/country-img/PER.png new file mode 100644 index 0000000..715800e Binary files /dev/null and b/public/country-img/PER.png differ diff --git a/public/country-img/PHL.png b/public/country-img/PHL.png new file mode 100644 index 0000000..597f540 Binary files /dev/null and b/public/country-img/PHL.png differ diff --git a/public/country-img/PLW.png b/public/country-img/PLW.png new file mode 100644 index 0000000..23a60b3 Binary files /dev/null and b/public/country-img/PLW.png differ diff --git a/public/country-img/PNG.png b/public/country-img/PNG.png new file mode 100644 index 0000000..e9da904 Binary files /dev/null and b/public/country-img/PNG.png differ diff --git a/public/country-img/POL.png b/public/country-img/POL.png new file mode 100644 index 0000000..1bf6ae8 Binary files /dev/null and b/public/country-img/POL.png differ diff --git a/public/country-img/PRK.png b/public/country-img/PRK.png new file mode 100644 index 0000000..0eeb475 Binary files /dev/null and b/public/country-img/PRK.png differ diff --git a/public/country-img/PRT.png b/public/country-img/PRT.png new file mode 100644 index 0000000..f6e928c Binary files /dev/null and b/public/country-img/PRT.png differ diff --git a/public/country-img/PRY.png b/public/country-img/PRY.png new file mode 100644 index 0000000..1acf33a Binary files /dev/null and b/public/country-img/PRY.png differ diff --git a/public/country-img/PSE.png b/public/country-img/PSE.png new file mode 100644 index 0000000..6d4ba3d Binary files /dev/null and b/public/country-img/PSE.png differ diff --git a/public/country-img/PYF.png b/public/country-img/PYF.png new file mode 100644 index 0000000..6cb7174 Binary files /dev/null and b/public/country-img/PYF.png differ diff --git a/public/country-img/QAT.png b/public/country-img/QAT.png new file mode 100644 index 0000000..4e13b77 Binary files /dev/null and b/public/country-img/QAT.png differ diff --git a/public/country-img/REU.png b/public/country-img/REU.png new file mode 100644 index 0000000..bdb8ecb Binary files /dev/null and b/public/country-img/REU.png differ diff --git a/public/country-img/ROU.png b/public/country-img/ROU.png new file mode 100644 index 0000000..13ffb20 Binary files /dev/null and b/public/country-img/ROU.png differ diff --git a/public/country-img/RUS.png b/public/country-img/RUS.png new file mode 100644 index 0000000..8bc3231 Binary files /dev/null and b/public/country-img/RUS.png differ diff --git a/public/country-img/RWA.png b/public/country-img/RWA.png new file mode 100644 index 0000000..fd3fff3 Binary files /dev/null and b/public/country-img/RWA.png differ diff --git a/public/country-img/SAU.png b/public/country-img/SAU.png new file mode 100644 index 0000000..0ada596 Binary files /dev/null and b/public/country-img/SAU.png differ diff --git a/public/country-img/SDN.png b/public/country-img/SDN.png new file mode 100644 index 0000000..e5bf5b1 Binary files /dev/null and b/public/country-img/SDN.png differ diff --git a/public/country-img/SEN.png b/public/country-img/SEN.png new file mode 100644 index 0000000..1f40651 Binary files /dev/null and b/public/country-img/SEN.png differ diff --git a/public/country-img/SGP.png b/public/country-img/SGP.png new file mode 100644 index 0000000..12f89b7 Binary files /dev/null and b/public/country-img/SGP.png differ diff --git a/public/country-img/SLB.png b/public/country-img/SLB.png new file mode 100644 index 0000000..a01fc32 Binary files /dev/null and b/public/country-img/SLB.png differ diff --git a/public/country-img/SLE.png b/public/country-img/SLE.png new file mode 100644 index 0000000..6d4734d Binary files /dev/null and b/public/country-img/SLE.png differ diff --git a/public/country-img/SLV.png b/public/country-img/SLV.png new file mode 100644 index 0000000..319236b Binary files /dev/null and b/public/country-img/SLV.png differ diff --git a/public/country-img/SMR.png b/public/country-img/SMR.png new file mode 100644 index 0000000..974dc0b Binary files /dev/null and b/public/country-img/SMR.png differ diff --git a/public/country-img/SOM.png b/public/country-img/SOM.png new file mode 100644 index 0000000..e9e5fe0 Binary files /dev/null and b/public/country-img/SOM.png differ diff --git a/public/country-img/SRB.png b/public/country-img/SRB.png new file mode 100644 index 0000000..98b1efb Binary files /dev/null and b/public/country-img/SRB.png differ diff --git a/public/country-img/STP.png b/public/country-img/STP.png new file mode 100644 index 0000000..3a63437 Binary files /dev/null and b/public/country-img/STP.png differ diff --git a/public/country-img/SUR.png b/public/country-img/SUR.png new file mode 100644 index 0000000..b538bab Binary files /dev/null and b/public/country-img/SUR.png differ diff --git a/public/country-img/SVK.png b/public/country-img/SVK.png new file mode 100644 index 0000000..2d910d5 Binary files /dev/null and b/public/country-img/SVK.png differ diff --git a/public/country-img/SVN.png b/public/country-img/SVN.png new file mode 100644 index 0000000..3ca7d5f Binary files /dev/null and b/public/country-img/SVN.png differ diff --git a/public/country-img/SWE.png b/public/country-img/SWE.png new file mode 100644 index 0000000..32a7faa Binary files /dev/null and b/public/country-img/SWE.png differ diff --git a/public/country-img/SWZ.png b/public/country-img/SWZ.png new file mode 100644 index 0000000..308cb34 Binary files /dev/null and b/public/country-img/SWZ.png differ diff --git a/public/country-img/SYC.png b/public/country-img/SYC.png new file mode 100644 index 0000000..f45176c Binary files /dev/null and b/public/country-img/SYC.png differ diff --git a/public/country-img/SYR.png b/public/country-img/SYR.png new file mode 100644 index 0000000..16a2997 Binary files /dev/null and b/public/country-img/SYR.png differ diff --git a/public/country-img/TCA.png b/public/country-img/TCA.png new file mode 100644 index 0000000..8fe5874 Binary files /dev/null and b/public/country-img/TCA.png differ diff --git a/public/country-img/TCD.png b/public/country-img/TCD.png new file mode 100644 index 0000000..afb9b73 Binary files /dev/null and b/public/country-img/TCD.png differ diff --git a/public/country-img/TGO.png b/public/country-img/TGO.png new file mode 100644 index 0000000..f031761 Binary files /dev/null and b/public/country-img/TGO.png differ diff --git a/public/country-img/THA.png b/public/country-img/THA.png new file mode 100644 index 0000000..3fa9267 Binary files /dev/null and b/public/country-img/THA.png differ diff --git a/public/country-img/TJK.png b/public/country-img/TJK.png new file mode 100644 index 0000000..55b6c54 Binary files /dev/null and b/public/country-img/TJK.png differ diff --git a/public/country-img/TKM.png b/public/country-img/TKM.png new file mode 100644 index 0000000..6794bc3 Binary files /dev/null and b/public/country-img/TKM.png differ diff --git a/public/country-img/TON.png b/public/country-img/TON.png new file mode 100644 index 0000000..426d331 Binary files /dev/null and b/public/country-img/TON.png differ diff --git a/public/country-img/TTO.png b/public/country-img/TTO.png new file mode 100644 index 0000000..a84a7d0 Binary files /dev/null and b/public/country-img/TTO.png differ diff --git a/public/country-img/TUN.png b/public/country-img/TUN.png new file mode 100644 index 0000000..5c30f80 Binary files /dev/null and b/public/country-img/TUN.png differ diff --git a/public/country-img/TUR.png b/public/country-img/TUR.png new file mode 100644 index 0000000..d7af12b Binary files /dev/null and b/public/country-img/TUR.png differ diff --git a/public/country-img/TUV.png b/public/country-img/TUV.png new file mode 100644 index 0000000..1a6c287 Binary files /dev/null and b/public/country-img/TUV.png differ diff --git a/public/country-img/TWN.png b/public/country-img/TWN.png new file mode 100644 index 0000000..81d4f34 Binary files /dev/null and b/public/country-img/TWN.png differ diff --git a/public/country-img/TZA.png b/public/country-img/TZA.png new file mode 100644 index 0000000..ff163a0 Binary files /dev/null and b/public/country-img/TZA.png differ diff --git a/public/country-img/UGA.png b/public/country-img/UGA.png new file mode 100644 index 0000000..456a79f Binary files /dev/null and b/public/country-img/UGA.png differ diff --git a/public/country-img/UKR.png b/public/country-img/UKR.png new file mode 100644 index 0000000..46b5070 Binary files /dev/null and b/public/country-img/UKR.png differ diff --git a/public/country-img/URY.png b/public/country-img/URY.png new file mode 100644 index 0000000..16d469e Binary files /dev/null and b/public/country-img/URY.png differ diff --git a/public/country-img/USA.png b/public/country-img/USA.png new file mode 100644 index 0000000..80b0624 Binary files /dev/null and b/public/country-img/USA.png differ diff --git a/public/country-img/UZB.png b/public/country-img/UZB.png new file mode 100644 index 0000000..70bbb52 Binary files /dev/null and b/public/country-img/UZB.png differ diff --git a/public/country-img/VAT.png b/public/country-img/VAT.png new file mode 100644 index 0000000..dcfa23d Binary files /dev/null and b/public/country-img/VAT.png differ diff --git a/public/country-img/VCT.png b/public/country-img/VCT.png new file mode 100644 index 0000000..e8b1d40 Binary files /dev/null and b/public/country-img/VCT.png differ diff --git a/public/country-img/VEN.png b/public/country-img/VEN.png new file mode 100644 index 0000000..b2d7d76 Binary files /dev/null and b/public/country-img/VEN.png differ diff --git a/public/country-img/VGB.png b/public/country-img/VGB.png new file mode 100644 index 0000000..6a5aed9 Binary files /dev/null and b/public/country-img/VGB.png differ diff --git a/public/country-img/VIR.png b/public/country-img/VIR.png new file mode 100644 index 0000000..71647c2 Binary files /dev/null and b/public/country-img/VIR.png differ diff --git a/public/country-img/VNM.png b/public/country-img/VNM.png new file mode 100644 index 0000000..af1faa5 Binary files /dev/null and b/public/country-img/VNM.png differ diff --git a/public/country-img/VUT.png b/public/country-img/VUT.png new file mode 100644 index 0000000..6714676 Binary files /dev/null and b/public/country-img/VUT.png differ diff --git a/public/country-img/WLF.png b/public/country-img/WLF.png new file mode 100644 index 0000000..7839773 Binary files /dev/null and b/public/country-img/WLF.png differ diff --git a/public/country-img/WSM.png b/public/country-img/WSM.png new file mode 100644 index 0000000..9f51be1 Binary files /dev/null and b/public/country-img/WSM.png differ diff --git a/public/country-img/YEM.png b/public/country-img/YEM.png new file mode 100644 index 0000000..0759545 Binary files /dev/null and b/public/country-img/YEM.png differ diff --git a/public/country-img/ZAF.png b/public/country-img/ZAF.png new file mode 100644 index 0000000..1e30fbb Binary files /dev/null and b/public/country-img/ZAF.png differ diff --git a/public/country-img/ZMB.png b/public/country-img/ZMB.png new file mode 100644 index 0000000..d873ae6 Binary files /dev/null and b/public/country-img/ZMB.png differ diff --git a/public/country-img/ZWE.png b/public/country-img/ZWE.png new file mode 100644 index 0000000..fb528bf Binary files /dev/null and b/public/country-img/ZWE.png differ diff --git a/public/country-img/undefined.png b/public/country-img/undefined.png new file mode 100644 index 0000000..0fd1fe7 Binary files /dev/null and b/public/country-img/undefined.png differ diff --git a/public/drawArea/duobianxing.png b/public/drawArea/duobianxing.png new file mode 100644 index 0000000..4b82999 Binary files /dev/null and b/public/drawArea/duobianxing.png differ diff --git a/public/drawArea/juxing.png b/public/drawArea/juxing.png new file mode 100644 index 0000000..c6aa3d9 Binary files /dev/null and b/public/drawArea/juxing.png differ diff --git a/public/drawArea/yuan.png b/public/drawArea/yuan.png new file mode 100644 index 0000000..c8688f5 Binary files /dev/null and b/public/drawArea/yuan.png differ diff --git a/public/img/All-Fleets.png b/public/img/All-Fleets.png new file mode 100644 index 0000000..0b62a23 Binary files /dev/null and b/public/img/All-Fleets.png differ diff --git a/public/img/Map-Selection.png b/public/img/Map-Selection.png new file mode 100644 index 0000000..6eab766 Binary files /dev/null and b/public/img/Map-Selection.png differ diff --git a/public/img/Search-History.png b/public/img/Search-History.png new file mode 100644 index 0000000..35d8d32 Binary files /dev/null and b/public/img/Search-History.png differ diff --git a/public/img/Ship-Movement.png b/public/img/Ship-Movement.png new file mode 100644 index 0000000..8d192ad Binary files /dev/null and b/public/img/Ship-Movement.png differ diff --git a/public/img/Voyage-History.png b/public/img/Voyage-History.png new file mode 100644 index 0000000..1815c17 Binary files /dev/null and b/public/img/Voyage-History.png differ diff --git a/public/img/Voyage.png b/public/img/Voyage.png new file mode 100644 index 0000000..324c0f4 Binary files /dev/null and b/public/img/Voyage.png differ diff --git a/public/img/Weather.png b/public/img/Weather.png new file mode 100644 index 0000000..e7b667e Binary files /dev/null and b/public/img/Weather.png differ diff --git a/public/img/add.png b/public/img/add.png new file mode 100644 index 0000000..28bf2a2 Binary files /dev/null and b/public/img/add.png differ diff --git a/public/img/blue.png b/public/img/blue.png new file mode 100644 index 0000000..afe426a Binary files /dev/null and b/public/img/blue.png differ diff --git a/public/img/car.svg b/public/img/car.svg new file mode 100644 index 0000000..1462573 --- /dev/null +++ b/public/img/car.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/daosanjiao.svg b/public/img/daosanjiao.svg new file mode 100644 index 0000000..0adfb0b --- /dev/null +++ b/public/img/daosanjiao.svg @@ -0,0 +1,12 @@ + + + + + + + diff --git a/public/img/del.png b/public/img/del.png new file mode 100644 index 0000000..5111acf Binary files /dev/null and b/public/img/del.png differ diff --git a/public/img/delay.png b/public/img/delay.png new file mode 100644 index 0000000..2fcf7a4 Binary files /dev/null and b/public/img/delay.png differ diff --git a/public/img/draw-point.png b/public/img/draw-point.png new file mode 100644 index 0000000..c5aaa90 Binary files /dev/null and b/public/img/draw-point.png differ diff --git a/public/img/duobianxing.png b/public/img/duobianxing.png new file mode 100644 index 0000000..4b82999 Binary files /dev/null and b/public/img/duobianxing.png differ diff --git a/public/img/end.png b/public/img/end.png new file mode 100644 index 0000000..6453b9b Binary files /dev/null and b/public/img/end.png differ diff --git a/public/img/eye-close.png b/public/img/eye-close.png new file mode 100644 index 0000000..8486c46 Binary files /dev/null and b/public/img/eye-close.png differ diff --git a/public/img/eye-open.png b/public/img/eye-open.png new file mode 100644 index 0000000..9d2a7cc Binary files /dev/null and b/public/img/eye-open.png differ diff --git a/public/img/go-right.png b/public/img/go-right.png new file mode 100644 index 0000000..bf4157f Binary files /dev/null and b/public/img/go-right.png differ diff --git a/public/img/guiji.png b/public/img/guiji.png new file mode 100644 index 0000000..7c69f0b Binary files /dev/null and b/public/img/guiji.png differ diff --git a/public/img/guiji.svg b/public/img/guiji.svg new file mode 100644 index 0000000..11fbd5e --- /dev/null +++ b/public/img/guiji.svg @@ -0,0 +1,37 @@ + + + 轨迹 + Created with Sketch. + + + + + + + + + diff --git a/public/img/jiantou.png b/public/img/jiantou.png new file mode 100644 index 0000000..c9bcf63 Binary files /dev/null and b/public/img/jiantou.png differ diff --git a/public/img/jizhuangxiang.png b/public/img/jizhuangxiang.png new file mode 100644 index 0000000..75ebd9a Binary files /dev/null and b/public/img/jizhuangxiang.png differ diff --git a/public/img/juxing.png b/public/img/juxing.png new file mode 100644 index 0000000..c6aa3d9 Binary files /dev/null and b/public/img/juxing.png differ diff --git a/public/img/kuang.png b/public/img/kuang.png new file mode 100644 index 0000000..f7a2172 Binary files /dev/null and b/public/img/kuang.png differ diff --git a/public/img/laba.png b/public/img/laba.png new file mode 100644 index 0000000..d69fcbf Binary files /dev/null and b/public/img/laba.png differ diff --git a/public/img/line.png b/public/img/line.png new file mode 100644 index 0000000..a2f5e01 Binary files /dev/null and b/public/img/line.png differ diff --git a/public/img/logo.png b/public/img/logo.png new file mode 100644 index 0000000..651689a Binary files /dev/null and b/public/img/logo.png differ diff --git a/public/img/logo.svg b/public/img/logo.svg new file mode 100644 index 0000000..80518f7 --- /dev/null +++ b/public/img/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/logo1.png b/public/img/logo1.png new file mode 100644 index 0000000..0147f67 Binary files /dev/null and b/public/img/logo1.png differ diff --git a/public/img/mao_ico.png b/public/img/mao_ico.png new file mode 100644 index 0000000..8965b81 Binary files /dev/null and b/public/img/mao_ico.png differ diff --git a/public/img/marineWeather.png b/public/img/marineWeather.png new file mode 100644 index 0000000..3471261 Binary files /dev/null and b/public/img/marineWeather.png differ diff --git a/public/img/marineWeather.svg b/public/img/marineWeather.svg new file mode 100644 index 0000000..00c1fea --- /dev/null +++ b/public/img/marineWeather.svg @@ -0,0 +1 @@ + diff --git a/public/img/point.png b/public/img/point.png new file mode 100644 index 0000000..704f0e5 Binary files /dev/null and b/public/img/point.png differ diff --git a/public/img/port.png b/public/img/port.png new file mode 100644 index 0000000..34f7da8 Binary files /dev/null and b/public/img/port.png differ diff --git a/public/img/portIcon.png b/public/img/portIcon.png new file mode 100644 index 0000000..4668710 Binary files /dev/null and b/public/img/portIcon.png differ diff --git a/public/img/portMenu.png b/public/img/portMenu.png new file mode 100644 index 0000000..741ed5f Binary files /dev/null and b/public/img/portMenu.png differ diff --git a/public/img/pos.png b/public/img/pos.png new file mode 100644 index 0000000..6a86a89 Binary files /dev/null and b/public/img/pos.png differ diff --git a/public/img/search-port.svg b/public/img/search-port.svg new file mode 100644 index 0000000..dfefc1c --- /dev/null +++ b/public/img/search-port.svg @@ -0,0 +1,14 @@ + + + + + + + diff --git a/public/img/search-ship.svg b/public/img/search-ship.svg new file mode 100644 index 0000000..7c45376 --- /dev/null +++ b/public/img/search-ship.svg @@ -0,0 +1,16 @@ + + + + + + + + diff --git a/public/img/select.png b/public/img/select.png new file mode 100644 index 0000000..c2574d2 Binary files /dev/null and b/public/img/select.png differ diff --git a/public/img/shipAgency.png b/public/img/shipAgency.png new file mode 100644 index 0000000..f7e9f58 Binary files /dev/null and b/public/img/shipAgency.png differ diff --git a/public/img/shipAgencybak230302.png b/public/img/shipAgencybak230302.png new file mode 100644 index 0000000..111f409 Binary files /dev/null and b/public/img/shipAgencybak230302.png differ diff --git a/public/img/shipIcon.png b/public/img/shipIcon.png new file mode 100644 index 0000000..d6d2b39 Binary files /dev/null and b/public/img/shipIcon.png differ diff --git a/public/img/ship_ico.png b/public/img/ship_ico.png new file mode 100644 index 0000000..2a40f04 Binary files /dev/null and b/public/img/ship_ico.png differ diff --git a/public/img/start.png b/public/img/start.png new file mode 100644 index 0000000..17e1894 Binary files /dev/null and b/public/img/start.png differ diff --git a/public/img/time.png b/public/img/time.png new file mode 100644 index 0000000..94cbe92 Binary files /dev/null and b/public/img/time.png differ diff --git a/public/img/time.svg b/public/img/time.svg new file mode 100644 index 0000000..80f88b1 --- /dev/null +++ b/public/img/time.svg @@ -0,0 +1,36 @@ + + + 搜索记录 + Created with Sketch. + + + + + + + + diff --git a/public/img/tool.png b/public/img/tool.png new file mode 100644 index 0000000..c103157 Binary files /dev/null and b/public/img/tool.png differ diff --git a/public/img/tool.svg b/public/img/tool.svg new file mode 100644 index 0000000..7be008c --- /dev/null +++ b/public/img/tool.svg @@ -0,0 +1,35 @@ + + 工具 + Created with Sketch. + + + + + + + + + diff --git a/public/img/tt_b3.png b/public/img/tt_b3.png new file mode 100644 index 0000000..7642f9e Binary files /dev/null and b/public/img/tt_b3.png differ diff --git a/public/img/typhoonLegend.png b/public/img/typhoonLegend.png new file mode 100644 index 0000000..239f8dc Binary files /dev/null and b/public/img/typhoonLegend.png differ diff --git a/public/img/yuan.png b/public/img/yuan.png new file mode 100644 index 0000000..c8688f5 Binary files /dev/null and b/public/img/yuan.png differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..d82c8ea --- /dev/null +++ b/public/index.html @@ -0,0 +1,13 @@ + + + + + + + + <%= htmlWebpackPlugin.options.title %> + + +
+ + diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000..f27edbb Binary files /dev/null and b/public/logo.png differ diff --git a/public/menu-icon/allShips.svg b/public/menu-icon/allShips.svg new file mode 100644 index 0000000..af44973 --- /dev/null +++ b/public/menu-icon/allShips.svg @@ -0,0 +1,24 @@ + + 编组 + Created with Sketch. + + + + + + + + + diff --git a/public/menu-icon/areaList.svg b/public/menu-icon/areaList.svg new file mode 100644 index 0000000..3ddff77 --- /dev/null +++ b/public/menu-icon/areaList.svg @@ -0,0 +1,25 @@ + + 区域 + Created with Sketch. + + + + + + + + + diff --git a/public/menu-icon/dataAnalysis.svg b/public/menu-icon/dataAnalysis.svg new file mode 100644 index 0000000..e5caa36 --- /dev/null +++ b/public/menu-icon/dataAnalysis.svg @@ -0,0 +1,28 @@ + + 数据分析 + Created with Sketch. + + + + + + + + + + + diff --git a/public/menu-icon/guiji.svg b/public/menu-icon/guiji.svg new file mode 100644 index 0000000..5ec4cdb --- /dev/null +++ b/public/menu-icon/guiji.svg @@ -0,0 +1,27 @@ + + 轨迹 + Created with Sketch. + + + + + + + + + diff --git a/public/menu-icon/jizhuangxiang.png b/public/menu-icon/jizhuangxiang.png new file mode 100644 index 0000000..75ebd9a Binary files /dev/null and b/public/menu-icon/jizhuangxiang.png differ diff --git a/public/menu-icon/mapTool.svg b/public/menu-icon/mapTool.svg new file mode 100644 index 0000000..e178d37 --- /dev/null +++ b/public/menu-icon/mapTool.svg @@ -0,0 +1,27 @@ + + 工具 + Created with Sketch. + + + + + + + + + + + diff --git a/public/menu-icon/port3.png b/public/menu-icon/port3.png new file mode 100644 index 0000000..4603174 Binary files /dev/null and b/public/menu-icon/port3.png differ diff --git a/public/menu-icon/port4.png b/public/menu-icon/port4.png new file mode 100644 index 0000000..62c77df Binary files /dev/null and b/public/menu-icon/port4.png differ diff --git a/public/menu-icon/portInfo.png b/public/menu-icon/portInfo.png new file mode 100644 index 0000000..8b74f31 Binary files /dev/null and b/public/menu-icon/portInfo.png differ diff --git a/public/menu-icon/route.svg b/public/menu-icon/route.svg new file mode 100644 index 0000000..e8e5e55 --- /dev/null +++ b/public/menu-icon/route.svg @@ -0,0 +1,18 @@ + + + + + + + + + diff --git a/public/menu-icon/searchHistory.svg b/public/menu-icon/searchHistory.svg new file mode 100644 index 0000000..f1ccba4 --- /dev/null +++ b/public/menu-icon/searchHistory.svg @@ -0,0 +1,25 @@ + + 搜索记录 + Created with Sketch. + + + + + + + + + diff --git a/public/menu-icon/weather.png b/public/menu-icon/weather.png new file mode 100644 index 0000000..ea51e1d Binary files /dev/null and b/public/menu-icon/weather.png differ diff --git a/public/menu-icon/weather.svg b/public/menu-icon/weather.svg new file mode 100644 index 0000000..106a977 --- /dev/null +++ b/public/menu-icon/weather.svg @@ -0,0 +1,14 @@ + + + + + + + diff --git a/public/real-info-icon/horn.svg b/public/real-info-icon/horn.svg new file mode 100644 index 0000000..3b37d81 --- /dev/null +++ b/public/real-info-icon/horn.svg @@ -0,0 +1,43 @@ + + 编组 + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..89722aa --- /dev/null +++ b/src/App.vue @@ -0,0 +1,32 @@ + + diff --git a/src/ErrorApp.vue b/src/ErrorApp.vue new file mode 100644 index 0000000..08d2482 --- /dev/null +++ b/src/ErrorApp.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/api/data-analysis/index.ts b/src/api/data-analysis/index.ts new file mode 100644 index 0000000..0c2621c --- /dev/null +++ b/src/api/data-analysis/index.ts @@ -0,0 +1,25 @@ +import CryptoJS from 'crypto-js' +// @ts-ignore +import { JSEncrypt } from './jsencrypt' +const sysConfig = require('../../../public/config/sys-config.json') + +// DES 解密 +function decryptByDES (ciphertext: string, key: string) { + const keyHex = CryptoJS.enc.Utf8.parse(key) + const decrypted = CryptoJS.DES.decrypt( + ({ ciphertext: CryptoJS.enc.Base64.parse(ciphertext) }) as any, + keyHex, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7 + }) + return decrypted.toString(CryptoJS.enc.Utf8) +} + +export function decrypt (encrypted: any, DesKey: any) { + const publicKey = sysConfig.publicKey + const decrypt = new JSEncrypt() + decrypt.setPublicKey(publicKey) + const desKey = decrypt.decrypt(DesKey) // 解密 + const message = decryptByDES(encrypted.replace(/[\r\n]/g, ''), desKey) + return JSON.parse(message) +} diff --git a/src/api/data-analysis/jsencrypt.js b/src/api/data-analysis/jsencrypt.js new file mode 100644 index 0000000..559f0bd --- /dev/null +++ b/src/api/data-analysis/jsencrypt.js @@ -0,0 +1,5372 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.JSEncrypt = {}))); +}(this, (function (exports) { + 'use strict'; + + var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz"; + function int2char (n) { + return BI_RM.charAt(n); + } + //#region BIT_OPERATIONS + // (public) this & a + function op_and (x, y) { + return x & y; + } + // (public) this | a + function op_or (x, y) { + return x | y; + } + // (public) this ^ a + function op_xor (x, y) { + return x ^ y; + } + // (public) this & ~a + function op_andnot (x, y) { + return x & ~y; + } + // return index of lowest 1-bit in x, x < 2^31 + function lbit (x) { + if (x == 0) { + return -1; + } + var r = 0; + if ((x & 0xffff) == 0) { + x >>= 16; + r += 16; + } + if ((x & 0xff) == 0) { + x >>= 8; + r += 8; + } + if ((x & 0xf) == 0) { + x >>= 4; + r += 4; + } + if ((x & 3) == 0) { + x >>= 2; + r += 2; + } + if ((x & 1) == 0) { + ++r; + } + return r; + } + // return number of 1 bits in x + function cbit (x) { + var r = 0; + while (x != 0) { + x &= x - 1; + ++r; + } + return r; + } + //#endregion BIT_OPERATIONS + + var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var b64pad = "="; + function hex2b64 (h) { + var i; + var c; + var ret = ""; + for (i = 0; i + 3 <= h.length; i += 3) { + c = parseInt(h.substring(i, i + 3), 16); + ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63); + } + if (i + 1 == h.length) { + c = parseInt(h.substring(i, i + 1), 16); + ret += b64map.charAt(c << 2); + } + else if (i + 2 == h.length) { + c = parseInt(h.substring(i, i + 2), 16); + ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4); + } + while ((ret.length & 3) > 0) { + ret += b64pad; + } + return ret; + } + // convert a base64 string to hex + function b64tohex (s) { + var ret = ""; + var i; + var k = 0; // b64 state, 0-3 + var slop = 0; + for (i = 0; i < s.length; ++i) { + if (s.charAt(i) == b64pad) { + break; + } + var v = b64map.indexOf(s.charAt(i)); + if (v < 0) { + continue; + } + if (k == 0) { + ret += int2char(v >> 2); + slop = v & 3; + k = 1; + } + else if (k == 1) { + ret += int2char((slop << 2) | (v >> 4)); + slop = v & 0xf; + k = 2; + } + else if (k == 2) { + ret += int2char(slop); + ret += int2char(v >> 2); + slop = v & 3; + k = 3; + } + else { + ret += int2char((slop << 2) | (v >> 4)); + ret += int2char(v & 0xf); + k = 0; + } + } + if (k == 1) { + ret += int2char(slop << 2); + } + return ret; + } + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + 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 + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends (d, b) { + extendStatics(d, b); + function __ () { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + // Hex JavaScript decoder + // Copyright (c) 2008-2013 Lapo Luchini + // Permission to use, copy, modify, and/or distribute this software for any + // purpose with or without fee is hereby granted, provided that the above + // copyright notice and this permission notice appear in all copies. + // + // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + /*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */ + var decoder; + var Hex = { + decode: function (a) { + var i; + if (decoder === undefined) { + var hex = "0123456789ABCDEF"; + var ignore = " \f\n\r\t\u00A0\u2028\u2029"; + decoder = {}; + for (i = 0; i < 16; ++i) { + decoder[hex.charAt(i)] = i; + } + hex = hex.toLowerCase(); + for (i = 10; i < 16; ++i) { + decoder[hex.charAt(i)] = i; + } + for (i = 0; i < ignore.length; ++i) { + decoder[ignore.charAt(i)] = -1; + } + } + var out = []; + var bits = 0; + var char_count = 0; + for (i = 0; i < a.length; ++i) { + var c = a.charAt(i); + if (c == "=") { + break; + } + c = decoder[c]; + if (c == -1) { + continue; + } + if (c === undefined) { + throw new Error("Illegal character at offset " + i); + } + bits |= c; + if (++char_count >= 2) { + out[out.length] = bits; + bits = 0; + char_count = 0; + } + else { + bits <<= 4; + } + } + if (char_count) { + throw new Error("Hex encoding incomplete: 4 bits missing"); + } + return out; + } + }; + + // Base64 JavaScript decoder + // Copyright (c) 2008-2013 Lapo Luchini + // Permission to use, copy, modify, and/or distribute this software for any + // purpose with or without fee is hereby granted, provided that the above + // copyright notice and this permission notice appear in all copies. + // + // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + /*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */ + var decoder$1; + var Base64 = { + decode: function (a) { + var i; + if (decoder$1 === undefined) { + var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var ignore = "= \f\n\r\t\u00A0\u2028\u2029"; + decoder$1 = Object.create(null); + for (i = 0; i < 64; ++i) { + decoder$1[b64.charAt(i)] = i; + } + for (i = 0; i < ignore.length; ++i) { + decoder$1[ignore.charAt(i)] = -1; + } + } + var out = []; + var bits = 0; + var char_count = 0; + for (i = 0; i < a.length; ++i) { + var c = a.charAt(i); + if (c == "=") { + break; + } + c = decoder$1[c]; + if (c == -1) { + continue; + } + if (c === undefined) { + throw new Error("Illegal character at offset " + i); + } + bits |= c; + if (++char_count >= 4) { + out[out.length] = (bits >> 16); + out[out.length] = (bits >> 8) & 0xFF; + out[out.length] = bits & 0xFF; + bits = 0; + char_count = 0; + } + else { + bits <<= 6; + } + } + switch (char_count) { + case 1: + throw new Error("Base64 encoding incomplete: at least 2 bits missing"); + case 2: + out[out.length] = (bits >> 10); + break; + case 3: + out[out.length] = (bits >> 16); + out[out.length] = (bits >> 8) & 0xFF; + break; + } + return out; + }, + re: /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/, + unarmor: function (a) { + var m = Base64.re.exec(a); + if (m) { + if (m[1]) { + a = m[1]; + } + else if (m[2]) { + a = m[2]; + } + else { + throw new Error("RegExp out of sync"); + } + } + return Base64.decode(a); + } + }; + + // Big integer base-10 printing library + // Copyright (c) 2014 Lapo Luchini + // Permission to use, copy, modify, and/or distribute this software for any + // purpose with or without fee is hereby granted, provided that the above + // copyright notice and this permission notice appear in all copies. + // + // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + /*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */ + var max = 10000000000000; // biggest integer that can still fit 2^53 when multiplied by 256 + var Int10 = /** @class */ (function () { + function Int10 (value) { + this.buf = [+value || 0]; + } + Int10.prototype.mulAdd = function (m, c) { + // assert(m <= 256) + var b = this.buf; + var l = b.length; + var i; + var t; + for (i = 0; i < l; ++i) { + t = b[i] * m + c; + if (t < max) { + c = 0; + } + else { + c = 0 | (t / max); + t -= c * max; + } + b[i] = t; + } + if (c > 0) { + b[i] = c; + } + }; + Int10.prototype.sub = function (c) { + // assert(m <= 256) + var b = this.buf; + var l = b.length; + var i; + var t; + for (i = 0; i < l; ++i) { + t = b[i] - c; + if (t < 0) { + t += max; + c = 1; + } + else { + c = 0; + } + b[i] = t; + } + while (b[b.length - 1] === 0) { + b.pop(); + } + }; + Int10.prototype.toString = function (base) { + if ((base || 10) != 10) { + throw new Error("only base 10 is supported"); + } + var b = this.buf; + var s = b[b.length - 1].toString(); + for (var i = b.length - 2; i >= 0; --i) { + s += (max + b[i]).toString().substring(1); + } + return s; + }; + Int10.prototype.valueOf = function () { + var b = this.buf; + var v = 0; + for (var i = b.length - 1; i >= 0; --i) { + v = v * max + b[i]; + } + return v; + }; + Int10.prototype.simplify = function () { + var b = this.buf; + return (b.length == 1) ? b[0] : this; + }; + return Int10; + }()); + + // ASN.1 JavaScript decoder + var ellipsis = "\u2026"; + var reTimeS = /^(\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/; + var reTimeL = /^(\d\d\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/; + function stringCut (str, len) { + if (str.length > len) { + str = str.substring(0, len) + ellipsis; + } + return str; + } + var Stream = /** @class */ (function () { + function Stream (enc, pos) { + this.hexDigits = "0123456789ABCDEF"; + if (enc instanceof Stream) { + this.enc = enc.enc; + this.pos = enc.pos; + } + else { + // enc should be an array or a binary string + this.enc = enc; + this.pos = pos; + } + } + Stream.prototype.get = function (pos) { + if (pos === undefined) { + pos = this.pos++; + } + if (pos >= this.enc.length) { + throw new Error("Requesting byte offset " + pos + " on a stream of length " + this.enc.length); + } + return ("string" === typeof this.enc) ? this.enc.charCodeAt(pos) : this.enc[pos]; + }; + Stream.prototype.hexByte = function (b) { + return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF); + }; + Stream.prototype.hexDump = function (start, end, raw) { + var s = ""; + for (var i = start; i < end; ++i) { + s += this.hexByte(this.get(i)); + if (raw !== true) { + switch (i & 0xF) { + case 0x7: + s += " "; + break; + case 0xF: + s += "\n"; + break; + default: + s += " "; + } + } + } + return s; + }; + Stream.prototype.isASCII = function (start, end) { + for (var i = start; i < end; ++i) { + var c = this.get(i); + if (c < 32 || c > 176) { + return false; + } + } + return true; + }; + Stream.prototype.parseStringISO = function (start, end) { + var s = ""; + for (var i = start; i < end; ++i) { + s += String.fromCharCode(this.get(i)); + } + return s; + }; + Stream.prototype.parseStringUTF = function (start, end) { + var s = ""; + for (var i = start; i < end;) { + var c = this.get(i++); + if (c < 128) { + s += String.fromCharCode(c); + } + else if ((c > 191) && (c < 224)) { + s += String.fromCharCode(((c & 0x1F) << 6) | (this.get(i++) & 0x3F)); + } + else { + s += String.fromCharCode(((c & 0x0F) << 12) | ((this.get(i++) & 0x3F) << 6) | (this.get(i++) & 0x3F)); + } + } + return s; + }; + Stream.prototype.parseStringBMP = function (start, end) { + var str = ""; + var hi; + var lo; + for (var i = start; i < end;) { + hi = this.get(i++); + lo = this.get(i++); + str += String.fromCharCode((hi << 8) | lo); + } + return str; + }; + Stream.prototype.parseTime = function (start, end, shortYear) { + var s = this.parseStringISO(start, end); + var m = (shortYear ? reTimeS : reTimeL).exec(s); + if (!m) { + return "Unrecognized time: " + s; + } + if (shortYear) { + // to avoid querying the timer, use the fixed range [1970, 2069] + // it will conform with ITU X.400 [-10, +40] sliding window until 2030 + m[1] = +m[1]; + m[1] += (+m[1] < 70) ? 2000 : 1900; + } + s = m[1] + "-" + m[2] + "-" + m[3] + " " + m[4]; + if (m[5]) { + s += ":" + m[5]; + if (m[6]) { + s += ":" + m[6]; + if (m[7]) { + s += "." + m[7]; + } + } + } + if (m[8]) { + s += " UTC"; + if (m[8] != "Z") { + s += m[8]; + if (m[9]) { + s += ":" + m[9]; + } + } + } + return s; + }; + Stream.prototype.parseInteger = function (start, end) { + var v = this.get(start); + var neg = (v > 127); + var pad = neg ? 255 : 0; + var len; + var s = ""; + // skip unuseful bits (not allowed in DER) + while (v == pad && ++start < end) { + v = this.get(start); + } + len = end - start; + if (len === 0) { + return neg ? -1 : 0; + } + // show bit length of huge integers + if (len > 4) { + s = v; + len <<= 3; + while (((+s ^ pad) & 0x80) == 0) { + s = +s << 1; + --len; + } + s = "(" + len + " bit)\n"; + } + // decode the integer + if (neg) { + v = v - 256; + } + var n = new Int10(v); + for (var i = start + 1; i < end; ++i) { + n.mulAdd(256, this.get(i)); + } + return s + n.toString(); + }; + Stream.prototype.parseBitString = function (start, end, maxLength) { + var unusedBit = this.get(start); + var lenBit = ((end - start - 1) << 3) - unusedBit; + var intro = "(" + lenBit + " bit)\n"; + var s = ""; + for (var i = start + 1; i < end; ++i) { + var b = this.get(i); + var skip = (i == end - 1) ? unusedBit : 0; + for (var j = 7; j >= skip; --j) { + s += (b >> j) & 1 ? "1" : "0"; + } + if (s.length > maxLength) { + return intro + stringCut(s, maxLength); + } + } + return intro + s; + }; + Stream.prototype.parseOctetString = function (start, end, maxLength) { + if (this.isASCII(start, end)) { + return stringCut(this.parseStringISO(start, end), maxLength); + } + var len = end - start; + var s = "(" + len + " byte)\n"; + maxLength /= 2; // we work in bytes + if (len > maxLength) { + end = start + maxLength; + } + for (var i = start; i < end; ++i) { + s += this.hexByte(this.get(i)); + } + if (len > maxLength) { + s += ellipsis; + } + return s; + }; + Stream.prototype.parseOID = function (start, end, maxLength) { + var s = ""; + var n = new Int10(); + var bits = 0; + for (var i = start; i < end; ++i) { + var v = this.get(i); + n.mulAdd(128, v & 0x7F); + bits += 7; + if (!(v & 0x80)) { // finished + if (s === "") { + n = n.simplify(); + if (n instanceof Int10) { + n.sub(80); + s = "2." + n.toString(); + } + else { + var m = n < 80 ? n < 40 ? 0 : 1 : 2; + s = m + "." + (n - m * 40); + } + } + else { + s += "." + n.toString(); + } + if (s.length > maxLength) { + return stringCut(s, maxLength); + } + n = new Int10(); + bits = 0; + } + } + if (bits > 0) { + s += ".incomplete"; + } + return s; + }; + return Stream; + }()); + var ASN1 = /** @class */ (function () { + function ASN1 (stream, header, length, tag, sub) { + if (!(tag instanceof ASN1Tag)) { + throw new Error("Invalid tag value."); + } + this.stream = stream; + this.header = header; + this.length = length; + this.tag = tag; + this.sub = sub; + } + ASN1.prototype.typeName = function () { + switch (this.tag.tagClass) { + case 0: // universal + switch (this.tag.tagNumber) { + case 0x00: + return "EOC"; + case 0x01: + return "BOOLEAN"; + case 0x02: + return "INTEGER"; + case 0x03: + return "BIT_STRING"; + case 0x04: + return "OCTET_STRING"; + case 0x05: + return "NULL"; + case 0x06: + return "OBJECT_IDENTIFIER"; + case 0x07: + return "ObjectDescriptor"; + case 0x08: + return "EXTERNAL"; + case 0x09: + return "REAL"; + case 0x0A: + return "ENUMERATED"; + case 0x0B: + return "EMBEDDED_PDV"; + case 0x0C: + return "UTF8String"; + case 0x10: + return "SEQUENCE"; + case 0x11: + return "SET"; + case 0x12: + return "NumericString"; + case 0x13: + return "PrintableString"; // ASCII subset + case 0x14: + return "TeletexString"; // aka T61String + case 0x15: + return "VideotexString"; + case 0x16: + return "IA5String"; // ASCII + case 0x17: + return "UTCTime"; + case 0x18: + return "GeneralizedTime"; + case 0x19: + return "GraphicString"; + case 0x1A: + return "VisibleString"; // ASCII subset + case 0x1B: + return "GeneralString"; + case 0x1C: + return "UniversalString"; + case 0x1E: + return "BMPString"; + } + return "Universal_" + this.tag.tagNumber.toString(); + case 1: + return "Application_" + this.tag.tagNumber.toString(); + case 2: + return "[" + this.tag.tagNumber.toString() + "]"; // Context + case 3: + return "Private_" + this.tag.tagNumber.toString(); + } + }; + ASN1.prototype.content = function (maxLength) { + if (this.tag === undefined) { + return null; + } + if (maxLength === undefined) { + maxLength = Infinity; + } + var content = this.posContent(); + var len = Math.abs(this.length); + if (!this.tag.isUniversal()) { + if (this.sub !== null) { + return "(" + this.sub.length + " elem)"; + } + return this.stream.parseOctetString(content, content + len, maxLength); + } + switch (this.tag.tagNumber) { + case 0x01: // BOOLEAN + return (this.stream.get(content) === 0) ? "false" : "true"; + case 0x02: // INTEGER + return this.stream.parseInteger(content, content + len); + case 0x03: // BIT_STRING + return this.sub ? "(" + this.sub.length + " elem)" : + this.stream.parseBitString(content, content + len, maxLength); + case 0x04: // OCTET_STRING + return this.sub ? "(" + this.sub.length + " elem)" : + this.stream.parseOctetString(content, content + len, maxLength); + // case 0x05: // NULL + case 0x06: // OBJECT_IDENTIFIER + return this.stream.parseOID(content, content + len, maxLength); + // case 0x07: // ObjectDescriptor + // case 0x08: // EXTERNAL + // case 0x09: // REAL + // case 0x0A: // ENUMERATED + // case 0x0B: // EMBEDDED_PDV + case 0x10: // SEQUENCE + case 0x11: // SET + if (this.sub !== null) { + return "(" + this.sub.length + " elem)"; + } + else { + return "(no elem)"; + } + case 0x0C: // UTF8String + return stringCut(this.stream.parseStringUTF(content, content + len), maxLength); + case 0x12: // NumericString + case 0x13: // PrintableString + case 0x14: // TeletexString + case 0x15: // VideotexString + case 0x16: // IA5String + // case 0x19: // GraphicString + case 0x1A: // VisibleString + // case 0x1B: // GeneralString + // case 0x1C: // UniversalString + return stringCut(this.stream.parseStringISO(content, content + len), maxLength); + case 0x1E: // BMPString + return stringCut(this.stream.parseStringBMP(content, content + len), maxLength); + case 0x17: // UTCTime + case 0x18: // GeneralizedTime + return this.stream.parseTime(content, content + len, (this.tag.tagNumber == 0x17)); + } + return null; + }; + ASN1.prototype.toString = function () { + return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + ((this.sub === null) ? "null" : this.sub.length) + "]"; + }; + ASN1.prototype.toPrettyString = function (indent) { + if (indent === undefined) { + indent = ""; + } + var s = indent + this.typeName() + " @" + this.stream.pos; + if (this.length >= 0) { + s += "+"; + } + s += this.length; + if (this.tag.tagConstructed) { + s += " (constructed)"; + } + else if ((this.tag.isUniversal() && ((this.tag.tagNumber == 0x03) || (this.tag.tagNumber == 0x04))) && (this.sub !== null)) { + s += " (encapsulates)"; + } + s += "\n"; + if (this.sub !== null) { + indent += " "; + for (var i = 0, max = this.sub.length; i < max; ++i) { + s += this.sub[i].toPrettyString(indent); + } + } + return s; + }; + ASN1.prototype.posStart = function () { + return this.stream.pos; + }; + ASN1.prototype.posContent = function () { + return this.stream.pos + this.header; + }; + ASN1.prototype.posEnd = function () { + return this.stream.pos + this.header + Math.abs(this.length); + }; + ASN1.prototype.toHexString = function () { + return this.stream.hexDump(this.posStart(), this.posEnd(), true); + }; + ASN1.decodeLength = function (stream) { + var buf = stream.get(); + var len = buf & 0x7F; + if (len == buf) { + return len; + } + // no reason to use Int10, as it would be a huge buffer anyways + if (len > 6) { + throw new Error("Length over 48 bits not supported at position " + (stream.pos - 1)); + } + if (len === 0) { + return null; + } // undefined + buf = 0; + for (var i = 0; i < len; ++i) { + buf = (buf * 256) + stream.get(); + } + return buf; + }; + /** + * Retrieve the hexadecimal value (as a string) of the current ASN.1 element + * @returns {string} + * @public + */ + ASN1.prototype.getHexStringValue = function () { + var hexString = this.toHexString(); + var offset = this.header * 2; + var length = this.length * 2; + return hexString.substr(offset, length); + }; + ASN1.decode = function (str) { + var stream; + if (!(str instanceof Stream)) { + stream = new Stream(str, 0); + } + else { + stream = str; + } + var streamStart = new Stream(stream); + var tag = new ASN1Tag(stream); + var len = ASN1.decodeLength(stream); + var start = stream.pos; + var header = start - streamStart.pos; + var sub = null; + var getSub = function () { + var ret = []; + if (len !== null) { + // definite length + var end = start + len; + while (stream.pos < end) { + ret[ret.length] = ASN1.decode(stream); + } + if (stream.pos != end) { + throw new Error("Content size is not correct for container starting at offset " + start); + } + } + else { + // undefined length + try { + for (; ;) { + var s = ASN1.decode(stream); + if (s.tag.isEOC()) { + break; + } + ret[ret.length] = s; + } + len = start - stream.pos; // undefined lengths are represented as negative values + } + catch (e) { + throw new Error("Exception while decoding undefined length content: " + e); + } + } + return ret; + }; + if (tag.tagConstructed) { + // must have valid content + sub = getSub(); + } + else if (tag.isUniversal() && ((tag.tagNumber == 0x03) || (tag.tagNumber == 0x04))) { + // sometimes BitString and OctetString are used to encapsulate ASN.1 + try { + if (tag.tagNumber == 0x03) { + if (stream.get() != 0) { + throw new Error("BIT STRINGs with unused bits cannot encapsulate."); + } + } + sub = getSub(); + for (var i = 0; i < sub.length; ++i) { + if (sub[i].tag.isEOC()) { + throw new Error("EOC is not supposed to be actual content."); + } + } + } + catch (e) { + // but silently ignore when they don't + sub = null; + } + } + if (sub === null) { + if (len === null) { + throw new Error("We can't skip over an invalid tag with undefined length at offset " + start); + } + stream.pos = start + Math.abs(len); + } + return new ASN1(streamStart, header, len, tag, sub); + }; + return ASN1; + }()); + var ASN1Tag = /** @class */ (function () { + function ASN1Tag (stream) { + var buf = stream.get(); + this.tagClass = buf >> 6; + this.tagConstructed = ((buf & 0x20) !== 0); + this.tagNumber = buf & 0x1F; + if (this.tagNumber == 0x1F) { // long tag + var n = new Int10(); + do { + buf = stream.get(); + n.mulAdd(128, buf & 0x7F); + } while (buf & 0x80); + this.tagNumber = n.simplify(); + } + } + ASN1Tag.prototype.isUniversal = function () { + return this.tagClass === 0x00; + }; + ASN1Tag.prototype.isEOC = function () { + return this.tagClass === 0x00 && this.tagNumber === 0x00; + }; + return ASN1Tag; + }()); + + // Copyright (c) 2005 Tom Wu + // Bits per digit + var dbits; + // JavaScript engine analysis + var canary = 0xdeadbeefcafe; + var j_lm = ((canary & 0xffffff) == 0xefcafe); + //#region + var lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]; + var lplim = (1 << 26) / lowprimes[lowprimes.length - 1]; + //#endregion + // (public) Constructor + var BigInteger = /** @class */ (function () { + function BigInteger (a, b, c) { + if (a != null) { + if ("number" == typeof a) { + this.fromNumber(a, b, c); + } + else if (b == null && "string" != typeof a) { + this.fromString(a, 256); + } + else { + this.fromString(a, b); + } + } + } + //#region PUBLIC + // BigInteger.prototype.toString = bnToString; + // (public) return string representation in given radix + BigInteger.prototype.toString = function (b) { + if (this.s < 0) { + return "-" + this.negate().toString(b); + } + var k; + if (b == 16) { + k = 4; + } + else if (b == 8) { + k = 3; + } + else if (b == 2) { + k = 1; + } + else if (b == 32) { + k = 5; + } + else if (b == 4) { + k = 2; + } + else { + return this.toRadix(b); + } + var km = (1 << k) - 1; + var d; + var m = false; + var r = ""; + var i = this.t; + var p = this.DB - (i * this.DB) % k; + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) > 0) { + m = true; + r = int2char(d); + } + while (i >= 0) { + if (p < k) { + d = (this[i] & ((1 << p) - 1)) << (k - p); + d |= this[--i] >> (p += this.DB - k); + } + else { + d = (this[i] >> (p -= k)) & km; + if (p <= 0) { + p += this.DB; + --i; + } + } + if (d > 0) { + m = true; + } + if (m) { + r += int2char(d); + } + } + } + return m ? r : "0"; + }; + // BigInteger.prototype.negate = bnNegate; + // (public) -this + BigInteger.prototype.negate = function () { + var r = nbi(); + BigInteger.ZERO.subTo(this, r); + return r; + }; + // BigInteger.prototype.abs = bnAbs; + // (public) |this| + BigInteger.prototype.abs = function () { + return (this.s < 0) ? this.negate() : this; + }; + // BigInteger.prototype.compareTo = bnCompareTo; + // (public) return + if this > a, - if this < a, 0 if equal + BigInteger.prototype.compareTo = function (a) { + var r = this.s - a.s; + if (r != 0) { + return r; + } + var i = this.t; + r = i - a.t; + if (r != 0) { + return (this.s < 0) ? -r : r; + } + while (--i >= 0) { + if ((r = this[i] - a[i]) != 0) { + return r; + } + } + return 0; + }; + // BigInteger.prototype.bitLength = bnBitLength; + // (public) return the number of bits in "this" + BigInteger.prototype.bitLength = function () { + if (this.t <= 0) { + return 0; + } + return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM)); + }; + // BigInteger.prototype.mod = bnMod; + // (public) this mod a + BigInteger.prototype.mod = function (a) { + var r = nbi(); + this.abs().divRemTo(a, null, r); + if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) { + a.subTo(r, r); + } + return r; + }; + // BigInteger.prototype.modPowInt = bnModPowInt; + // (public) this^e % m, 0 <= e < 2^32 + BigInteger.prototype.modPowInt = function (e, m) { + var z; + if (e < 256 || m.isEven()) { + z = new Classic(m); + } + else { + z = new Montgomery(m); + } + return this.exp(e, z); + }; + // BigInteger.prototype.clone = bnClone; + // (public) + BigInteger.prototype.clone = function () { + var r = nbi(); + this.copyTo(r); + return r; + }; + // BigInteger.prototype.intValue = bnIntValue; + // (public) return value as integer + BigInteger.prototype.intValue = function () { + if (this.s < 0) { + if (this.t == 1) { + return this[0] - this.DV; + } + else if (this.t == 0) { + return -1; + } + } + else if (this.t == 1) { + return this[0]; + } + else if (this.t == 0) { + return 0; + } + // assumes 16 < DB < 32 + return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]; + }; + // BigInteger.prototype.byteValue = bnByteValue; + // (public) return value as byte + BigInteger.prototype.byteValue = function () { + return (this.t == 0) ? this.s : (this[0] << 24) >> 24; + }; + // BigInteger.prototype.shortValue = bnShortValue; + // (public) return value as short (assumes DB>=16) + BigInteger.prototype.shortValue = function () { + return (this.t == 0) ? this.s : (this[0] << 16) >> 16; + }; + // BigInteger.prototype.signum = bnSigNum; + // (public) 0 if this == 0, 1 if this > 0 + BigInteger.prototype.signum = function () { + if (this.s < 0) { + return -1; + } + else if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) { + return 0; + } + else { + return 1; + } + }; + // BigInteger.prototype.toByteArray = bnToByteArray; + // (public) convert to bigendian byte array + BigInteger.prototype.toByteArray = function () { + var i = this.t; + var r = []; + r[0] = this.s; + var p = this.DB - (i * this.DB) % 8; + var d; + var k = 0; + if (i-- > 0) { + if (p < this.DB && (d = this[i] >> p) != (this.s & this.DM) >> p) { + r[k++] = d | (this.s << (this.DB - p)); + } + while (i >= 0) { + if (p < 8) { + d = (this[i] & ((1 << p) - 1)) << (8 - p); + d |= this[--i] >> (p += this.DB - 8); + } + else { + d = (this[i] >> (p -= 8)) & 0xff; + if (p <= 0) { + p += this.DB; + --i; + } + } + if ((d & 0x80) != 0) { + d |= -256; + } + if (k == 0 && (this.s & 0x80) != (d & 0x80)) { + ++k; + } + if (k > 0 || d != this.s) { + r[k++] = d; + } + } + } + return r; + }; + // BigInteger.prototype.equals = bnEquals; + BigInteger.prototype.equals = function (a) { + return (this.compareTo(a) == 0); + }; + // BigInteger.prototype.min = bnMin; + BigInteger.prototype.min = function (a) { + return (this.compareTo(a) < 0) ? this : a; + }; + // BigInteger.prototype.max = bnMax; + BigInteger.prototype.max = function (a) { + return (this.compareTo(a) > 0) ? this : a; + }; + // BigInteger.prototype.and = bnAnd; + BigInteger.prototype.and = function (a) { + var r = nbi(); + this.bitwiseTo(a, op_and, r); + return r; + }; + // BigInteger.prototype.or = bnOr; + BigInteger.prototype.or = function (a) { + var r = nbi(); + this.bitwiseTo(a, op_or, r); + return r; + }; + // BigInteger.prototype.xor = bnXor; + BigInteger.prototype.xor = function (a) { + var r = nbi(); + this.bitwiseTo(a, op_xor, r); + return r; + }; + // BigInteger.prototype.andNot = bnAndNot; + BigInteger.prototype.andNot = function (a) { + var r = nbi(); + this.bitwiseTo(a, op_andnot, r); + return r; + }; + // BigInteger.prototype.not = bnNot; + // (public) ~this + BigInteger.prototype.not = function () { + var r = nbi(); + for (var i = 0; i < this.t; ++i) { + r[i] = this.DM & ~this[i]; + } + r.t = this.t; + r.s = ~this.s; + return r; + }; + // BigInteger.prototype.shiftLeft = bnShiftLeft; + // (public) this << n + BigInteger.prototype.shiftLeft = function (n) { + var r = nbi(); + if (n < 0) { + this.rShiftTo(-n, r); + } + else { + this.lShiftTo(n, r); + } + return r; + }; + // BigInteger.prototype.shiftRight = bnShiftRight; + // (public) this >> n + BigInteger.prototype.shiftRight = function (n) { + var r = nbi(); + if (n < 0) { + this.lShiftTo(-n, r); + } + else { + this.rShiftTo(n, r); + } + return r; + }; + // BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit; + // (public) returns index of lowest 1-bit (or -1 if none) + BigInteger.prototype.getLowestSetBit = function () { + for (var i = 0; i < this.t; ++i) { + if (this[i] != 0) { + return i * this.DB + lbit(this[i]); + } + } + if (this.s < 0) { + return this.t * this.DB; + } + return -1; + }; + // BigInteger.prototype.bitCount = bnBitCount; + // (public) return number of set bits + BigInteger.prototype.bitCount = function () { + var r = 0; + var x = this.s & this.DM; + for (var i = 0; i < this.t; ++i) { + r += cbit(this[i] ^ x); + } + return r; + }; + // BigInteger.prototype.testBit = bnTestBit; + // (public) true iff nth bit is set + BigInteger.prototype.testBit = function (n) { + var j = Math.floor(n / this.DB); + if (j >= this.t) { + return (this.s != 0); + } + return ((this[j] & (1 << (n % this.DB))) != 0); + }; + // BigInteger.prototype.setBit = bnSetBit; + // (public) this | (1< 1) { + var g2 = nbi(); + z.sqrTo(g[1], g2); + while (n <= km) { + g[n] = nbi(); + z.mulTo(g2, g[n - 2], g[n]); + n += 2; + } + } + var j = e.t - 1; + var w; + var is1 = true; + var r2 = nbi(); + var t; + i = nbits(e[j]) - 1; + while (j >= 0) { + if (i >= k1) { + w = (e[j] >> (i - k1)) & km; + } + else { + w = (e[j] & ((1 << (i + 1)) - 1)) << (k1 - i); + if (j > 0) { + w |= e[j - 1] >> (this.DB + i - k1); + } + } + n = k; + while ((w & 1) == 0) { + w >>= 1; + --n; + } + if ((i -= n) < 0) { + i += this.DB; + --j; + } + if (is1) { // ret == 1, don't bother squaring or multiplying it + g[w].copyTo(r); + is1 = false; + } + else { + while (n > 1) { + z.sqrTo(r, r2); + z.sqrTo(r2, r); + n -= 2; + } + if (n > 0) { + z.sqrTo(r, r2); + } + else { + t = r; + r = r2; + r2 = t; + } + z.mulTo(r2, g[w], r); + } + while (j >= 0 && (e[j] & (1 << i)) == 0) { + z.sqrTo(r, r2); + t = r; + r = r2; + r2 = t; + if (--i < 0) { + i = this.DB - 1; + --j; + } + } + } + return z.revert(r); + }; + // BigInteger.prototype.modInverse = bnModInverse; + // (public) 1/this % m (HAC 14.61) + BigInteger.prototype.modInverse = function (m) { + var ac = m.isEven(); + if ((this.isEven() && ac) || m.signum() == 0) { + return BigInteger.ZERO; + } + var u = m.clone(); + var v = this.clone(); + var a = nbv(1); + var b = nbv(0); + var c = nbv(0); + var d = nbv(1); + while (u.signum() != 0) { + while (u.isEven()) { + u.rShiftTo(1, u); + if (ac) { + if (!a.isEven() || !b.isEven()) { + a.addTo(this, a); + b.subTo(m, b); + } + a.rShiftTo(1, a); + } + else if (!b.isEven()) { + b.subTo(m, b); + } + b.rShiftTo(1, b); + } + while (v.isEven()) { + v.rShiftTo(1, v); + if (ac) { + if (!c.isEven() || !d.isEven()) { + c.addTo(this, c); + d.subTo(m, d); + } + c.rShiftTo(1, c); + } + else if (!d.isEven()) { + d.subTo(m, d); + } + d.rShiftTo(1, d); + } + if (u.compareTo(v) >= 0) { + u.subTo(v, u); + if (ac) { + a.subTo(c, a); + } + b.subTo(d, b); + } + else { + v.subTo(u, v); + if (ac) { + c.subTo(a, c); + } + d.subTo(b, d); + } + } + if (v.compareTo(BigInteger.ONE) != 0) { + return BigInteger.ZERO; + } + if (d.compareTo(m) >= 0) { + return d.subtract(m); + } + if (d.signum() < 0) { + d.addTo(m, d); + } + else { + return d; + } + if (d.signum() < 0) { + return d.add(m); + } + else { + return d; + } + }; + // BigInteger.prototype.pow = bnPow; + // (public) this^e + BigInteger.prototype.pow = function (e) { + return this.exp(e, new NullExp()); + }; + // BigInteger.prototype.gcd = bnGCD; + // (public) gcd(this,a) (HAC 14.54) + BigInteger.prototype.gcd = function (a) { + var x = (this.s < 0) ? this.negate() : this.clone(); + var y = (a.s < 0) ? a.negate() : a.clone(); + if (x.compareTo(y) < 0) { + var t = x; + x = y; + y = t; + } + var i = x.getLowestSetBit(); + var g = y.getLowestSetBit(); + if (g < 0) { + return x; + } + if (i < g) { + g = i; + } + if (g > 0) { + x.rShiftTo(g, x); + y.rShiftTo(g, y); + } + while (x.signum() > 0) { + if ((i = x.getLowestSetBit()) > 0) { + x.rShiftTo(i, x); + } + if ((i = y.getLowestSetBit()) > 0) { + y.rShiftTo(i, y); + } + if (x.compareTo(y) >= 0) { + x.subTo(y, x); + x.rShiftTo(1, x); + } + else { + y.subTo(x, y); + y.rShiftTo(1, y); + } + } + if (g > 0) { + y.lShiftTo(g, y); + } + return y; + }; + // BigInteger.prototype.isProbablePrime = bnIsProbablePrime; + // (public) test primality with certainty >= 1-.5^t + BigInteger.prototype.isProbablePrime = function (t) { + var i; + var x = this.abs(); + if (x.t == 1 && x[0] <= lowprimes[lowprimes.length - 1]) { + for (i = 0; i < lowprimes.length; ++i) { + if (x[0] == lowprimes[i]) { + return true; + } + } + return false; + } + if (x.isEven()) { + return false; + } + i = 1; + while (i < lowprimes.length) { + var m = lowprimes[i]; + var j = i + 1; + while (j < lowprimes.length && m < lplim) { + m *= lowprimes[j++]; + } + m = x.modInt(m); + while (i < j) { + if (m % lowprimes[i++] == 0) { + return false; + } + } + } + return x.millerRabin(t); + }; + //#endregion PUBLIC + //#region PROTECTED + // BigInteger.prototype.copyTo = bnpCopyTo; + // (protected) copy this to r + BigInteger.prototype.copyTo = function (r) { + for (var i = this.t - 1; i >= 0; --i) { + r[i] = this[i]; + } + r.t = this.t; + r.s = this.s; + }; + // BigInteger.prototype.fromInt = bnpFromInt; + // (protected) set from integer value x, -DV <= x < DV + BigInteger.prototype.fromInt = function (x) { + this.t = 1; + this.s = (x < 0) ? -1 : 0; + if (x > 0) { + this[0] = x; + } + else if (x < -1) { + this[0] = x + this.DV; + } + else { + this.t = 0; + } + }; + // BigInteger.prototype.fromString = bnpFromString; + // (protected) set from string and radix + BigInteger.prototype.fromString = function (s, b) { + var k; + if (b == 16) { + k = 4; + } + else if (b == 8) { + k = 3; + } + else if (b == 256) { + k = 8; + /* byte array */ + } + else if (b == 2) { + k = 1; + } + else if (b == 32) { + k = 5; + } + else if (b == 4) { + k = 2; + } + else { + this.fromRadix(s, b); + return; + } + this.t = 0; + this.s = 0; + var i = s.length; + var mi = false; + var sh = 0; + while (--i >= 0) { + var x = (k == 8) ? (+s[i]) & 0xff : intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-") { + mi = true; + } + continue; + } + mi = false; + if (sh == 0) { + this[this.t++] = x; + } + else if (sh + k > this.DB) { + this[this.t - 1] |= (x & ((1 << (this.DB - sh)) - 1)) << sh; + this[this.t++] = (x >> (this.DB - sh)); + } + else { + this[this.t - 1] |= x << sh; + } + sh += k; + if (sh >= this.DB) { + sh -= this.DB; + } + } + if (k == 8 && ((+s[0]) & 0x80) != 0) { + this.s = -1; + if (sh > 0) { + this[this.t - 1] |= ((1 << (this.DB - sh)) - 1) << sh; + } + } + this.clamp(); + if (mi) { + BigInteger.ZERO.subTo(this, this); + } + }; + // BigInteger.prototype.clamp = bnpClamp; + // (protected) clamp off excess high words + BigInteger.prototype.clamp = function () { + var c = this.s & this.DM; + while (this.t > 0 && this[this.t - 1] == c) { + --this.t; + } + }; + // BigInteger.prototype.dlShiftTo = bnpDLShiftTo; + // (protected) r = this << n*DB + BigInteger.prototype.dlShiftTo = function (n, r) { + var i; + for (i = this.t - 1; i >= 0; --i) { + r[i + n] = this[i]; + } + for (i = n - 1; i >= 0; --i) { + r[i] = 0; + } + r.t = this.t + n; + r.s = this.s; + }; + // BigInteger.prototype.drShiftTo = bnpDRShiftTo; + // (protected) r = this >> n*DB + BigInteger.prototype.drShiftTo = function (n, r) { + for (var i = n; i < this.t; ++i) { + r[i - n] = this[i]; + } + r.t = Math.max(this.t - n, 0); + r.s = this.s; + }; + // BigInteger.prototype.lShiftTo = bnpLShiftTo; + // (protected) r = this << n + BigInteger.prototype.lShiftTo = function (n, r) { + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << cbs) - 1; + var ds = Math.floor(n / this.DB); + var c = (this.s << bs) & this.DM; + for (var i = this.t - 1; i >= 0; --i) { + r[i + ds + 1] = (this[i] >> cbs) | c; + c = (this[i] & bm) << bs; + } + for (var i = ds - 1; i >= 0; --i) { + r[i] = 0; + } + r[ds] = c; + r.t = this.t + ds + 1; + r.s = this.s; + r.clamp(); + }; + // BigInteger.prototype.rShiftTo = bnpRShiftTo; + // (protected) r = this >> n + BigInteger.prototype.rShiftTo = function (n, r) { + r.s = this.s; + var ds = Math.floor(n / this.DB); + if (ds >= this.t) { + r.t = 0; + return; + } + var bs = n % this.DB; + var cbs = this.DB - bs; + var bm = (1 << bs) - 1; + r[0] = this[ds] >> bs; + for (var i = ds + 1; i < this.t; ++i) { + r[i - ds - 1] |= (this[i] & bm) << cbs; + r[i - ds] = this[i] >> bs; + } + if (bs > 0) { + r[this.t - ds - 1] |= (this.s & bm) << cbs; + } + r.t = this.t - ds; + r.clamp(); + }; + // BigInteger.prototype.subTo = bnpSubTo; + // (protected) r = this - a + BigInteger.prototype.subTo = function (a, r) { + var i = 0; + var c = 0; + var m = Math.min(a.t, this.t); + while (i < m) { + c += this[i] - a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + if (a.t < this.t) { + c -= a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } + else { + c += this.s; + while (i < a.t) { + c -= a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c -= a.s; + } + r.s = (c < 0) ? -1 : 0; + if (c < -1) { + r[i++] = this.DV + c; + } + else if (c > 0) { + r[i++] = c; + } + r.t = i; + r.clamp(); + }; + // BigInteger.prototype.multiplyTo = bnpMultiplyTo; + // (protected) r = this * a, r != this,a (HAC 14.12) + // "this" should be the larger one if appropriate. + BigInteger.prototype.multiplyTo = function (a, r) { + var x = this.abs(); + var y = a.abs(); + var i = x.t; + r.t = i + y.t; + while (--i >= 0) { + r[i] = 0; + } + for (i = 0; i < y.t; ++i) { + r[i + x.t] = x.am(0, y[i], r, i, 0, x.t); + } + r.s = 0; + r.clamp(); + if (this.s != a.s) { + BigInteger.ZERO.subTo(r, r); + } + }; + // BigInteger.prototype.squareTo = bnpSquareTo; + // (protected) r = this^2, r != this (HAC 14.16) + BigInteger.prototype.squareTo = function (r) { + var x = this.abs(); + var i = r.t = 2 * x.t; + while (--i >= 0) { + r[i] = 0; + } + for (i = 0; i < x.t - 1; ++i) { + var c = x.am(i, x[i], r, 2 * i, 0, 1); + if ((r[i + x.t] += x.am(i + 1, 2 * x[i], r, 2 * i + 1, c, x.t - i - 1)) >= x.DV) { + r[i + x.t] -= x.DV; + r[i + x.t + 1] = 1; + } + } + if (r.t > 0) { + r[r.t - 1] += x.am(i, x[i], r, 2 * i, 0, 1); + } + r.s = 0; + r.clamp(); + }; + // BigInteger.prototype.divRemTo = bnpDivRemTo; + // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) + // r != q, this != m. q or r may be null. + BigInteger.prototype.divRemTo = function (m, q, r) { + var pm = m.abs(); + if (pm.t <= 0) { + return; + } + var pt = this.abs(); + if (pt.t < pm.t) { + if (q != null) { + q.fromInt(0); + } + if (r != null) { + this.copyTo(r); + } + return; + } + if (r == null) { + r = nbi(); + } + var y = nbi(); + var ts = this.s; + var ms = m.s; + var nsh = this.DB - nbits(pm[pm.t - 1]); // normalize modulus + if (nsh > 0) { + pm.lShiftTo(nsh, y); + pt.lShiftTo(nsh, r); + } + else { + pm.copyTo(y); + pt.copyTo(r); + } + var ys = y.t; + var y0 = y[ys - 1]; + if (y0 == 0) { + return; + } + var yt = y0 * (1 << this.F1) + ((ys > 1) ? y[ys - 2] >> this.F2 : 0); + var d1 = this.FV / yt; + var d2 = (1 << this.F1) / yt; + var e = 1 << this.F2; + var i = r.t; + var j = i - ys; + var t = (q == null) ? nbi() : q; + y.dlShiftTo(j, t); + if (r.compareTo(t) >= 0) { + r[r.t++] = 1; + r.subTo(t, r); + } + BigInteger.ONE.dlShiftTo(ys, t); + t.subTo(y, y); // "negative" y so we can replace sub with am later + while (y.t < ys) { + y[y.t++] = 0; + } + while (--j >= 0) { + // Estimate quotient digit + var qd = (r[--i] == y0) ? this.DM : Math.floor(r[i] * d1 + (r[i - 1] + e) * d2); + if ((r[i] += y.am(0, qd, r, j, 0, ys)) < qd) { // Try it out + y.dlShiftTo(j, t); + r.subTo(t, r); + while (r[i] < --qd) { + r.subTo(t, r); + } + } + } + if (q != null) { + r.drShiftTo(ys, q); + if (ts != ms) { + BigInteger.ZERO.subTo(q, q); + } + } + r.t = ys; + r.clamp(); + if (nsh > 0) { + r.rShiftTo(nsh, r); + } // Denormalize remainder + if (ts < 0) { + BigInteger.ZERO.subTo(r, r); + } + }; + // BigInteger.prototype.invDigit = bnpInvDigit; + // (protected) return "-1/this % 2^DB"; useful for Mont. reduction + // justification: + // xy == 1 (mod m) + // xy = 1+km + // xy(2-xy) = (1+km)(1-km) + // x[y(2-xy)] = 1-k^2m^2 + // x[y(2-xy)] == 1 (mod m^2) + // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 + // should reduce x and y(2-xy) by m^2 at each step to keep size bounded. + // JS multiply "overflows" differently from C/C++, so care is needed here. + BigInteger.prototype.invDigit = function () { + if (this.t < 1) { + return 0; + } + var x = this[0]; + if ((x & 1) == 0) { + return 0; + } + var y = x & 3; // y == 1/x mod 2^2 + y = (y * (2 - (x & 0xf) * y)) & 0xf; // y == 1/x mod 2^4 + y = (y * (2 - (x & 0xff) * y)) & 0xff; // y == 1/x mod 2^8 + y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff; // y == 1/x mod 2^16 + // last step - calculate inverse mod DV directly; + // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints + y = (y * (2 - x * y % this.DV)) % this.DV; // y == 1/x mod 2^dbits + // we really want the negative inverse, and -DV < y < DV + return (y > 0) ? this.DV - y : -y; + }; + // BigInteger.prototype.isEven = bnpIsEven; + // (protected) true iff this is even + BigInteger.prototype.isEven = function () { + return ((this.t > 0) ? (this[0] & 1) : this.s) == 0; + }; + // BigInteger.prototype.exp = bnpExp; + // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) + BigInteger.prototype.exp = function (e, z) { + if (e > 0xffffffff || e < 1) { + return BigInteger.ONE; + } + var r = nbi(); + var r2 = nbi(); + var g = z.convert(this); + var i = nbits(e) - 1; + g.copyTo(r); + while (--i >= 0) { + z.sqrTo(r, r2); + if ((e & (1 << i)) > 0) { + z.mulTo(r2, g, r); + } + else { + var t = r; + r = r2; + r2 = t; + } + } + return z.revert(r); + }; + // BigInteger.prototype.chunkSize = bnpChunkSize; + // (protected) return x s.t. r^x < DV + BigInteger.prototype.chunkSize = function (r) { + return Math.floor(Math.LN2 * this.DB / Math.log(r)); + }; + // BigInteger.prototype.toRadix = bnpToRadix; + // (protected) convert to radix string + BigInteger.prototype.toRadix = function (b) { + if (b == null) { + b = 10; + } + if (this.signum() == 0 || b < 2 || b > 36) { + return "0"; + } + var cs = this.chunkSize(b); + var a = Math.pow(b, cs); + var d = nbv(a); + var y = nbi(); + var z = nbi(); + var r = ""; + this.divRemTo(d, y, z); + while (y.signum() > 0) { + r = (a + z.intValue()).toString(b).substr(1) + r; + y.divRemTo(d, y, z); + } + return z.intValue().toString(b) + r; + }; + // BigInteger.prototype.fromRadix = bnpFromRadix; + // (protected) convert from radix string + BigInteger.prototype.fromRadix = function (s, b) { + this.fromInt(0); + if (b == null) { + b = 10; + } + var cs = this.chunkSize(b); + var d = Math.pow(b, cs); + var mi = false; + var j = 0; + var w = 0; + for (var i = 0; i < s.length; ++i) { + var x = intAt(s, i); + if (x < 0) { + if (s.charAt(i) == "-" && this.signum() == 0) { + mi = true; + } + continue; + } + w = b * w + x; + if (++j >= cs) { + this.dMultiply(d); + this.dAddOffset(w, 0); + j = 0; + w = 0; + } + } + if (j > 0) { + this.dMultiply(Math.pow(b, j)); + this.dAddOffset(w, 0); + } + if (mi) { + BigInteger.ZERO.subTo(this, this); + } + }; + // BigInteger.prototype.fromNumber = bnpFromNumber; + // (protected) alternate constructor + BigInteger.prototype.fromNumber = function (a, b, c) { + if ("number" == typeof b) { + // new BigInteger(int,int,RNG) + if (a < 2) { + this.fromInt(1); + } + else { + this.fromNumber(a, c); + if (!this.testBit(a - 1)) { + // force MSB set + this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); + } + if (this.isEven()) { + this.dAddOffset(1, 0); + } // force odd + while (!this.isProbablePrime(b)) { + this.dAddOffset(2, 0); + if (this.bitLength() > a) { + this.subTo(BigInteger.ONE.shiftLeft(a - 1), this); + } + } + } + } + else { + // new BigInteger(int,RNG) + var x = []; + var t = a & 7; + x.length = (a >> 3) + 1; + b.nextBytes(x); + if (t > 0) { + x[0] &= ((1 << t) - 1); + } + else { + x[0] = 0; + } + this.fromString(x, 256); + } + }; + // BigInteger.prototype.bitwiseTo = bnpBitwiseTo; + // (protected) r = this op a (bitwise) + BigInteger.prototype.bitwiseTo = function (a, op, r) { + var i; + var f; + var m = Math.min(a.t, this.t); + for (i = 0; i < m; ++i) { + r[i] = op(this[i], a[i]); + } + if (a.t < this.t) { + f = a.s & this.DM; + for (i = m; i < this.t; ++i) { + r[i] = op(this[i], f); + } + r.t = this.t; + } + else { + f = this.s & this.DM; + for (i = m; i < a.t; ++i) { + r[i] = op(f, a[i]); + } + r.t = a.t; + } + r.s = op(this.s, a.s); + r.clamp(); + }; + // BigInteger.prototype.changeBit = bnpChangeBit; + // (protected) this op (1<>= this.DB; + } + if (a.t < this.t) { + c += a.s; + while (i < this.t) { + c += this[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += this.s; + } + else { + c += this.s; + while (i < a.t) { + c += a[i]; + r[i++] = c & this.DM; + c >>= this.DB; + } + c += a.s; + } + r.s = (c < 0) ? -1 : 0; + if (c > 0) { + r[i++] = c; + } + else if (c < -1) { + r[i++] = this.DV + c; + } + r.t = i; + r.clamp(); + }; + // BigInteger.prototype.dMultiply = bnpDMultiply; + // (protected) this *= n, this >= 0, 1 < n < DV + BigInteger.prototype.dMultiply = function (n) { + this[this.t] = this.am(0, n - 1, this, 0, 0, this.t); + ++this.t; + this.clamp(); + }; + // BigInteger.prototype.dAddOffset = bnpDAddOffset; + // (protected) this += n << w words, this >= 0 + BigInteger.prototype.dAddOffset = function (n, w) { + if (n == 0) { + return; + } + while (this.t <= w) { + this[this.t++] = 0; + } + this[w] += n; + while (this[w] >= this.DV) { + this[w] -= this.DV; + if (++w >= this.t) { + this[this.t++] = 0; + } + ++this[w]; + } + }; + // BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo; + // (protected) r = lower n words of "this * a", a.t <= n + // "this" should be the larger one if appropriate. + BigInteger.prototype.multiplyLowerTo = function (a, n, r) { + var i = Math.min(this.t + a.t, n); + r.s = 0; // assumes a,this >= 0 + r.t = i; + while (i > 0) { + r[--i] = 0; + } + for (var j = r.t - this.t; i < j; ++i) { + r[i + this.t] = this.am(0, a[i], r, i, 0, this.t); + } + for (var j = Math.min(a.t, n); i < j; ++i) { + this.am(0, a[i], r, i, 0, n - i); + } + r.clamp(); + }; + // BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo; + // (protected) r = "this * a" without lower n words, n > 0 + // "this" should be the larger one if appropriate. + BigInteger.prototype.multiplyUpperTo = function (a, n, r) { + --n; + var i = r.t = this.t + a.t - n; + r.s = 0; // assumes a,this >= 0 + while (--i >= 0) { + r[i] = 0; + } + for (i = Math.max(n - this.t, 0); i < a.t; ++i) { + r[this.t + i - n] = this.am(n - i, a[i], r, 0, 0, this.t + i - n); + } + r.clamp(); + r.drShiftTo(1, r); + }; + // BigInteger.prototype.modInt = bnpModInt; + // (protected) this % n, n < 2^26 + BigInteger.prototype.modInt = function (n) { + if (n <= 0) { + return 0; + } + var d = this.DV % n; + var r = (this.s < 0) ? n - 1 : 0; + if (this.t > 0) { + if (d == 0) { + r = this[0] % n; + } + else { + for (var i = this.t - 1; i >= 0; --i) { + r = (d * r + this[i]) % n; + } + } + } + return r; + }; + // BigInteger.prototype.millerRabin = bnpMillerRabin; + // (protected) true if probably prime (HAC 4.24, Miller-Rabin) + BigInteger.prototype.millerRabin = function (t) { + var n1 = this.subtract(BigInteger.ONE); + var k = n1.getLowestSetBit(); + if (k <= 0) { + return false; + } + var r = n1.shiftRight(k); + t = (t + 1) >> 1; + if (t > lowprimes.length) { + t = lowprimes.length; + } + var a = nbi(); + for (var i = 0; i < t; ++i) { + // Pick bases at random, instead of starting at 2 + a.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]); + var y = a.modPow(r, this); + if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { + var j = 1; + while (j++ < k && y.compareTo(n1) != 0) { + y = y.modPowInt(2, this); + if (y.compareTo(BigInteger.ONE) == 0) { + return false; + } + } + if (y.compareTo(n1) != 0) { + return false; + } + } + } + return true; + }; + // BigInteger.prototype.square = bnSquare; + // (public) this^2 + BigInteger.prototype.square = function () { + var r = nbi(); + this.squareTo(r); + return r; + }; + //#region ASYNC + // Public API method + BigInteger.prototype.gcda = function (a, callback) { + var x = (this.s < 0) ? this.negate() : this.clone(); + var y = (a.s < 0) ? a.negate() : a.clone(); + if (x.compareTo(y) < 0) { + var t = x; + x = y; + y = t; + } + var i = x.getLowestSetBit(); + var g = y.getLowestSetBit(); + if (g < 0) { + callback(x); + return; + } + if (i < g) { + g = i; + } + if (g > 0) { + x.rShiftTo(g, x); + y.rShiftTo(g, y); + } + // Workhorse of the algorithm, gets called 200 - 800 times per 512 bit keygen. + var gcda1 = function () { + if ((i = x.getLowestSetBit()) > 0) { + x.rShiftTo(i, x); + } + if ((i = y.getLowestSetBit()) > 0) { + y.rShiftTo(i, y); + } + if (x.compareTo(y) >= 0) { + x.subTo(y, x); + x.rShiftTo(1, x); + } + else { + y.subTo(x, y); + y.rShiftTo(1, y); + } + if (!(x.signum() > 0)) { + if (g > 0) { + y.lShiftTo(g, y); + } + setTimeout(function () { callback(y); }, 0); // escape + } + else { + setTimeout(gcda1, 0); + } + }; + setTimeout(gcda1, 10); + }; + // (protected) alternate constructor + BigInteger.prototype.fromNumberAsync = function (a, b, c, callback) { + if ("number" == typeof b) { + if (a < 2) { + this.fromInt(1); + } + else { + this.fromNumber(a, c); + if (!this.testBit(a - 1)) { + this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this); + } + if (this.isEven()) { + this.dAddOffset(1, 0); + } + var bnp_1 = this; + var bnpfn1_1 = function () { + bnp_1.dAddOffset(2, 0); + if (bnp_1.bitLength() > a) { + bnp_1.subTo(BigInteger.ONE.shiftLeft(a - 1), bnp_1); + } + if (bnp_1.isProbablePrime(b)) { + setTimeout(function () { callback(); }, 0); // escape + } + else { + setTimeout(bnpfn1_1, 0); + } + }; + setTimeout(bnpfn1_1, 0); + } + } + else { + var x = []; + var t = a & 7; + x.length = (a >> 3) + 1; + b.nextBytes(x); + if (t > 0) { + x[0] &= ((1 << t) - 1); + } + else { + x[0] = 0; + } + this.fromString(x, 256); + } + }; + return BigInteger; + }()); + //#region REDUCERS + //#region NullExp + var NullExp = /** @class */ (function () { + function NullExp () { + } + // NullExp.prototype.convert = nNop; + NullExp.prototype.convert = function (x) { + return x; + }; + // NullExp.prototype.revert = nNop; + NullExp.prototype.revert = function (x) { + return x; + }; + // NullExp.prototype.mulTo = nMulTo; + NullExp.prototype.mulTo = function (x, y, r) { + x.multiplyTo(y, r); + }; + // NullExp.prototype.sqrTo = nSqrTo; + NullExp.prototype.sqrTo = function (x, r) { + x.squareTo(r); + }; + return NullExp; + }()); + // Modular reduction using "classic" algorithm + var Classic = /** @class */ (function () { + function Classic (m) { + this.m = m; + } + // Classic.prototype.convert = cConvert; + Classic.prototype.convert = function (x) { + if (x.s < 0 || x.compareTo(this.m) >= 0) { + return x.mod(this.m); + } + else { + return x; + } + }; + // Classic.prototype.revert = cRevert; + Classic.prototype.revert = function (x) { + return x; + }; + // Classic.prototype.reduce = cReduce; + Classic.prototype.reduce = function (x) { + x.divRemTo(this.m, null, x); + }; + // Classic.prototype.mulTo = cMulTo; + Classic.prototype.mulTo = function (x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + }; + // Classic.prototype.sqrTo = cSqrTo; + Classic.prototype.sqrTo = function (x, r) { + x.squareTo(r); + this.reduce(r); + }; + return Classic; + }()); + //#endregion + //#region Montgomery + // Montgomery reduction + var Montgomery = /** @class */ (function () { + function Montgomery (m) { + this.m = m; + this.mp = m.invDigit(); + this.mpl = this.mp & 0x7fff; + this.mph = this.mp >> 15; + this.um = (1 << (m.DB - 15)) - 1; + this.mt2 = 2 * m.t; + } + // Montgomery.prototype.convert = montConvert; + // xR mod m + Montgomery.prototype.convert = function (x) { + var r = nbi(); + x.abs().dlShiftTo(this.m.t, r); + r.divRemTo(this.m, null, r); + if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) { + this.m.subTo(r, r); + } + return r; + }; + // Montgomery.prototype.revert = montRevert; + // x/R mod m + Montgomery.prototype.revert = function (x) { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + }; + // Montgomery.prototype.reduce = montReduce; + // x = x/R mod m (HAC 14.32) + Montgomery.prototype.reduce = function (x) { + while (x.t <= this.mt2) { + // pad x so am has enough room later + x[x.t++] = 0; + } + for (var i = 0; i < this.m.t; ++i) { + // faster way of calculating u0 = x[i]*mp mod DV + var j = x[i] & 0x7fff; + var u0 = (j * this.mpl + (((j * this.mph + (x[i] >> 15) * this.mpl) & this.um) << 15)) & x.DM; + // use am to combine the multiply-shift-add into one call + j = i + this.m.t; + x[j] += this.m.am(0, u0, x, i, 0, this.m.t); + // propagate carry + while (x[j] >= x.DV) { + x[j] -= x.DV; + x[++j]++; + } + } + x.clamp(); + x.drShiftTo(this.m.t, x); + if (x.compareTo(this.m) >= 0) { + x.subTo(this.m, x); + } + }; + // Montgomery.prototype.mulTo = montMulTo; + // r = "xy/R mod m"; x,y != r + Montgomery.prototype.mulTo = function (x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + }; + // Montgomery.prototype.sqrTo = montSqrTo; + // r = "x^2/R mod m"; x != r + Montgomery.prototype.sqrTo = function (x, r) { + x.squareTo(r); + this.reduce(r); + }; + return Montgomery; + }()); + //#endregion Montgomery + //#region Barrett + // Barrett modular reduction + var Barrett = /** @class */ (function () { + function Barrett (m) { + this.m = m; + // setup Barrett + this.r2 = nbi(); + this.q3 = nbi(); + BigInteger.ONE.dlShiftTo(2 * m.t, this.r2); + this.mu = this.r2.divide(m); + } + // Barrett.prototype.convert = barrettConvert; + Barrett.prototype.convert = function (x) { + if (x.s < 0 || x.t > 2 * this.m.t) { + return x.mod(this.m); + } + else if (x.compareTo(this.m) < 0) { + return x; + } + else { + var r = nbi(); + x.copyTo(r); + this.reduce(r); + return r; + } + }; + // Barrett.prototype.revert = barrettRevert; + Barrett.prototype.revert = function (x) { + return x; + }; + // Barrett.prototype.reduce = barrettReduce; + // x = x mod m (HAC 14.42) + Barrett.prototype.reduce = function (x) { + x.drShiftTo(this.m.t - 1, this.r2); + if (x.t > this.m.t + 1) { + x.t = this.m.t + 1; + x.clamp(); + } + this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3); + this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); + while (x.compareTo(this.r2) < 0) { + x.dAddOffset(1, this.m.t + 1); + } + x.subTo(this.r2, x); + while (x.compareTo(this.m) >= 0) { + x.subTo(this.m, x); + } + }; + // Barrett.prototype.mulTo = barrettMulTo; + // r = x*y mod m; x,y != r + Barrett.prototype.mulTo = function (x, y, r) { + x.multiplyTo(y, r); + this.reduce(r); + }; + // Barrett.prototype.sqrTo = barrettSqrTo; + // r = x^2 mod m; x != r + Barrett.prototype.sqrTo = function (x, r) { + x.squareTo(r); + this.reduce(r); + }; + return Barrett; + }()); + //#endregion + //#endregion REDUCERS + // return new, unset BigInteger + function nbi () { return new BigInteger(null); } + function parseBigInt (str, r) { + return new BigInteger(str, r); + } + // am: Compute w_j += (x*this_i), propagate carries, + // c is initial carry, returns final carry. + // c < 3*dvalue, x < 2*dvalue, this_i < dvalue + // We need to select the fastest one that works in this environment. + // am1: use a single mult and divide to get the high bits, + // max digit bits should be 26 because + // max internal value = 2*dvalue^2-2*dvalue (< 2^53) + function am1 (i, x, w, j, c, n) { + while (--n >= 0) { + var v = x * this[i++] + w[j] + c; + c = Math.floor(v / 0x4000000); + w[j++] = v & 0x3ffffff; + } + return c; + } + // am2 avoids a big mult-and-extract completely. + // Max digit bits should be <= 30 because we do bitwise ops + // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) + function am2 (i, x, w, j, c, n) { + var xl = x & 0x7fff; + var xh = x >> 15; + while (--n >= 0) { + var l = this[i] & 0x7fff; + var h = this[i++] >> 15; + var m = xh * l + h * xl; + l = xl * l + ((m & 0x7fff) << 15) + w[j] + (c & 0x3fffffff); + c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30); + w[j++] = l & 0x3fffffff; + } + return c; + } + // Alternately, set max digit bits to 28 since some + // browsers slow down when dealing with 32-bit numbers. + function am3 (i, x, w, j, c, n) { + var xl = x & 0x3fff; + var xh = x >> 14; + while (--n >= 0) { + var l = this[i] & 0x3fff; + var h = this[i++] >> 14; + var m = xh * l + h * xl; + l = xl * l + ((m & 0x3fff) << 14) + w[j] + c; + c = (l >> 28) + (m >> 14) + xh * h; + w[j++] = l & 0xfffffff; + } + return c; + } + if (j_lm && (navigator.appName == "Microsoft Internet Explorer")) { + BigInteger.prototype.am = am2; + dbits = 30; + } + else if (j_lm && (navigator.appName != "Netscape")) { + BigInteger.prototype.am = am1; + dbits = 26; + } + else { // Mozilla/Netscape seems to prefer am3 + BigInteger.prototype.am = am3; + dbits = 28; + } + BigInteger.prototype.DB = dbits; + BigInteger.prototype.DM = ((1 << dbits) - 1); + BigInteger.prototype.DV = (1 << dbits); + var BI_FP = 52; + BigInteger.prototype.FV = Math.pow(2, BI_FP); + BigInteger.prototype.F1 = BI_FP - dbits; + BigInteger.prototype.F2 = 2 * dbits - BI_FP; + // Digit conversions + var BI_RC = []; + var rr; + var vv; + rr = "0".charCodeAt(0); + for (vv = 0; vv <= 9; ++vv) { + BI_RC[rr++] = vv; + } + rr = "a".charCodeAt(0); + for (vv = 10; vv < 36; ++vv) { + BI_RC[rr++] = vv; + } + rr = "A".charCodeAt(0); + for (vv = 10; vv < 36; ++vv) { + BI_RC[rr++] = vv; + } + function intAt (s, i) { + var c = BI_RC[s.charCodeAt(i)]; + return (c == null) ? -1 : c; + } + // return bigint initialized to value + function nbv (i) { + var r = nbi(); + r.fromInt(i); + return r; + } + // returns bit length of the integer x + function nbits (x) { + var r = 1; + var t; + if ((t = x >>> 16) != 0) { + x = t; + r += 16; + } + if ((t = x >> 8) != 0) { + x = t; + r += 8; + } + if ((t = x >> 4) != 0) { + x = t; + r += 4; + } + if ((t = x >> 2) != 0) { + x = t; + r += 2; + } + if ((t = x >> 1) != 0) { + x = t; + r += 1; + } + return r; + } + // "constants" + BigInteger.ZERO = nbv(0); + BigInteger.ONE = nbv(1); + + // prng4.js - uses Arcfour as a PRNG + var Arcfour = /** @class */ (function () { + function Arcfour () { + this.i = 0; + this.j = 0; + this.S = []; + } + // Arcfour.prototype.init = ARC4init; + // Initialize arcfour context from key, an array of ints, each from [0..255] + Arcfour.prototype.init = function (key) { + var i; + var j; + var t; + for (i = 0; i < 256; ++i) { + this.S[i] = i; + } + j = 0; + for (i = 0; i < 256; ++i) { + j = (j + this.S[i] + key[i % key.length]) & 255; + t = this.S[i]; + this.S[i] = this.S[j]; + this.S[j] = t; + } + this.i = 0; + this.j = 0; + }; + // Arcfour.prototype.next = ARC4next; + Arcfour.prototype.next = function () { + var t; + this.i = (this.i + 1) & 255; + this.j = (this.j + this.S[this.i]) & 255; + t = this.S[this.i]; + this.S[this.i] = this.S[this.j]; + this.S[this.j] = t; + return this.S[(t + this.S[this.i]) & 255]; + }; + return Arcfour; + }()); + // Plug in your RNG constructor here + function prng_newstate () { + return new Arcfour(); + } + // Pool size must be a multiple of 4 and greater than 32. + // An array of bytes the size of the pool will be passed to init() + var rng_psize = 256; + + // Random number generator - requires a PRNG backend, e.g. prng4.js + var rng_state; + var rng_pool = null; + var rng_pptr; + // Initialize the pool with junk if needed. + if (rng_pool == null) { + rng_pool = []; + rng_pptr = 0; + var t = void 0; + if (window.crypto && window.crypto.getRandomValues) { + // Extract entropy (2048 bits) from RNG if available + var z = new Uint32Array(256); + window.crypto.getRandomValues(z); + for (t = 0; t < z.length; ++t) { + rng_pool[rng_pptr++] = z[t] & 255; + } + } + // Use mouse events for entropy, if we do not have enough entropy by the time + // we need it, entropy will be generated by Math.random. + var onMouseMoveListener_1 = function (ev) { + this.count = this.count || 0; + if (this.count >= 256 || rng_pptr >= rng_psize) { + if (window.removeEventListener) { + window.removeEventListener("mousemove", onMouseMoveListener_1, false); + } + else if (window.detachEvent) { + window.detachEvent("onmousemove", onMouseMoveListener_1); + } + return; + } + try { + var mouseCoordinates = ev.x + ev.y; + rng_pool[rng_pptr++] = mouseCoordinates & 255; + this.count += 1; + } + catch (e) { + // Sometimes Firefox will deny permission to access event properties for some reason. Ignore. + } + }; + if (window.addEventListener) { + window.addEventListener("mousemove", onMouseMoveListener_1, false); + } + else if (window.attachEvent) { + window.attachEvent("onmousemove", onMouseMoveListener_1); + } + } + function rng_get_byte () { + if (rng_state == null) { + rng_state = prng_newstate(); + // At this point, we may not have collected enough entropy. If not, fall back to Math.random + while (rng_pptr < rng_psize) { + var random = Math.floor(65536 * Math.random()); + rng_pool[rng_pptr++] = random & 255; + } + rng_state.init(rng_pool); + for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) { + rng_pool[rng_pptr] = 0; + } + rng_pptr = 0; + } + // TODO: allow reseeding after first request + return rng_state.next(); + } + var SecureRandom = /** @class */ (function () { + function SecureRandom () { + } + SecureRandom.prototype.nextBytes = function (ba) { + for (var i = 0; i < ba.length; ++i) { + ba[i] = rng_get_byte(); + } + }; + return SecureRandom; + }()); + + // Depends on jsbn.js and rng.js + // function linebrk(s,n) { + // var ret = ""; + // var i = 0; + // while(i + n < s.length) { + // ret += s.substring(i,i+n) + "\n"; + // i += n; + // } + // return ret + s.substring(i,s.length); + // } + // function byte2Hex(b) { + // if(b < 0x10) + // return "0" + b.toString(16); + // else + // return b.toString(16); + // } + function pkcs1pad1 (s, n) { + if (n < s.length + 22) { + console.error("Message too long for RSA"); + return null; + } + var len = n - s.length - 6; + var filler = ""; + for (var f = 0; f < len; f += 2) { + filler += "ff"; + } + var m = "0001" + filler + "00" + s; + return parseBigInt(m, 16); + } + // PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint + function pkcs1pad2 (s, n) { + if (n < s.length + 11) { // TODO: fix for utf-8 + console.error("Message too long for RSA"); + return null; + } + var ba = []; + var i = s.length - 1; + while (i >= 0 && n > 0) { + var c = s.charCodeAt(i--); + if (c < 128) { // encode using utf-8 + ba[--n] = c; + } + else if ((c > 127) && (c < 2048)) { + ba[--n] = (c & 63) | 128; + ba[--n] = (c >> 6) | 192; + } + else { + ba[--n] = (c & 63) | 128; + ba[--n] = ((c >> 6) & 63) | 128; + ba[--n] = (c >> 12) | 224; + } + } + ba[--n] = 0; + var rng = new SecureRandom(); + var x = []; + while (n > 2) { // random non-zero pad + x[0] = 0; + while (x[0] == 0) { + rng.nextBytes(x); + } + ba[--n] = x[0]; + } + ba[--n] = 2; + ba[--n] = 0; + return new BigInteger(ba); + } + // "empty" RSA key constructor + var RSAKey = /** @class */ (function () { + function RSAKey () { + this.n = null; + this.e = 0; + this.d = null; + this.p = null; + this.q = null; + this.dmp1 = null; + this.dmq1 = null; + this.coeff = null; + } + //#region PROTECTED + // protected + // RSAKey.prototype.doPublic = RSADoPublic; + // Perform raw public operation on "x": return x^e (mod n) + RSAKey.prototype.doPublic = function (x) { + return x.modPowInt(this.e, this.n); + }; + // RSAKey.prototype.doPrivate = RSADoPrivate; + // Perform raw private operation on "x": return x^d (mod n) + RSAKey.prototype.doPrivate = function (x) { + if (this.p == null || this.q == null) { + return x.modPow(this.d, this.n); + } + // TODO: re-calculate any missing CRT params + var xp = x.mod(this.p).modPow(this.dmp1, this.p); + var xq = x.mod(this.q).modPow(this.dmq1, this.q); + while (xp.compareTo(xq) < 0) { + xp = xp.add(this.p); + } + return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq); + }; + //#endregion PROTECTED + //#region PUBLIC + // RSAKey.prototype.setPublic = RSASetPublic; + // Set the public key fields N and e from hex strings + RSAKey.prototype.setPublic = function (N, E) { + if (N != null && E != null && N.length > 0 && E.length > 0) { + this.n = parseBigInt(N, 16); + this.e = parseInt(E, 16); + } + else { + console.error("Invalid RSA public key"); + } + }; + // RSAKey.prototype.encrypt = RSAEncrypt; + // Return the PKCS#1 RSA encryption of "text" as an even-length hex string + RSAKey.prototype.encrypt = function (text) { + var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3); + if (m == null) { + return null; + } + var c = this.doPublic(m); + if (c == null) { + return null; + } + var h = c.toString(16); + if ((h.length & 1) == 0) { + return h; + } + else { + return "0" + h; + } + }; + // RSAKey.prototype.setPrivate = RSASetPrivate; + // Set the private key fields N, e, and d from hex strings + RSAKey.prototype.setPrivate = function (N, E, D) { + if (N != null && E != null && N.length > 0 && E.length > 0) { + this.n = parseBigInt(N, 16); + this.e = parseInt(E, 16); + this.d = parseBigInt(D, 16); + } + else { + console.error("Invalid RSA private key"); + } + }; + // RSAKey.prototype.setPrivateEx = RSASetPrivateEx; + // Set the private key fields N, e, d and CRT params from hex strings + RSAKey.prototype.setPrivateEx = function (N, E, D, P, Q, DP, DQ, C) { + if (N != null && E != null && N.length > 0 && E.length > 0) { + this.n = parseBigInt(N, 16); + this.e = parseInt(E, 16); + this.d = parseBigInt(D, 16); + this.p = parseBigInt(P, 16); + this.q = parseBigInt(Q, 16); + this.dmp1 = parseBigInt(DP, 16); + this.dmq1 = parseBigInt(DQ, 16); + this.coeff = parseBigInt(C, 16); + } + else { + console.error("Invalid RSA private key"); + } + }; + // RSAKey.prototype.generate = RSAGenerate; + // Generate a new random private key B bits long, using public expt E + RSAKey.prototype.generate = function (B, E) { + var rng = new SecureRandom(); + var qs = B >> 1; + this.e = parseInt(E, 16); + var ee = new BigInteger(E, 16); + for (; ;) { + for (; ;) { + this.p = new BigInteger(B - qs, 1, rng); + if (this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) { + break; + } + } + for (; ;) { + this.q = new BigInteger(qs, 1, rng); + if (this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) { + break; + } + } + if (this.p.compareTo(this.q) <= 0) { + var t = this.p; + this.p = this.q; + this.q = t; + } + var p1 = this.p.subtract(BigInteger.ONE); + var q1 = this.q.subtract(BigInteger.ONE); + var phi = p1.multiply(q1); + if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) { + this.n = this.p.multiply(this.q); + this.d = ee.modInverse(phi); + this.dmp1 = this.d.mod(p1); + this.dmq1 = this.d.mod(q1); + this.coeff = this.q.modInverse(this.p); + break; + } + } + }; + // RSAKey.prototype.decrypt = RSADecrypt; + // Return the PKCS#1 RSA decryption of "ctext". + // "ctext" is an even-length hex string and the output is a plain string. + RSAKey.prototype.decrypt = function (ctext) { + var c = parseBigInt(ctext, 16); + var m = this.doPublic(c); + //var m = this.doPrivate(c); + if (m == null) { + return null; + } + + return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3); + + }; + // Generate a new random private key B bits long, using public expt E + RSAKey.prototype.generateAsync = function (B, E, callback) { + var rng = new SecureRandom(); + var qs = B >> 1; + this.e = parseInt(E, 16); + var ee = new BigInteger(E, 16); + var rsa = this; + // These functions have non-descript names because they were originally for(;;) loops. + // I don't know about cryptography to give them better names than loop1-4. + var loop1 = function () { + var loop4 = function () { + if (rsa.p.compareTo(rsa.q) <= 0) { + var t = rsa.p; + rsa.p = rsa.q; + rsa.q = t; + } + var p1 = rsa.p.subtract(BigInteger.ONE); + var q1 = rsa.q.subtract(BigInteger.ONE); + var phi = p1.multiply(q1); + if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) { + rsa.n = rsa.p.multiply(rsa.q); + rsa.d = ee.modInverse(phi); + rsa.dmp1 = rsa.d.mod(p1); + rsa.dmq1 = rsa.d.mod(q1); + rsa.coeff = rsa.q.modInverse(rsa.p); + setTimeout(function () { callback(); }, 0); // escape + } + else { + setTimeout(loop1, 0); + } + }; + var loop3 = function () { + rsa.q = nbi(); + rsa.q.fromNumberAsync(qs, 1, rng, function () { + rsa.q.subtract(BigInteger.ONE).gcda(ee, function (r) { + if (r.compareTo(BigInteger.ONE) == 0 && rsa.q.isProbablePrime(10)) { + setTimeout(loop4, 0); + } + else { + setTimeout(loop3, 0); + } + }); + }); + }; + var loop2 = function () { + rsa.p = nbi(); + rsa.p.fromNumberAsync(B - qs, 1, rng, function () { + rsa.p.subtract(BigInteger.ONE).gcda(ee, function (r) { + if (r.compareTo(BigInteger.ONE) == 0 && rsa.p.isProbablePrime(10)) { + setTimeout(loop3, 0); + } + else { + setTimeout(loop2, 0); + } + }); + }); + }; + setTimeout(loop2, 0); + }; + setTimeout(loop1, 0); + }; + RSAKey.prototype.sign = function (text, digestMethod, digestName) { + var header = getDigestHeader(digestName); + var digest = header + digestMethod(text).toString(); + var m = pkcs1pad1(digest, this.n.bitLength() / 4); + if (m == null) { + return null; + } + var c = this.doPrivate(m); + if (c == null) { + return null; + } + var h = c.toString(16); + if ((h.length & 1) == 0) { + return h; + } + else { + return "0" + h; + } + }; + RSAKey.prototype.verify = function (text, signature, digestMethod) { + var c = parseBigInt(signature, 16); + var m = this.doPublic(c); + if (m == null) { + return null; + } + var unpadded = m.toString(16).replace(/^1f+00/, ""); + var digest = removeDigestHeader(unpadded); + return digest == digestMethod(text).toString(); + }; + return RSAKey; + }()); + // Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext + function pkcs1unpad2 (d, n) { + var b = d.toByteArray(); + var i = 0; + while (i < b.length && b[i] == 0) { + ++i; + } + // if (b.length - i != n - 1 || b[i] != 2) { + // return null; + // } + ++i; + while (b[i] != 0) { + if (++i >= b.length) { + return null; + } + } + var ret = ""; + while (++i < b.length) { + var c = b[i] & 255; + if (c < 128) { // utf-8 decode + ret += String.fromCharCode(c); + } + else if ((c > 191) && (c < 224)) { + ret += String.fromCharCode(((c & 31) << 6) | (b[i + 1] & 63)); + ++i; + } + else { + ret += String.fromCharCode(((c & 15) << 12) | ((b[i + 1] & 63) << 6) | (b[i + 2] & 63)); + i += 2; + } + } + return ret; + } + // https://tools.ietf.org/html/rfc3447#page-43 + var DIGEST_HEADERS = { + md2: "3020300c06082a864886f70d020205000410", + md5: "3020300c06082a864886f70d020505000410", + sha1: "3021300906052b0e03021a05000414", + sha224: "302d300d06096086480165030402040500041c", + sha256: "3031300d060960864801650304020105000420", + sha384: "3041300d060960864801650304020205000430", + sha512: "3051300d060960864801650304020305000440", + ripemd160: "3021300906052b2403020105000414", + }; + function getDigestHeader (name) { + return DIGEST_HEADERS[name] || ""; + } + function removeDigestHeader (str) { + for (var name_1 in DIGEST_HEADERS) { + if (DIGEST_HEADERS.hasOwnProperty(name_1)) { + var header = DIGEST_HEADERS[name_1]; + var len = header.length; + if (str.substr(0, len) == header) { + return str.substr(len); + } + } + } + return str; + } + // Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string + // function RSAEncryptB64(text) { + // var h = this.encrypt(text); + // if(h) return hex2b64(h); else return null; + // } + // public + // RSAKey.prototype.encrypt_b64 = RSAEncryptB64; + + /*! + Copyright (c) 2011, Yahoo! Inc. All rights reserved. + Code licensed under the BSD License: + http://developer.yahoo.com/yui/license.html + version: 2.9.0 + */ + var YAHOO = {}; + YAHOO.lang = { + /** + * Utility to set up the prototype, constructor and superclass properties to + * support an inheritance strategy that can chain constructors and methods. + * Static members will not be inherited. + * + * @method extend + * @static + * @param {Function} subc the object to modify + * @param {Function} superc the object to inherit + * @param {Object} overrides additional properties/methods to add to the + * subclass prototype. These will override the + * matching items obtained from the superclass + * if present. + */ + extend: function (subc, superc, overrides) { + if (!superc || !subc) { + throw new Error("YAHOO.lang.extend failed, please check that " + + "all dependencies are included."); + } + + var F = function () { }; + F.prototype = superc.prototype; + subc.prototype = new F(); + subc.prototype.constructor = subc; + subc.superclass = superc.prototype; + + if (superc.prototype.constructor == Object.prototype.constructor) { + superc.prototype.constructor = superc; + } + + if (overrides) { + var i; + for (i in overrides) { + subc.prototype[i] = overrides[i]; + } + + /* + * IE will not enumerate native functions in a derived object even if the + * function was overridden. This is a workaround for specific functions + * we care about on the Object prototype. + * @property _IEEnumFix + * @param {Function} r the object to receive the augmentation + * @param {Function} s the object that supplies the properties to augment + * @static + * @private + */ + var _IEEnumFix = function () { }, + ADD = ["toString", "valueOf"]; + try { + if (/MSIE/.test(navigator.userAgent)) { + _IEEnumFix = function (r, s) { + for (i = 0; i < ADD.length; i = i + 1) { + var fname = ADD[i], f = s[fname]; + if (typeof f === 'function' && f != Object.prototype[fname]) { + r[fname] = f; + } + } + }; + } + } catch (ex) { } _IEEnumFix(subc.prototype, overrides); + } + } + }; + + /* asn1-1.0.13.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license + */ + + /** + * @fileOverview + * @name asn1-1.0.js + * @author Kenji Urushima kenji.urushima@gmail.com + * @version asn1 1.0.13 (2017-Jun-02) + * @since jsrsasign 2.1 + * @license MIT License + */ + + /** + * kjur's class library name space + *

+ * This name space provides following name spaces: + *

    + *
  • {@link KJUR.asn1} - ASN.1 primitive hexadecimal encoder
  • + *
  • {@link KJUR.asn1.x509} - ASN.1 structure for X.509 certificate and CRL
  • + *
  • {@link KJUR.crypto} - Java Cryptographic Extension(JCE) style MessageDigest/Signature + * class and utilities
  • + *
+ *

+ * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2. + * @name KJUR + * @namespace kjur's class library name space + */ + var KJUR = {}; + + /** + * kjur's ASN.1 class library name space + *

+ * This is ITU-T X.690 ASN.1 DER encoder class library and + * class structure and methods is very similar to + * org.bouncycastle.asn1 package of + * well known BouncyCaslte Cryptography Library. + *

PROVIDING ASN.1 PRIMITIVES

+ * Here are ASN.1 DER primitive classes. + *
    + *
  • 0x01 {@link KJUR.asn1.DERBoolean}
  • + *
  • 0x02 {@link KJUR.asn1.DERInteger}
  • + *
  • 0x03 {@link KJUR.asn1.DERBitString}
  • + *
  • 0x04 {@link KJUR.asn1.DEROctetString}
  • + *
  • 0x05 {@link KJUR.asn1.DERNull}
  • + *
  • 0x06 {@link KJUR.asn1.DERObjectIdentifier}
  • + *
  • 0x0a {@link KJUR.asn1.DEREnumerated}
  • + *
  • 0x0c {@link KJUR.asn1.DERUTF8String}
  • + *
  • 0x12 {@link KJUR.asn1.DERNumericString}
  • + *
  • 0x13 {@link KJUR.asn1.DERPrintableString}
  • + *
  • 0x14 {@link KJUR.asn1.DERTeletexString}
  • + *
  • 0x16 {@link KJUR.asn1.DERIA5String}
  • + *
  • 0x17 {@link KJUR.asn1.DERUTCTime}
  • + *
  • 0x18 {@link KJUR.asn1.DERGeneralizedTime}
  • + *
  • 0x30 {@link KJUR.asn1.DERSequence}
  • + *
  • 0x31 {@link KJUR.asn1.DERSet}
  • + *
+ *

OTHER ASN.1 CLASSES

+ *
    + *
  • {@link KJUR.asn1.ASN1Object}
  • + *
  • {@link KJUR.asn1.DERAbstractString}
  • + *
  • {@link KJUR.asn1.DERAbstractTime}
  • + *
  • {@link KJUR.asn1.DERAbstractStructured}
  • + *
  • {@link KJUR.asn1.DERTaggedObject}
  • + *
+ *

SUB NAME SPACES

+ *
    + *
  • {@link KJUR.asn1.cades} - CAdES long term signature format
  • + *
  • {@link KJUR.asn1.cms} - Cryptographic Message Syntax
  • + *
  • {@link KJUR.asn1.csr} - Certificate Signing Request (CSR/PKCS#10)
  • + *
  • {@link KJUR.asn1.tsp} - RFC 3161 Timestamping Protocol Format
  • + *
  • {@link KJUR.asn1.x509} - RFC 5280 X.509 certificate and CRL
  • + *
+ *

+ * NOTE: Please ignore method summary and document of this namespace. + * This caused by a bug of jsdoc2. + * @name KJUR.asn1 + * @namespace + */ + if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) KJUR.asn1 = {}; + + /** + * ASN1 utilities class + * @name KJUR.asn1.ASN1Util + * @class ASN1 utilities class + * @since asn1 1.0.2 + */ + KJUR.asn1.ASN1Util = new function () { + this.integerToByteHex = function (i) { + var h = i.toString(16); + if ((h.length % 2) == 1) h = '0' + h; + return h; + }; + this.bigIntToMinTwosComplementsHex = function (bigIntegerValue) { + var h = bigIntegerValue.toString(16); + if (h.substr(0, 1) != '-') { + if (h.length % 2 == 1) { + h = '0' + h; + } else { + if (!h.match(/^[0-7]/)) { + h = '00' + h; + } + } + } else { + var hPos = h.substr(1); + var xorLen = hPos.length; + if (xorLen % 2 == 1) { + xorLen += 1; + } else { + if (!h.match(/^[0-7]/)) { + xorLen += 2; + } + } + var hMask = ''; + for (var i = 0; i < xorLen; i++) { + hMask += 'f'; + } + var biMask = new BigInteger(hMask, 16); + var biNeg = biMask.xor(bigIntegerValue).add(BigInteger.ONE); + h = biNeg.toString(16).replace(/^-/, ''); + } + return h; + }; + /** + * get PEM string from hexadecimal data and header string + * @name getPEMStringFromHex + * @memberOf KJUR.asn1.ASN1Util + * @function + * @param {String} dataHex hexadecimal string of PEM body + * @param {String} pemHeader PEM header string (ex. 'RSA PRIVATE KEY') + * @return {String} PEM formatted string of input data + * @description + * This method converts a hexadecimal string to a PEM string with + * a specified header. Its line break will be CRLF("\r\n"). + * @example + * var pem = KJUR.asn1.ASN1Util.getPEMStringFromHex('616161', 'RSA PRIVATE KEY'); + * // value of pem will be: + * -----BEGIN PRIVATE KEY----- + * YWFh + * -----END PRIVATE KEY----- + */ + this.getPEMStringFromHex = function (dataHex, pemHeader) { + return hextopem(dataHex, pemHeader); + }; + + /** + * generate ASN1Object specifed by JSON parameters + * @name newObject + * @memberOf KJUR.asn1.ASN1Util + * @function + * @param {Array} param JSON parameter to generate ASN1Object + * @return {KJUR.asn1.ASN1Object} generated object + * @since asn1 1.0.3 + * @description + * generate any ASN1Object specified by JSON param + * including ASN.1 primitive or structured. + * Generally 'param' can be described as follows: + *
+ * {TYPE-OF-ASNOBJ: ASN1OBJ-PARAMETER} + *
+ * 'TYPE-OF-ASN1OBJ' can be one of following symbols: + *
    + *
  • 'bool' - DERBoolean
  • + *
  • 'int' - DERInteger
  • + *
  • 'bitstr' - DERBitString
  • + *
  • 'octstr' - DEROctetString
  • + *
  • 'null' - DERNull
  • + *
  • 'oid' - DERObjectIdentifier
  • + *
  • 'enum' - DEREnumerated
  • + *
  • 'utf8str' - DERUTF8String
  • + *
  • 'numstr' - DERNumericString
  • + *
  • 'prnstr' - DERPrintableString
  • + *
  • 'telstr' - DERTeletexString
  • + *
  • 'ia5str' - DERIA5String
  • + *
  • 'utctime' - DERUTCTime
  • + *
  • 'gentime' - DERGeneralizedTime
  • + *
  • 'seq' - DERSequence
  • + *
  • 'set' - DERSet
  • + *
  • 'tag' - DERTaggedObject
  • + *
+ * @example + * newObject({'prnstr': 'aaa'}); + * newObject({'seq': [{'int': 3}, {'prnstr': 'aaa'}]}) + * // ASN.1 Tagged Object + * newObject({'tag': {'tag': 'a1', + * 'explicit': true, + * 'obj': {'seq': [{'int': 3}, {'prnstr': 'aaa'}]}}}); + * // more simple representation of ASN.1 Tagged Object + * newObject({'tag': ['a1', + * true, + * {'seq': [ + * {'int': 3}, + * {'prnstr': 'aaa'}]} + * ]}); + */ + this.newObject = function (param) { + var _KJUR = KJUR, + _KJUR_asn1 = _KJUR.asn1, + _DERBoolean = _KJUR_asn1.DERBoolean, + _DERInteger = _KJUR_asn1.DERInteger, + _DERBitString = _KJUR_asn1.DERBitString, + _DEROctetString = _KJUR_asn1.DEROctetString, + _DERNull = _KJUR_asn1.DERNull, + _DERObjectIdentifier = _KJUR_asn1.DERObjectIdentifier, + _DEREnumerated = _KJUR_asn1.DEREnumerated, + _DERUTF8String = _KJUR_asn1.DERUTF8String, + _DERNumericString = _KJUR_asn1.DERNumericString, + _DERPrintableString = _KJUR_asn1.DERPrintableString, + _DERTeletexString = _KJUR_asn1.DERTeletexString, + _DERIA5String = _KJUR_asn1.DERIA5String, + _DERUTCTime = _KJUR_asn1.DERUTCTime, + _DERGeneralizedTime = _KJUR_asn1.DERGeneralizedTime, + _DERSequence = _KJUR_asn1.DERSequence, + _DERSet = _KJUR_asn1.DERSet, + _DERTaggedObject = _KJUR_asn1.DERTaggedObject, + _newObject = _KJUR_asn1.ASN1Util.newObject; + + var keys = Object.keys(param); + if (keys.length != 1) + throw "key of param shall be only one."; + var key = keys[0]; + + if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + key + ":") == -1) + throw "undefined key: " + key; + + if (key == "bool") return new _DERBoolean(param[key]); + if (key == "int") return new _DERInteger(param[key]); + if (key == "bitstr") return new _DERBitString(param[key]); + if (key == "octstr") return new _DEROctetString(param[key]); + if (key == "null") return new _DERNull(param[key]); + if (key == "oid") return new _DERObjectIdentifier(param[key]); + if (key == "enum") return new _DEREnumerated(param[key]); + if (key == "utf8str") return new _DERUTF8String(param[key]); + if (key == "numstr") return new _DERNumericString(param[key]); + if (key == "prnstr") return new _DERPrintableString(param[key]); + if (key == "telstr") return new _DERTeletexString(param[key]); + if (key == "ia5str") return new _DERIA5String(param[key]); + if (key == "utctime") return new _DERUTCTime(param[key]); + if (key == "gentime") return new _DERGeneralizedTime(param[key]); + + if (key == "seq") { + var paramList = param[key]; + var a = []; + for (var i = 0; i < paramList.length; i++) { + var asn1Obj = _newObject(paramList[i]); + a.push(asn1Obj); + } + return new _DERSequence({ 'array': a }); + } + + if (key == "set") { + var paramList = param[key]; + var a = []; + for (var i = 0; i < paramList.length; i++) { + var asn1Obj = _newObject(paramList[i]); + a.push(asn1Obj); + } + return new _DERSet({ 'array': a }); + } + + if (key == "tag") { + var tagParam = param[key]; + if (Object.prototype.toString.call(tagParam) === '[object Array]' && + tagParam.length == 3) { + var obj = _newObject(tagParam[2]); + return new _DERTaggedObject({ + tag: tagParam[0], + explicit: tagParam[1], + obj: obj + }); + } else { + var newParam = {}; + if (tagParam.explicit !== undefined) + newParam.explicit = tagParam.explicit; + if (tagParam.tag !== undefined) + newParam.tag = tagParam.tag; + if (tagParam.obj === undefined) + throw "obj shall be specified for 'tag'."; + newParam.obj = _newObject(tagParam.obj); + return new _DERTaggedObject(newParam); + } + } + }; + + /** + * get encoded hexadecimal string of ASN1Object specifed by JSON parameters + * @name jsonToASN1HEX + * @memberOf KJUR.asn1.ASN1Util + * @function + * @param {Array} param JSON parameter to generate ASN1Object + * @return hexadecimal string of ASN1Object + * @since asn1 1.0.4 + * @description + * As for ASN.1 object representation of JSON object, + * please see {@link newObject}. + * @example + * jsonToASN1HEX({'prnstr': 'aaa'}); + */ + this.jsonToASN1HEX = function (param) { + var asn1Obj = this.newObject(param); + return asn1Obj.getEncodedHex(); + }; + }; + + /** + * get dot noted oid number string from hexadecimal value of OID + * @name oidHexToInt + * @memberOf KJUR.asn1.ASN1Util + * @function + * @param {String} hex hexadecimal value of object identifier + * @return {String} dot noted string of object identifier + * @since jsrsasign 4.8.3 asn1 1.0.7 + * @description + * This static method converts from hexadecimal string representation of + * ASN.1 value of object identifier to oid number string. + * @example + * KJUR.asn1.ASN1Util.oidHexToInt('550406') → "2.5.4.6" + */ + KJUR.asn1.ASN1Util.oidHexToInt = function (hex) { + var s = ""; + var i01 = parseInt(hex.substr(0, 2), 16); + var i0 = Math.floor(i01 / 40); + var i1 = i01 % 40; + var s = i0 + "." + i1; + + var binbuf = ""; + for (var i = 2; i < hex.length; i += 2) { + var value = parseInt(hex.substr(i, 2), 16); + var bin = ("00000000" + value.toString(2)).slice(- 8); + binbuf = binbuf + bin.substr(1, 7); + if (bin.substr(0, 1) == "0") { + var bi = new BigInteger(binbuf, 2); + s = s + "." + bi.toString(10); + binbuf = ""; + } + } + return s; + }; + + /** + * get hexadecimal value of object identifier from dot noted oid value + * @name oidIntToHex + * @memberOf KJUR.asn1.ASN1Util + * @function + * @param {String} oidString dot noted string of object identifier + * @return {String} hexadecimal value of object identifier + * @since jsrsasign 4.8.3 asn1 1.0.7 + * @description + * This static method converts from object identifier value string. + * to hexadecimal string representation of it. + * @example + * KJUR.asn1.ASN1Util.oidIntToHex("2.5.4.6") → "550406" + */ + KJUR.asn1.ASN1Util.oidIntToHex = function (oidString) { + var itox = function (i) { + var h = i.toString(16); + if (h.length == 1) h = '0' + h; + return h; + }; + + var roidtox = function (roid) { + var h = ''; + var bi = new BigInteger(roid, 10); + var b = bi.toString(2); + var padLen = 7 - b.length % 7; + if (padLen == 7) padLen = 0; + var bPad = ''; + for (var i = 0; i < padLen; i++) bPad += '0'; + b = bPad + b; + for (var i = 0; i < b.length - 1; i += 7) { + var b8 = b.substr(i, 7); + if (i != b.length - 7) b8 = '1' + b8; + h += itox(parseInt(b8, 2)); + } + return h; + }; + + if (!oidString.match(/^[0-9.]+$/)) { + throw "malformed oid string: " + oidString; + } + var h = ''; + var a = oidString.split('.'); + var i0 = parseInt(a[0]) * 40 + parseInt(a[1]); + h += itox(i0); + a.splice(0, 2); + for (var i = 0; i < a.length; i++) { + h += roidtox(a[i]); + } + return h; + }; + + + // ******************************************************************** + // Abstract ASN.1 Classes + // ******************************************************************** + + // ******************************************************************** + + /** + * base class for ASN.1 DER encoder object + * @name KJUR.asn1.ASN1Object + * @class base class for ASN.1 DER encoder object + * @property {Boolean} isModified flag whether internal data was changed + * @property {String} hTLV hexadecimal string of ASN.1 TLV + * @property {String} hT hexadecimal string of ASN.1 TLV tag(T) + * @property {String} hL hexadecimal string of ASN.1 TLV length(L) + * @property {String} hV hexadecimal string of ASN.1 TLV value(V) + * @description + */ + KJUR.asn1.ASN1Object = function () { + var hV = ''; + + /** + * get hexadecimal ASN.1 TLV length(L) bytes from TLV value(V) + * @name getLengthHexFromValue + * @memberOf KJUR.asn1.ASN1Object# + * @function + * @return {String} hexadecimal string of ASN.1 TLV length(L) + */ + this.getLengthHexFromValue = function () { + if (typeof this.hV == "undefined" || this.hV == null) { + throw "this.hV is null or undefined."; + } + if (this.hV.length % 2 == 1) { + throw "value hex must be even length: n=" + hV.length + ",v=" + this.hV; + } + var n = this.hV.length / 2; + var hN = n.toString(16); + if (hN.length % 2 == 1) { + hN = "0" + hN; + } + if (n < 128) { + return hN; + } else { + var hNlen = hN.length / 2; + if (hNlen > 15) { + throw "ASN.1 length too long to represent by 8x: n = " + n.toString(16); + } + var head = 128 + hNlen; + return head.toString(16) + hN; + } + }; + + /** + * get hexadecimal string of ASN.1 TLV bytes + * @name getEncodedHex + * @memberOf KJUR.asn1.ASN1Object# + * @function + * @return {String} hexadecimal string of ASN.1 TLV + */ + this.getEncodedHex = function () { + if (this.hTLV == null || this.isModified) { + this.hV = this.getFreshValueHex(); + this.hL = this.getLengthHexFromValue(); + this.hTLV = this.hT + this.hL + this.hV; + this.isModified = false; + //alert("first time: " + this.hTLV); + } + return this.hTLV; + }; + + /** + * get hexadecimal string of ASN.1 TLV value(V) bytes + * @name getValueHex + * @memberOf KJUR.asn1.ASN1Object# + * @function + * @return {String} hexadecimal string of ASN.1 TLV value(V) bytes + */ + this.getValueHex = function () { + this.getEncodedHex(); + return this.hV; + }; + + this.getFreshValueHex = function () { + return ''; + }; + }; + + // == BEGIN DERAbstractString ================================================ + /** + * base class for ASN.1 DER string classes + * @name KJUR.asn1.DERAbstractString + * @class base class for ASN.1 DER string classes + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @property {String} s internal string of value + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • str - specify initial ASN.1 value(V) by a string
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
+ * NOTE: 'params' can be omitted. + */ + KJUR.asn1.DERAbstractString = function (params) { + KJUR.asn1.DERAbstractString.superclass.constructor.call(this); + + /** + * get string value of this string object + * @name getString + * @memberOf KJUR.asn1.DERAbstractString# + * @function + * @return {String} string value of this string object + */ + this.getString = function () { + return this.s; + }; + + /** + * set value by a string + * @name setString + * @memberOf KJUR.asn1.DERAbstractString# + * @function + * @param {String} newS value by a string to set + */ + this.setString = function (newS) { + this.hTLV = null; + this.isModified = true; + this.s = newS; + this.hV = stohex(this.s); + }; + + /** + * set value by a hexadecimal string + * @name setStringHex + * @memberOf KJUR.asn1.DERAbstractString# + * @function + * @param {String} newHexString value by a hexadecimal string to set + */ + this.setStringHex = function (newHexString) { + this.hTLV = null; + this.isModified = true; + this.s = null; + this.hV = newHexString; + }; + + this.getFreshValueHex = function () { + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params == "string") { + this.setString(params); + } else if (typeof params['str'] != "undefined") { + this.setString(params['str']); + } else if (typeof params['hex'] != "undefined") { + this.setStringHex(params['hex']); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object); + // == END DERAbstractString ================================================ + + // == BEGIN DERAbstractTime ================================================== + /** + * base class for ASN.1 DER Generalized/UTCTime class + * @name KJUR.asn1.DERAbstractTime + * @class base class for ASN.1 DER Generalized/UTCTime class + * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'}) + * @extends KJUR.asn1.ASN1Object + * @description + * @see KJUR.asn1.ASN1Object - superclass + */ + KJUR.asn1.DERAbstractTime = function (params) { + KJUR.asn1.DERAbstractTime.superclass.constructor.call(this); + + // --- PRIVATE METHODS -------------------- + this.localDateToUTC = function (d) { + utc = d.getTime() + (d.getTimezoneOffset() * 60000); + var utcDate = new Date(utc); + return utcDate; + }; + + /* + * format date string by Data object + * @name formatDate + * @memberOf KJUR.asn1.AbstractTime; + * @param {Date} dateObject + * @param {string} type 'utc' or 'gen' + * @param {boolean} withMillis flag for with millisections or not + * @description + * 'withMillis' flag is supported from asn1 1.0.6. + */ + this.formatDate = function (dateObject, type, withMillis) { + var pad = this.zeroPadding; + var d = this.localDateToUTC(dateObject); + var year = String(d.getFullYear()); + if (type == 'utc') year = year.substr(2, 2); + var month = pad(String(d.getMonth() + 1), 2); + var day = pad(String(d.getDate()), 2); + var hour = pad(String(d.getHours()), 2); + var min = pad(String(d.getMinutes()), 2); + var sec = pad(String(d.getSeconds()), 2); + var s = year + month + day + hour + min + sec; + if (withMillis === true) { + var millis = d.getMilliseconds(); + if (millis != 0) { + var sMillis = pad(String(millis), 3); + sMillis = sMillis.replace(/[0]+$/, ""); + s = s + "." + sMillis; + } + } + return s + "Z"; + }; + + this.zeroPadding = function (s, len) { + if (s.length >= len) return s; + return new Array(len - s.length + 1).join('0') + s; + }; + + // --- PUBLIC METHODS -------------------- + /** + * get string value of this string object + * @name getString + * @memberOf KJUR.asn1.DERAbstractTime# + * @function + * @return {String} string value of this time object + */ + this.getString = function () { + return this.s; + }; + + /** + * set value by a string + * @name setString + * @memberOf KJUR.asn1.DERAbstractTime# + * @function + * @param {String} newS value by a string to set such like "130430235959Z" + */ + this.setString = function (newS) { + this.hTLV = null; + this.isModified = true; + this.s = newS; + this.hV = stohex(newS); + }; + + /** + * set value by a Date object + * @name setByDateValue + * @memberOf KJUR.asn1.DERAbstractTime# + * @function + * @param {Integer} year year of date (ex. 2013) + * @param {Integer} month month of date between 1 and 12 (ex. 12) + * @param {Integer} day day of month + * @param {Integer} hour hours of date + * @param {Integer} min minutes of date + * @param {Integer} sec seconds of date + */ + this.setByDateValue = function (year, month, day, hour, min, sec) { + var dateObject = new Date(Date.UTC(year, month - 1, day, hour, min, sec, 0)); + this.setByDate(dateObject); + }; + + this.getFreshValueHex = function () { + return this.hV; + }; + }; + YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object); + // == END DERAbstractTime ================================================== + + // == BEGIN DERAbstractStructured ============================================ + /** + * base class for ASN.1 DER structured class + * @name KJUR.asn1.DERAbstractStructured + * @class base class for ASN.1 DER structured class + * @property {Array} asn1Array internal array of ASN1Object + * @extends KJUR.asn1.ASN1Object + * @description + * @see KJUR.asn1.ASN1Object - superclass + */ + KJUR.asn1.DERAbstractStructured = function (params) { + KJUR.asn1.DERAbstractString.superclass.constructor.call(this); + + /** + * set value by array of ASN1Object + * @name setByASN1ObjectArray + * @memberOf KJUR.asn1.DERAbstractStructured# + * @function + * @param {array} asn1ObjectArray array of ASN1Object to set + */ + this.setByASN1ObjectArray = function (asn1ObjectArray) { + this.hTLV = null; + this.isModified = true; + this.asn1Array = asn1ObjectArray; + }; + + /** + * append an ASN1Object to internal array + * @name appendASN1Object + * @memberOf KJUR.asn1.DERAbstractStructured# + * @function + * @param {ASN1Object} asn1Object to add + */ + this.appendASN1Object = function (asn1Object) { + this.hTLV = null; + this.isModified = true; + this.asn1Array.push(asn1Object); + }; + + this.asn1Array = new Array(); + if (typeof params != "undefined") { + if (typeof params['array'] != "undefined") { + this.asn1Array = params['array']; + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object); + + + // ******************************************************************** + // ASN.1 Object Classes + // ******************************************************************** + + // ******************************************************************** + /** + * class for ASN.1 DER Boolean + * @name KJUR.asn1.DERBoolean + * @class class for ASN.1 DER Boolean + * @extends KJUR.asn1.ASN1Object + * @description + * @see KJUR.asn1.ASN1Object - superclass + */ + KJUR.asn1.DERBoolean = function () { + KJUR.asn1.DERBoolean.superclass.constructor.call(this); + this.hT = "01"; + this.hTLV = "0101ff"; + }; + YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER Integer + * @name KJUR.asn1.DERInteger + * @class class for ASN.1 DER Integer + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • int - specify initial ASN.1 value(V) by integer value
  • + *
  • bigint - specify initial ASN.1 value(V) by BigInteger object
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
+ * NOTE: 'params' can be omitted. + */ + KJUR.asn1.DERInteger = function (params) { + KJUR.asn1.DERInteger.superclass.constructor.call(this); + this.hT = "02"; + + /** + * set value by Tom Wu's BigInteger object + * @name setByBigInteger + * @memberOf KJUR.asn1.DERInteger# + * @function + * @param {BigInteger} bigIntegerValue to set + */ + this.setByBigInteger = function (bigIntegerValue) { + this.hTLV = null; + this.isModified = true; + this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue); + }; + + /** + * set value by integer value + * @name setByInteger + * @memberOf KJUR.asn1.DERInteger + * @function + * @param {Integer} integer value to set + */ + this.setByInteger = function (intValue) { + var bi = new BigInteger(String(intValue), 10); + this.setByBigInteger(bi); + }; + + /** + * set value by integer value + * @name setValueHex + * @memberOf KJUR.asn1.DERInteger# + * @function + * @param {String} hexadecimal string of integer value + * @description + *
+ * NOTE: Value shall be represented by minimum octet length of + * two's complement representation. + * @example + * new KJUR.asn1.DERInteger(123); + * new KJUR.asn1.DERInteger({'int': 123}); + * new KJUR.asn1.DERInteger({'hex': '1fad'}); + */ + this.setValueHex = function (newHexString) { + this.hV = newHexString; + }; + + this.getFreshValueHex = function () { + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params['bigint'] != "undefined") { + this.setByBigInteger(params['bigint']); + } else if (typeof params['int'] != "undefined") { + this.setByInteger(params['int']); + } else if (typeof params == "number") { + this.setByInteger(params); + } else if (typeof params['hex'] != "undefined") { + this.setValueHex(params['hex']); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER encoded BitString primitive + * @name KJUR.asn1.DERBitString + * @class class for ASN.1 DER encoded BitString primitive + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • bin - specify binary string (ex. '10111')
  • + *
  • array - specify array of boolean (ex. [true,false,true,true])
  • + *
  • hex - specify hexadecimal string of ASN.1 value(V) including unused bits
  • + *
  • obj - specify {@link KJUR.asn1.ASN1Util.newObject} + * argument for "BitString encapsulates" structure.
  • + *
+ * NOTE1: 'params' can be omitted.
+ * NOTE2: 'obj' parameter have been supported since + * asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25).
+ * @example + * // default constructor + * o = new KJUR.asn1.DERBitString(); + * // initialize with binary string + * o = new KJUR.asn1.DERBitString({bin: "1011"}); + * // initialize with boolean array + * o = new KJUR.asn1.DERBitString({array: [true,false,true,true]}); + * // initialize with hexadecimal string (04 is unused bits) + * o = new KJUR.asn1.DEROctetString({hex: "04bac0"}); + * // initialize with ASN1Util.newObject argument for encapsulated + * o = new KJUR.asn1.DERBitString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}}); + * // above generates a ASN.1 data like this: + * // BIT STRING, encapsulates { + * // SEQUENCE { + * // INTEGER 3 + * // PrintableString 'aaa' + * // } + * // } + */ + KJUR.asn1.DERBitString = function (params) { + if (params !== undefined && typeof params.obj !== "undefined") { + var o = KJUR.asn1.ASN1Util.newObject(params.obj); + params.hex = "00" + o.getEncodedHex(); + } + KJUR.asn1.DERBitString.superclass.constructor.call(this); + this.hT = "03"; + + /** + * set ASN.1 value(V) by a hexadecimal string including unused bits + * @name setHexValueIncludingUnusedBits + * @memberOf KJUR.asn1.DERBitString# + * @function + * @param {String} newHexStringIncludingUnusedBits + */ + this.setHexValueIncludingUnusedBits = function (newHexStringIncludingUnusedBits) { + this.hTLV = null; + this.isModified = true; + this.hV = newHexStringIncludingUnusedBits; + }; + + /** + * set ASN.1 value(V) by unused bit and hexadecimal string of value + * @name setUnusedBitsAndHexValue + * @memberOf KJUR.asn1.DERBitString# + * @function + * @param {Integer} unusedBits + * @param {String} hValue + */ + this.setUnusedBitsAndHexValue = function (unusedBits, hValue) { + if (unusedBits < 0 || 7 < unusedBits) { + throw "unused bits shall be from 0 to 7: u = " + unusedBits; + } + var hUnusedBits = "0" + unusedBits; + this.hTLV = null; + this.isModified = true; + this.hV = hUnusedBits + hValue; + }; + + /** + * set ASN.1 DER BitString by binary string
+ * @name setByBinaryString + * @memberOf KJUR.asn1.DERBitString# + * @function + * @param {String} binaryString binary value string (i.e. '10111') + * @description + * Its unused bits will be calculated automatically by length of + * 'binaryValue'.
+ * NOTE: Trailing zeros '0' will be ignored. + * @example + * o = new KJUR.asn1.DERBitString(); + * o.setByBooleanArray("01011"); + */ + this.setByBinaryString = function (binaryString) { + binaryString = binaryString.replace(/0+$/, ''); + var unusedBits = 8 - binaryString.length % 8; + if (unusedBits == 8) unusedBits = 0; + for (var i = 0; i <= unusedBits; i++) { + binaryString += '0'; + } + var h = ''; + for (var i = 0; i < binaryString.length - 1; i += 8) { + var b = binaryString.substr(i, 8); + var x = parseInt(b, 2).toString(16); + if (x.length == 1) x = '0' + x; + h += x; + } + this.hTLV = null; + this.isModified = true; + this.hV = '0' + unusedBits + h; + }; + + /** + * set ASN.1 TLV value(V) by an array of boolean
+ * @name setByBooleanArray + * @memberOf KJUR.asn1.DERBitString# + * @function + * @param {array} booleanArray array of boolean (ex. [true, false, true]) + * @description + * NOTE: Trailing falses will be ignored in the ASN.1 DER Object. + * @example + * o = new KJUR.asn1.DERBitString(); + * o.setByBooleanArray([false, true, false, true, true]); + */ + this.setByBooleanArray = function (booleanArray) { + var s = ''; + for (var i = 0; i < booleanArray.length; i++) { + if (booleanArray[i] == true) { + s += '1'; + } else { + s += '0'; + } + } + this.setByBinaryString(s); + }; + + /** + * generate an array of falses with specified length
+ * @name newFalseArray + * @memberOf KJUR.asn1.DERBitString + * @function + * @param {Integer} nLength length of array to generate + * @return {array} array of boolean falses + * @description + * This static method may be useful to initialize boolean array. + * @example + * o = new KJUR.asn1.DERBitString(); + * o.newFalseArray(3) → [false, false, false] + */ + this.newFalseArray = function (nLength) { + var a = new Array(nLength); + for (var i = 0; i < nLength; i++) { + a[i] = false; + } + return a; + }; + + this.getFreshValueHex = function () { + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params == "string" && params.toLowerCase().match(/^[0-9a-f]+$/)) { + this.setHexValueIncludingUnusedBits(params); + } else if (typeof params['hex'] != "undefined") { + this.setHexValueIncludingUnusedBits(params['hex']); + } else if (typeof params['bin'] != "undefined") { + this.setByBinaryString(params['bin']); + } else if (typeof params['array'] != "undefined") { + this.setByBooleanArray(params['array']); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER OctetString
+ * @name KJUR.asn1.DEROctetString + * @class class for ASN.1 DER OctetString + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * This class provides ASN.1 OctetString simple type.
+ * Supported "params" attributes are: + *
    + *
  • str - to set a string as a value
  • + *
  • hex - to set a hexadecimal string as a value
  • + *
  • obj - to set a encapsulated ASN.1 value by JSON object + * which is defined in {@link KJUR.asn1.ASN1Util.newObject}
  • + *
+ * NOTE: A parameter 'obj' have been supported + * for "OCTET STRING, encapsulates" structure. + * since asn1 1.0.11, jsrsasign 6.1.1 (2016-Sep-25). + * @see KJUR.asn1.DERAbstractString - superclass + * @example + * // default constructor + * o = new KJUR.asn1.DEROctetString(); + * // initialize with string + * o = new KJUR.asn1.DEROctetString({str: "aaa"}); + * // initialize with hexadecimal string + * o = new KJUR.asn1.DEROctetString({hex: "616161"}); + * // initialize with ASN1Util.newObject argument + * o = new KJUR.asn1.DEROctetString({obj: {seq: [{int: 3}, {prnstr: 'aaa'}]}}); + * // above generates a ASN.1 data like this: + * // OCTET STRING, encapsulates { + * // SEQUENCE { + * // INTEGER 3 + * // PrintableString 'aaa' + * // } + * // } + */ + KJUR.asn1.DEROctetString = function (params) { + if (params !== undefined && typeof params.obj !== "undefined") { + var o = KJUR.asn1.ASN1Util.newObject(params.obj); + params.hex = o.getEncodedHex(); + } + KJUR.asn1.DEROctetString.superclass.constructor.call(this, params); + this.hT = "04"; + }; + YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER Null + * @name KJUR.asn1.DERNull + * @class class for ASN.1 DER Null + * @extends KJUR.asn1.ASN1Object + * @description + * @see KJUR.asn1.ASN1Object - superclass + */ + KJUR.asn1.DERNull = function () { + KJUR.asn1.DERNull.superclass.constructor.call(this); + this.hT = "05"; + this.hTLV = "0500"; + }; + YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER ObjectIdentifier + * @name KJUR.asn1.DERObjectIdentifier + * @class class for ASN.1 DER ObjectIdentifier + * @param {Array} params associative array of parameters (ex. {'oid': '2.5.4.5'}) + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • oid - specify initial ASN.1 value(V) by a oid string (ex. 2.5.4.13)
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
+ * NOTE: 'params' can be omitted. + */ + KJUR.asn1.DERObjectIdentifier = function (params) { + var itox = function (i) { + var h = i.toString(16); + if (h.length == 1) h = '0' + h; + return h; + }; + var roidtox = function (roid) { + var h = ''; + var bi = new BigInteger(roid, 10); + var b = bi.toString(2); + var padLen = 7 - b.length % 7; + if (padLen == 7) padLen = 0; + var bPad = ''; + for (var i = 0; i < padLen; i++) bPad += '0'; + b = bPad + b; + for (var i = 0; i < b.length - 1; i += 7) { + var b8 = b.substr(i, 7); + if (i != b.length - 7) b8 = '1' + b8; + h += itox(parseInt(b8, 2)); + } + return h; + }; + + KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this); + this.hT = "06"; + + /** + * set value by a hexadecimal string + * @name setValueHex + * @memberOf KJUR.asn1.DERObjectIdentifier# + * @function + * @param {String} newHexString hexadecimal value of OID bytes + */ + this.setValueHex = function (newHexString) { + this.hTLV = null; + this.isModified = true; + this.s = null; + this.hV = newHexString; + }; + + /** + * set value by a OID string
+ * @name setValueOidString + * @memberOf KJUR.asn1.DERObjectIdentifier# + * @function + * @param {String} oidString OID string (ex. 2.5.4.13) + * @example + * o = new KJUR.asn1.DERObjectIdentifier(); + * o.setValueOidString("2.5.4.13"); + */ + this.setValueOidString = function (oidString) { + if (!oidString.match(/^[0-9.]+$/)) { + throw "malformed oid string: " + oidString; + } + var h = ''; + var a = oidString.split('.'); + var i0 = parseInt(a[0]) * 40 + parseInt(a[1]); + h += itox(i0); + a.splice(0, 2); + for (var i = 0; i < a.length; i++) { + h += roidtox(a[i]); + } + this.hTLV = null; + this.isModified = true; + this.s = null; + this.hV = h; + }; + + /** + * set value by a OID name + * @name setValueName + * @memberOf KJUR.asn1.DERObjectIdentifier# + * @function + * @param {String} oidName OID name (ex. 'serverAuth') + * @since 1.0.1 + * @description + * OID name shall be defined in 'KJUR.asn1.x509.OID.name2oidList'. + * Otherwise raise error. + * @example + * o = new KJUR.asn1.DERObjectIdentifier(); + * o.setValueName("serverAuth"); + */ + this.setValueName = function (oidName) { + var oid = KJUR.asn1.x509.OID.name2oid(oidName); + if (oid !== '') { + this.setValueOidString(oid); + } else { + throw "DERObjectIdentifier oidName undefined: " + oidName; + } + }; + + this.getFreshValueHex = function () { + return this.hV; + }; + + if (params !== undefined) { + if (typeof params === "string") { + if (params.match(/^[0-2].[0-9.]+$/)) { + this.setValueOidString(params); + } else { + this.setValueName(params); + } + } else if (params.oid !== undefined) { + this.setValueOidString(params.oid); + } else if (params.hex !== undefined) { + this.setValueHex(params.hex); + } else if (params.name !== undefined) { + this.setValueName(params.name); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER Enumerated + * @name KJUR.asn1.DEREnumerated + * @class class for ASN.1 DER Enumerated + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • int - specify initial ASN.1 value(V) by integer value
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
+ * NOTE: 'params' can be omitted. + * @example + * new KJUR.asn1.DEREnumerated(123); + * new KJUR.asn1.DEREnumerated({int: 123}); + * new KJUR.asn1.DEREnumerated({hex: '1fad'}); + */ + KJUR.asn1.DEREnumerated = function (params) { + KJUR.asn1.DEREnumerated.superclass.constructor.call(this); + this.hT = "0a"; + + /** + * set value by Tom Wu's BigInteger object + * @name setByBigInteger + * @memberOf KJUR.asn1.DEREnumerated# + * @function + * @param {BigInteger} bigIntegerValue to set + */ + this.setByBigInteger = function (bigIntegerValue) { + this.hTLV = null; + this.isModified = true; + this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(bigIntegerValue); + }; + + /** + * set value by integer value + * @name setByInteger + * @memberOf KJUR.asn1.DEREnumerated# + * @function + * @param {Integer} integer value to set + */ + this.setByInteger = function (intValue) { + var bi = new BigInteger(String(intValue), 10); + this.setByBigInteger(bi); + }; + + /** + * set value by integer value + * @name setValueHex + * @memberOf KJUR.asn1.DEREnumerated# + * @function + * @param {String} hexadecimal string of integer value + * @description + *
+ * NOTE: Value shall be represented by minimum octet length of + * two's complement representation. + */ + this.setValueHex = function (newHexString) { + this.hV = newHexString; + }; + + this.getFreshValueHex = function () { + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params['int'] != "undefined") { + this.setByInteger(params['int']); + } else if (typeof params == "number") { + this.setByInteger(params); + } else if (typeof params['hex'] != "undefined") { + this.setValueHex(params['hex']); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object); + + // ******************************************************************** + /** + * class for ASN.1 DER UTF8String + * @name KJUR.asn1.DERUTF8String + * @class class for ASN.1 DER UTF8String + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * @see KJUR.asn1.DERAbstractString - superclass + */ + KJUR.asn1.DERUTF8String = function (params) { + KJUR.asn1.DERUTF8String.superclass.constructor.call(this, params); + this.hT = "0c"; + }; + YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER NumericString + * @name KJUR.asn1.DERNumericString + * @class class for ASN.1 DER NumericString + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * @see KJUR.asn1.DERAbstractString - superclass + */ + KJUR.asn1.DERNumericString = function (params) { + KJUR.asn1.DERNumericString.superclass.constructor.call(this, params); + this.hT = "12"; + }; + YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER PrintableString + * @name KJUR.asn1.DERPrintableString + * @class class for ASN.1 DER PrintableString + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * @see KJUR.asn1.DERAbstractString - superclass + */ + KJUR.asn1.DERPrintableString = function (params) { + KJUR.asn1.DERPrintableString.superclass.constructor.call(this, params); + this.hT = "13"; + }; + YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER TeletexString + * @name KJUR.asn1.DERTeletexString + * @class class for ASN.1 DER TeletexString + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * @see KJUR.asn1.DERAbstractString - superclass + */ + KJUR.asn1.DERTeletexString = function (params) { + KJUR.asn1.DERTeletexString.superclass.constructor.call(this, params); + this.hT = "14"; + }; + YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER IA5String + * @name KJUR.asn1.DERIA5String + * @class class for ASN.1 DER IA5String + * @param {Array} params associative array of parameters (ex. {'str': 'aaa'}) + * @extends KJUR.asn1.DERAbstractString + * @description + * @see KJUR.asn1.DERAbstractString - superclass + */ + KJUR.asn1.DERIA5String = function (params) { + KJUR.asn1.DERIA5String.superclass.constructor.call(this, params); + this.hT = "16"; + }; + YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString); + + // ******************************************************************** + /** + * class for ASN.1 DER UTCTime + * @name KJUR.asn1.DERUTCTime + * @class class for ASN.1 DER UTCTime + * @param {Array} params associative array of parameters (ex. {'str': '130430235959Z'}) + * @extends KJUR.asn1.DERAbstractTime + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • str - specify initial ASN.1 value(V) by a string (ex.'130430235959Z')
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
  • date - specify Date object.
  • + *
+ * NOTE: 'params' can be omitted. + *

EXAMPLES

+ * @example + * d1 = new KJUR.asn1.DERUTCTime(); + * d1.setString('130430125959Z'); + * + * d2 = new KJUR.asn1.DERUTCTime({'str': '130430125959Z'}); + * d3 = new KJUR.asn1.DERUTCTime({'date': new Date(Date.UTC(2015, 0, 31, 0, 0, 0, 0))}); + * d4 = new KJUR.asn1.DERUTCTime('130430125959Z'); + */ + KJUR.asn1.DERUTCTime = function (params) { + KJUR.asn1.DERUTCTime.superclass.constructor.call(this, params); + this.hT = "17"; + + /** + * set value by a Date object
+ * @name setByDate + * @memberOf KJUR.asn1.DERUTCTime# + * @function + * @param {Date} dateObject Date object to set ASN.1 value(V) + * @example + * o = new KJUR.asn1.DERUTCTime(); + * o.setByDate(new Date("2016/12/31")); + */ + this.setByDate = function (dateObject) { + this.hTLV = null; + this.isModified = true; + this.date = dateObject; + this.s = this.formatDate(this.date, 'utc'); + this.hV = stohex(this.s); + }; + + this.getFreshValueHex = function () { + if (typeof this.date == "undefined" && typeof this.s == "undefined") { + this.date = new Date(); + this.s = this.formatDate(this.date, 'utc'); + this.hV = stohex(this.s); + } + return this.hV; + }; + + if (params !== undefined) { + if (params.str !== undefined) { + this.setString(params.str); + } else if (typeof params == "string" && params.match(/^[0-9]{12}Z$/)) { + this.setString(params); + } else if (params.hex !== undefined) { + this.setStringHex(params.hex); + } else if (params.date !== undefined) { + this.setByDate(params.date); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime); + + // ******************************************************************** + /** + * class for ASN.1 DER GeneralizedTime + * @name KJUR.asn1.DERGeneralizedTime + * @class class for ASN.1 DER GeneralizedTime + * @param {Array} params associative array of parameters (ex. {'str': '20130430235959Z'}) + * @property {Boolean} withMillis flag to show milliseconds or not + * @extends KJUR.asn1.DERAbstractTime + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • str - specify initial ASN.1 value(V) by a string (ex.'20130430235959Z')
  • + *
  • hex - specify initial ASN.1 value(V) by a hexadecimal string
  • + *
  • date - specify Date object.
  • + *
  • millis - specify flag to show milliseconds (from 1.0.6)
  • + *
+ * NOTE1: 'params' can be omitted. + * NOTE2: 'withMillis' property is supported from asn1 1.0.6. + */ + KJUR.asn1.DERGeneralizedTime = function (params) { + KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, params); + this.hT = "18"; + this.withMillis = false; + + /** + * set value by a Date object + * @name setByDate + * @memberOf KJUR.asn1.DERGeneralizedTime# + * @function + * @param {Date} dateObject Date object to set ASN.1 value(V) + * @example + * When you specify UTC time, use 'Date.UTC' method like this:
+ * o1 = new DERUTCTime(); + * o1.setByDate(date); + * + * date = new Date(Date.UTC(2015, 0, 31, 23, 59, 59, 0)); #2015JAN31 23:59:59 + */ + this.setByDate = function (dateObject) { + this.hTLV = null; + this.isModified = true; + this.date = dateObject; + this.s = this.formatDate(this.date, 'gen', this.withMillis); + this.hV = stohex(this.s); + }; + + this.getFreshValueHex = function () { + if (this.date === undefined && this.s === undefined) { + this.date = new Date(); + this.s = this.formatDate(this.date, 'gen', this.withMillis); + this.hV = stohex(this.s); + } + return this.hV; + }; + + if (params !== undefined) { + if (params.str !== undefined) { + this.setString(params.str); + } else if (typeof params == "string" && params.match(/^[0-9]{14}Z$/)) { + this.setString(params); + } else if (params.hex !== undefined) { + this.setStringHex(params.hex); + } else if (params.date !== undefined) { + this.setByDate(params.date); + } + if (params.millis === true) { + this.withMillis = true; + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime); + + // ******************************************************************** + /** + * class for ASN.1 DER Sequence + * @name KJUR.asn1.DERSequence + * @class class for ASN.1 DER Sequence + * @extends KJUR.asn1.DERAbstractStructured + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • array - specify array of ASN1Object to set elements of content
  • + *
+ * NOTE: 'params' can be omitted. + */ + KJUR.asn1.DERSequence = function (params) { + KJUR.asn1.DERSequence.superclass.constructor.call(this, params); + this.hT = "30"; + this.getFreshValueHex = function () { + var h = ''; + for (var i = 0; i < this.asn1Array.length; i++) { + var asn1Obj = this.asn1Array[i]; + h += asn1Obj.getEncodedHex(); + } + this.hV = h; + return this.hV; + }; + }; + YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured); + + // ******************************************************************** + /** + * class for ASN.1 DER Set + * @name KJUR.asn1.DERSet + * @class class for ASN.1 DER Set + * @extends KJUR.asn1.DERAbstractStructured + * @description + *
+ * As for argument 'params' for constructor, you can specify one of + * following properties: + *
    + *
  • array - specify array of ASN1Object to set elements of content
  • + *
  • sortflag - flag for sort (default: true). ASN.1 BER is not sorted in 'SET OF'.
  • + *
+ * NOTE1: 'params' can be omitted.
+ * NOTE2: sortflag is supported since 1.0.5. + */ + KJUR.asn1.DERSet = function (params) { + KJUR.asn1.DERSet.superclass.constructor.call(this, params); + this.hT = "31"; + this.sortFlag = true; // item shall be sorted only in ASN.1 DER + this.getFreshValueHex = function () { + var a = new Array(); + for (var i = 0; i < this.asn1Array.length; i++) { + var asn1Obj = this.asn1Array[i]; + a.push(asn1Obj.getEncodedHex()); + } + if (this.sortFlag == true) a.sort(); + this.hV = a.join(''); + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params.sortflag != "undefined" && + params.sortflag == false) + this.sortFlag = false; + } + }; + YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured); + + // ******************************************************************** + /** + * class for ASN.1 DER TaggedObject + * @name KJUR.asn1.DERTaggedObject + * @class class for ASN.1 DER TaggedObject + * @extends KJUR.asn1.ASN1Object + * @description + *
+ * Parameter 'tagNoNex' is ASN.1 tag(T) value for this object. + * For example, if you find '[1]' tag in a ASN.1 dump, + * 'tagNoHex' will be 'a1'. + *
+ * As for optional argument 'params' for constructor, you can specify *ANY* of + * following properties: + *
    + *
  • explicit - specify true if this is explicit tag otherwise false + * (default is 'true').
  • + *
  • tag - specify tag (default is 'a0' which means [0])
  • + *
  • obj - specify ASN1Object which is tagged
  • + *
+ * @example + * d1 = new KJUR.asn1.DERUTF8String({'str':'a'}); + * d2 = new KJUR.asn1.DERTaggedObject({'obj': d1}); + * hex = d2.getEncodedHex(); + */ + KJUR.asn1.DERTaggedObject = function (params) { + KJUR.asn1.DERTaggedObject.superclass.constructor.call(this); + this.hT = "a0"; + this.hV = ''; + this.isExplicit = true; + this.asn1Object = null; + + /** + * set value by an ASN1Object + * @name setString + * @memberOf KJUR.asn1.DERTaggedObject# + * @function + * @param {Boolean} isExplicitFlag flag for explicit/implicit tag + * @param {Integer} tagNoHex hexadecimal string of ASN.1 tag + * @param {ASN1Object} asn1Object ASN.1 to encapsulate + */ + this.setASN1Object = function (isExplicitFlag, tagNoHex, asn1Object) { + this.hT = tagNoHex; + this.isExplicit = isExplicitFlag; + this.asn1Object = asn1Object; + if (this.isExplicit) { + this.hV = this.asn1Object.getEncodedHex(); + this.hTLV = null; + this.isModified = true; + } else { + this.hV = null; + this.hTLV = asn1Object.getEncodedHex(); + this.hTLV = this.hTLV.replace(/^../, tagNoHex); + this.isModified = false; + } + }; + + this.getFreshValueHex = function () { + return this.hV; + }; + + if (typeof params != "undefined") { + if (typeof params['tag'] != "undefined") { + this.hT = params['tag']; + } + if (typeof params['explicit'] != "undefined") { + this.isExplicit = params['explicit']; + } + if (typeof params['obj'] != "undefined") { + this.asn1Object = params['obj']; + this.setASN1Object(this.isExplicit, this.hT, this.asn1Object); + } + } + }; + YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object); + + /** + * Create a new JSEncryptRSAKey that extends Tom Wu's RSA key object. + * This object is just a decorator for parsing the key parameter + * @param {string|Object} key - The key in string format, or an object containing + * the parameters needed to build a RSAKey object. + * @constructor + */ + var JSEncryptRSAKey = /** @class */ (function (_super) { + __extends(JSEncryptRSAKey, _super); + function JSEncryptRSAKey (key) { + var _this = _super.call(this) || this; + // Call the super constructor. + // RSAKey.call(this); + // If a key key was provided. + if (key) { + // If this is a string... + if (typeof key === "string") { + _this.parseKey(key); + } + else if (JSEncryptRSAKey.hasPrivateKeyProperty(key) || + JSEncryptRSAKey.hasPublicKeyProperty(key)) { + // Set the values for the key. + _this.parsePropertiesFrom(key); + } + } + return _this; + } + /** + * Method to parse a pem encoded string containing both a public or private key. + * The method will translate the pem encoded string in a der encoded string and + * will parse private key and public key parameters. This method accepts public key + * in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1). + * + * @todo Check how many rsa formats use the same format of pkcs #1. + * + * The format is defined as: + * PublicKeyInfo ::= SEQUENCE { + * algorithm AlgorithmIdentifier, + * PublicKey BIT STRING + * } + * Where AlgorithmIdentifier is: + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, the OID of the enc algorithm + * parameters ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1) + * } + * and PublicKey is a SEQUENCE encapsulated in a BIT STRING + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER -- e + * } + * it's possible to examine the structure of the keys obtained from openssl using + * an asn.1 dumper as the one used here to parse the components: http://lapo.it/asn1js/ + * @argument {string} pem the pem encoded string, can include the BEGIN/END header/footer + * @private + */ + JSEncryptRSAKey.prototype.parseKey = function (pem) { + try { + var modulus = 0; + var public_exponent = 0; + var reHex = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/; + var der = reHex.test(pem) ? Hex.decode(pem) : Base64.unarmor(pem); + var asn1 = ASN1.decode(der); + // Fixes a bug with OpenSSL 1.0+ private keys + if (asn1.sub.length === 3) { + asn1 = asn1.sub[2].sub[0]; + } + if (asn1.sub.length === 9) { + // Parse the private key. + modulus = asn1.sub[1].getHexStringValue(); // bigint + this.n = parseBigInt(modulus, 16); + public_exponent = asn1.sub[2].getHexStringValue(); // int + this.e = parseInt(public_exponent, 16); + var private_exponent = asn1.sub[3].getHexStringValue(); // bigint + this.d = parseBigInt(private_exponent, 16); + var prime1 = asn1.sub[4].getHexStringValue(); // bigint + this.p = parseBigInt(prime1, 16); + var prime2 = asn1.sub[5].getHexStringValue(); // bigint + this.q = parseBigInt(prime2, 16); + var exponent1 = asn1.sub[6].getHexStringValue(); // bigint + this.dmp1 = parseBigInt(exponent1, 16); + var exponent2 = asn1.sub[7].getHexStringValue(); // bigint + this.dmq1 = parseBigInt(exponent2, 16); + var coefficient = asn1.sub[8].getHexStringValue(); // bigint + this.coeff = parseBigInt(coefficient, 16); + } + else if (asn1.sub.length === 2) { + // Parse the public key. + var bit_string = asn1.sub[1]; + var sequence = bit_string.sub[0]; + modulus = sequence.sub[0].getHexStringValue(); + this.n = parseBigInt(modulus, 16); + public_exponent = sequence.sub[1].getHexStringValue(); + this.e = parseInt(public_exponent, 16); + } + else { + return false; + } + return true; + } + catch (ex) { + return false; + } + }; + /** + * Translate rsa parameters in a hex encoded string representing the rsa key. + * + * The translation follow the ASN.1 notation : + * RSAPrivateKey ::= SEQUENCE { + * version Version, + * modulus INTEGER, -- n + * publicExponent INTEGER, -- e + * privateExponent INTEGER, -- d + * prime1 INTEGER, -- p + * prime2 INTEGER, -- q + * exponent1 INTEGER, -- d mod (p1) + * exponent2 INTEGER, -- d mod (q-1) + * coefficient INTEGER, -- (inverse of q) mod p + * } + * @returns {string} DER Encoded String representing the rsa private key + * @private + */ + JSEncryptRSAKey.prototype.getPrivateBaseKey = function () { + var options = { + array: [ + new KJUR.asn1.DERInteger({ int: 0 }), + new KJUR.asn1.DERInteger({ bigint: this.n }), + new KJUR.asn1.DERInteger({ int: this.e }), + new KJUR.asn1.DERInteger({ bigint: this.d }), + new KJUR.asn1.DERInteger({ bigint: this.p }), + new KJUR.asn1.DERInteger({ bigint: this.q }), + new KJUR.asn1.DERInteger({ bigint: this.dmp1 }), + new KJUR.asn1.DERInteger({ bigint: this.dmq1 }), + new KJUR.asn1.DERInteger({ bigint: this.coeff }) + ] + }; + var seq = new KJUR.asn1.DERSequence(options); + return seq.getEncodedHex(); + }; + /** + * base64 (pem) encoded version of the DER encoded representation + * @returns {string} pem encoded representation without header and footer + * @public + */ + JSEncryptRSAKey.prototype.getPrivateBaseKeyB64 = function () { + return hex2b64(this.getPrivateBaseKey()); + }; + /** + * Translate rsa parameters in a hex encoded string representing the rsa public key. + * The representation follow the ASN.1 notation : + * PublicKeyInfo ::= SEQUENCE { + * algorithm AlgorithmIdentifier, + * PublicKey BIT STRING + * } + * Where AlgorithmIdentifier is: + * AlgorithmIdentifier ::= SEQUENCE { + * algorithm OBJECT IDENTIFIER, the OID of the enc algorithm + * parameters ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1) + * } + * and PublicKey is a SEQUENCE encapsulated in a BIT STRING + * RSAPublicKey ::= SEQUENCE { + * modulus INTEGER, -- n + * publicExponent INTEGER -- e + * } + * @returns {string} DER Encoded String representing the rsa public key + * @private + */ + JSEncryptRSAKey.prototype.getPublicBaseKey = function () { + var first_sequence = new KJUR.asn1.DERSequence({ + array: [ + new KJUR.asn1.DERObjectIdentifier({ oid: "1.2.840.113549.1.1.1" }), + new KJUR.asn1.DERNull() + ] + }); + var second_sequence = new KJUR.asn1.DERSequence({ + array: [ + new KJUR.asn1.DERInteger({ bigint: this.n }), + new KJUR.asn1.DERInteger({ int: this.e }) + ] + }); + var bit_string = new KJUR.asn1.DERBitString({ + hex: "00" + second_sequence.getEncodedHex() + }); + var seq = new KJUR.asn1.DERSequence({ + array: [ + first_sequence, + bit_string + ] + }); + return seq.getEncodedHex(); + }; + /** + * base64 (pem) encoded version of the DER encoded representation + * @returns {string} pem encoded representation without header and footer + * @public + */ + JSEncryptRSAKey.prototype.getPublicBaseKeyB64 = function () { + return hex2b64(this.getPublicBaseKey()); + }; + /** + * wrap the string in block of width chars. The default value for rsa keys is 64 + * characters. + * @param {string} str the pem encoded string without header and footer + * @param {Number} [width=64] - the length the string has to be wrapped at + * @returns {string} + * @private + */ + JSEncryptRSAKey.wordwrap = function (str, width) { + width = width || 64; + if (!str) { + return str; + } + var regex = "(.{1," + width + "})( +|$\n?)|(.{1," + width + "})"; + return str.match(RegExp(regex, "g")).join("\n"); + }; + /** + * Retrieve the pem encoded private key + * @returns {string} the pem encoded private key with header/footer + * @public + */ + JSEncryptRSAKey.prototype.getPrivateKey = function () { + var key = "-----BEGIN RSA PRIVATE KEY-----\n"; + key += JSEncryptRSAKey.wordwrap(this.getPrivateBaseKeyB64()) + "\n"; + key += "-----END RSA PRIVATE KEY-----"; + return key; + }; + /** + * Retrieve the pem encoded public key + * @returns {string} the pem encoded public key with header/footer + * @public + */ + JSEncryptRSAKey.prototype.getPublicKey = function () { + var key = "-----BEGIN PUBLIC KEY-----\n"; + key += JSEncryptRSAKey.wordwrap(this.getPublicBaseKeyB64()) + "\n"; + key += "-----END PUBLIC KEY-----"; + return key; + }; + /** + * Check if the object contains the necessary parameters to populate the rsa modulus + * and public exponent parameters. + * @param {Object} [obj={}] - An object that may contain the two public key + * parameters + * @returns {boolean} true if the object contains both the modulus and the public exponent + * properties (n and e) + * @todo check for types of n and e. N should be a parseable bigInt object, E should + * be a parseable integer number + * @private + */ + JSEncryptRSAKey.hasPublicKeyProperty = function (obj) { + obj = obj || {}; + return (obj.hasOwnProperty("n") && + obj.hasOwnProperty("e")); + }; + /** + * Check if the object contains ALL the parameters of an RSA key. + * @param {Object} [obj={}] - An object that may contain nine rsa key + * parameters + * @returns {boolean} true if the object contains all the parameters needed + * @todo check for types of the parameters all the parameters but the public exponent + * should be parseable bigint objects, the public exponent should be a parseable integer number + * @private + */ + JSEncryptRSAKey.hasPrivateKeyProperty = function (obj) { + obj = obj || {}; + return (obj.hasOwnProperty("n") && + obj.hasOwnProperty("e") && + obj.hasOwnProperty("d") && + obj.hasOwnProperty("p") && + obj.hasOwnProperty("q") && + obj.hasOwnProperty("dmp1") && + obj.hasOwnProperty("dmq1") && + obj.hasOwnProperty("coeff")); + }; + /** + * Parse the properties of obj in the current rsa object. Obj should AT LEAST + * include the modulus and public exponent (n, e) parameters. + * @param {Object} obj - the object containing rsa parameters + * @private + */ + JSEncryptRSAKey.prototype.parsePropertiesFrom = function (obj) { + this.n = obj.n; + this.e = obj.e; + if (obj.hasOwnProperty("d")) { + this.d = obj.d; + this.p = obj.p; + this.q = obj.q; + this.dmp1 = obj.dmp1; + this.dmq1 = obj.dmq1; + this.coeff = obj.coeff; + } + }; + return JSEncryptRSAKey; + }(RSAKey)); + + /** + * + * @param {Object} [options = {}] - An object to customize JSEncrypt behaviour + * possible parameters are: + * - default_key_size {number} default: 1024 the key size in bit + * - default_public_exponent {string} default: '010001' the hexadecimal representation of the public exponent + * - log {boolean} default: false whether log warn/error or not + * @constructor + */ + var JSEncrypt = /** @class */ (function () { + function JSEncrypt (options) { + options = options || {}; + this.default_key_size = parseInt(options.default_key_size, 10) || 1024; + this.default_public_exponent = options.default_public_exponent || "010001"; // 65537 default openssl public exponent for rsa key type + this.log = options.log || false; + // The private and public key. + this.key = null; + } + /** + * Method to set the rsa key parameter (one method is enough to set both the public + * and the private key, since the private key contains the public key paramenters) + * Log a warning if logs are enabled + * @param {Object|string} key the pem encoded string or an object (with or without header/footer) + * @public + */ + JSEncrypt.prototype.setKey = function (key) { + if (this.log && this.key) { + console.warn("A key was already set, overriding existing."); + } + this.key = new JSEncryptRSAKey(key); + }; + /** + * Proxy method for setKey, for api compatibility + * @see setKey + * @public + */ + JSEncrypt.prototype.setPrivateKey = function (privkey) { + // Create the key. + this.setKey(privkey); + }; + /** + * Proxy method for setKey, for api compatibility + * @see setKey + * @public + */ + JSEncrypt.prototype.setPublicKey = function (pubkey) { + // Sets the public key. + this.setKey(pubkey); + }; + /** + * Proxy method for RSAKey object's decrypt, decrypt the string using the private + * components of the rsa key object. Note that if the object was not set will be created + * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor + * @param {string} str base64 encoded crypted string to decrypt + * @return {string} the decrypted string + * @public + */ + JSEncrypt.prototype.decrypt = function (str) { + // Return the decrypted string. + try { + return this.getKey().decrypt(b64tohex(str)); + } + catch (ex) { + return false; + } + }; + /** + * Proxy method for RSAKey object's encrypt, encrypt the string using the public + * components of the rsa key object. Note that if the object was not set will be created + * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor + * @param {string} str the string to encrypt + * @return {string} the encrypted string encoded in base64 + * @public + */ + JSEncrypt.prototype.encrypt = function (str) { + // Return the encrypted string. + try { + return hex2b64(this.getKey().encrypt(str)); + } + catch (ex) { + return false; + } + }; + /** + * Proxy method for RSAKey object's sign. + * @param {string} str the string to sign + * @param {function} digestMethod hash method + * @param {string} digestName the name of the hash algorithm + * @return {string} the signature encoded in base64 + * @public + */ + JSEncrypt.prototype.sign = function (str, digestMethod, digestName) { + // return the RSA signature of 'str' in 'hex' format. + try { + return hex2b64(this.getKey().sign(str, digestMethod, digestName)); + } + catch (ex) { + return false; + } + }; + /** + * Proxy method for RSAKey object's verify. + * @param {string} str the string to verify + * @param {string} signature the signature encoded in base64 to compare the string to + * @param {function} digestMethod hash method + * @return {boolean} whether the data and signature match + * @public + */ + JSEncrypt.prototype.verify = function (str, signature, digestMethod) { + // Return the decrypted 'digest' of the signature. + try { + return this.getKey().verify(str, b64tohex(signature), digestMethod); + } + catch (ex) { + return false; + } + }; + /** + * Getter for the current JSEncryptRSAKey object. If it doesn't exists a new object + * will be created and returned + * @param {callback} [cb] the callback to be called if we want the key to be generated + * in an async fashion + * @returns {JSEncryptRSAKey} the JSEncryptRSAKey object + * @public + */ + JSEncrypt.prototype.getKey = function (cb) { + // Only create new if it does not exist. + if (!this.key) { + // Get a new private key. + this.key = new JSEncryptRSAKey(); + if (cb && {}.toString.call(cb) === "[object Function]") { + this.key.generateAsync(this.default_key_size, this.default_public_exponent, cb); + return; + } + // Generate the key. + this.key.generate(this.default_key_size, this.default_public_exponent); + } + return this.key; + }; + /** + * Returns the pem encoded representation of the private key + * If the key doesn't exists a new key will be created + * @returns {string} pem encoded representation of the private key WITH header and footer + * @public + */ + JSEncrypt.prototype.getPrivateKey = function () { + // Return the private representation of this key. + return this.getKey().getPrivateKey(); + }; + /** + * Returns the pem encoded representation of the private key + * If the key doesn't exists a new key will be created + * @returns {string} pem encoded representation of the private key WITHOUT header and footer + * @public + */ + JSEncrypt.prototype.getPrivateKeyB64 = function () { + // Return the private representation of this key. + return this.getKey().getPrivateBaseKeyB64(); + }; + /** + * Returns the pem encoded representation of the public key + * If the key doesn't exists a new key will be created + * @returns {string} pem encoded representation of the public key WITH header and footer + * @public + */ + JSEncrypt.prototype.getPublicKey = function () { + // Return the private representation of this key. + return this.getKey().getPublicKey(); + }; + /** + * Returns the pem encoded representation of the public key + * If the key doesn't exists a new key will be created + * @returns {string} pem encoded representation of the public key WITHOUT header and footer + * @public + */ + JSEncrypt.prototype.getPublicKeyB64 = function () { + // Return the private representation of this key. + return this.getKey().getPublicBaseKeyB64(); + }; + JSEncrypt.version = "3.0.0-rc.1"; + return JSEncrypt; + }()); + + window.JSEncrypt = JSEncrypt; + exports.JSEncrypt = JSEncrypt; + exports.default = JSEncrypt; + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); \ No newline at end of file diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..0cce3ec --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,674 @@ +import Http from '@/util/axios' +import {decrypt} from './data-analysis' +import md5 from 'md5'; + +const prefix = '/zero2/myships' +const icdPrefix = 'https://sinoagent.i.sinotrans.com' // 生产 +// const icdPrefix = 'http://sinoicd.i.sinotrans.com' // 测试 +class Api { + + public getInfoByDestPort(data: any) { + return Http.post(prefix + '/sp/ports/getDestPort', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 查询单日新增靠泊船舶列表 + */ + public getBerthsOfNumber(data: any) { + return Http.post(prefix + '/exapi/berth/berth/vessel', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 查询单日港外待靠泊数量及时长 + */ + public getMoorsOfNumber(data: any) { + return Http.post(prefix + '/exapi/berth/wait/num', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 4.2查询单日新增离泊数量及靠泊时长 + * @param data + */ + public getLeaveBerth(data: any) { + return Http.post(prefix + '/exapi/berth/unberth/num', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 获取船舶事件 + * @param data + */ + public getShipEvent(data: any) { + return Http.post(prefix + '/sp/ships/ihs/event', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 集装箱查询接口 + * @param data + */ + public getContainersScreening(data: any) { + return Http.post(prefix + '/exapi/movements/containersScreening', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 提单号查询接口 + * @param data + */ + public getContainersBillOfLadingScreening(data: any) { + return Http.post(prefix + '/exapi/movements/billofLadingScreening', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 获取内贸船舶信息 + * @param data + */ + public getInnerShipData(data: string) { + return Http.post(prefix + '/sp/ships/cert/mmsi', {mmsi: data}).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 查询具体船舶静态详情 + * @param data 参数 + */ + public async getShipMessage(data: any) { + return await Http.post(prefix + '/sp/ships/posAndAissta', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 模糊搜索 AIS 船舶库 + * @param data 参数 + */ + public async searchBoathouse(data: any) { + let shipData: any[] = [] + + await Http.post(prefix + '/sp/search/shipAisWithTime', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code) { + shipData = data.data + this.searchDictionary('2').then((res: any) => { + if (res) { + shipData.forEach((item2: any) => { + for (let i = 0, j = res.length; i < j; i++) { + if (item2.aisShiptypeId + '' === res[i].id + '') { + item2.type = res[i].valueChs + } + if (!item2.type) { + item2.type = '其他类型' + } + } + }) + } + }) + } + }) + return shipData + } + + /** + * 模糊查询港口 + * @param keyword + */ + public searchPortKeyWord(keyword: any) { + return Http.post(prefix + '/sp/search/ports', {keyword: keyword}) + } + + /** + * 到港查询 + * @param data + */ + public getArrivePortQuery(data: any) { + return Http.post(prefix + '/sp/ports/arrivalStatistics', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }).catch((err) => { + return err + }) + } + + /** + * 离港查询 + * @param data + */ + public getLeavePortQuery(data: any) { + return Http.post(prefix + '/sp/ports/departureStatistics', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }).catch((err) => { + return err + }) + } + + /** + * 预计到港查询 + * @param data + */ + public getYjPortQuery(data: any) { + return Http.post(prefix + '/sp/ports/expectedArrivalStatistics', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }).catch((err) => { + return err + }) + } + + public getPortList(data: any) { + data.portLevelId = '1' + return Http.post(prefix + '/sp/ports/search', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + public getPortWeather(data: any) { + return Http.post(prefix + '/exapi/weather/singleMomentData', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + public getWeather(data: any) { + return Http.post(prefix + '/exapi/weather/singleMomentData', data).then((res: any) => { + const DesKey = res.headers.deskey + const data = decrypt(res.data, DesKey) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 获取字典 + * type + * 1: // 获取船舶国籍字典 + * 2: // 获取船舶类型字典 + * 3: // 获取航行状态字典 + */ + public searchDictionary(type: string) { + const param: { name: string } = {name: ''} + if (type === '1') { + param.name = 'ais_nationality_id' + } else if (type === '2') { + param.name = 'ais_ship_type_id' + } else if (type === '3') { + param.name = 'ais_nav_status_id' + } + return Http.post(prefix + '/sp/dict', param).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 查询船舶历史轨迹 + * @param data + */ + public getHistoryTrack(data: any) { + return Http.post(prefix + '/sp/ships/position/history', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + public getShipHistoryInterval(data: any) { + return Http.post(prefix + '/sp/ships/position/history/intervalHour', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 获取最新的提醒新信息 + * @param data + */ + public getLastRemindInfo(data: any) { + return Http.post(prefix + '/ms/event/getAllEventByTime', data).then((res: any) => { + const data = this.decryptUtil(res) + return data + }) + } + + /** + * 获取船舶港口历史 + * @param data + */ + public getShipPort(data: any) { + return Http.post(prefix + '/sp/ships/port/history', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + public getShipCnName(data: any) { + return Http.post(prefix + '/sp/ships/getCnNameByMMSI', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + public getDestPort(data: any) { + return Http.post(prefix + '/sp/ports/getDestPort', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 获取数据分析图片地址 + * @param data + * @private + */ + public getDataAnalysisImg(data: any) { + return Http.post(prefix + '/uc/public/getMotImg', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data.url + } + }) + } + + /** + * 获取最新的提醒消息 + * @param data + */ + public getMessageLast(data: any) { + return Http.post(prefix + '/ms/event/getLatestAreaEvent', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 获取船舶挂靠港记录 + * @param data + */ + public getPortReport(data: any) { + return Http.post(prefix + '/sp/auth/ships/port/v2/history_api', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 获取用户区域列表菜单 + * @param data + */ + public getAreaMenuList(data: any) { + return Http.post(prefix + '/ms/label/getAreaGroup', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 查询区域范围内的船舶数据 + */ + public getAreaData(data: any) { + return Http.post(prefix + '/sp/auth/region/latest/dataAalysis', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 获取船队数据 + */ + public async getShipRanks(data: any) { + return await Http.post(prefix + '/ms/business/getFollowShip', data).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + private decryptUtil(data: any) { + const DesKey = data.headers['deskey'] + return decrypt(data.data, DesKey) + } + + /** + * 模糊查询港口信息 + * @param keyword + */ + public getPort(keyword: string) { + return Http.post(prefix + '/sp/search/ports', {keyword: keyword}).then((res: any) => { + const data = this.decryptUtil(res) + if (data.code === '0') { + return data.data + } + }) + } + + /** + * 通过港口id获取港口的信息 + * @param data + */ + public getPortInfo(data: any) { + return Http.post(prefix + '/sp/ports/ihs/port', {portId: data}).then((res: any) => { + const result = this.decryptUtil(res) + if (result.code === '0') { + return result.data + } + }) + } + + public getShipRouteSearch(data: any) { + return Http.post(prefix + '/exapi/shipRoute/search', data).then((res: any) => { + const result = this.decryptUtil(res) + if (result.code === '0') { + return result + } + }) + } + + public getFollowFlag(data: any) { + return Http.post(prefix + '/ms/shipRoute/getFollowFlag', data) + } + + public getPortRouteList() { + return Http.post(prefix + '/ms/shipRoute/getFollow', 'POST', {}) + } + + public getRouteInfo(data: any) { + return Http.post(prefix + '/ms/shipRoute/get', data) + } + + public getStatusTrack(data: any) { + return Http.post(prefix + '/exapi/shipRoute/statusTrack', data).then((res: any) => { + const result = this.decryptUtil(res) + if (result.code === '0') { + return result + } + }) + } + + public getShipDoc(data: any) { + return Http.post(prefix + '/sp/ihs/v2/shipArchive', data).then((res: any) => { + const result = this.decryptUtil(res) + if (result.code === '0') { + return result.data + } + }) + } + + public testToken(appToken: string) { + return Http.get(icdPrefix + '/isa/sysClient/checkToken?appToken=' + appToken).then((res: any) => { + return res.data + }) + } + + public getShipFleet(token: string, companyId: string) { + return Http.get(icdPrefix + '/isa/sysClientFleet/getShipsMmsi?companyId=' + companyId, { + headers: { + Authorization: token + } + }).then((res: any) => { + return res.data + }) + } + + public getShipIdByMmmsi(mmsi: string) { + return Http.post(prefix + '/sp/ships/getShipIdByMMSI', {mmsiList: mmsi}).then((res: any) => { + const result = this.decryptUtil(res) + if (result.code === '0') { + return result + } + }) + } + + /** + * 根据mmsi查询船舶静态信息 + * @param mmsi + */ + public getShipBymmsi(mmsi: string) { + return Http.post(prefix + '/sp/auth/ships/getAisStaticLatest', {mmsiList: mmsi}).then((res: any) => { + const result = this.decryptUtil(res) + if (result.code === '0') { + return result + } + }) + } + + /** + * 预测船舶目的港及剩余里程和时长 + */ + public getPredictTime(data: any) { + return Http.post(prefix + '/exapi/shipRoute/predict', data).then((res: any) => { + const result = this.decryptUtil(res) + if (result.code === '0') { + return result + } + }) + } + + /** + * 获取台风列表 + */ + public getTyphoonList() { + return Http.post(prefix + '/weather/typhoonList', {daysnumber: -1}).then((res: any) => { + const result = this.decryptUtil(res) + if (result.code === '0') { + return result + } + }) + } + + /** + * 获取台风详情 + */ + public getTyphoonInfo(id: string) { + return Http.post(prefix + '/weather/typhoonData', {id: id}).then((res: any) => { + const result = this.decryptUtil(res) + if (result.code === '0') { + return result + } + }) + } + + /** + * 根据节点查询航线路由 + */ + public getRouteByNodes(data: any) { + return Http.post(prefix + '/exapi/shipRoute/routingNodes', data).then((res: any) => { + const result = this.decryptUtil(res) + if (result.code === '0') { + return result + } + }) + } + + /** + * 通告预警地区和分类标签下通告预警条数(用于柱状图) + */ + public getIncidentCount() { + const id = 'al00009' + const key = '99bd0e09e068a19600fb4ef1e1890200' + const time = parseInt(new Date().getTime() / 1000 + '') + return Http.post('https://talk.anlantech.cn/standard/incident/count', {}, { + headers: { + 'anlan-version': 'v2', + 'anlan-appid': id, + 'anlan-timestamp': time, + 'anlan-token': md5('' + id + time + key) + } + }).then((res) => { + return res.data + }) + } + + /** + * 通告预警地区和分类标签下通告预警条数(用于柱状图) + */ + public getIncidentInfo(param?: any) { + const id = 'al00009' + const key = '99bd0e09e068a19600fb4ef1e1890200' + const time = parseInt(new Date().getTime() / 1000 + '') + let typeIds = param && param.typeIds ? param.typeIds : ''; + let org = param && param.org ? param.org : ''; + let begin = param && param.begin ? param.begin : ''; + let end = param && param.end ? param.end : ''; + let page = param && param.page ? param.page : ''; + let size = param && param.size ? param.size : ''; + return Http.get('https://talk.anlantech.cn/standard/incidentInfo?' + `typeIds=${typeIds}&org=${org}&begin=${begin}&end=${end}&page=${page}&size=${size}`, { + headers: { + 'anlan-version': 'v2', + 'anlan-appid': id, + 'anlan-timestamp': time, + 'anlan-token': md5('' + id + time + key) + } + }).then((res) => { + return res.data + }) + } + + /** + * 分类标签地址 + */ + public getIncidentTypeTags() { + const id = 'al00009' + const key = '99bd0e09e068a19600fb4ef1e1890200' + const time = parseInt(new Date().getTime() / 1000 + '') + return Http.get('https://talk.anlantech.cn/standard/incident/tags', { + headers: { + 'anlan-version': 'v2', + 'anlan-appid': id, + 'anlan-timestamp': time, + 'anlan-token': md5('' + id + time + key) + } + }).then((res) => { + return res.data + }) + } + + /** + * 地区列表地址 + */ + public getIncidentOrgsTags() { + const id = 'al00009' + const key = '99bd0e09e068a19600fb4ef1e1890200' + const time = parseInt(new Date().getTime() / 1000 + '') + return Http.get('https://talk.anlantech.cn/standard/incident/orgs', { + headers: { + 'anlan-version': 'v2', + 'anlan-appid': id, + 'anlan-timestamp': time, + 'anlan-token': md5('' + id + time + key) + } + }).then((res) => { + return res.data + }) + } + + /** + * 获取车辆信息 + */ + // public getCarInfo() { + // return Http.post('/car/carhisttrack/car/track/getCarHistoricalTrackSingle',{carNum: '琼A2AJ02'}).then((res: any) => { + // console.log(res) + // }) + // } + /** + * 获取车辆信息 + */ + public getCarInfo() { + return Http.post('/zero2/car/carhisttrack/car/track/getCarHistoricalTrack').then((res: any) => { + return res.data + }) + } + public getCarTrack (data: any) { + return Http.post('/zeroi/free/freetrade/api/getCarTrack', data).then(res => { + return res.data + }) + } +} + +const HttpApi = new Api() +export default HttpApi diff --git a/src/components/arrive-leave-query/index.vue b/src/components/arrive-leave-query/index.vue new file mode 100644 index 0000000..578b603 --- /dev/null +++ b/src/components/arrive-leave-query/index.vue @@ -0,0 +1,1066 @@ + + + + + diff --git a/src/components/dialog/index.vue b/src/components/dialog/index.vue new file mode 100644 index 0000000..8d43781 --- /dev/null +++ b/src/components/dialog/index.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/src/components/header/index.vue b/src/components/header/index.vue new file mode 100644 index 0000000..c6447c7 --- /dev/null +++ b/src/components/header/index.vue @@ -0,0 +1,179 @@ + + + + + diff --git a/src/components/menu/analysis.ts b/src/components/menu/analysis.ts new file mode 100644 index 0000000..2b54121 --- /dev/null +++ b/src/components/menu/analysis.ts @@ -0,0 +1,96 @@ +import {MenuType} from "@/module/menu"; +import HttpApi from "@/api"; +import {Vue} from "vue-property-decorator"; + +interface MenuOption { + title: string, + icon: string, + children: MenuOption[], + type: string, + + [key: string]: any +} + +const config = require('../../../public/config/menu.json') +const menu: MenuType[] = config.menu +const menuList: MenuType[] = [] + +function analysisMenu(menus: MenuType[]) { + for (let i = 0; i < menus.length; i++) { + const menuItem = menus[i] + if (menuItem.open) { + if (!menuItem.children.length) { + // if (menuItem.nameEn === 'My Fleets' && !Vue.prototype.$myFleet.length) { + // continue + // } + menuList.push(menuItem) + } else { + menuList.push(analysisMenuChildren(menuItem)) + } + } + + } +} + +function analysisMenuChildren(menu: MenuType) { + const menuTemp: MenuType = JSON.parse(JSON.stringify(menu)); + menuTemp.children = [] + for (let child of menu.children) { + if (child.open) { + if (!child.children.length) { + menuTemp.children.push(child) + } else { + menuTemp.children.push(analysisMenuChildren(child)) + } + } + } + return menuTemp +} + +analysisMenu(menu) + +HttpApi.getAreaMenuList({}).then((res: any) => { + if (res) { + const tempMenuAll: MenuOption[] = [] + res.forEach((item: any, index1: number) => { + const tempData: MenuOption = { + title: item.name, + id: item.id, + index: 'area-' + index1, + icon: '', + children: [], + type: 'AreaListTemp', + hasMini: false + } + if (item.tsCustomAreaList) { + item.tsCustomAreaList.forEach((res: any, index: any) => { + const tempData2: MenuOption = { + title: '', + icon: '', + children: [], + type: 'AreaListTemp', + hasMini: false + } + tempData2.title = res.name + tempData2.area = res.area + tempData2.cLat = res.cLat + tempData2.cLon = res.cLon + tempData2.cagid = res.cagid + tempData2.check = res.check + tempData2.id = res.id + tempData2.useType = res.useType + tempData2.index = 'area-' + index1 + '-' + index + tempData.children.push(tempData2) + }) + } + tempMenuAll.push(tempData) + }) + + menuList.forEach((item: any) => { + if (item.title === '区域列表') { + item.children = tempMenuAll + } + }) + } +}) +export {menuList} diff --git a/src/components/menu/index.vue b/src/components/menu/index.vue new file mode 100644 index 0000000..4b40116 --- /dev/null +++ b/src/components/menu/index.vue @@ -0,0 +1,68 @@ + + + + diff --git a/src/components/menu/menu-item/index.vue b/src/components/menu/menu-item/index.vue new file mode 100644 index 0000000..5b0f11c --- /dev/null +++ b/src/components/menu/menu-item/index.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/src/components/menu/menu-temp/index.vue b/src/components/menu/menu-temp/index.vue new file mode 100644 index 0000000..391fad6 --- /dev/null +++ b/src/components/menu/menu-temp/index.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/components/menu/style.css b/src/components/menu/style.css new file mode 100644 index 0000000..e55f852 --- /dev/null +++ b/src/components/menu/style.css @@ -0,0 +1,6 @@ +.menu-item-box-c .menu-icon-c { + width: 1.875rem !important; + text-align: center; + box-sizing: border-box; + padding-right: 0.625rem; +} diff --git a/src/components/menu/submenu-item/index.vue b/src/components/menu/submenu-item/index.vue new file mode 100644 index 0000000..7c8e5c5 --- /dev/null +++ b/src/components/menu/submenu-item/index.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/src/components/on-map-view/MapBottomMousePos.vue b/src/components/on-map-view/MapBottomMousePos.vue new file mode 100644 index 0000000..093a343 --- /dev/null +++ b/src/components/on-map-view/MapBottomMousePos.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/components/on-map-view/MapBottomShipType.vue b/src/components/on-map-view/MapBottomShipType.vue new file mode 100644 index 0000000..72aec97 --- /dev/null +++ b/src/components/on-map-view/MapBottomShipType.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/components/on-map-view/MiniBox.vue b/src/components/on-map-view/MiniBox.vue new file mode 100644 index 0000000..2949f68 --- /dev/null +++ b/src/components/on-map-view/MiniBox.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/src/components/on-map-view/OnClickWeather.vue b/src/components/on-map-view/OnClickWeather.vue new file mode 100644 index 0000000..97a97fd --- /dev/null +++ b/src/components/on-map-view/OnClickWeather.vue @@ -0,0 +1,82 @@ + + + + + diff --git a/src/components/on-map-view/PortHoverView.vue b/src/components/on-map-view/PortHoverView.vue new file mode 100644 index 0000000..e4809a3 --- /dev/null +++ b/src/components/on-map-view/PortHoverView.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/src/components/on-map-view/ShipHoverView.vue b/src/components/on-map-view/ShipHoverView.vue new file mode 100644 index 0000000..3df40e9 --- /dev/null +++ b/src/components/on-map-view/ShipHoverView.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/on-map-view/TrackHoverView.vue b/src/components/on-map-view/TrackHoverView.vue new file mode 100644 index 0000000..ef689fb --- /dev/null +++ b/src/components/on-map-view/TrackHoverView.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/src/components/on-map-view/ViewAllPort.vue b/src/components/on-map-view/ViewAllPort.vue new file mode 100644 index 0000000..d1543c2 --- /dev/null +++ b/src/components/on-map-view/ViewAllPort.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/src/components/real-time-info/realTimeInfo.vue b/src/components/real-time-info/realTimeInfo.vue new file mode 100644 index 0000000..87d6c7a --- /dev/null +++ b/src/components/real-time-info/realTimeInfo.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/src/components/search/index.vue b/src/components/search/index.vue new file mode 100644 index 0000000..598da69 --- /dev/null +++ b/src/components/search/index.vue @@ -0,0 +1,338 @@ + + + + + diff --git a/src/components/ship-fleet/index.vue b/src/components/ship-fleet/index.vue new file mode 100644 index 0000000..6b9179f --- /dev/null +++ b/src/components/ship-fleet/index.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/components/table/index.vue b/src/components/table/index.vue new file mode 100644 index 0000000..f387f5d --- /dev/null +++ b/src/components/table/index.vue @@ -0,0 +1,102 @@ + + + diff --git a/src/css/element/index.scss b/src/css/element/index.scss new file mode 100644 index 0000000..36f8cf7 --- /dev/null +++ b/src/css/element/index.scss @@ -0,0 +1,454 @@ +.el-aside { + background: var(--aside-bg) !important; + height: 100% !important; + border: none !important; + overflow-x: hidden !important; +} + +.el-table-filter .el-table-filter__content .el-checkbox__label{ + color: black; +} + +.el-container { + width: 100% !important; + height: 100% !important; +} + +.el-main { + overflow: hidden !important; + width: 100% !important; + height: 100% !important; + padding: unset !important; +} +.el-tabs__item { + font-size: 0.875rem!important; +} +/* el-tabs 样式开始*/ +/*去掉切换时el-tab-pane底部的蓝色下划线*/ +/*//.el-tabs__active-bar { +// background-color: transparent !important; +//} + +!*去掉tabs底部的下划线*! +//.el-tabs__nav-wrap::after { +// position: static !important; +//} + +!*tabs 居中*! +//.el-tabs__header { +// display: flex !important; +// justify-content: center !important; +// background: rgba(52, 51, 82, 0.7) !important; +// //border-radius: 0.12rem 0.12rem 0 0; +// border-radius: 12px 12px 0 0; +//} + +!* tabs 选中字体颜色 *! +//.el-tabs__item { +// color: var(--theme-color-no) !important; +//} + +!* tabs 选中字体颜色 *! +//.el-tabs__item.is-active { +// color: #ffffff !important; +//} + +!* tabs 选中字体颜色 *! +//.el-tabs__item:hover { +// color: var(--theme-color) !important; +//} + +//.el-tabs__content { +// //padding: 0 0.2rem !important;; +// padding: 0 20px !important; +//}*/ + +/* el-tabs 样式结束*/ + + +/* el-button 样式开始 */ +.el-button { + height: 1.875rem; + width: 8.125rem; + line-height: unset; + display: flex !important; + align-items: center; + justify-content: center; + background: var(--theme-color) !important; + border-color: var(--theme-color) !important; + color: #ffffff !important; + margin-right: 0.62rem !important; +} + +.cancel-btn .el-button { + background: var(--cancel-btn-gb) !important; + color: var(--theme-color) !important; + border-color: var(--theme-color) !important; +} + + +.el-button:hover { + opacity: 0.75 !important; +} + +/* el-button 样式结束 */ + + +/* el-select 样式开始 */ +.el-select { + height: 1.875rem !important; +} + +.el-select .el-input__inner { + height: 1.875rem; + background: rgba(255, 255, 255, 0.6); + color: black; + border-color: var(--aside-bg); +} + +.el-select .el-input__suffix-inner { + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.el-select .el-input__suffix-inner .el-select__caret { + line-height: unset !important; +} + +.el-select-dropdown__item.selected { + color: var(--theme-color) !important; +} + +/* el-select 样式结束 */ + + +/* el-form 样式开始 */ +.el-form { + margin-top: 1.25rem; +} + +.el-form .el-form-item { + height: 1.875rem !important; + margin-bottom: 0.62rem !important; +} + +.el-form .el-form-item .el-form-item__label { + height: 1.875rem; + color: #ffffff; + line-height: 1.875rem; +} + +.el-form .el-form-item .el-form-item__content { + line-height: 1.875rem; +} + +/* el-form 样式结束*/ + + +/* el-input 样式开始*/ + +.el-input .el-input__inner { + height: 2.5rem !important; + background: rgba(255, 255, 255, 0.2) !important; + color: black !important; + border-color: var(--aside-bg) !important; +} + +.el-input .el-input__inner:focus { + border-color: var(--theme-color) !important; +} + +.el-input__inner .el-input__icon { + height: 100% !important; + display: flex !important; + align-items: center !important; +} + +/* el-input 样式结束*/ + +/* .el-textarea 样式开始*/ +.el-textarea .el-textarea__inner { + background: rgba(255, 255, 255, 0.2); + color: var(--white-font); + border-color: var(--aside-bg); +} + +.el-textarea .el-textarea__inner:hover { + background: rgba(255, 255, 255, 0.2); + color: var(--white-font); + border-color: var(--aside-bg); +} + +.el-textarea .el-textarea__inner:focus { + border-color: var(--theme-color) !important; +} + +/* .el-textarea 样式结束*/ + + +/* 颜色选取器样式开始*/ +.el-color-picker, .el-color-picker .el-color-picker__trigger { + width: 1.875rem !important; + height: 1.875rem !important; +} + +.el-color-dropdown__btns { + display: flex; +} + +.el-color-dropdown__btns .el-button { + width: 3.125rem; + height: 1.875rem; +} + +/* 颜色选取器样式结束*/ + + +/* el-menu 样式开始*/ + +.el-menu { + border: none !important; +} + +.el-submenu__title { + height: 2.5rem !important; + line-height: 2.5rem !important; + font-size: 0.875rem!important; +} + + +.el-menu-item { + height: 2.5rem !important; + line-height: 2.5rem !important; + font-size: 0.875rem!important; +} + + +.vxe-modal--body .el-menu { + background: transparent !important; +} + +/* el-menu 样式结束*/ + + +/* 时间组件样式开始 */ +.el-date-editor { + width: 10.5rem !important; + height: 100% !important; +} + +.el-date-editor .el-range-separator { + height: 100% !important; + display: flex !important; + align-items: center !important; + justify-content: center; +} + +.el-picker-panel__footer { + display: flex; + align-items: center; + justify-content: flex-end; +} + +.el-picker-panel__footer .el-button { + width: 5rem !important; +} + +.el-picker-panel__footer .el-button:nth-child(1) { + background: transparent !important; + border: none !important; + color: var(--theme-color) !important; + width: 5rem; +} + +.el-date-table td.today span { + color: var(--theme-color) !important; +} + +.el-date-table td.available:hover { + color: var(--theme-color) !important; +} + +.el-date-table td.end-date span, .el-date-table td.start-date span { + background: var(--theme-color) !important; +} + +.el-date-range-picker__editor .el-input__inner { + //color: var(--white-font) !important; + color: black !important; +} + +.el-table.el-table__body-wrapper.el-table__cell.el-table__body.el-table__row { + height: 2.5rem !important; +} + +.el-range-editor.is-active { + border-color: var(--theme-color) !important; +} + +.el-date-editor { + background: rgba(255, 255, 255, 0.2) !important; + //border: none !important; +} + +.el-date-editor .el-range-input { + background: unset !important; + //color: var(--white-font) !important; +} + +.el-range-separator { + //color: var(--white-font) !important; +} + +/* 时间组件样式结束*/ + + +/*checkbox 样式开始*/ +.el-checkbox .el-checkbox__label { + color: var(--white-font); +} + +.is-checked .el-checkbox__label { + color: var(--theme-color) !important; +} + +.is-checked .el-checkbox__inner { + background: var(--theme-color) !important; + border-color: var(--theme-color) !important; +} + +/*checkbox 样式结束*/ + + +/* loading 样式开始*/ +.el-loading-mask { + height: 100%; +} + +.el-loading-mask .el-loading-spinner .circular { + width: 1.875rem; + height: 1.875rem; +} + +.el-loading-mask .el-loading-spinner { + display: flex; + align-items: center; + justify-content: center; + top: unset; + margin: unset; +} + +.el-loading-spinner .path { + stroke: var(--theme-color) !important; +} + +/* loading 样式结束*/ + + +/* message 开始*/ +.el-message-box { + background: transparent !important; + border: unset !important; + padding: 0 !important; + position: relative; + border-radius: 0.875rem !important; +} + +.el-message-box .el-message-box__header { + background: var(--theme-color) !important; +} + +.el-message-box .el-message-box__header .el-message-box__title { + color: var(--white-font) !important; + font-family: "Microsoft YaHei", serif !important; + font-weight: 400 !important; +} + +.el-message-box .el-message-box__header .el-message-box__headerbtn .el-message-box__close { + color: var(--white-font) !important; +} + +.el-message-box .el-message-box__header .el-message-box__headerbtn .el-message-box__close:hover { + opacity: 0.7 !important; +} + +.el-message-box .el-message-box__content .el-message-box__container { + color: var(--white-font) !important; +} + +.el-message-box .el-message-box__content, .el-message-box .el-message-box__btns { + background: var(--modal-bg-color) !important; +} + +.el-message-box .el-message-box__content { + font-size: 0.9rem !important; + height: 5rem !important; +} + +.el-message-box .el-message-box__btns { + height: 3.125rem; +} + + +.el-message-box .el-message-box__btns { + display: flex; + align-items: center; + justify-content: center; + flex-direction: row-reverse +} + +.el-message-box .el-message-box__btns .el-button:nth-child(1) { + background: transparent !important; +} + +/* message 结束*/ + + +/* 分页 开始*/ +.el-pagination { + height: 1.875rem !important; + box-sizing: border-box; + padding: 0 !important; + display: flex; + align-items: center; +} + +.el-pagination .el-pagination__sizes { + height: 1.375rem !important; + box-sizing: border-box; +} + +.el-pagination .el-pagination__sizes .el-select { + height: 1.375rem !important; +} + +.el-pagination .el-pagination__sizes .el-select .el-input { + height: 1.375rem !important; +} + +.el-pagination .el-pagination__sizes .el-select .el-input .el-input__inner { + height: 1.375rem !important; + box-sizing: border-box; +} + +.el-pagination .el-pager .number { + color: var(--theme-color) !important; +} + +.el-pagination .el-pagination__jump { + height: 1.375rem !important; + display: flex !important; + align-items: center !important; +} + +.el-pagination .el-pagination__jump .el-input { + height: 1.375rem !important; +} + +.el-pagination .el-pagination__jump .el-input .el-input__inner { + height: 1.375rem !important; +} + +/* 分页 结束*/ diff --git a/src/css/element/source-index.css b/src/css/element/source-index.css new file mode 100644 index 0000000..8752bb5 --- /dev/null +++ b/src/css/element/source-index.css @@ -0,0 +1 @@ +@font-face{font-family:vxeiconfont;src:url("data:application/x-font-woff2;charset=utf-8;base64,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 0.4375remxcQhT6JtOltxQqd1RaWylF5jSTYpvCkBUFkj0pyuAIKBKJdWIxiiImGClF5JwJkBqilQ7ZxjJ4ycKpoML1IOWnW5RFh2ICKUeVfC1m3rt0Z4MZCx8TPrajz0ZlEI/VENljqKHCSFQJliuDVl1qNEmsFR5aPLMYHAVFD1FzEsIZ7R2xyiGPgDRnz0Zk6JxTRZIuYJ+ex95KK+dboBFkkjwEG7ZSOq/vrZQ0QFNrt93VJuIMacPt858WK1LIByeWLOjvSwIRusf/BrWtxLXveV+qhamUR7cs2NVofVQfWVK7HWUCvWA2zqJlWOCwmdStyjMU+aPufflZHg0LBjmuzhnD1VI1++Gjz+t5W0l25DsqZ75VXxZHEVyaA04IqFOGavGA6IVUAVFILMI61EAm8ru13a3FtIPI1meGGd 0.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") format("woff2")}@-webkit-keyframes rollCircle{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rollCircle{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}[class*=vxe-icon-]{font-family:vxeiconfont!important;font-style:normal;font-weight:400;font-size:1.1em;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[class*=vxe-icon-].animat,[class*=vxe-icon-].roll{display:inline-block}[class*=vxe-icon-].animat{-webkit-transition:-webkit-transform .25s ease-in-out;transition:-webkit-transform .25s ease-in-out;transition:transform .25s ease-in-out;transition:transform .25s ease-in-out,-webkit-transform .25s ease-in-out}[class*=vxe-icon-].rotate45{-webkit-transform:rotate(45deg);transform:rotate(45deg)}[class*=vxe-icon-].rotate90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}[class*=vxe-icon-].rotate180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}[class*=vxe-icon-].roll{-webkit-animation:rollCircle 1s linear infinite;animation:rollCircle 1s linear infinite}.vxe-icon-lightning:before{content:""}.vxe-icon-cloudy:before{content:""}.vxe-icon-heavy-rain:before{content:""}.vxe-icon-moon:before{content:""}.vxe-icon-sunny:before{content:""}.vxe-icon-location:before{content:""}.vxe-icon-location-fill:before{content:""}.vxe-icon-microphone-fill:before{content:""}.vxe-icon-microphone:before{content:""}.vxe-icon-share:before{content:""}.vxe-icon-share-fill:before{content:""}.vxe-icon-flag:before{content:""}.vxe-icon-flag-fill:before{content:""}.vxe-icon-platform:before{content:""}.vxe-icon-goods-fill:before{content:""}.vxe-icon-goods:before{content:""}.vxe-icon-funnel-clear:before{content:""}.vxe-icon-envelope:before{content:""}.vxe-icon-envelope-open-fill:before{content:""}.vxe-icon-envelope-open:before{content:""}.vxe-icon-envelope-fill:before{content:""}.vxe-icon-message-fill:before{content:""}.vxe-icon-chat:before{content:""}.vxe-icon-chat-fill:before{content:""}.vxe-icon-send:before{content:""}.vxe-icon-send-fill:before{content:""}.vxe-icon-user:before{content:""}.vxe-icon-user-fill:before{content:""}.vxe-icon-wechat:before{content:""}.vxe-icon-alipay:before{content:""}.vxe-icon-indicator:before{content:""}.vxe-icon-file-excel:before{content:""}.vxe-icon-file-pdf:before{content:""}.vxe-icon-file-image:before{content:""}.vxe-icon-file-markdown:before{content:""}.vxe-icon-file-ppt:before{content:""}.vxe-icon-file-word:before{content:""}.vxe-icon-file-zip:before{content:""}.vxe-icon-file-txt:before{content:""}.vxe-icon-refresh:before{content:""}.vxe-icon-checkbox-unchecked:before{content:""}.vxe-icon-information:before{content:""}.vxe-icon-info-circle-fill:before{content:""}.vxe-icon-info-circle:before{content:""}.vxe-icon-chart-radar:before{content:""}.vxe-icon-chart-bar-x:before{content:""}.vxe-icon-repeat:before{content:""}.vxe-icon-voice-fill:before{content:""}.vxe-icon-voice:before{content:""}.vxe-icon-flow-branch:before{content:""}.vxe-icon-comment:before{content:""}.vxe-icon-folder:before{content:""}.vxe-icon-folder-open:before{content:""}.vxe-icon-picture:before{content:""}.vxe-icon-picture-fill:before{content:""}.vxe-icon-bell:before{content:""}.vxe-icon-bell-fill:before{content:""}.vxe-icon-undo:before{content:""}.vxe-icon-home:before{content:""}.vxe-icon-home-fill:before{content:""}.vxe-icon-checkbox-checked:before{content:""}.vxe-icon-checkbox-indeterminate:before{content:""}.vxe-icon-fullscreen:before{content:""}.vxe-icon-minimize:before{content:""}.vxe-icon-print:before{content:""}.vxe-icon-upload:before{content:""}.vxe-icon-download:before{content:""}.vxe-icon-cloud-upload:before{content:""}.vxe-icon-cloud-download:before{content:""}.vxe-icon-spinner:before{content:""}.vxe-icon-close:before{content:""}.vxe-icon-custom-column:before{content:""}.vxe-icon-edit:before{content:""}.vxe-icon-zoom-in:before{content:""}.vxe-icon-caret-down:before{content:""}.vxe-icon-caret-up:before{content:""}.vxe-icon-caret-right:before{content:""}.vxe-icon-caret-left:before{content:""}.vxe-icon-square-checked-fill:before{content:""}.vxe-icon-square-close:before{content:""}.vxe-icon-square-down:before{content:""}.vxe-icon-square-left:before{content:""}.vxe-icon-square-caret-right:before{content:""}.vxe-icon-square-minus:before{content:""}.vxe-icon-square-plus:before{content:""}.vxe-icon-square-right:before{content:""}.vxe-icon-square-up:before{content:""}.vxe-icon-square-checked:before{content:""}.vxe-icon-square-down-fill:before{content:""}.vxe-icon-square-minus-fill:before{content:""}.vxe-icon-square-close-fill:before{content:""}.vxe-icon-square-left-fill:before{content:""}.vxe-icon-square-caret-right-fill:before{content:""}.vxe-icon-square-up-fill:before{content:""}.vxe-icon-square-right-fill:before{content:""}.vxe-icon-square-plus-fill:before{content:""}.vxe-icon-square-plus-square:before{content:""}.vxe-icon-square-fill:before{content:""}.vxe-icon-square-square:before{content:""}.vxe-icon-sort-alpha-desc:before{content:""}.vxe-icon-sort-alpha-asc:before{content:""}.vxe-icon-sort-numeric-asc:before{content:""}.vxe-icon-sort-numeric-desc:before{content:""}.vxe-icon-star-fill:before{content:""}.vxe-icon-star:before{content:""}.vxe-icon-star-half:before{content:""}.vxe-icon-lock-fill:before{content:""}.vxe-icon-unlock-fill:before{content:""}.vxe-icon-question:before{content:""}.vxe-icon-exclamation:before{content:""}.vxe-icon-ellipsis-h:before{content:""}.vxe-icon-ellipsis-v:before{content:""}.vxe-icon-save:before{content:""}.vxe-icon-setting:before{content:""}.vxe-icon-setting-fill:before{content:""}.vxe-icon-link:before{content:""}.vxe-icon-sort:before{content:""}.vxe-icon-chart-pie:before{content:""}.vxe-icon-chart-line:before{content:""}.vxe-icon-swap:before{content:""}.vxe-icon-num-list:before{content:""}.vxe-icon-copy:before{content:""}.vxe-icon-company:before{content:""}.vxe-icon-swap-right:before{content:""}.vxe-icon-swap-left:before{content:""}.vxe-icon-table:before{content:""}.vxe-icon-merge-cells:before{content:""}.vxe-icon-paste:before{content:""}.vxe-icon-cut:before{content:""}.vxe-icon-lock:before{content:""}.vxe-icon-unlock:before{content:""}.vxe-icon-chart-bar-y:before{content:""}.vxe-icon-fixed-fill:before{content:""}.vxe-icon-fixed:before{content:""}.vxe-icon-square:before{content:""}.vxe-icon-check:before{content:""}.vxe-icon-question-circle-fill:before{content:""}.vxe-icon-error-circle-fill:before{content:""}.vxe-icon-delete:before{content:""}.vxe-icon-dot:before{content:""}.vxe-icon-success-circle:before{content:""}.vxe-icon-delete-fill:before{content:""}.vxe-icon-minus:before{content:""}.vxe-icon-maximize:before{content:""}.vxe-icon-question-circle:before{content:""}.vxe-icon-warning-circle:before{content:""}.vxe-icon-warnion-circle-fill:before{content:""}.vxe-icon-eye-fill:before{content:""}.vxe-icon-search:before{content:""}.vxe-icon-funnel:before{content:""}.vxe-icon-eye-fill-close:before{content:""}.vxe-icon-search-zoom-in:before{content:""}.vxe-icon-arrow-right:before{content:""}.vxe-icon-arrow-left:before{content:""}.vxe-icon-arrow-up:before{content:""}.vxe-icon-calendar:before{content:""}.vxe-icon-arrow-down:before{content:""}.vxe-icon-warning-triangle:before{content:""}.vxe-icon-add:before{content:""}.vxe-icon-arrow-double-left:before{content:""}.vxe-icon-arrow-double-right:before{content:""}.vxe-icon-menu:before{content:""}.vxe-icon-warning-triangle-fill:before{content:""}.vxe-icon-error-circle:before{content:""}.vxe-icon-zoom-out:before{content:""}.vxe-icon-success-circle-fill:before{content:""}.vxe-icon-radio-checked:before{content:""}.vxe-icon-radio-unchecked:before{content:""}.vxe-cell--filter{padding:0 .1em 0 .25em;text-align:center;vertical-align:middle;display:inline-block;line-height:0}.vxe-cell--filter.col--filter .vxe-filter--btn{color:#606266}.vxe-cell--filter .vxe-filter--btn{color:#c0c4cc;cursor:pointer}.vxe-cell--filter .vxe-filter--btn:hover{color:#606266}.is--filter-active .vxe-cell--filter .vxe-filter--btn{color:#409eff}.vxe-table--filter-wrapper{display:none;position:absolute;top:0;min-width: 6.25rem;border-radius: 0.25rem;background-color:#fff;border: 0.0625rem solid #dadce0;-webkit-box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2);box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2);z-index:10}.vxe-table--filter-wrapper:not(.is--multiple){text-align:center}.vxe-table--filter-wrapper.is--active{display:block}.vxe-table--filter-wrapper .vxe-table--filter-body>li,.vxe-table--filter-wrapper .vxe-table--filter-header>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width: 22.5rem;padding:.25em .8em;cursor:pointer}.vxe-table--filter-wrapper .vxe-table--filter-body>li.is--checked,.vxe-table--filter-wrapper .vxe-table--filter-header>li.is--checked{color:#409eff}.vxe-table--filter-wrapper .vxe-table--filter-body>li:hover,.vxe-table--filter-wrapper .vxe-table--filter-header>li:hover{background-color:#f5f7fa}.vxe-table--filter-wrapper .vxe-table--filter-header{padding-top:.2em}.vxe-table--filter-wrapper .vxe-table--filter-body{max-height: 12.5rem;padding-bottom:.2em}.vxe-table--filter-wrapper>ul{list-style-type:none;padding:0;margin:0;overflow:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-table--filter-wrapper.is--multiple>ul>li{padding:.25em .8em .25em 1em}.vxe-table--filter-wrapper .vxe-table--filter-footer{border-top: 0.0625rem solid #dadce0;padding:.6em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-table--filter-wrapper .vxe-table--filter-footer button{background-color:transparent;padding:0 .4em;border:0;color:#606266;cursor:pointer}.vxe-table--filter-wrapper .vxe-table--filter-footer button:focus{outline:none}.vxe-table--filter-wrapper .vxe-table--filter-footer button:hover{color:#409eff}.vxe-table--filter-wrapper .vxe-table--filter-footer button.is--disabled{color:#bfbfbf;cursor:not-allowed}.vxe-table--context-menu-clild-wrapper,.vxe-table--context-menu-wrapper{position:absolute;top:0;left:0;font-size: 0.75rem;border: 0.0625rem solid #dadce0;-webkit-box-shadow: 0.1875rem 0.1875rem 0.25rem -0.125rem rgba(0,0,0,.6);box-shadow: 0.1875rem 0.1875rem 0.25rem -0.125rem rgba(0,0,0,.6);padding:0 0.0625rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;background-color:#fff}.vxe-context-menu--link{display:block;padding:0 2.5em;width: 11.125rem;line-height: 1.625rem;color:#606266;cursor:pointer}.vxe-context-menu--link .vxe-context-menu--link-prefix,.vxe-context-menu--link .vxe-context-menu--link-suffix{position:absolute;top: 0.3125rem;margin-right: 0.3125rem;font-size: 1rem}.vxe-context-menu--link .vxe-context-menu--link-prefix{left: 0.3125rem}.vxe-context-menu--link .vxe-context-menu--link-suffix{right: 0.3125rem}.vxe-context-menu--link .vxe-context-menu--link-suffix.suffix--haschild{top: 0.5rem}.vxe-context-menu--link .vxe-context-menu--link-suffix.suffix--haschild:before{position:absolute;content:"";border: 0.25rem solid transparent;border-left-color:#727272}.vxe-context-menu--link .vxe-context-menu--link-content{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-table--context-menu-clild-wrapper .vxe-context-menu--link{padding:0 2em 0 2.5em}.vxe-context-menu--option-wrapper,.vxe-table--context-menu-clild-wrapper{margin:0;padding:0;list-style-type:none;border-bottom: 0.0625rem solid #e8eaed}.vxe-context-menu--option-wrapper li,.vxe-table--context-menu-clild-wrapper li{position:relative;margin: 0.0625rem 0;border: 0.0625rem solid transparent}.vxe-context-menu--option-wrapper li:last-child,.vxe-table--context-menu-clild-wrapper li:last-child{border:0}.vxe-context-menu--option-wrapper li.link--active,.vxe-table--context-menu-clild-wrapper li.link--active{background-color:#c5c5c5;border-color:#c5c5c5}.vxe-context-menu--option-wrapper li.link--active>.vxe-context-menu--link,.vxe-table--context-menu-clild-wrapper li.link--active>.vxe-context-menu--link{color:#2b2b2b}.vxe-context-menu--option-wrapper li.link--disabled>.vxe-context-menu--link,.vxe-table--context-menu-clild-wrapper li.link--disabled>.vxe-context-menu--link{color:#bfbfbf;cursor:no-drop}.vxe-context-menu--option-wrapper li.link--disabled.link--active,.vxe-table--context-menu-clild-wrapper li.link--disabled.link--active{border-color:#c0c1c2;background-color:#eee}.vxe-context-menu--option-wrapper li.link--disabled.link--active:hover,.vxe-table--context-menu-clild-wrapper li.link--disabled.link--active:hover{background-color:inherit}.vxe-table--context-menu-clild-wrapper{display:none;top:0;left:100%}.vxe-table--context-menu-clild-wrapper.is--show{display:block}.vxe-export--panel-column>ul{list-style-type:none;overflow:auto;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-export--panel-column>ul>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.vxe-export--panel>table{width:100%;border:0;table-layout:fixed}.vxe-export--panel>table tr td{padding:0 0.625rem}.vxe-export--panel>table tr td:first-child{text-align:right;width:30%;font-weight:700;padding: 0.5rem 0.625rem}.vxe-export--panel>table tr td:nth-child(2){width:70%}.vxe-export--panel>table tr td>.vxe-input,.vxe-export--panel>table tr td>.vxe-select{width:80%}.vxe-export--panel>table tr td>.vxe-export--panel-option-row{padding:.25em 0}.vxe-export--panel .vxe-export--panel-column{width:80%;border: 0.0625rem solid #dcdfe6;margin: 0.1875rem 0;border-radius: 0.25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-export--panel .vxe-export--panel-column>ul>li{padding:.2em 1em .2em 1em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--2{padding-left:3.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--2 .vxe-checkbox--icon{left:1.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--3{padding-left:4.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--3 .vxe-checkbox--icon{left:2.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--4{padding-left:5.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--4 .vxe-checkbox--icon{left:3.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--5{padding-left:6.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--5 .vxe-checkbox--icon{left:4.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--6{padding-left:7.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--6 .vxe-checkbox--icon{left:5.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--7{padding-left:8.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--7 .vxe-checkbox--icon{left:6.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--8{padding-left:9.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--8 .vxe-checkbox--icon{left:7.8em}.vxe-export--panel .vxe-export--panel-column .vxe-export--panel-column-header{padding:.1em 0;background-color:#f8f8f9;font-weight:700;border-bottom: 0.0625rem solid #e8eaec}.vxe-export--panel .vxe-export--panel-column .vxe-export--panel-column-body{padding:.2em 0;min-height:10em;max-height:17.6em}.vxe-export--panel .vxe-import-selected--file{padding-right: 2.5rem;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-export--panel .vxe-import-selected--file>i{display:none;position:absolute;top:50%;right: 0.9375rem;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size: 1rem;cursor:pointer}.vxe-export--panel .vxe-import-selected--file:hover{color:#409eff}.vxe-export--panel .vxe-import-selected--file:hover>i{display:block}.vxe-export--panel .vxe-import-select--file{border: 0.0625rem dashed #dcdfe6;padding: 0.375rem 2.125rem;outline:0;border-radius: 0.25rem;background-color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.vxe-export--panel .vxe-import-select--file:focus{border-color:#409eff;-webkit-box-shadow:0 0 .25em 0 #409eff;box-shadow:0 0 .25em 0 #409eff}.vxe-export--panel .vxe-import-select--file:hover{color:#409eff;border-color:#409eff}.vxe-export--panel .vxe-export--panel-btns{text-align:right;padding:.25em}.vxe-loading{display:none;position:absolute;width:100%;height:100%;top:0;left:0;z-index:99;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:hsla(0,0%,100%,.5)}.vxe-loading.is--visible{display:block}.vxe-loading>.vxe-loading--chunk{width:100%;position:absolute;top:50%;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;color:#409eff}.vxe-loading .vxe-loading--default-icon{font-size:1.4em}.vxe-loading .vxe-loading--text{padding:.4em 0}.vxe-loading .vxe-loading--spinner{display:inline-block;position:relative;width: 3.5rem;height: 3.5rem}.vxe-loading .vxe-loading--spinner:after,.vxe-loading .vxe-loading--spinner:before{content:"";width:100%;height:100%;border-radius:50%;background-color:#409eff;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:bounce 2s ease-in-out infinite;animation:bounce 2s ease-in-out infinite}.vxe-loading .vxe-loading--spinner:after{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes bounce{0%,to{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounce{0%,to{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.size--mini .vxe-loading .vxe-loading--spinner{width: 2.375rem;height: 2.375rem}.size--small .vxe-loading .vxe-loading--spinner{width: 2.75rem;height: 2.75rem}.size--medium .vxe-loading .vxe-loading--spinner{width: 3.125rem;height: 3.125rem}.vxe-table--render-default .vxe-body--column.col--ellipsis,.vxe-table--render-default.vxe-editable .vxe-body--column,.vxe-table--render-default .vxe-footer--column.col--ellipsis,.vxe-table--render-default .vxe-header--column.col--ellipsis{height: 3rem}.vxe-table--render-default.size--medium .vxe-body--column.col--ellipsis,.vxe-table--render-default.size--medium .vxe-footer--column.col--ellipsis,.vxe-table--render-default.size--medium .vxe-header--column.col--ellipsis,.vxe-table--render-default.vxe-editable.size--medium .vxe-body--column{height: 2.75rem}.vxe-table--render-default.size--small .vxe-body--column.col--ellipsis,.vxe-table--render-default.size--small .vxe-footer--column.col--ellipsis,.vxe-table--render-default.size--small .vxe-header--column.col--ellipsis,.vxe-table--render-default.vxe-editable.size--small .vxe-body--column{height: 2.5rem}.vxe-table--render-default.size--mini .vxe-body--column.col--ellipsis,.vxe-table--render-default.size--mini .vxe-footer--column.col--ellipsis,.vxe-table--render-default.size--mini .vxe-header--column.col--ellipsis,.vxe-table--render-default.vxe-editable.size--mini .vxe-body--column{height: 2.25rem}.vxe-table--file-form,.vxe-table-slots{display:none}.vxe-table--print-frame{position:fixed;bottom:-100%;left:-100%;height:0;width:0;border:0}.vxe-table--body-wrapper{scroll-behavior:auto}.vxe-table--body-wrapper,.vxe-table--fixed-left-body-wrapper,.vxe-table--fixed-right-body-wrapper{overflow-y:auto;overflow-x:auto}.vxe-cell .vxe-default-input,.vxe-cell .vxe-default-textarea,.vxe-table--filter-wrapper .vxe-default-input,.vxe-table--filter-wrapper .vxe-default-textarea{background-color:#fff}.vxe-cell .vxe-default-input,.vxe-cell .vxe-default-select,.vxe-cell .vxe-default-textarea,.vxe-table--filter-wrapper .vxe-default-input,.vxe-table--filter-wrapper .vxe-default-select,.vxe-table--filter-wrapper .vxe-default-textarea{outline:0;padding:0 0.125rem;width:100%;color:#606266;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6}.vxe-cell .vxe-default-input:focus,.vxe-cell .vxe-default-select:focus,.vxe-cell .vxe-default-textarea:focus,.vxe-table--filter-wrapper .vxe-default-input:focus,.vxe-table--filter-wrapper .vxe-default-select:focus,.vxe-table--filter-wrapper .vxe-default-textarea:focus{border: 0.0625rem solid #409eff}.vxe-cell .vxe-default-input[disabled],.vxe-cell .vxe-default-select[disabled],.vxe-cell .vxe-default-textarea[disabled],.vxe-table--filter-wrapper .vxe-default-input[disabled],.vxe-table--filter-wrapper .vxe-default-select[disabled],.vxe-table--filter-wrapper .vxe-default-textarea[disabled]{cursor:not-allowed;background-color:#f3f3f3}.vxe-cell .vxe-default-input,.vxe-cell .vxe-default-select,.vxe-cell .vxe-default-textarea,.vxe-table--filter-wrapper .vxe-default-input,.vxe-table--filter-wrapper .vxe-default-select,.vxe-table--filter-wrapper .vxe-default-textarea{height: 2.125rem}.vxe-cell .vxe-default-input[type=date]::-webkit-inner-spin-button,.vxe-table--filter-wrapper .vxe-default-input[type=date]::-webkit-inner-spin-button{margin-top: 0.25rem}.vxe-cell .vxe-default-input[type=date]::-webkit-inner-spin-button,.vxe-cell .vxe-default-input[type=number]::-webkit-inner-spin-button,.vxe-table--filter-wrapper .vxe-default-input[type=date]::-webkit-inner-spin-button,.vxe-table--filter-wrapper .vxe-default-input[type=number]::-webkit-inner-spin-button{height: 1.5rem}.vxe-cell .vxe-default-input::-webkit-input-placeholder,.vxe-table--filter-wrapper .vxe-default-input::-webkit-input-placeholder{color:#c0c4cc}.vxe-cell .vxe-default-input::-moz-placeholder,.vxe-table--filter-wrapper .vxe-default-input::-moz-placeholder{color:#c0c4cc}.vxe-cell .vxe-default-input:-ms-input-placeholder,.vxe-table--filter-wrapper .vxe-default-input:-ms-input-placeholder{color:#c0c4cc}.vxe-cell .vxe-default-input::-ms-input-placeholder,.vxe-table--filter-wrapper .vxe-default-input::-ms-input-placeholder{color:#c0c4cc}.vxe-cell .vxe-default-input::placeholder,.vxe-table--filter-wrapper .vxe-default-input::placeholder{color:#c0c4cc}.vxe-cell .vxe-default-textarea,.vxe-table--filter-wrapper .vxe-default-textarea{resize:none;vertical-align:middle}.vxe-cell .vxe-input,.vxe-cell .vxe-select,.vxe-cell .vxe-textarea,.vxe-table--filter-wrapper .vxe-input,.vxe-table--filter-wrapper .vxe-select,.vxe-table--filter-wrapper .vxe-textarea{width:100%;display:block}.vxe-cell .vxe-input>.vxe-input--inner,.vxe-cell .vxe-textarea>.vxe-textarea--inner,.vxe-table--filter-wrapper .vxe-input>.vxe-input--inner,.vxe-table--filter-wrapper .vxe-textarea>.vxe-textarea--inner{padding:0 0.125rem}.vxe-cell .vxe-default-textarea,.vxe-cell .vxe-textarea--inner,.vxe-table--filter-wrapper .vxe-default-textarea,.vxe-table--filter-wrapper .vxe-textarea--inner{resize:none}.vxe-table--cell-active-area,.vxe-table--cell-copy-area,.vxe-table--cell-extend-area,.vxe-table--cell-main-area,.vxe-table--checkbox-range{display:none;position:absolute;pointer-events:none;z-index:1}.vxe-table--fixed-left-wrapper .vxe-table--cell-active-area,.vxe-table--fixed-left-wrapper .vxe-table--cell-copy-area,.vxe-table--fixed-left-wrapper .vxe-table--cell-extend-area,.vxe-table--fixed-left-wrapper .vxe-table--cell-main-area,.vxe-table--fixed-left-wrapper .vxe-table--checkbox-range,.vxe-table--fixed-right-wrapper .vxe-table--cell-active-area,.vxe-table--fixed-right-wrapper .vxe-table--cell-copy-area,.vxe-table--fixed-right-wrapper .vxe-table--cell-extend-area,.vxe-table--fixed-right-wrapper .vxe-table--cell-main-area,.vxe-table--fixed-right-wrapper .vxe-table--checkbox-range{z-index:2}.vxe-table--fixed-left-wrapper .vxe-table--cell-active-area[half="1"],.vxe-table--fixed-left-wrapper .vxe-table--cell-extend-area[half="1"],.vxe-table--fixed-left-wrapper .vxe-table--cell-main-area[half="1"]{border-right:0}.vxe-table--fixed-left-wrapper .vxe-table--cell-copy-area[half="1"]{background-size: 0.1875rem 0.75rem,0 0.75rem, 0.75rem 0.1875rem, 0.75rem 0.1875rem}.vxe-table--fixed-right-wrapper .vxe-table--cell-active-area[half="1"],.vxe-table--fixed-right-wrapper .vxe-table--cell-extend-area[half="1"],.vxe-table--fixed-right-wrapper .vxe-table--cell-main-area[half="1"]{border-left:0}.vxe-table--fixed-right-wrapper .vxe-table--cell-copy-area[half="1"]{background-size:0 0.75rem, 0.1875rem 0.75rem, 0.75rem 0.1875rem, 0.75rem 0.1875rem}.vxe-table--checkbox-range{background-color:rgba(50,128,252,.2);border: 0.0625rem solid #006af1}.vxe-table--cell-area{height:0;font-size:0;display:none}.vxe-table--cell-area>.vxe-table--cell-main-area{background-color:rgba(64,158,255,.2);border: 0.0625rem solid #409eff}.vxe-table--cell-area .vxe-table--cell-main-area-btn{display:none;position:absolute;right: -0.0625rem;bottom: -0.0625rem;width: 0.4375rem;height: 0.4375rem;border-style:solid;border-color:#fff;border-width: 0.0625rem 0 0 0.0625rem;background-color:#409eff;pointer-events:auto;cursor:crosshair}.vxe-table--cell-area .vxe-table--cell-extend-area{border: 0.125rem solid #409eff}@-webkit-keyframes moveCopyCellBorder{to{background-position:0 -0.75rem,100% 0.75rem, 0.75rem 0, -0.75rem 100%}}@keyframes moveCopyCellBorder{to{background-position:0 -0.75rem,100% 0.75rem, 0.75rem 0, -0.75rem 100%}}.vxe-table--cell-copy-area{background:linear-gradient(0deg,transparent 0.375rem,#409eff 0) repeat-y,linear-gradient(0deg,transparent 50%,#409eff 0) repeat-y,linear-gradient(90deg,transparent 50%,#409eff 0) repeat-x,linear-gradient(90deg,transparent 50%,#409eff 0) repeat-x;background-size: 0.1875rem 0.75rem, 0.1875rem 0.75rem, 0.75rem 0.1875rem, 0.75rem 0.1875rem;background-position:0 0,100% 0,0 0,0 100%;-webkit-animation:moveCopyCellBorder .5s linear infinite;animation:moveCopyCellBorder .5s linear infinite}.vxe-table--cell-active-area{border: 0.125rem solid #409eff}.vxe-table--cell-multi-area>.vxe-table--cell-main-area{background-color:rgba(64,158,255,.2)}.vxe-table--render-default.is--round .vxe-table--border-line,.vxe-table--render-default.is--round .vxe-table--render-default.is--round,.vxe-table--render-default.is--round:not(.is--header):not(.is--footer) .vxe-table--body-wrapper.body--wrapper{border-radius: 0.25rem}.vxe-table--render-default.is--round.is--footer:not(.is--header) .vxe-table--body-wrapper.body--wrapper,.vxe-table--render-default.is--round.is--header .vxe-table--header-wrapper.body--wrapper{border-radius: 0.25rem 0.25rem 0 0}.vxe-table--render-default.is--round.is--header .vxe-table--header-wrapper.fixed-left--wrapper{border-radius: 0.25rem 0 0 0}.vxe-table--render-default.is--round.is--header .vxe-table--header-wrapper.fixed-right--wrapper{border-radius:0 0.25rem 0 0}.vxe-table--render-default.is--round.is--footer .vxe-table--footer-wrapper.body--wrapper,.vxe-table--render-default.is--round.is--header:not(.is--footer) .vxe-table--body-wrapper.body--wrapper{border-radius:0 0 0.25rem 0.25rem}.vxe-table--render-default.is--round.is--footer .vxe-table--footer-wrapper.fixed-left--wrapper,.vxe-table--render-default.is--round.is--footer:not(.is--header) .vxe-table--body-wrapper.fixed-left--wrapper,.vxe-table--render-default.is--round.is--header:not(.is--footer) .vxe-table--body-wrapper.fixed-left--wrapper{border-radius:0 0 0 0.25rem}.vxe-table--render-default.is--round.is--footer .vxe-table--footer-wrapper.fixed-right--wrapper,.vxe-table--render-default.is--round.is--footer:not(.is--header) .vxe-table--body-wrapper.fixed-right--wrapper,.vxe-table--render-default.is--round.is--header:not(.is--footer) .vxe-table--body-wrapper.fixed-right--wrapper{border-radius:0 0 0.25rem 0}.vxe-table .vxe-table--header-wrapper{color:#606266}.vxe-table .vxe-table--header-wrapper .vxe-table--header-border-line{position:absolute;left:0;bottom:0;height:0;border-bottom: 0.0625rem solid #e8eaec}.vxe-table .vxe-cell--sort{width:1.5em;height:1.35em;vertical-align:middle;text-align:center;display:inline-block;position:relative}.vxe-table .vxe-sort--asc-btn,.vxe-table .vxe-sort--desc-btn{position:absolute;left:.2em;color:#c0c4cc;width:1em;text-align:center;height:.8em;line-height:.8em;cursor:pointer}.vxe-table .vxe-sort--asc-btn:hover,.vxe-table .vxe-sort--desc-btn:hover{color:#606266}.vxe-table .vxe-sort--asc-btn.sort--active,.vxe-table .vxe-sort--desc-btn.sort--active{color:#409eff}.vxe-table .vxe-sort--asc-btn{top:-.1em}.vxe-table .vxe-sort--desc-btn{bottom:-.2em}.vxe-header--column{position:relative;font-weight:700}.vxe-header--column.col--ellipsis>.vxe-cell{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-header--column.col--ellipsis>.vxe-cell .vxe-cell--title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-header--column.col--ellipsis>.vxe-cell>i:not(.vxe-cell--title),.vxe-header--column.col--ellipsis>.vxe-cell>span:not(.vxe-cell--title){-ms-flex-negative:0;flex-shrink:0}.vxe-header--column .vxe-cell--required-icon{display:inline-block;color:#f56c6c;width:.8em;height:1em;line-height:1em;font-family:Verdana,Arial,Tahoma;font-weight:400;position:relative}.vxe-header--column .vxe-cell--required-icon:before{content:"*";position:absolute;left:0;top:.2em}.vxe-header--column .vxe-cell--required-icon{margin-right:.1em}.vxe-header--column .vxe-cell--edit-icon,.vxe-header--column .vxe-cell-help-icon{margin-right:.2em}.vxe-header--column .vxe-cell-help-icon{cursor:help}.vxe-header--column .vxe-resizable{position:absolute;right: -0.4375rem;bottom:0;width: 0.875rem;height:100%;text-align:center;z-index:1;cursor:col-resize}.vxe-header--column .vxe-resizable.is--line:after,.vxe-header--column .vxe-resizable.is--line:before{content:"";display:inline-block;vertical-align:middle}.vxe-header--column .vxe-resizable.is--line:before{width: 0.0625rem;height:50%;background-color:#d9dddf}.vxe-header--column .vxe-resizable.is--line:after{width:0;height:100%}.vxe-table--fixed-right-wrapper .vxe-header--column .vxe-resizable{right:auto;left: -0.4375rem}.vxe-table--render-default{position:relative;font-size: 0.875rem;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;direction:ltr}.vxe-table--render-default .vxe-table--body-wrapper,.vxe-table--render-default .vxe-table--footer-wrapper{background-color:#fff}.vxe-table--render-default .vxe-table--body,.vxe-table--render-default .vxe-table--footer,.vxe-table--render-default .vxe-table--header{border:0;border-spacing:0;border-collapse:separate;table-layout:fixed}.vxe-table--render-default .vxe-table--footer-wrapper,.vxe-table--render-default .vxe-table--header-wrapper{overflow-x:hidden;overflow-y:hidden}.vxe-table--render-default:not(.is--empty).is--footer.is--scroll-x .vxe-table--body-wrapper{overflow-x:scroll}.vxe-table--render-default .vxe-body--row.row--stripe{background-color:#fafafa}.vxe-table--render-default .vxe-body--row.row--checked,.vxe-table--render-default .vxe-body--row.row--radio{background-color:#fff3e0}.vxe-table--render-default .vxe-body--row.row--current{background-color:#e6f7ff}.vxe-table--render-default .vxe-body--row.row--hover,.vxe-table--render-default .vxe-body--row.row--hover.row--stripe{background-color:#f5f7fa}.vxe-table--render-default .vxe-body--row.row--hover.row--checked,.vxe-table--render-default .vxe-body--row.row--hover.row--radio{background-color:#ffebbc}.vxe-table--render-default .vxe-body--row.row--hover.row--current{background-color:#d7effb}.vxe-table--render-default.drag--resize .vxe-table--fixed-left-wrapper *,.vxe-table--render-default.drag--resize .vxe-table--fixed-right-wrapper *,.vxe-table--render-default.drag--resize .vxe-table--main-wrapper *{cursor:col-resize}.vxe-table--render-default.drag--area .vxe-table--fixed-left-wrapper *,.vxe-table--render-default.drag--area .vxe-table--fixed-right-wrapper *,.vxe-table--render-default.drag--area .vxe-table--main-wrapper *,.vxe-table--render-default.drag--range .vxe-table--fixed-left-wrapper *,.vxe-table--render-default.drag--range .vxe-table--fixed-right-wrapper *,.vxe-table--render-default.drag--range .vxe-table--main-wrapper *{cursor:default}.vxe-table--render-default.drag--extend-range .vxe-table--fixed-left-wrapper *,.vxe-table--render-default.drag--extend-range .vxe-table--fixed-right-wrapper *,.vxe-table--render-default.drag--extend-range .vxe-table--main-wrapper *{cursor:crosshair}.vxe-table--render-default.column--highlight .vxe-header--column:not(.col--seq):hover{background-color:#d7effb}.vxe-table--render-default.cell--area .vxe-table--main-wrapper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-table--render-default .vxe-body--column,.vxe-table--render-default .vxe-footer--column,.vxe-table--render-default .vxe-header--column{position:relative;line-height: 1.375rem;text-align:left}.vxe-table--render-default .vxe-body--column:not(.col--ellipsis),.vxe-table--render-default .vxe-footer--column:not(.col--ellipsis),.vxe-table--render-default .vxe-header--column:not(.col--ellipsis){padding: 0.8125rem 0}.vxe-table--render-default .vxe-body--column.col--current,.vxe-table--render-default .vxe-footer--column.col--current,.vxe-table--render-default .vxe-header--column.col--current{background-color:#e6f7ff}.vxe-table--render-default .vxe-body--column.col--center,.vxe-table--render-default .vxe-footer--column.col--center,.vxe-table--render-default .vxe-header--column.col--center{text-align:center}.vxe-table--render-default .vxe-body--column.col--right,.vxe-table--render-default .vxe-footer--column.col--right,.vxe-table--render-default .vxe-header--column.col--right{text-align:right}.vxe-table--render-default .vxe-footer--column.col--ellipsis.col--center .vxe-cell,.vxe-table--render-default .vxe-header--column.col--ellipsis.col--center .vxe-cell{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.vxe-table--render-default .vxe-footer--column.col--ellipsis.col--right .vxe-cell,.vxe-table--render-default .vxe-header--column.col--ellipsis.col--right .vxe-cell{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.vxe-table--render-default .vxe-body--column.col--checkbox{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-table--render-default .vxe-table--footer-wrapper{border-top: 0.0625rem solid #e8eaec}.vxe-table--render-default.border--default .vxe-table--header-wrapper,.vxe-table--render-default.border--full .vxe-table--header-wrapper,.vxe-table--render-default.border--outer .vxe-table--header-wrapper{background-color:#f8f8f9}.vxe-table--render-default.border--default .vxe-body--column,.vxe-table--render-default.border--default .vxe-footer--column,.vxe-table--render-default.border--default .vxe-header--column,.vxe-table--render-default.border--inner .vxe-body--column,.vxe-table--render-default.border--inner .vxe-footer--column,.vxe-table--render-default.border--inner .vxe-header--column{background-image:-webkit-gradient(linear,left top,left bottom,from(#e8eaec),to(#e8eaec));background-image:linear-gradient(#e8eaec,#e8eaec);background-repeat:no-repeat;background-size:100% 0.0625rem;background-position:100% 100%}.vxe-table--render-default.border--full .vxe-body--column,.vxe-table--render-default.border--full .vxe-footer--column,.vxe-table--render-default.border--full .vxe-header--column{background-image:-webkit-gradient(linear,left top,left bottom,from(#e8eaec),to(#e8eaec)),-webkit-gradient(linear,left top,left bottom,from(#e8eaec),to(#e8eaec));background-image:linear-gradient(#e8eaec,#e8eaec),linear-gradient(#e8eaec,#e8eaec);background-repeat:no-repeat;background-size: 0.0625rem 100%,100% 0.0625rem;background-position:100% 0,100% 100%}.vxe-table--render-default.border--full .vxe-table--fixed-left-wrapper .vxe-body--column{border-right-color:#e8eaec}.vxe-table--render-default.border--default .vxe-table--header-wrapper .vxe-header--row:last-child .vxe-header--gutter,.vxe-table--render-default.border--full .vxe-table--header-wrapper .vxe-header--row:last-child .vxe-header--gutter,.vxe-table--render-default.border--inner .vxe-table--header-wrapper .vxe-header--row:last-child .vxe-header--gutter,.vxe-table--render-default.border--outer .vxe-table--header-wrapper .vxe-header--row:last-child .vxe-header--gutter{background-image:-webkit-gradient(linear,left top,left bottom,from(#e8eaec),to(#e8eaec));background-image:linear-gradient(#e8eaec,#e8eaec);background-repeat:no-repeat;background-size:100% 0.0625rem;background-position:100% 100%}.vxe-table--render-default.border--inner .vxe-table--header-wrapper,.vxe-table--render-default.border--none .vxe-table--header-wrapper{background-color:#fff}.vxe-table--render-default.border--inner .vxe-table--fixed-left-wrapper,.vxe-table--render-default.border--none .vxe-table--fixed-left-wrapper{border-right:0}.vxe-table--render-default.border--inner .vxe-table--border-line{border-width:0 0 0.0625rem 0}.vxe-table--render-default.border--none .vxe-table--border-line,.vxe-table--render-default.border--none .vxe-table--header-border-line{display:none}.vxe-table--render-default.size--medium{font-size: 0.875rem}.vxe-table--render-default.size--medium .vxe-table--empty-block,.vxe-table--render-default.size--medium .vxe-table--empty-placeholder{min-height: 2.75rem}.vxe-table--render-default.size--medium .vxe-body--column:not(.col--ellipsis),.vxe-table--render-default.size--medium .vxe-footer--column:not(.col--ellipsis),.vxe-table--render-default.size--medium .vxe-header--column:not(.col--ellipsis){padding: 0.6875rem 0}.vxe-table--render-default.size--medium .vxe-cell .vxe-default-input,.vxe-table--render-default.size--medium .vxe-cell .vxe-default-select,.vxe-table--render-default.size--medium .vxe-cell .vxe-default-textarea{height: 2rem}.vxe-table--render-default.size--medium .vxe-cell .vxe-default-input[type=date]::-webkit-inner-spin-button{margin-top: 0.1875rem}.vxe-table--render-default.size--small{font-size: 0.8125rem}.vxe-table--render-default.size--small .vxe-table--empty-block,.vxe-table--render-default.size--small .vxe-table--empty-placeholder{min-height: 2.5rem}.vxe-table--render-default.size--small .vxe-body--column:not(.col--ellipsis),.vxe-table--render-default.size--small .vxe-footer--column:not(.col--ellipsis),.vxe-table--render-default.size--small .vxe-header--column:not(.col--ellipsis){padding: 0.5625rem 0}.vxe-table--render-default.size--small .vxe-cell .vxe-default-input,.vxe-table--render-default.size--small .vxe-cell .vxe-default-select,.vxe-table--render-default.size--small .vxe-cell .vxe-default-textarea{height: 1.875rem}.vxe-table--render-default.size--small .vxe-cell .vxe-default-input[type=date]::-webkit-inner-spin-button{margin-top: 0.125rem}.vxe-table--render-default.size--mini{font-size: 0.75rem}.vxe-table--render-default.size--mini .vxe-table--empty-block,.vxe-table--render-default.size--mini .vxe-table--empty-placeholder{min-height: 2.25rem}.vxe-table--render-default.size--mini .vxe-body--column:not(.col--ellipsis),.vxe-table--render-default.size--mini .vxe-footer--column:not(.col--ellipsis),.vxe-table--render-default.size--mini .vxe-header--column:not(.col--ellipsis){padding: 0.4375rem 0}.vxe-table--render-default.size--mini .vxe-cell .vxe-default-input,.vxe-table--render-default.size--mini .vxe-cell .vxe-default-select,.vxe-table--render-default.size--mini .vxe-cell .vxe-default-textarea{height: 1.75rem}.vxe-table--render-default.size--mini .vxe-cell .vxe-default-input[type=date]::-webkit-inner-spin-button{margin-top: 0.0625rem}.vxe-table--render-default .vxe-cell{white-space:pre-line;word-break:break-all;padding-left: 0.625rem;padding-right: 0.625rem}.vxe-table--render-default .vxe-cell--placeholder{color:#c0c4cc}.vxe-table--render-default .fixed--hidden{visibility:hidden}.vxe-table--render-default .vxe-table--fixed-left-wrapper,.vxe-table--render-default .vxe-table--fixed-right-wrapper{width:100%;position:absolute;top:0;z-index:5;overflow:hidden;background-color:inherit;-webkit-transition:box-shadow .3s;transition:box-shadow .3s}.vxe-table--render-default .vxe-table--fixed-left-wrapper .vxe-table--body-wrapper,.vxe-table--render-default .vxe-table--fixed-right-wrapper .vxe-table--body-wrapper{overflow-x:hidden}.vxe-table--render-default .vxe-table--fixed-left-wrapper .vxe-table--body-wrapper{width:calc(100% + 2.5rem)}.vxe-table--render-default.is--header .vxe-table--fixed-left-wrapper .vxe-table--body-wrapper:before,.vxe-table--render-default.is--header .vxe-table--fixed-right-wrapper .vxe-table--body-wrapper:before{display:none}.vxe-table--render-default .vxe-table--fixed-left-wrapper{left:0;width: 12.5rem}.vxe-table--render-default .vxe-table--fixed-left-wrapper.scrolling--middle{-webkit-box-shadow: 0.25rem 0.1875rem 0.25rem 0 rgba(0,0,0,.12);box-shadow: 0.25rem 0.1875rem 0.25rem 0 rgba(0,0,0,.12)}.vxe-table--render-default .vxe-table--fixed-right-wrapper{right:0}.vxe-table--render-default .vxe-table--fixed-right-wrapper.scrolling--middle{-webkit-box-shadow: -0.25rem 0.1875rem 0.25rem 0 rgba(0,0,0,.12);box-shadow: -0.25rem 0.1875rem 0.25rem 0 rgba(0,0,0,.12)}.vxe-table--render-default .vxe-table--body-wrapper,.vxe-table--render-default .vxe-table--footer-wrapper,.vxe-table--render-default .vxe-table--header-wrapper{position:relative}.vxe-table--render-default .vxe-table--body-wrapper.fixed-left--wrapper,.vxe-table--render-default .vxe-table--body-wrapper.fixed-right--wrapper,.vxe-table--render-default .vxe-table--footer-wrapper.fixed-left--wrapper,.vxe-table--render-default .vxe-table--footer-wrapper.fixed-right--wrapper,.vxe-table--render-default .vxe-table--header-wrapper.fixed-left--wrapper,.vxe-table--render-default .vxe-table--header-wrapper.fixed-right--wrapper{position:absolute;top:0}.vxe-table--render-default .vxe-table--body-wrapper.fixed-left--wrapper,.vxe-table--render-default .vxe-table--footer-wrapper.fixed-left--wrapper,.vxe-table--render-default .vxe-table--header-wrapper.fixed-left--wrapper{left:0}.vxe-table--render-default .vxe-table--body-wrapper.fixed-right--wrapper,.vxe-table--render-default .vxe-table--footer-wrapper.fixed-right--wrapper,.vxe-table--render-default .vxe-table--header-wrapper.fixed-right--wrapper{right:0;overflow-y:auto}.vxe-table--render-default .vxe-body--x-space{width:100%;height: 0.0625rem;margin-bottom: -0.0625rem}.vxe-table--render-default .vxe-body--y-space{width:0;float:left}.vxe-table--render-default .vxe-table--resizable-bar{display:none;position:absolute;top:0;left:0;width: 0.0625rem;height:100%;z-index:9;cursor:col-resize}.vxe-table--render-default .vxe-table--resizable-bar:before{content:"";display:block;height:100%;background-color:#409eff}.vxe-table--render-default .vxe-table--border-line{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10;pointer-events:none;border: 0.0625rem solid #e8eaec}.vxe-table--render-default.is--tree-line .vxe-body--row:first-child .vxe-tree--line{border-width:0 0 0.0625rem 0}.vxe-table--render-default.is--tree-line .vxe-body--row .vxe-body--column{background-image:none}.vxe-table--render-default .vxe-tree--line-wrapper{position:relative;display:block;height:0}.vxe-table--render-default .vxe-tree--line{content:"";position:absolute;bottom:-.9em;width:.8em;border-width:0 0 0.0625rem 0.0625rem;border-style:dotted;border-color:#909399;pointer-events:none}.vxe-table--render-default .vxe-cell--tree-node{position:relative}.vxe-table--render-default .vxe-tree--btn-wrapper{position:absolute;top:50%;width:1em;height:1em;text-align:center;-webkit-transform:translateY(-50%);transform:translateY(-50%);z-index:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.vxe-table--render-default .vxe-tree--node-btn{display:block;color:#939599}.vxe-table--render-default .vxe-tree--node-btn:hover{color:#606266}.vxe-table--render-default .vxe-tree-cell{display:block;padding-left:1.5em}.vxe-table--render-default .vxe-body--column.col--ellipsis>.vxe-cell .vxe-tree-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-table--render-default .vxe-table--expanded{cursor:pointer}.vxe-table--render-default .vxe-table--expanded .vxe-table--expand-btn{display:inline-block;width:1em;height:1em;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#939599}.vxe-table--render-default .vxe-table--expanded .vxe-table--expand-btn:hover{color:#606266}.vxe-table--render-default .vxe-table--expanded+.vxe-table--expand-label{padding-left:.5em}.vxe-table--render-default .vxe-body--expanded-column{border-bottom: 0.0625rem solid #e8eaec}.vxe-table--render-default .vxe-body--expanded-column.col--ellipsis>.vxe-body--expanded-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-table--render-default .vxe-body--expanded-cell{position:relative;z-index:1}.vxe-table--render-default .vxe-body--expanded-cell.is--ellipsis{overflow:auto}.vxe-table--render-default .vxe-body--column.col--ellipsis>.vxe-cell,.vxe-table--render-default .vxe-footer--column.col--ellipsis>.vxe-cell,.vxe-table--render-default .vxe-header--column.col--ellipsis>.vxe-cell{max-height: 3rem}.vxe-table--render-default.size--medium .vxe-body--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--medium .vxe-footer--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--medium .vxe-header--column.col--ellipsis>.vxe-cell{max-height: 2.75rem}.vxe-table--render-default.size--medium .vxe-cell--checkbox,.vxe-table--render-default.size--medium .vxe-cell--radio{font-size: 0.875rem}.vxe-table--render-default.size--small .vxe-body--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--small .vxe-footer--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--small .vxe-header--column.col--ellipsis>.vxe-cell{max-height: 2.5rem}.vxe-table--render-default.size--small .vxe-cell--checkbox,.vxe-table--render-default.size--small .vxe-cell--radio{font-size: 0.8125rem}.vxe-table--render-default.size--mini .vxe-body--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--mini .vxe-footer--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--mini .vxe-header--column.col--ellipsis>.vxe-cell{max-height: 2.25rem}.vxe-table--render-default.size--mini .vxe-cell--checkbox,.vxe-table--render-default.size--mini .vxe-cell--radio{font-size: 0.75rem}.vxe-table--render-default .vxe-table--empty-block,.vxe-table--render-default .vxe-table--empty-placeholder{min-height: 3rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center;overflow:hidden;width:100%;pointer-events:none}.vxe-table--render-default .vxe-table--empty-block{display:none;visibility:hidden}.vxe-table--render-default .vxe-table--empty-placeholder{display:none;position:absolute;top:0;z-index:5}.vxe-table--render-default .vxe-table--empty-content{display:block;width:50%;pointer-events:auto}.vxe-table--render-default.is--empty .vxe-table--empty-block,.vxe-table--render-default.is--empty .vxe-table--empty-placeholder{display:-webkit-box;display:-ms-flexbox;display:flex}.vxe-table--render-default .vxe-body--column.col--selected{-webkit-box-shadow:inset 0 0 0 0.125rem #409eff;box-shadow:inset 0 0 0 0.125rem #409eff}.vxe-table--render-default .vxe-body--column.col--actived,.vxe-table--render-default .vxe-body--column.col--selected{position:relative}.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-cell--valid{width: 20rem;position:absolute;bottom:calc(100% + 0.25rem);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);text-align:center;pointer-events:none;z-index:4}.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-cell--valid .vxe-cell--valid-msg{display:inline-block;border-radius: 0.25rem;padding: 0.5rem 0.75rem;color:#fff;background-color:#f56c6c;pointer-events:auto}.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-default-input,.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-default-select,.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-default-textarea,.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-input>.vxe-input--inner{border-color:#f56c6c}.vxe-table--render-default .vxe-body--row:first-child .vxe-cell--valid{bottom:auto;top:calc(100% + 0.25rem)}.vxe-table--render-default .vxe-body--column:first-child .vxe-cell--valid{left: 0.625rem;-webkit-transform:translateX(0);transform:translateX(0);text-align:left}.vxe-table--render-default .vxe-body--row.row--new>.vxe-body--column{position:relative}.vxe-table--render-default .vxe-body--row.row--new>.vxe-body--column:before{content:"";top: -0.3125rem;left: -0.3125rem;position:absolute;border-width: 0.3125rem;border-style:solid;border-color:transparent #19a15f transparent transparent;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.vxe-table--render-default .vxe-body--column.col--dirty{position:relative}.vxe-table--render-default .vxe-body--column.col--dirty:before{content:"";top: -0.3125rem;left: -0.3125rem;position:absolute;border-width: 0.3125rem;border-style:solid;border-color:transparent #f56c6c transparent transparent;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived{-webkit-box-shadow:inset 0 0 0 0.125rem #409eff;box-shadow:inset 0 0 0 0.125rem #409eff}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived.col--valid-error{-webkit-box-shadow:inset 0 0 0 0.125rem #f56c6c;box-shadow:inset 0 0 0 0.125rem #f56c6c}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-default-input,.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-default-textarea{border:0;padding:0}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-default-input{height: 1.375rem}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-input .vxe-input--inner{border:0;padding-left:0}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-textarea{height: 1.3125rem}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-textarea .vxe-textarea--inner{border:0}.vxe-table--render-default.vxe-editable .vxe-body--column,.vxe-table--render-default.vxe-editable .vxe-body--column.col--actived{padding:0}.vxe-table--footer-wrapper{color:#606266;margin-top: -0.0625rem}.vxe-table--footer-wrapper.body--wrapper{overflow-x:auto}.vxe-footer--column.col--ellipsis>.vxe-cell{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-footer--column.col--ellipsis>.vxe-cell .vxe-cell--item{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-grid{position:relative}.vxe-grid.is--loading:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:99;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:hsla(0,0%,100%,.5)}.vxe-grid.is--loading>.vxe-table .vxe-loading{background-color:transparent}.vxe-grid.is--maximize{position:fixed;top:0;left:0;width:100%;height:100%;padding:.5em 1em;background-color:#fff}.vxe-grid .vxe-body--row.row--pending{color:#f56c6c;text-decoration:line-through;cursor:no-drop}.vxe-grid .vxe-body--row.row--pending .vxe-body--column{position:relative}.vxe-grid .vxe-body--row.row--pending .vxe-body--column:after{content:"";position:absolute;top:50%;left:0;width:100%;height:0;border-bottom: 0.0625rem solid #f56c6c;z-index:1}.vxe-grid .vxe-grid--bottom-wrapper,.vxe-grid .vxe-grid--form-wrapper,.vxe-grid .vxe-grid--top-wrapper{position:relative}.vxe-grid,.vxe-grid.size--medium{font-size: 0.875rem}.vxe-grid.size--small{font-size: 0.8125rem}.vxe-grid.size--mini{font-size: 0.75rem}.vxe-toolbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.6em 0;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;background-color:#fff}.vxe-toolbar:after{content:"";display:block;clear:both;height:0;overflow:hidden;visibility:hidden}.vxe-toolbar.is--perfect{border: 0.0625rem solid #e8eaec;border-bottom-width:0;background-color:#f8f8f9}.vxe-toolbar.is--loading:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:hsla(0,0%,100%,.5)}.vxe-toolbar .vxe-buttons--wrapper{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.vxe-toolbar .vxe-buttons--wrapper>.vxe-button+.vxe-button--item,.vxe-toolbar .vxe-buttons--wrapper>.vxe-button--item+.vxe-button,.vxe-toolbar .vxe-buttons--wrapper>.vxe-button--item+.vxe-button--item{margin-left:.8em}.vxe-toolbar .vxe-buttons--wrapper>.vxe-button--item{display:inline-block}.vxe-toolbar .vxe-tools--wrapper>.vxe-button+.vxe-tool--item,.vxe-toolbar .vxe-tools--wrapper>.vxe-tool--item+.vxe-button,.vxe-toolbar .vxe-tools--wrapper>.vxe-tool--item+.vxe-tool--item{margin-left:.8em}.vxe-toolbar .vxe-tools--wrapper>.vxe-tool--item{display:inline-block}.vxe-toolbar .vxe-tools--wrapper>.vxe-button{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.vxe-toolbar .vxe-buttons--wrapper,.vxe-toolbar .vxe-tools--operate,.vxe-toolbar .vxe-tools--wrapper,.vxe-toolbar .vxe-tools--wrapper>.vxe-button{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-toolbar .vxe-buttons--wrapper,.vxe-toolbar .vxe-tools--wrapper{-ms-flex-wrap:wrap;flex-wrap:wrap}.vxe-toolbar .vxe-tools--operate{-ms-flex-negative:0;flex-shrink:0}.vxe-toolbar .vxe-custom--wrapper{position:relative;margin-left:.8em}.vxe-toolbar .vxe-custom--wrapper.is--active>.vxe-button{background-color:#d9dadb;border-radius:50%}.vxe-toolbar .vxe-custom--wrapper.is--active .vxe-custom--option-wrapper{display:block}.vxe-toolbar .vxe-custom--option-wrapper{display:none;position:absolute;right: 0.125rem;text-align:left;background-color:#fff;z-index:19;border: 0.0625rem solid #e8eaec;border-radius: 0.25rem;-webkit-box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2);box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2)}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header{padding:.28em 0;font-weight:700;border-bottom: 0.0625rem solid #dadce0}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body{padding:.2em 0;max-height:17.6em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body .vxe-custom--option:hover{background-color:#f5f7fa}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li{max-width:16em;min-width:12.5em;padding:.2em 1em .2em 1em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--2,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--2{padding-left:3.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--2 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--2 .vxe-checkbox--icon{left:1.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--3,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--3{padding-left:4.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--3 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--3 .vxe-checkbox--icon{left:2.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--4,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--4{padding-left:5.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--4 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--4 .vxe-checkbox--icon{left:3.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--5,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--5{padding-left:6.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--5 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--5 .vxe-checkbox--icon{left:4.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--6,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--6{padding-left:7.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--6 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--6 .vxe-checkbox--icon{left:5.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--7,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--7{padding-left:8.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--7 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--7 .vxe-checkbox--icon{left:6.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--8,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--8{padding-left:9.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--8 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--8 .vxe-checkbox--icon{left:7.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer{border-top: 0.0625rem solid #dadce0;text-align:right}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer button{background-color:transparent;width:50%;height:2.5em;border:0;color:#606266;text-align:center;cursor:pointer}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer button:focus{outline:none}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer button:hover{color:#409eff}.vxe-custom--option-wrapper .vxe-custom--body,.vxe-custom--option-wrapper .vxe-custom--header{list-style-type:none;overflow-x:hidden;overflow-y:auto;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-custom--option-wrapper .vxe-custom--body>li,.vxe-custom--option-wrapper .vxe-custom--header>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-toolbar,.vxe-toolbar.size--medium{font-size: 0.875rem}.vxe-toolbar.size--small{font-size: 0.8125rem}.vxe-toolbar.size--mini{font-size: 0.75rem}.vxe-pager{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;text-align:right;background-color:#fff}.vxe-pager.is--hidden{display:none}.vxe-pager.align--left{text-align:left}.vxe-pager.align--center{text-align:center}.vxe-pager.is--loading:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:hsla(0,0%,100%,.5)}.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--num-btn,.vxe-pager .vxe-pager--prev-btn{color:inherit;outline:0;padding:0;border: 0.0625rem solid transparent}.vxe-pager .vxe-pager--jump-next:not(.is--disabled):focus,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled):focus,.vxe-pager .vxe-pager--next-btn:not(.is--disabled):focus,.vxe-pager .vxe-pager--num-btn:not(.is--disabled):focus,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled):focus{-webkit-box-shadow:0 0 .25em 0 #409eff;box-shadow:0 0 .25em 0 #409eff}.vxe-pager .vxe-pager--jump-next:not(.is--disabled):active,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled):active,.vxe-pager .vxe-pager--next-btn:not(.is--disabled):active,.vxe-pager .vxe-pager--num-btn:not(.is--disabled):active,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled):active{background-color:#f7f7f7}.vxe-pager.is--border:not(.is--background) .vxe-pager--jump-next,.vxe-pager.is--border:not(.is--background) .vxe-pager--jump-prev,.vxe-pager.is--border:not(.is--background) .vxe-pager--next-btn,.vxe-pager.is--border:not(.is--background) .vxe-pager--num-btn,.vxe-pager.is--border:not(.is--background) .vxe-pager--prev-btn,.vxe-pager.is--perfect:not(.is--background) .vxe-pager--jump-next,.vxe-pager.is--perfect:not(.is--background) .vxe-pager--jump-prev,.vxe-pager.is--perfect:not(.is--background) .vxe-pager--next-btn,.vxe-pager.is--perfect:not(.is--background) .vxe-pager--num-btn,.vxe-pager.is--perfect:not(.is--background) .vxe-pager--prev-btn{border-color:#dcdfe6}.vxe-pager.is--background .vxe-pager--jump-next,.vxe-pager.is--background .vxe-pager--jump-prev,.vxe-pager.is--background .vxe-pager--next-btn,.vxe-pager.is--background .vxe-pager--num-btn,.vxe-pager.is--background .vxe-pager--prev-btn,.vxe-pager.is--perfect .vxe-pager--jump-next,.vxe-pager.is--perfect .vxe-pager--jump-prev,.vxe-pager.is--perfect .vxe-pager--next-btn,.vxe-pager.is--perfect .vxe-pager--num-btn,.vxe-pager.is--perfect .vxe-pager--prev-btn{background-color:#f4f4f5}.vxe-pager.is--background .vxe-pager--jump-next:not(.is--disabled).is--active,.vxe-pager.is--background .vxe-pager--jump-prev:not(.is--disabled).is--active,.vxe-pager.is--background .vxe-pager--num-btn:not(.is--disabled).is--active,.vxe-pager.is--perfect .vxe-pager--jump-next:not(.is--disabled).is--active,.vxe-pager.is--perfect .vxe-pager--jump-prev:not(.is--disabled).is--active,.vxe-pager.is--perfect .vxe-pager--num-btn:not(.is--disabled).is--active{color:#fff;background-color:#409eff}.vxe-pager.is--background .vxe-pager--jump-next:not(.is--disabled).is--active:hover,.vxe-pager.is--background .vxe-pager--jump-prev:not(.is--disabled).is--active:hover,.vxe-pager.is--background .vxe-pager--num-btn:not(.is--disabled).is--active:hover,.vxe-pager.is--perfect .vxe-pager--jump-next:not(.is--disabled).is--active:hover,.vxe-pager.is--perfect .vxe-pager--jump-prev:not(.is--disabled).is--active:hover,.vxe-pager.is--perfect .vxe-pager--num-btn:not(.is--disabled).is--active:hover{background-color:#5faeff}.vxe-pager.is--background .vxe-pager--jump-next:not(.is--disabled).is--active:focus,.vxe-pager.is--background .vxe-pager--jump-prev:not(.is--disabled).is--active:focus,.vxe-pager.is--background .vxe-pager--num-btn:not(.is--disabled).is--active:focus,.vxe-pager.is--perfect .vxe-pager--jump-next:not(.is--disabled).is--active:focus,.vxe-pager.is--perfect .vxe-pager--jump-prev:not(.is--disabled).is--active:focus,.vxe-pager.is--perfect .vxe-pager--num-btn:not(.is--disabled).is--active:focus{border-color:#409eff}.vxe-pager.is--background .vxe-pager--jump-next:not(.is--disabled).is--active:active,.vxe-pager.is--background .vxe-pager--jump-prev:not(.is--disabled).is--active:active,.vxe-pager.is--background .vxe-pager--num-btn:not(.is--disabled).is--active:active,.vxe-pager.is--perfect .vxe-pager--jump-next:not(.is--disabled).is--active:active,.vxe-pager.is--perfect .vxe-pager--jump-prev:not(.is--disabled).is--active:active,.vxe-pager.is--perfect .vxe-pager--num-btn:not(.is--disabled).is--active:active{border-color:#3196ff;background-color:#3196ff}.vxe-pager.is--perfect{border: 0.0625rem solid #e8eaec;border-top-width:0;background-color:#fff}.vxe-pager.is--border .vxe-pager--num-btn.is--active{border-color:#409eff}.vxe-pager .vxe-pager--wrapper{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.vxe-pager .vxe-pager--btn-icon,.vxe-pager .vxe-pager--jump-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.vxe-pager .vxe-pager--count,.vxe-pager .vxe-pager--jump,.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--left-wrapper,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--prev-btn,.vxe-pager .vxe-pager--right-wrapper,.vxe-pager .vxe-pager--sizes,.vxe-pager .vxe-pager--total{margin:0 .4em;vertical-align:middle;display:inline-block}.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--num-btn,.vxe-pager .vxe-pager--prev-btn{position:relative;cursor:pointer}.vxe-pager .vxe-pager--count,.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--left-wrapper,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--num-btn,.vxe-pager .vxe-pager--prev-btn,.vxe-pager .vxe-pager--right-wrapper{height:2.15em;line-height:2em;display:inline-block}.vxe-pager .vxe-pager--jump .vxe-pager--goto,.vxe-pager .vxe-pager--sizes>.vxe-input{height:2.15em;line-height:2.15em}.vxe-pager .vxe-pager--sizes>.vxe-select--panel .vxe-select-option{text-align:center}.vxe-pager .vxe-pager--count,.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--num-btn,.vxe-pager .vxe-pager--prev-btn{min-width:2.15em}.vxe-pager .vxe-pager--btn-wrapper{padding:0;margin:0;display:inline-block;text-align:center}.vxe-pager .vxe-pager--btn-wrapper .vxe-pager--jump-next:hover .vxe-pager--jump-more-icon,.vxe-pager .vxe-pager--btn-wrapper .vxe-pager--jump-prev:hover .vxe-pager--jump-more-icon{display:none}.vxe-pager .vxe-pager--btn-wrapper .vxe-pager--jump-next:hover .vxe-pager--jump-icon,.vxe-pager .vxe-pager--btn-wrapper .vxe-pager--jump-prev:hover .vxe-pager--jump-icon{display:inline-block}.vxe-pager .vxe-pager--btn-wrapper .vxe-pager--jump-icon{display:none}.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--num-btn,.vxe-pager .vxe-pager--prev-btn{text-align:center;border-radius: 0.25rem;margin:0 .25em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff}.vxe-pager .vxe-pager--jump-next:not(.is--disabled):hover,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled):hover,.vxe-pager .vxe-pager--next-btn:not(.is--disabled):hover,.vxe-pager .vxe-pager--num-btn:not(.is--disabled):hover,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled):hover{color:#5faeff}.vxe-pager .vxe-pager--jump-next:not(.is--disabled).is--active,.vxe-pager .vxe-pager--jump-next:not(.is--disabled):focus,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled).is--active,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled):focus,.vxe-pager .vxe-pager--next-btn:not(.is--disabled).is--active,.vxe-pager .vxe-pager--next-btn:not(.is--disabled):focus,.vxe-pager .vxe-pager--num-btn:not(.is--disabled).is--active,.vxe-pager .vxe-pager--num-btn:not(.is--disabled):focus,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled).is--active,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled):focus{color:#409eff}.vxe-pager .vxe-pager--jump-next:not(.is--disabled):active,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled):active,.vxe-pager .vxe-pager--next-btn:not(.is--disabled):active,.vxe-pager .vxe-pager--num-btn:not(.is--disabled):active,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled):active{color:#3196ff}.vxe-pager .vxe-pager--jump-next.is--disabled,.vxe-pager .vxe-pager--jump-prev.is--disabled,.vxe-pager .vxe-pager--next-btn.is--disabled,.vxe-pager .vxe-pager--num-btn.is--disabled,.vxe-pager .vxe-pager--prev-btn.is--disabled{cursor:no-drop;color:#bfbfbf}.vxe-pager .vxe-pager--jump-next.is--disabled:hover,.vxe-pager .vxe-pager--jump-prev.is--disabled:hover,.vxe-pager .vxe-pager--next-btn.is--disabled:hover,.vxe-pager .vxe-pager--num-btn.is--disabled:hover,.vxe-pager .vxe-pager--prev-btn.is--disabled:hover{color:#bfbfbf}.vxe-pager .vxe-pager--num-btn{vertical-align:middle}.vxe-pager .vxe-pager--num-btn.is--active{font-weight:700}.vxe-pager .vxe-pager--sizes{width:7em;text-align:center;cursor:pointer}.vxe-pager .vxe-pager--count,.vxe-pager .vxe-pager--sizes .vxe-input--inner{text-align:center}.vxe-pager .vxe-pager--count>span{vertical-align:middle}.vxe-pager .vxe-pager--count .vxe-pager--separator{margin-right:.2em}.vxe-pager .vxe-pager--count .vxe-pager--separator:before{content:"/"}.vxe-pager .vxe-pager--jump .vxe-pager--goto{border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6;color:#606266;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out;padding:0 .4em;background-color:#fff}.vxe-pager .vxe-pager--jump .vxe-pager--goto:focus{border: 0.0625rem solid #409eff;outline:0}.vxe-pager .vxe-pager--jump .vxe-pager--goto-text{margin-right:.25em}.vxe-pager .vxe-pager--jump .vxe-pager--classifier-text{margin-left:.25em}.vxe-pager .vxe-pager--jump .vxe-pager--goto{width:3.2em;text-align:center}.vxe-pager{font-size: 0.875rem;height: 3rem}.vxe-pager.size--medium{font-size: 0.875rem;height: 2.75rem}.vxe-pager.size--small{font-size: 0.8125rem;height: 2.5rem}.vxe-pager.size--mini{font-size: 0.75rem;height: 2.25rem}.vxe-checkbox,.vxe-checkbox-group{display:inline-block;vertical-align:middle;line-height:1}.vxe-checkbox{white-space:nowrap}.vxe-checkbox+.vxe-checkbox{margin-left: 0.625rem}.vxe-checkbox>input[type=checkbox]{position:absolute;width:0;height:0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.vxe-checkbox.is--indeterminate>input:not(:checked)+.vxe-checkbox--icon{color:#409eff}.vxe-checkbox:not(.is--disabled)>input:focus+.vxe-checkbox--icon{color:#409eff;-webkit-box-shadow:0 0 .2em 0 #409eff;box-shadow:0 0 .2em 0 #409eff}.vxe-checkbox:not(.is--disabled):hover>input+.vxe-checkbox--icon{border-color:#409eff}.vxe-checkbox.is--disabled{cursor:not-allowed}.vxe-checkbox.is--disabled>input+.vxe-checkbox--icon{color:#dcdfe6}.vxe-checkbox.is--disabled>input+.vxe-checkbox--icon+.vxe-checkbox--label{color:#bfbfbf}.vxe-checkbox.is--disabled>input:checked+.vxe-checkbox--icon{color:#dcdfe6}.vxe-checkbox .vxe-checkbox--label{padding-left:.5em;vertical-align:middle;display:inline-block;max-width:50em}.vxe-checkbox,.vxe-checkbox.size--medium{font-size: 0.875rem}.vxe-checkbox.size--small{font-size: 0.8125rem}.vxe-checkbox.size--mini{font-size: 0.75rem}[class*=vxe-],[class*=vxe-]:after,[class*=vxe-] :after,[class*=vxe-]:before,[class*=vxe-] :before{-webkit-box-sizing:border-box;box-sizing:border-box}.vxe-checkbox .vxe-checkbox--label,.vxe-radio-button .vxe-radio--label,.vxe-radio .vxe-radio--label,.vxe-table--render-default .vxe-body--column.col--ellipsis:not(.col--actived)>.vxe-cell,.vxe-table--render-default .vxe-footer--column.col--ellipsis:not(.col--actived)>.vxe-cell,.vxe-table--render-default .vxe-header--column.col--ellipsis:not(.col--actived)>.vxe-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[class*=vxe-]{font-variant:tabular-nums;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum"}.vxe-primary-color{color:#409eff}.vxe-success-color{color:#67c23a}.vxe-info-color{color:#909399}.vxe-warning-color{color:#e6a23c}.vxe-danger-color{color:#f56c6c}.vxe-perfect-color{color:#f8f8f9}.vxe-row:after{content:"";display:block;clear:both;height:0;overflow:hidden;visibility:hidden}.vxe-row>.vxe-col--1{float:left;width:4.16667%}.vxe-row>.vxe-col--2{float:left;width:8.33333%}.vxe-row>.vxe-col--3{float:left;width:12.5%}.vxe-row>.vxe-col--4{float:left;width:16.66667%}.vxe-row>.vxe-col--5{float:left;width:20.83333%}.vxe-row>.vxe-col--6{float:left;width:25%}.vxe-row>.vxe-col--7{float:left;width:29.16667%}.vxe-row>.vxe-col--8{float:left;width:33.33333%}.vxe-row>.vxe-col--9{float:left;width:37.5%}.vxe-row>.vxe-col--10{float:left;width:41.66667%}.vxe-row>.vxe-col--11{float:left;width:45.83333%}.vxe-row>.vxe-col--12{float:left;width:50%}.vxe-row>.vxe-col--13{float:left;width:54.16667%}.vxe-row>.vxe-col--14{float:left;width:58.33333%}.vxe-row>.vxe-col--15{float:left;width:62.5%}.vxe-row>.vxe-col--16{float:left;width:66.66667%}.vxe-row>.vxe-col--17{float:left;width:70.83333%}.vxe-row>.vxe-col--18{float:left;width:75%}.vxe-row>.vxe-col--19{float:left;width:79.16667%}.vxe-row>.vxe-col--20{float:left;width:83.33333%}.vxe-row>.vxe-col--21{float:left;width:87.5%}.vxe-row>.vxe-col--22{float:left;width:91.66667%}.vxe-row>.vxe-col--23{float:left;width:95.83333%}.vxe-row>.vxe-col--24{float:left;width:100%}.is--animat .vxe-filter--btn:after,.is--animat .vxe-filter--btn:before,.is--animat .vxe-input--wrapper .vxe-input,.is--animat .vxe-sort--asc-btn:after,.is--animat .vxe-sort--asc-btn:before,.is--animat .vxe-sort--desc-btn:after,.is--animat .vxe-sort--desc-btn:before{-webkit-transition:border .1s ease-in-out;transition:border .1s ease-in-out}.is--animat .vxe-table--expand-btn,.is--animat .vxe-tree--node-btn{-webkit-transition:-webkit-transform .1s ease-in-out;transition:-webkit-transform .1s ease-in-out;transition:transform .1s ease-in-out;transition:transform .1s ease-in-out,-webkit-transform .1s ease-in-out}.is--animat .vxe-checkbox>input:checked+span,.is--animat .vxe-radio>input:checked+span{-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out}.vxe-checkbox .vxe-checkbox--icon,.vxe-custom--option .vxe-checkbox--icon,.vxe-export--panel-column-option .vxe-checkbox--icon,.vxe-table--filter-option .vxe-checkbox--icon,.vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--icon{font-size:1.34em;color:#dcdfe6;vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.is--checked.vxe-checkbox,.is--checked.vxe-checkbox .vxe-checkbox--icon,.is--checked.vxe-custom--option,.is--checked.vxe-custom--option .vxe-checkbox--icon,.is--checked.vxe-export--panel-column-option,.is--checked.vxe-export--panel-column-option .vxe-checkbox--icon,.is--checked.vxe-table--filter-option,.is--checked.vxe-table--filter-option .vxe-checkbox--icon,.is--indeterminate.vxe-checkbox,.is--indeterminate.vxe-checkbox .vxe-checkbox--icon,.is--indeterminate.vxe-custom--option,.is--indeterminate.vxe-custom--option .vxe-checkbox--icon,.is--indeterminate.vxe-export--panel-column-option,.is--indeterminate.vxe-export--panel-column-option .vxe-checkbox--icon,.is--indeterminate.vxe-table--filter-option,.is--indeterminate.vxe-table--filter-option .vxe-checkbox--icon,.vxe-table--render-default .is--checked.vxe-cell--checkbox,.vxe-table--render-default .is--checked.vxe-cell--checkbox .vxe-checkbox--icon,.vxe-table--render-default .is--indeterminate.vxe-cell--checkbox,.vxe-table--render-default .is--indeterminate.vxe-cell--checkbox .vxe-checkbox--icon{color:#409eff}.vxe-checkbox:not(.is--disabled),.vxe-custom--option:not(.is--disabled),.vxe-export--panel-column-option:not(.is--disabled),.vxe-table--filter-option:not(.is--disabled),.vxe-table--render-default .vxe-cell--checkbox:not(.is--disabled){cursor:pointer}.vxe-checkbox:not(.is--disabled):hover .vxe-checkbox--icon,.vxe-custom--option:not(.is--disabled):hover .vxe-checkbox--icon,.vxe-export--panel-column-option:not(.is--disabled):hover .vxe-checkbox--icon,.vxe-table--filter-option:not(.is--disabled):hover .vxe-checkbox--icon,.vxe-table--render-default .vxe-cell--checkbox:not(.is--disabled):hover .vxe-checkbox--icon{color:#409eff}.is--disabled.vxe-checkbox,.is--disabled.vxe-custom--option,.is--disabled.vxe-export--panel-column-option,.is--disabled.vxe-table--filter-option,.vxe-table--render-default .is--disabled.vxe-cell--checkbox{color:#bfbfbf;cursor:not-allowed}.is--disabled.vxe-checkbox .vxe-checkbox--icon,.is--disabled.vxe-custom--option .vxe-checkbox--icon,.is--disabled.vxe-export--panel-column-option .vxe-checkbox--icon,.is--disabled.vxe-table--filter-option .vxe-checkbox--icon,.vxe-table--render-default .is--disabled.vxe-cell--checkbox .vxe-checkbox--icon{color:#dcdfe6}.vxe-checkbox .vxe-checkbox--label,.vxe-custom--option .vxe-checkbox--label,.vxe-export--panel-column-option .vxe-checkbox--label,.vxe-table--filter-option .vxe-checkbox--label,.vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--label{padding-left:.5em;vertical-align:middle}.vxe-radio,.vxe-table--render-default .vxe-cell--radio{cursor:pointer}.vxe-radio .vxe-radio--icon,.vxe-table--render-default .vxe-cell--radio .vxe-radio--icon{font-size:1.4em;color:#dcdfe6;vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.is--checked.vxe-radio,.is--checked.vxe-radio .vxe-radio--icon,.vxe-table--render-default .is--checked.vxe-cell--radio,.vxe-table--render-default .is--checked.vxe-cell--radio .vxe-radio--icon{color:#409eff}.vxe-radio:not(.is--disabled),.vxe-table--render-default .vxe-cell--radio:not(.is--disabled){cursor:pointer}.vxe-radio:not(.is--disabled):hover .vxe-radio--icon,.vxe-table--render-default .vxe-cell--radio:not(.is--disabled):hover .vxe-radio--icon{color:#409eff}.is--disabled.vxe-radio,.vxe-table--render-default .is--disabled.vxe-cell--radio{color:#bfbfbf;cursor:not-allowed}.is--disabled.vxe-radio .vxe-radio--icon,.vxe-table--render-default .is--disabled.vxe-cell--radio .vxe-radio--icon{color:#dcdfe6}.vxe-radio .vxe-radio--label,.vxe-table--render-default .vxe-cell--radio .vxe-radio--label{padding-left:.5em;vertical-align:middle}.vxe-radio-group{display:inline-block;vertical-align:middle;line-height:1;font-size:0}.vxe-radio-group+.vxe-radio-group{margin-left: 0.625rem}.vxe-radio{display:inline-block;vertical-align:middle;white-space:nowrap;line-height:1}.vxe-radio>input[type=radio]{position:absolute;width:0;height:0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.vxe-radio .vxe-radio--label{vertical-align:middle;display:inline-block;max-width:50em}.vxe-radio:not(.is--disabled)>input:focus+.vxe-radio--icon{color:#409eff}.vxe-radio:not(.vxe-radio-button)+.vxe-radio{margin-left: 0.625rem}.vxe-radio-button .vxe-radio--label{background-color:#fff}.vxe-radio-button:first-child .vxe-radio--label{border-left: 0.0625rem solid #dcdfe6;border-radius: 0.25rem 0 0 0.25rem}.vxe-radio-button:last-child .vxe-radio--label{border-radius:0 0.25rem 0.25rem 0}.vxe-radio-button>input:checked+.vxe-radio--label{color:#fff;background-color:#409eff;border-color:#409eff}.vxe-radio-button .vxe-radio--label{padding:0 1em;line-height: 2rem;display:inline-block;border-style:solid;border-color:#dcdfe6;border-width: 0.0625rem 0.0625rem 0.0625rem 0;max-width:50em}.vxe-radio-button.is--disabled{cursor:not-allowed}.vxe-radio-button.is--disabled>input:not(:checked)+.vxe-radio--label{color:#dcdfe6}.vxe-radio-button.is--disabled>input:checked+.vxe-radio--label{border-color:#a6d2ff;background-color:#a6d2ff}.vxe-radio-button:not(.is--disabled)>input:focus+.vxe-radio--label{border-color:#409eff;-webkit-box-shadow:0 0 .2em 0 #409eff;box-shadow:0 0 .2em 0 #409eff}.vxe-radio-button:not(.is--disabled):hover>input:not(:checked)+.vxe-radio--label{color:#409eff}.vxe-radio-button.size--medium .vxe-radio--label{line-height: 1.875rem}.vxe-radio-button.size--small .vxe-radio--label{line-height: 1.75rem}.vxe-radio-button.size--mini .vxe-radio--label{line-height: 1.625rem}.vxe-radio,.vxe-radio.size--medium{font-size: 0.875rem}.vxe-radio.size--small{font-size: 0.8125rem}.vxe-radio.size--mini{font-size: 0.75rem}.vxe-input--inner{width:100%;height:100%;border-radius: 0.25rem;outline:0;margin:0;font-size:inherit;font-family:inherit;line-height:inherit;padding:0 .6em;color:#606266;border: 0.0625rem solid #dcdfe6;background-color:#fff;-webkit-box-shadow:none;box-shadow:none}.vxe-input--inner::-webkit-input-placeholder{color:#c0c4cc}.vxe-input--inner::-moz-placeholder{color:#c0c4cc}.vxe-input--inner:-ms-input-placeholder{color:#c0c4cc}.vxe-input--inner::-ms-input-placeholder{color:#c0c4cc}.vxe-input--inner::placeholder{color:#c0c4cc}.vxe-input--inner::-webkit-autofill{background-color:#fff}.vxe-input--inner[type=number]{-webkit-appearance:none;appearance:none;-moz-appearance:textfield}.vxe-input--inner[type=number]::-webkit-inner-spin-button,.vxe-input--inner[type=number]::-webkit-outer-spin-button,.vxe-input--inner[type=search],.vxe-input--inner[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}.vxe-input--inner[disabled]{cursor:not-allowed;color:#bfbfbf;background-color:#f3f3f3}.vxe-input{display:inline-block;position:relative;width: 11.25rem}.vxe-input.is--disabled .vxe-input--date-picker-suffix,.vxe-input.is--disabled .vxe-input--number-suffix,.vxe-input.is--disabled .vxe-input--password-suffix,.vxe-input.is--disabled .vxe-input--search-suffix,.vxe-input.is--disabled .vxe-input--suffix{cursor:no-drop}.vxe-input:not(.is--disabled) .vxe-input--clear-icon,.vxe-input:not(.is--disabled) .vxe-input--number-suffix,.vxe-input:not(.is--disabled) .vxe-input--password-suffix,.vxe-input:not(.is--disabled) .vxe-input--search-suffix{cursor:pointer}.vxe-input:not(.is--disabled).is--active .vxe-input--inner{border: 0.0625rem solid #409eff}.vxe-input .vxe-input--extra-suffix,.vxe-input .vxe-input--prefix,.vxe-input .vxe-input--suffix{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:0;width:1.6em;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#c0c4cc}.vxe-input .vxe-input--prefix{left:.2em}.vxe-input.is--prefix .vxe-input--inner{padding-left:1.8em}.vxe-input .vxe-input--clear-icon{display:none}.vxe-input .vxe-input--extra-suffix,.vxe-input .vxe-input--suffix{right:.2em}.vxe-input.is--suffix .vxe-input--inner{padding-right:1.8em}.vxe-input.is--left .vxe-input--inner{text-align:left}.vxe-input.is--center .vxe-input--inner{text-align:center}.vxe-input.is--right .vxe-input--inner{text-align:right}.vxe-input.is--controls.type--date .vxe-input--inner,.vxe-input.is--controls.type--datetime .vxe-input--inner,.vxe-input.is--controls.type--float .vxe-input--inner,.vxe-input.is--controls.type--integer .vxe-input--inner,.vxe-input.is--controls.type--month .vxe-input--inner,.vxe-input.is--controls.type--number .vxe-input--inner,.vxe-input.is--controls.type--password .vxe-input--inner,.vxe-input.is--controls.type--quarter .vxe-input--inner,.vxe-input.is--controls.type--search .vxe-input--inner,.vxe-input.is--controls.type--time .vxe-input--inner,.vxe-input.is--controls.type--week .vxe-input--inner,.vxe-input.is--controls.type--year .vxe-input--inner{padding-right:1.8em}.vxe-input.is--controls.type--date .vxe-input--suffix,.vxe-input.is--controls.type--datetime .vxe-input--suffix,.vxe-input.is--controls.type--float .vxe-input--suffix,.vxe-input.is--controls.type--integer .vxe-input--suffix,.vxe-input.is--controls.type--month .vxe-input--suffix,.vxe-input.is--controls.type--number .vxe-input--suffix,.vxe-input.is--controls.type--password .vxe-input--suffix,.vxe-input.is--controls.type--quarter .vxe-input--suffix,.vxe-input.is--controls.type--search .vxe-input--suffix,.vxe-input.is--controls.type--time .vxe-input--suffix,.vxe-input.is--controls.type--week .vxe-input--suffix,.vxe-input.is--controls.type--year .vxe-input--suffix{right:1.6em}.vxe-input.is--suffix.is--controls.type--date .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--datetime .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--float .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--integer .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--month .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--number .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--password .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--quarter .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--search .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--time .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--week .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--year .vxe-input--inner{padding-right:3.2em}.vxe-input.is--suffix:hover .vxe-input--suffix.is--clear .vxe-input--suffix-icon{display:none}.vxe-input.is--suffix:hover .vxe-input--suffix.is--clear .vxe-input--clear-icon{display:inline}.vxe-input:not(.is--disabled) .vxe-input--suffix:hover .vxe-input--clear-icon{color:#606266}.vxe-input:not(.is--disabled) .vxe-input--suffix:active .vxe-input--clear-icon{color:#409eff}.vxe-input:not(.is--disabled) .vxe-input--extra-suffix:hover .vxe-input--password-suffix,.vxe-input:not(.is--disabled) .vxe-input--extra-suffix:hover .vxe-input--search-suffix{color:#606266}.vxe-input:not(.is--disabled) .vxe-input--extra-suffix:active .vxe-input--password-suffix,.vxe-input:not(.is--disabled) .vxe-input--extra-suffix:active .vxe-input--search-suffix{color:#409eff}.vxe-input:not(.is--disabled) .vxe-input--number-next:hover,.vxe-input:not(.is--disabled) .vxe-input--number-prev:hover{color:#606266}.vxe-input:not(.is--disabled) .vxe-input--number-next:active,.vxe-input:not(.is--disabled) .vxe-input--number-prev:active{color:#409eff}.vxe-input:not(.is--disabled) .vxe-input--number-next.is--disabled,.vxe-input:not(.is--disabled) .vxe-input--number-prev.is--disabled{cursor:no-drop;color:#e4e7ed}.vxe-input .vxe-input--date-picker-suffix,.vxe-input .vxe-input--number-suffix,.vxe-input .vxe-input--password-suffix,.vxe-input .vxe-input--search-suffix{position:relative;width:100%;height:100%}.vxe-input .vxe-input--date-picker-icon,.vxe-input .vxe-input--password-icon,.vxe-input .vxe-input--search-icon{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.vxe-input .vxe-input--date-picker-icon[class*=vxe-icon-],.vxe-input .vxe-input--password-icon[class*=vxe-icon-],.vxe-input .vxe-input--search-icon[class*=vxe-icon-]{font-size:1.2em}.vxe-input .vxe-input--date-picker-suffix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.vxe-input .vxe-input--date-picker-suffix .vxe-input--panel-icon{-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.vxe-input .vxe-input--number-next,.vxe-input .vxe-input--number-prev{position:relative;display:block;height:50%;width:100%;text-align:center}.vxe-input .vxe-input--number-next-icon,.vxe-input .vxe-input--number-prev-icon{line-height:.8em;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.vxe-input .vxe-input--number-prev-icon{bottom:0}.vxe-input .vxe-input--number-next-icon{top:0}.vxe-input--panel{display:none;position:absolute;left:0;padding: 0.25rem 0;color:#606266;text-align:left}.vxe-input--panel:not(.is--transfer){min-width:100%}.vxe-input--panel.is--transfer{position:fixed}.vxe-input--panel.animat--leave{display:block;opacity:0;-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.vxe-input--panel.animat--leave[placement=top]{-webkit-transform-origin:center bottom;transform-origin:center bottom}.vxe-input--panel.animat--enter{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}.vxe-input--panel-layout-wrapper,.vxe-input--panel-wrapper{background-color:#fff;border: 0.0625rem solid #dadce0;-webkit-box-shadow:0 0 0.375rem 0.125rem rgba(0,0,0,.1);box-shadow:0 0 0.375rem 0.125rem rgba(0,0,0,.1);border-radius: 0.25rem}.vxe-input--panel-wrapper{overflow-x:hidden;overflow-y:auto}.vxe-input--panel-layout-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.vxe-input--panel.type--date,.vxe-input--panel.type--month,.vxe-input--panel.type--quarter,.vxe-input--panel.type--week,.vxe-input--panel.type--year{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-input--panel.type--datetime .vxe-input--panel-right-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-left: 0.0625rem solid #dcdfe6}.vxe-input--panel.type--date .vxe-input--date-picker-body th,.vxe-input--panel.type--datetime .vxe-input--date-picker-body th{width:14.28571%}.vxe-input--panel.type--week .vxe-input--date-picker-body table th{width:12%}.vxe-input--panel.type--week .vxe-input--date-picker-body table th:first-child{width:14%}.vxe-input--panel.type--quarter .vxe-input--date-picker-body table th{width:50%}.vxe-input--panel.type--month .vxe-input--date-picker-body td,.vxe-input--panel.type--year .vxe-input--date-picker-body td{width:25%}.vxe-input--time-picker-title{display:inline-block;text-align:center;border: 0.0625rem solid #dcdfe6;border-radius: 0.25rem}.vxe-input--time-picker-confirm{position:absolute;right:0;top:0}.vxe-input--date-picker-confirm,.vxe-input--time-picker-confirm{outline:0;border: 0.0625rem solid #dcdfe6;border-radius: 0.25rem;cursor:pointer;color:#fff;border-color:#409eff;background-color:#409eff}.vxe-input--date-picker-confirm:hover,.vxe-input--time-picker-confirm:hover{background-color:#5faeff;border-color:#5faeff}.vxe-input--date-picker-confirm:active,.vxe-input--time-picker-confirm:active{background-color:#3196ff;border-color:#3196ff}.vxe-input--time-picker-header{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;-ms-flex-negative:0;flex-shrink:0}.vxe-input--date-picker-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-input--date-picker-header .vxe-input--date-picker-type-wrapper{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.vxe-input--date-picker-header .vxe-input--date-picker-btn-wrapper{-ms-flex-negative:0;flex-shrink:0;text-align:center}.vxe-input--date-picker-type-wrapper .vxe-input--date-picker-btn,.vxe-input--date-picker-type-wrapper .vxe-input--date-picker-label{display:inline-block}.vxe-input--date-picker-btn-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.vxe-input--date-picker-btn,.vxe-input--date-picker-label{display:inline-block;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background-color:#fff}.vxe-input--date-picker-btn.is--disabled{color:#bfbfbf;cursor:no-drop}.vxe-input--date-picker-btn:not(.is--disabled){cursor:pointer}.vxe-input--date-picker-btn:not(.is--disabled):hover{background-color:#fff}.vxe-input--date-picker-btn:not(.is--disabled):active{background-color:#f7f7f7}.vxe-input--date-picker-body{border-radius: 0.25rem;border: 0.0625rem solid #dadce0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-input--date-picker-body table{border:0;width:100%;border-spacing:0;border-collapse:separate;text-align:center;table-layout:fixed}.vxe-input--date-picker-body td,.vxe-input--date-picker-body th{font-weight:400}.vxe-input--date-picker-body th{-webkit-box-shadow:inset 0 -0.0625rem 0 0 #dadce0;box-shadow:inset 0 -0.0625rem 0 0 #dadce0}.vxe-input--date-picker-body td.is--next,.vxe-input--date-picker-body td.is--next .vxe-input--date-festival,.vxe-input--date-picker-body td.is--next .vxe-input--date-label,.vxe-input--date-picker-body td.is--prev,.vxe-input--date-picker-body td.is--prev .vxe-input--date-festival,.vxe-input--date-picker-body td.is--prev .vxe-input--date-label{color:#bfbfbf}.vxe-input--date-picker-body td.is--now{-webkit-box-shadow:inset 0 0 0 0.0625rem #dadce0;box-shadow:inset 0 0 0 0.0625rem #dadce0}.vxe-input--date-picker-body td.is--now:not(.is--selected).is--current,.vxe-input--date-picker-body td.is--now:not(.is--selected).is--current .vxe-input--date-festival,.vxe-input--date-picker-body td.is--now:not(.is--selected).is--current .vxe-input--date-label{color:#409eff}.vxe-input--date-picker-body td.is--hover{background-color:#f2f6fc}.vxe-input--date-picker-body td.is--selected{color:#fff;background-color:#409eff}.vxe-input--date-picker-body td.is--selected.is--next,.vxe-input--date-picker-body td.is--selected.is--prev{background-color:#73b8ff}.vxe-input--date-picker-body td.is--selected .vxe-input--date-festival,.vxe-input--date-picker-body td.is--selected .vxe-input--date-label{color:#fff}.vxe-input--date-picker-body td.is--selected .vxe-input--date-label.is-notice:before{background-color:#fff}.vxe-input--date-picker-body td:not(.is--disabled){cursor:pointer}.vxe-input--date-picker-body td.is--disabled{cursor:no-drop;color:#dcdfe6;background-color:#f3f3f3}.vxe-input--date-picker-body td.is--disabled .vxe-input--date-festival,.vxe-input--date-picker-body td.is--disabled .vxe-input--date-label{color:#dcdfe6}.vxe-input--date-week-view th:first-child{-webkit-box-shadow:inset -0.0625rem -0.0625rem 0 0 #dadce0;box-shadow:inset -0.0625rem -0.0625rem 0 0 #dadce0}.vxe-input--date-week-view td:first-child{-webkit-box-shadow:inset -0.0625rem 0 0 0 #dadce0;box-shadow:inset -0.0625rem 0 0 0 #dadce0}.vxe-input--date-festival,.vxe-input--date-label{display:block;overflow:hidden}.vxe-input--date-label{position:relative}.vxe-input--date-label.is-notice:before{content:"";position:absolute;width: 0.25rem;height: 0.25rem;left:.8em;top:.1em;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:100%;background-color:red}.vxe-input--date-label--extra{position:absolute;right:.1em;top:-.2em;font-size: 0.75rem;line-height: 0.75rem;-webkit-transform:scale(.7);transform:scale(.7);color:#67c23a}.vxe-input--date-label--extra.is-important{color:#fd2222}.vxe-input--date-festival{color:#999;height: 0.875rem;line-height:1;overflow:hidden}.vxe-input--date-festival.is-important{color:#409eff}.vxe-input--date-festival--label{display:block;font-size: 0.75rem;-webkit-transform:scale(.8);transform:scale(.8)}@-webkit-keyframes festivalOverlap2{0%,45%,to{-webkit-transform:translateY(0);transform:translateY(0)}50%,95%{-webkit-transform:translateY( -0.875rem);transform:translateY( -0.875rem)}}@keyframes festivalOverlap2{0%,45%,to{-webkit-transform:translateY(0);transform:translateY(0)}50%,95%{-webkit-transform:translateY( -0.875rem);transform:translateY( -0.875rem)}}@-webkit-keyframes festivalOverlap3{0%,20%,to{-webkit-transform:translateY(0);transform:translateY(0)}25%,45%,75%,95%{-webkit-transform:translateY( -0.875rem);transform:translateY( -0.875rem)}50%,70%{-webkit-transform:translateY( -1.75rem);transform:translateY( -1.75rem)}}@keyframes festivalOverlap3{0%,20%,to{-webkit-transform:translateY(0);transform:translateY(0)}25%,45%,75%,95%{-webkit-transform:translateY( -0.875rem);transform:translateY( -0.875rem)}50%,70%{-webkit-transform:translateY( -1.75rem);transform:translateY( -1.75rem)}}.vxe-input--date-festival--overlap{display:block;font-size: 0.75rem}.vxe-input--date-festival--overlap.overlap--2{-webkit-animation:festivalOverlap2 6s ease-in-out infinite;animation:festivalOverlap2 6s ease-in-out infinite}.vxe-input--date-festival--overlap.overlap--3{-webkit-animation:festivalOverlap3 9s ease-in-out infinite;animation:festivalOverlap3 9s ease-in-out infinite}.vxe-input--date-festival--overlap>span{height: 0.875rem;display:block;-webkit-transform:scale(.8);transform:scale(.8)}.vxe-input--time-picker-body{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;border: 0.0625rem solid #dadce0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;border-radius: 0.25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-input--time-picker-body>ul{height:100%;overflow:hidden;margin:0;padding:0}.vxe-input--time-picker-body>ul:after,.vxe-input--time-picker-body>ul:before{content:" ";display:block}.vxe-input--time-picker-body>ul:hover{overflow-y:auto}.vxe-input--time-picker-body>ul>li{display:block}.vxe-input--time-picker-body>ul>li:hover{background-color:#f2f6fc;cursor:pointer}.vxe-input--time-picker-body>ul>li.is--selected{font-weight:700;color:#409eff}.vxe-input--time-picker-body .vxe-input--time-picker-minute-list,.vxe-input--time-picker-body .vxe-input--time-picker-second-list{border-left: 0.0625rem solid #dadce0}.vxe-input{font-size: 0.875rem;height: 2.125rem;line-height: 2.125rem}.vxe-input .vxe-input--inner[type=date]::-webkit-inner-spin-button,.vxe-input .vxe-input--inner[type=month]::-webkit-inner-spin-button,.vxe-input .vxe-input--inner[type=week]::-webkit-inner-spin-button{margin-top: 0.375rem}.vxe-input .vxe-input--inner[type=date]::-webkit-inner-spin-button,.vxe-input .vxe-input--inner[type=month]::-webkit-inner-spin-button,.vxe-input .vxe-input--inner[type=number]::-webkit-inner-spin-button,.vxe-input .vxe-input--inner[type=week]::-webkit-inner-spin-button{height: 1.5rem}.vxe-input.size--medium{font-size: 0.875rem;height: 2rem;line-height: 2rem}.vxe-input.size--medium .vxe-input--inner[type=date]::-webkit-inner-spin-button,.vxe-input.size--medium .vxe-input--inner[type=month]::-webkit-inner-spin-button,.vxe-input.size--medium .vxe-input--inner[type=week]::-webkit-inner-spin-button{margin-top: 0.25rem}.vxe-input.size--small{font-size: 0.8125rem;height: 1.875rem;line-height: 1.875rem}.vxe-input.size--small .vxe-input--inner[type=date]::-webkit-inner-spin-button,.vxe-input.size--small .vxe-input--inner[type=month]::-webkit-inner-spin-button,.vxe-input.size--small .vxe-input--inner[type=week]::-webkit-inner-spin-button{margin-top: 0.125rem}.vxe-input.size--mini{font-size: 0.75rem;height: 1.75rem;line-height: 1.75rem}.vxe-input.size--mini .vxe-input--inner[type=date]::-webkit-inner-spin-button,.vxe-input.size--mini .vxe-input--inner[type=month]::-webkit-inner-spin-button,.vxe-input.size--mini .vxe-input--inner[type=week]::-webkit-inner-spin-button{margin-top:0}.vxe-input--panel{font-size: 0.875rem}.vxe-input--panel .vxe-input--panel-wrapper{max-height: 23.75rem}.vxe-input--panel.type--date .vxe-input--panel-wrapper,.vxe-input--panel.type--month .vxe-input--panel-wrapper,.vxe-input--panel.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.type--time .vxe-input--panel-wrapper,.vxe-input--panel.type--week .vxe-input--panel-wrapper,.vxe-input--panel.type--year .vxe-input--panel-wrapper{padding: 0.6875rem}.vxe-input--panel.type--date .vxe-input--panel-wrapper,.vxe-input--panel.type--month .vxe-input--panel-wrapper,.vxe-input--panel.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.type--year .vxe-input--panel-wrapper{width: 21rem}.vxe-input--panel.type--week .vxe-input--panel-wrapper{width: 23.75rem}.vxe-input--panel.type--time .vxe-input--panel-wrapper{width: 10.625rem}.vxe-input--panel.type--datetime .vxe-input--panel-left-wrapper{width: 21rem}.vxe-input--panel.type--datetime .vxe-input--panel-left-wrapper,.vxe-input--panel.type--datetime .vxe-input--panel-right-wrapper{padding: 0.6875rem}.vxe-input--panel .vxe-input--time-picker-title{height: 1.875rem;line-height: 1.875rem;padding:0 0.6875rem}.vxe-input--panel .vxe-input--date-picker-btn,.vxe-input--panel .vxe-input--date-picker-label{height: 1.875rem;line-height: 1.875rem}.vxe-input--panel .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-btn{margin-left: 0.5rem}.vxe-input--panel .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-current-btn,.vxe-input--panel .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-next-btn,.vxe-input--panel .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-prev-btn{width: 1.875rem;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6}.vxe-input--panel .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-btn,.vxe-input--panel .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-label{padding:0 0.5625rem}.vxe-input--panel .vxe-input--date-picker-header,.vxe-input--panel .vxe-input--time-picker-header{padding-bottom: 0.5rem}.vxe-input--panel .vxe-input--date-picker-body table,.vxe-input--panel .vxe-input--time-picker-body{height: 16.125rem}.vxe-input--panel .vxe-input--time-picker-body>ul{width: 3rem}.vxe-input--panel .vxe-input--time-picker-body>ul:after,.vxe-input--panel .vxe-input--time-picker-body>ul:before{height: 7.5rem}.vxe-input--panel .vxe-input--time-picker-body>ul>li{height: 1.625rem;padding-left: 0.5625rem}.vxe-input--panel .vxe-input--time-picker-body .vxe-input--time-picker-minute-list{left: 3rem}.vxe-input--panel .vxe-input--time-picker-body .vxe-input--time-picker-second-list{left: 6rem}.vxe-input--panel .vxe-input--date-day-view td,.vxe-input--panel .vxe-input--date-week-view td{height: 2.375rem}.vxe-input--panel .vxe-input--date-quarter-view td{height: 3.75rem}.vxe-input--panel .vxe-input--date-month-view td,.vxe-input--panel .vxe-input--date-year-view td{height: 3rem}.vxe-input--panel .vxe-input--date-picker-body th{height: 1.875rem}.vxe-input--panel .vxe-input--date-picker-confirm,.vxe-input--panel .vxe-input--time-picker-confirm{height: 1.875rem;padding:0 0.5625rem}.vxe-input--panel .vxe-input--date-label{line-height: 0.9375rem}.vxe-input--panel.size--medium{font-size: 0.875rem}.vxe-input--panel.size--medium .vxe-input--panel-wrapper{max-height: 22.5rem}.vxe-input--panel.size--medium.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--time .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--week .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--year .vxe-input--panel-wrapper{padding: 0.625rem}.vxe-input--panel.size--medium.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--year .vxe-input--panel-wrapper{width: 21rem}.vxe-input--panel.size--medium.type--week .vxe-input--panel-wrapper{width: 23.75rem}.vxe-input--panel.size--medium.type--time .vxe-input--panel-wrapper{width: 10.5rem}.vxe-input--panel.size--medium.type--datetime .vxe-input--panel-left-wrapper{width: 21rem}.vxe-input--panel.size--medium.type--datetime .vxe-input--panel-left-wrapper,.vxe-input--panel.size--medium.type--datetime .vxe-input--panel-right-wrapper{padding: 0.625rem}.vxe-input--panel.size--medium .vxe-input--time-picker-title{height: 1.8125rem;line-height: 1.8125rem;padding:0 0.625rem}.vxe-input--panel.size--medium .vxe-input--date-picker-btn,.vxe-input--panel.size--medium .vxe-input--date-picker-label{height: 1.8125rem;line-height: 1.8125rem}.vxe-input--panel.size--medium .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-btn{margin-left: 0.4375rem}.vxe-input--panel.size--medium .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-current-btn,.vxe-input--panel.size--medium .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-next-btn,.vxe-input--panel.size--medium .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-prev-btn{width: 1.8125rem;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6}.vxe-input--panel.size--medium .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-btn,.vxe-input--panel.size--medium .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-label{padding:0 0.5rem}.vxe-input--panel.size--medium .vxe-input--date-picker-header,.vxe-input--panel.size--medium .vxe-input--time-picker-header{padding-bottom: 0.4375rem}.vxe-input--panel.size--medium .vxe-input--date-picker-body table,.vxe-input--panel.size--medium .vxe-input--time-picker-body{height: 15.3125rem}.vxe-input--panel.size--medium .vxe-input--time-picker-body>ul{width: 3rem}.vxe-input--panel.size--medium .vxe-input--time-picker-body>ul:after,.vxe-input--panel.size--medium .vxe-input--time-picker-body>ul:before{height: 7.5rem}.vxe-input--panel.size--medium .vxe-input--time-picker-body>ul>li{height: 1.625rem;padding-left: 0.5rem}.vxe-input--panel.size--medium .vxe-input--time-picker-body .vxe-input--time-picker-minute-list{left: 3rem}.vxe-input--panel.size--medium .vxe-input--time-picker-body .vxe-input--time-picker-second-list{left: 6rem}.vxe-input--panel.size--medium .vxe-input--date-day-view td,.vxe-input--panel.size--medium .vxe-input--date-week-view td{height: 2.25rem}.vxe-input--panel.size--medium .vxe-input--date-quarter-view td{height: 3.625rem}.vxe-input--panel.size--medium .vxe-input--date-month-view td,.vxe-input--panel.size--medium .vxe-input--date-year-view td{height: 2.875rem}.vxe-input--panel.size--medium .vxe-input--date-picker-body th{height: 1.8125rem}.vxe-input--panel.size--medium .vxe-input--date-picker-confirm,.vxe-input--panel.size--medium .vxe-input--time-picker-confirm{height: 1.8125rem;padding:0 0.5rem}.vxe-input--panel.size--medium .vxe-input--date-label{line-height: 0.9375rem}.vxe-input--panel.size--small{font-size: 0.8125rem}.vxe-input--panel.size--small .vxe-input--panel-wrapper{max-height: 21.25rem}.vxe-input--panel.size--small.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--time .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--week .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--year .vxe-input--panel-wrapper{padding: 0.5625rem}.vxe-input--panel.size--small.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--year .vxe-input--panel-wrapper{width: 19.5rem}.vxe-input--panel.size--small.type--week .vxe-input--panel-wrapper{width: 22.125rem}.vxe-input--panel.size--small.type--time .vxe-input--panel-wrapper{width: 9.625rem}.vxe-input--panel.size--small.type--datetime .vxe-input--panel-left-wrapper{width: 19.5rem}.vxe-input--panel.size--small.type--datetime .vxe-input--panel-left-wrapper,.vxe-input--panel.size--small.type--datetime .vxe-input--panel-right-wrapper{padding: 0.5625rem}.vxe-input--panel.size--small .vxe-input--time-picker-title{height: 1.75rem;line-height: 1.75rem;padding:0 0.5625rem}.vxe-input--panel.size--small .vxe-input--date-picker-btn,.vxe-input--panel.size--small .vxe-input--date-picker-label{height: 1.75rem;line-height: 1.75rem}.vxe-input--panel.size--small .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-btn{margin-left: 0.375rem}.vxe-input--panel.size--small .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-current-btn,.vxe-input--panel.size--small .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-next-btn,.vxe-input--panel.size--small .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-prev-btn{width: 1.75rem;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6}.vxe-input--panel.size--small .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-btn,.vxe-input--panel.size--small .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-label{padding:0 0.4375rem}.vxe-input--panel.size--small .vxe-input--date-picker-header,.vxe-input--panel.size--small .vxe-input--time-picker-header{padding-bottom: 0.375rem}.vxe-input--panel.size--small .vxe-input--date-picker-body table,.vxe-input--panel.size--small .vxe-input--time-picker-body{height: 14.5rem}.vxe-input--panel.size--small .vxe-input--time-picker-body>ul{width: 2.75rem}.vxe-input--panel.size--small .vxe-input--time-picker-body>ul:after,.vxe-input--panel.size--small .vxe-input--time-picker-body>ul:before{height: 6.875rem}.vxe-input--panel.size--small .vxe-input--time-picker-body>ul>li{height: 1.625rem;padding-left: 0.4375rem}.vxe-input--panel.size--small .vxe-input--time-picker-body .vxe-input--time-picker-minute-list{left: 2.75rem}.vxe-input--panel.size--small .vxe-input--time-picker-body .vxe-input--time-picker-second-list{left: 5.5rem}.vxe-input--panel.size--small .vxe-input--date-day-view td,.vxe-input--panel.size--small .vxe-input--date-week-view td{height: 2.125rem}.vxe-input--panel.size--small .vxe-input--date-quarter-view td{height: 3.5rem}.vxe-input--panel.size--small .vxe-input--date-month-view td,.vxe-input--panel.size--small .vxe-input--date-year-view td{height: 2.75rem}.vxe-input--panel.size--small .vxe-input--date-picker-body th{height: 1.75rem}.vxe-input--panel.size--small .vxe-input--date-picker-confirm,.vxe-input--panel.size--small .vxe-input--time-picker-confirm{height: 1.75rem;padding:0 0.4375rem}.vxe-input--panel.size--small .vxe-input--date-label{line-height: 0.875rem}.vxe-input--panel.size--mini{font-size: 0.75rem}.vxe-input--panel.size--mini .vxe-input--panel-wrapper{max-height: 20rem}.vxe-input--panel.size--mini.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--time .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--week .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--year .vxe-input--panel-wrapper{padding: 0.5rem}.vxe-input--panel.size--mini.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--year .vxe-input--panel-wrapper{width: 18rem}.vxe-input--panel.size--mini.type--week .vxe-input--panel-wrapper{width: 20.375rem}.vxe-input--panel.size--mini.type--time .vxe-input--panel-wrapper{width: 9.125rem}.vxe-input--panel.size--mini.type--datetime .vxe-input--panel-left-wrapper{width: 18rem}.vxe-input--panel.size--mini.type--datetime .vxe-input--panel-left-wrapper,.vxe-input--panel.size--mini.type--datetime .vxe-input--panel-right-wrapper{padding: 0.5rem}.vxe-input--panel.size--mini .vxe-input--time-picker-title{height: 1.6875rem;line-height: 1.6875rem;padding:0 0.5rem}.vxe-input--panel.size--mini .vxe-input--date-picker-btn,.vxe-input--panel.size--mini .vxe-input--date-picker-label{height: 1.6875rem;line-height: 1.6875rem}.vxe-input--panel.size--mini .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-btn{margin-left: 0.3125rem}.vxe-input--panel.size--mini .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-current-btn,.vxe-input--panel.size--mini .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-next-btn,.vxe-input--panel.size--mini .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-prev-btn{width: 1.6875rem;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6}.vxe-input--panel.size--mini .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-btn,.vxe-input--panel.size--mini .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-label{padding:0 0.375rem}.vxe-input--panel.size--mini .vxe-input--date-picker-header,.vxe-input--panel.size--mini .vxe-input--time-picker-header{padding-bottom: 0.3125rem}.vxe-input--panel.size--mini .vxe-input--date-picker-body table,.vxe-input--panel.size--mini .vxe-input--time-picker-body{height: 13.625rem}.vxe-input--panel.size--mini .vxe-input--time-picker-body>ul{width: 2.625rem}.vxe-input--panel.size--mini .vxe-input--time-picker-body>ul:after,.vxe-input--panel.size--mini .vxe-input--time-picker-body>ul:before{height: 6.25rem}.vxe-input--panel.size--mini .vxe-input--time-picker-body>ul>li{height: 1.625rem;padding-left: 0.375rem}.vxe-input--panel.size--mini .vxe-input--time-picker-body .vxe-input--time-picker-minute-list{left: 2.625rem}.vxe-input--panel.size--mini .vxe-input--time-picker-body .vxe-input--time-picker-second-list{left: 5.25rem}.vxe-input--panel.size--mini .vxe-input--date-day-view td,.vxe-input--panel.size--mini .vxe-input--date-week-view td{height: 2rem}.vxe-input--panel.size--mini .vxe-input--date-quarter-view td{height: 3.375rem}.vxe-input--panel.size--mini .vxe-input--date-month-view td,.vxe-input--panel.size--mini .vxe-input--date-year-view td{height: 2.625rem}.vxe-input--panel.size--mini .vxe-input--date-picker-body th{height: 1.625rem}.vxe-input--panel.size--mini .vxe-input--date-picker-confirm,.vxe-input--panel.size--mini .vxe-input--time-picker-confirm{height: 1.6875rem;padding:0 0.375rem}.vxe-input--panel.size--mini .vxe-input--date-label{line-height: 0.8125rem}.vxe-textarea{position:relative;display:inline-block}.vxe-textarea:not(.def--cols),.vxe-textarea:not(.def--cols) .vxe-textarea--inner{width:100%}.vxe-textarea--inner{border-radius: 0.25rem;outline:0;font-size:inherit;padding:0 .6em;color:#606266;line-height:inherit;border: 0.0625rem solid #dcdfe6;background-color:#fff;display:block;padding:.3em .6em}.vxe-textarea--inner::-webkit-input-placeholder{color:#c0c4cc}.vxe-textarea--inner::-moz-placeholder{color:#c0c4cc}.vxe-textarea--inner:-ms-input-placeholder{color:#c0c4cc}.vxe-textarea--inner::-ms-input-placeholder{color:#c0c4cc}.vxe-textarea--inner::placeholder{color:#c0c4cc}.vxe-textarea--inner:focus{border: 0.0625rem solid #409eff}.vxe-textarea--inner[disabled]{cursor:not-allowed;background-color:#f3f3f3}.vxe-textarea--autosize,.vxe-textarea--inner{line-height:1.5715;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.vxe-textarea--autosize{display:block;position:fixed;top:0;left:0;width:100%;margin:0;padding:.3em .6em;word-wrap:break-word;white-space:pre-wrap;z-index:-1;visibility:hidden}.vxe-textarea--count{position:absolute;bottom:.2em;right:1.4em;padding-left:.2em;color:#999;background-color:#fff}.vxe-textarea--count.is--error{color:#f56c6c}.vxe-textarea,.vxe-textarea--autosize,.vxe-textarea--autosize.size--medium,.vxe-textarea.size--medium{font-size: 0.875rem}.vxe-textarea--autosize.size--small,.vxe-textarea.size--small{font-size: 0.8125rem}.vxe-textarea--autosize.size--mini,.vxe-textarea.size--mini{font-size: 0.75rem}.vxe-textarea:not(.is--autosize){min-height: 2.125rem}.vxe-textarea.size--medium{font-size: 0.875rem}.vxe-textarea.size--medium:not(.is--autosize){min-height: 2rem}.vxe-textarea.size--small:not(.is--autosize){min-height: 1.875rem}.vxe-textarea.size--mini:not(.is--autosize){min-height: 1.75rem}.vxe-button{position:relative;text-align:center;background-color:#fff;outline:0;font-size: 0.875rem;max-width: 31.25rem;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.vxe-button:not(.is--disabled){color:#606266;cursor:pointer}.vxe-button.is--loading{cursor:progress}.vxe-button.is--loading:before{content:"";position:absolute;left: -0.0625rem;top: -0.0625rem;right: -0.0625rem;bottom: -0.0625rem;border-radius:inherit;background-color:hsla(0,0%,100%,.35);pointer-events:none}.vxe-button.is--disabled{color:#bfbfbf}.vxe-button.is--disabled:not(.is--loading){cursor:no-drop}.vxe-button.type--text{text-decoration:none;border:0;padding:.1em .5em;background-color:transparent}.vxe-button.type--text:not(.is--disabled):focus{color:#2f3031}.vxe-button.type--text:not(.is--disabled):hover{color:#73b8ff}.vxe-button.type--text.theme--primary{color:#409eff}.vxe-button.type--text.theme--primary:not(.is--disabled):focus{color:#0d84ff}.vxe-button.type--text.theme--primary:not(.is--disabled):hover{color:#73b8ff}.vxe-button.type--text.theme--primary.is--disabled{color:#a6d2ff}.vxe-button.type--text.theme--success{color:#67c23a}.vxe-button.type--text.theme--success:not(.is--disabled):focus{color:#529b2e}.vxe-button.type--text.theme--success:not(.is--disabled):hover{color:#85cf60}.vxe-button.type--text.theme--success.is--disabled{color:#a3db87}.vxe-button.type--text.theme--info{color:#909399}.vxe-button.type--text.theme--info:not(.is--disabled):focus{color:#767980}.vxe-button.type--text.theme--info:not(.is--disabled):hover{color:#abadb1}.vxe-button.type--text.theme--info.is--disabled{color:#c5c7ca}.vxe-button.type--text.theme--warning{color:#e6a23c}.vxe-button.type--text.theme--warning:not(.is--disabled):focus{color:#d48a1b}.vxe-button.type--text.theme--warning:not(.is--disabled):hover{color:#ecb869}.vxe-button.type--text.theme--warning.is--disabled{color:#f2cd96}.vxe-button.type--text.theme--danger{color:#f56c6c}.vxe-button.type--text.theme--danger:not(.is--disabled):focus{color:#f23c3c}.vxe-button.type--text.theme--danger:not(.is--disabled):hover{color:#f89c9c}.vxe-button.type--text.theme--danger.is--disabled{color:#fbcccc}.vxe-button.type--text.theme--perfect{color:#f8f8f9}.vxe-button.type--text.theme--perfect:not(.is--disabled):focus{color:#dddde1}.vxe-button.type--text.theme--perfect.is--disabled,.vxe-button.type--text.theme--perfect:not(.is--disabled):hover{color:#fff}.vxe-button.type--button{font-family:inherit;height: 2.125rem;line-height:1;border: 0.0625rem solid #dcdfe6}.vxe-button.type--button.is--round{border-radius: 1.0625rem}.vxe-button.type--button:not(.is--round){border-radius: 0.25rem}.vxe-button.type--button.is--circle{padding:0 .5em;min-width: 2.125rem;border-radius:50%}.vxe-button.type--button:not(.is--circle){padding:0 1em}.vxe-button.type--button:not(.is--disabled):hover{color:#5faeff}.vxe-button.type--button:not(.is--disabled):focus{border-color:#409eff}.vxe-button.type--button:not(.is--disabled):active{color:#3196ff;border-color:#3196ff;background-color:#f7f7f7}.vxe-button.type--button.theme--primary{color:#fff}.vxe-button.type--button.theme--primary:not(.is--disabled){border-color:#409eff;background-color:#409eff}.vxe-button.type--button.theme--primary:not(.is--disabled):hover{color:#fff;background-color:#5faeff;border-color:#5faeff}.vxe-button.type--button.theme--primary:not(.is--disabled):active{color:#fff;background-color:#3196ff;border-color:#3196ff}.vxe-button.type--button.theme--primary.is--disabled{border-color:#a6d2ff;background-color:#a6d2ff}.vxe-button.type--button.theme--primary.is--loading{border-color:#409eff;background-color:#409eff}.vxe-button.type--button.theme--success{color:#fff}.vxe-button.type--button.theme--success:not(.is--disabled){border-color:#67c23a;background-color:#67c23a}.vxe-button.type--button.theme--success:not(.is--disabled):hover{color:#fff;background-color:#79cb50;border-color:#79cb50}.vxe-button.type--button.theme--success:not(.is--disabled):active{color:#fff;background-color:#61b636;border-color:#61b636}.vxe-button.type--button.theme--success.is--disabled{border-color:#a3db87;background-color:#a3db87}.vxe-button.type--button.theme--success.is--loading{border-color:#67c23a;background-color:#67c23a}.vxe-button.type--button.theme--info{color:#fff}.vxe-button.type--button.theme--info:not(.is--disabled){border-color:#909399;background-color:#909399}.vxe-button.type--button.theme--info:not(.is--disabled):hover{color:#fff;background-color:#a0a3a8;border-color:#a0a3a8}.vxe-button.type--button.theme--info:not(.is--disabled):active{color:#fff;background-color:#888b92;border-color:#888b92}.vxe-button.type--button.theme--info.is--disabled{border-color:#c5c7ca;background-color:#c5c7ca}.vxe-button.type--button.theme--info.is--loading{border-color:#909399;background-color:#909399}.vxe-button.type--button.theme--warning{color:#fff}.vxe-button.type--button.theme--warning:not(.is--disabled){border-color:#e6a23c;background-color:#e6a23c}.vxe-button.type--button.theme--warning:not(.is--disabled):hover{color:#fff;background-color:#e9af57;border-color:#e9af57}.vxe-button.type--button.theme--warning:not(.is--disabled):active{color:#fff;background-color:#e49c2e;border-color:#e49c2e}.vxe-button.type--button.theme--warning.is--disabled{border-color:#f2cd96;background-color:#f2cd96}.vxe-button.type--button.theme--warning.is--loading{border-color:#e6a23c;background-color:#e6a23c}.vxe-button.type--button.theme--danger{color:#fff}.vxe-button.type--button.theme--danger:not(.is--disabled){border-color:#f56c6c;background-color:#f56c6c}.vxe-button.type--button.theme--danger:not(.is--disabled):hover{color:#fff;background-color:#f78989;border-color:#f78989}.vxe-button.type--button.theme--danger:not(.is--disabled):active{color:#fff;background-color:#f45e5e;border-color:#f45e5e}.vxe-button.type--button.theme--danger.is--disabled{border-color:#fbcccc;background-color:#fbcccc}.vxe-button.type--button.theme--danger.is--loading{border-color:#f56c6c;background-color:#f56c6c}.vxe-button.type--button.theme--perfect{color:#606266}.vxe-button.type--button.theme--perfect:not(.is--disabled){border-color:#f8f8f9;background-color:#f8f8f9}.vxe-button.type--button.theme--perfect:not(.is--disabled):hover{color:#606266;background-color:#fff;border-color:#fff}.vxe-button.type--button.theme--perfect:not(.is--disabled):active{color:#606266;background-color:#f0f0f2;border-color:#f0f0f2}.vxe-button.type--button.theme--perfect.is--disabled{border-color:#fff;background-color:#fff}.vxe-button.type--button.theme--perfect.is--loading{border-color:#f8f8f9;background-color:#f8f8f9}.vxe-button.size--medium{font-size: 0.875rem}.vxe-button.size--medium.type--button{height: 2rem}.vxe-button.size--medium.type--button.is--circle{min-width: 2rem}.vxe-button.size--medium.type--button.is--round{border-radius: 1rem}.vxe-button.size--medium .vxe-button--icon,.vxe-button.size--medium .vxe-button--loading-icon{min-width: 0.875rem}.vxe-button.size--small{font-size: 0.8125rem}.vxe-button.size--small.type--button{height: 1.875rem}.vxe-button.size--small.type--button.is--circle{min-width: 1.875rem}.vxe-button.size--small.type--button.is--round{border-radius: 0.9375rem}.vxe-button.size--small .vxe-button--icon,.vxe-button.size--small .vxe-button--loading-icon{min-width: 0.8125rem}.vxe-button.size--mini{font-size: 0.75rem}.vxe-button.size--mini.type--button{height: 1.75rem}.vxe-button.size--mini.type--button.is--circle{min-width: 1.75rem}.vxe-button.size--mini.type--button.is--round{border-radius: 0.875rem}.vxe-button.size--mini .vxe-button--icon,.vxe-button.size--mini .vxe-button--loading-icon{min-width: 0.75rem}.vxe-button+.vxe-button,.vxe-button+.vxe-button--dropdown,.vxe-input+.vxe-button,.vxe-input+.vxe-button--dropdown{margin-left: 0.75rem}.vxe-button--icon,.vxe-button--loading-icon{min-width: 0.875rem}.vxe-button--icon+.vxe-button--content,.vxe-button--loading-icon+.vxe-button--content{margin-left: 0.25rem}.vxe-button--dropdown,.vxe-button--wrapper{display:inline-block}.vxe-button--dropdown{position:relative}.vxe-button--dropdown+.vxe-button,.vxe-button--dropdown+.vxe-button--dropdown{margin-left: 0.75rem}.vxe-button--dropdown>.vxe-button.type--button.theme--danger,.vxe-button--dropdown>.vxe-button.type--button.theme--info,.vxe-button--dropdown>.vxe-button.type--button.theme--primary,.vxe-button--dropdown>.vxe-button.type--button.theme--success,.vxe-button--dropdown>.vxe-button.type--button.theme--warning{color:#fff}.vxe-button--dropdown>.vxe-button.type--button.theme--perfect{color:#606266}.vxe-button--dropdown.is--active>.vxe-button:not(.is--disabled){color:#5faeff}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--primary{color:#73b8ff}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--success{color:#85cf60}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--info{color:#abadb1}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--warning{color:#ecb869}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--danger{color:#f89c9c}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--perfect{color:#fff}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--primary{color:#fff;background-color:#5faeff;border-color:#5faeff}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--success{color:#fff;background-color:#79cb50;border-color:#79cb50}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--info{color:#fff;background-color:#a0a3a8;border-color:#a0a3a8}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--warning{color:#fff;background-color:#e9af57;border-color:#e9af57}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--danger{color:#fff;background-color:#f78989;border-color:#f78989}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--perfect{color:#606266;background-color:#fff;border-color:#fff}.vxe-button--dropdown.is--active .vxe-button--dropdown-arrow{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.vxe-button--dropdown-arrow{display:inline-block;font-size: 0.75rem;margin-left: 0.25rem;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.vxe-button--dropdown-panel{display:none;position:absolute;right:0;padding: 0.25rem 0}.vxe-button--dropdown-panel.animat--leave{display:block;opacity:0;-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.vxe-button--dropdown-panel.animat--leave[placement=top]{-webkit-transform-origin:center bottom;transform-origin:center bottom}.vxe-button--dropdown-panel.animat--enter{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}.vxe-button--dropdown-wrapper{padding: 0.3125rem;background-color:#fff;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6;-webkit-box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2);box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2)}.vxe-button--dropdown-wrapper>.vxe-button{margin-left:0;margin-top:.4em;display:block;width:100%;border:0}.vxe-button--dropdown-wrapper>.vxe-button.type--text{padding: 0.125rem 0.5rem}.vxe-button--dropdown-wrapper>.vxe-button:first-child{margin-top:0}.vxe-button--dropdown-wrapper>.vxe-button:last-child{margin-bottom:0}.vxe-modal--wrapper{display:none;position:fixed;top:0;left:0;line-height:1.5;width:calc(100% + 1.125rem);height:calc(100% + 1.125rem);color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;-webkit-transition:top .4s ease-in-out;transition:top .4s ease-in-out}.vxe-modal--wrapper.is--active{display:block}.vxe-modal--wrapper.is--visible.is--mask:before{background-color:rgba(0,0,0,.5)}.vxe-modal--wrapper.is--visible.type--message .vxe-modal--box{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}.vxe-modal--wrapper.is--visible .vxe-modal--box{opacity:1;visibility:visible}.vxe-modal--wrapper.is--loading .vxe-modal--footer,.vxe-modal--wrapper.is--loading .vxe-modal--header{position:relative;border-bottom-color:hsla(0,0%,100%,.5)}.vxe-modal--wrapper.is--loading .vxe-modal--footer:before,.vxe-modal--wrapper.is--loading .vxe-modal--header:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:hsla(0,0%,100%,.5)}.vxe-modal--wrapper:not(.lock--view){pointer-events:none}.vxe-modal--wrapper:not(.type--message).lock--scroll{overflow:hidden}.vxe-modal--wrapper:not(.type--message):not(.lock--scroll){overflow:auto}.vxe-modal--wrapper.is--mask:before,.vxe-modal--wrapper.lock--view:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:-1;pointer-events:auto}.vxe-modal--wrapper.is--mask:before{background-color:transparent}.vxe-modal--wrapper.is--animat.is--mask:before{-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.vxe-modal--wrapper.is--animat.type--message .vxe-modal--box:not(.is--drag){-webkit-transition:all .4s ease-out;transition:all .4s ease-out}.vxe-modal--wrapper.type--alert .vxe-modal--body,.vxe-modal--wrapper.type--confirm .vxe-modal--body,.vxe-modal--wrapper.type--message .vxe-modal--body{white-space:normal;word-break:break-word}.vxe-modal--wrapper.type--message{text-align:center}.vxe-modal--wrapper.type--message .vxe-modal--box{display:inline-block;padding: 0.125rem 0;margin-top:0;width:auto;-webkit-box-shadow:0 0 0.5rem 0 rgba(0,0,0,.1);box-shadow:0 0 0.5rem 0 rgba(0,0,0,.1);opacity:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.vxe-modal--wrapper.type--message .vxe-modal--box .vxe-modal--body:after{content:"";display:block;clear:both;height:0;overflow:hidden;visibility:hidden}.vxe-modal--wrapper.type--message .vxe-modal--box .vxe-modal--content{max-width: 50rem;float:left}.vxe-modal--wrapper.type--message .vxe-modal--status-wrapper{font-size:1.4em;padding-left: 0.625rem}.vxe-modal--wrapper.type--alert .vxe-modal--box,.vxe-modal--wrapper.type--confirm .vxe-modal--box,.vxe-modal--wrapper.type--modal .vxe-modal--box{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:fixed;left:50%;top:0;-webkit-box-shadow:0 0 0.625rem 0 rgba(0,0,0,.2);box-shadow:0 0 0.625rem 0 rgba(0,0,0,.2)}.vxe-modal--wrapper.type--alert .vxe-modal--body,.vxe-modal--wrapper.type--alert .vxe-modal--body .vxe-modal--content,.vxe-modal--wrapper.type--confirm .vxe-modal--body,.vxe-modal--wrapper.type--confirm .vxe-modal--body .vxe-modal--content,.vxe-modal--wrapper.type--modal .vxe-modal--body,.vxe-modal--wrapper.type--modal .vxe-modal--body .vxe-modal--content{overflow:auto}.vxe-modal--wrapper.type--alert .vxe-modal--status-wrapper,.vxe-modal--wrapper.type--confirm .vxe-modal--status-wrapper{font-size:1.6em;padding-left: 0.625rem}.vxe-modal--wrapper .vxe-modal--box{visibility:hidden;width: 26.25rem;background-color:#fff;border-radius: 0.25rem;border: 0.0625rem solid #ebeef5;text-align:left;pointer-events:auto;opacity:0}.vxe-modal--wrapper .vxe-modal--box.is--drag{cursor:move}.vxe-modal--wrapper .vxe-modal--box.is--drag .vxe-modal--body:after,.vxe-modal--wrapper .vxe-modal--box.is--drag .vxe-modal--footer:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%}.vxe-modal--wrapper .vxe-modal--box.is--drag .vxe-modal--body,.vxe-modal--wrapper .vxe-modal--box.is--drag .vxe-modal--body .vxe-modal--content{overflow:hidden}.vxe-modal--wrapper.status--info .vxe-modal--status-wrapper{color:#909399}.vxe-modal--wrapper.status--question .vxe-modal--status-wrapper,.vxe-modal--wrapper.status--warning .vxe-modal--status-wrapper{color:#e6a23c}.vxe-modal--wrapper.status--success .vxe-modal--status-wrapper{color:#67c23a}.vxe-modal--wrapper.status--error .vxe-modal--status-wrapper{color:#f56c6c}.vxe-modal--wrapper.status--loading .vxe-modal--status-wrapper{color:#bfbfbf}.vxe-modal--wrapper .vxe-modal--status-wrapper{-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-modal--wrapper .vxe-modal--content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:.8em 1em;white-space:pre-line}.vxe-modal--wrapper .vxe-modal--body,.vxe-modal--wrapper .vxe-modal--footer,.vxe-modal--wrapper .vxe-modal--header{position:relative}.vxe-modal--wrapper .vxe-modal--body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.vxe-modal--wrapper .vxe-modal--header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-negative:0;flex-shrink:0;font-size:1.1em;font-weight:700;border-bottom: 0.0625rem solid #ebeef5;background-color:#f8f8f8;border-radius: 0.25rem 0.25rem 0 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-modal--wrapper .vxe-modal--header.is--draggable .vxe-modal--header-title{cursor:move}.vxe-modal--wrapper .vxe-modal--header.is--ellipsis .vxe-modal--header-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-modal--wrapper .vxe-modal--header-title{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:.6em 0 .6em 1em}.vxe-modal--wrapper .vxe-modal--header-right{-ms-flex-negative:0;flex-shrink:0;padding:.6em 1em .6em 0}.vxe-modal--wrapper .vxe-modal--close-btn,.vxe-modal--wrapper .vxe-modal--zoom-btn{cursor:pointer;margin-left:.6em}.vxe-modal--wrapper .vxe-modal--close-btn:hover,.vxe-modal--wrapper .vxe-modal--zoom-btn:hover{color:#409eff}.vxe-modal--wrapper .vxe-modal--footer{-ms-flex-negative:0;flex-shrink:0;text-align:right;padding:.4em 1em .8em 1em}.vxe-modal--wrapper.is--maximize .vxe-modal--box .vxe-modal--header{cursor:default}.vxe-modal--wrapper.is--maximize .vxe-modal--resize .sb-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .selb-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .sest-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .st-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .swlb-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .swst-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .wl-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .wr-resize{display:none}.vxe-modal--wrapper .vxe-modal--resize .sb-resize,.vxe-modal--wrapper .vxe-modal--resize .selb-resize,.vxe-modal--wrapper .vxe-modal--resize .sest-resize,.vxe-modal--wrapper .vxe-modal--resize .st-resize,.vxe-modal--wrapper .vxe-modal--resize .swlb-resize,.vxe-modal--wrapper .vxe-modal--resize .swst-resize,.vxe-modal--wrapper .vxe-modal--resize .wl-resize,.vxe-modal--wrapper .vxe-modal--resize .wr-resize{position:absolute;z-index:100}.vxe-modal--wrapper .vxe-modal--resize .wl-resize,.vxe-modal--wrapper .vxe-modal--resize .wr-resize{width: 0.5rem;height:100%;top:0;cursor:w-resize}.vxe-modal--wrapper .vxe-modal--resize .wl-resize{left: -0.3125rem}.vxe-modal--wrapper .vxe-modal--resize .wr-resize{right: -0.3125rem}.vxe-modal--wrapper .vxe-modal--resize .selb-resize,.vxe-modal--wrapper .vxe-modal--resize .sest-resize,.vxe-modal--wrapper .vxe-modal--resize .swlb-resize,.vxe-modal--wrapper .vxe-modal--resize .swst-resize{width: 0.625rem;height: 0.625rem;z-index:101}.vxe-modal--wrapper .vxe-modal--resize .sest-resize,.vxe-modal--wrapper .vxe-modal--resize .swst-resize{top: -0.5rem}.vxe-modal--wrapper .vxe-modal--resize .selb-resize,.vxe-modal--wrapper .vxe-modal--resize .swlb-resize{bottom: -0.5rem}.vxe-modal--wrapper .vxe-modal--resize .sest-resize,.vxe-modal--wrapper .vxe-modal--resize .swlb-resize{cursor:sw-resize}.vxe-modal--wrapper .vxe-modal--resize .selb-resize,.vxe-modal--wrapper .vxe-modal--resize .swst-resize{cursor:se-resize}.vxe-modal--wrapper .vxe-modal--resize .swlb-resize,.vxe-modal--wrapper .vxe-modal--resize .swst-resize{left: -0.5rem}.vxe-modal--wrapper .vxe-modal--resize .selb-resize,.vxe-modal--wrapper .vxe-modal--resize .sest-resize{right: -0.5rem}.vxe-modal--wrapper .vxe-modal--resize .sb-resize,.vxe-modal--wrapper .vxe-modal--resize .st-resize{width:100%;height: 0.5rem;left:0;cursor:s-resize}.vxe-modal--wrapper .vxe-modal--resize .st-resize{top: -0.3125rem}.vxe-modal--wrapper .vxe-modal--resize .sb-resize{bottom: -0.3125rem}.vxe-modal--wrapper,.vxe-modal--wrapper.size--medium{font-size: 0.875rem}.vxe-modal--wrapper.size--small{font-size: 0.8125rem}.vxe-modal--wrapper.size--mini{font-size: 0.75rem}.vxe-table--tooltip-wrapper{display:none;position:absolute;top:-100%;left:-100%;font-size: 0.75rem;max-width: 37.5rem;border-radius: 0.25rem;padding: 0.5rem 0.75rem;white-space:normal;word-break:break-word;-webkit-box-shadow: 0.125rem 0.125rem 0.25rem -0.125rem rgba(0,0,0,.2);box-shadow: 0.125rem 0.125rem 0.25rem -0.125rem rgba(0,0,0,.2);color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.vxe-table--tooltip-wrapper:not(.is--enterable){pointer-events:none}.vxe-table--tooltip-wrapper.is--arrow .vxe-table--tooltip-arrow,.vxe-table--tooltip-wrapper.is--visible{display:block}.vxe-table--tooltip-wrapper.is--enterable:after{content:"";position:absolute;left:0;width:100%;height: 0.375rem;background-color:transparent}.vxe-table--tooltip-wrapper .vxe-table--tooltip-content{white-space:pre-line}.vxe-table--tooltip-wrapper .vxe-table--tooltip-arrow{display:none;position:absolute;border-color:transparent;border-width: 0.375rem;border-style:solid;left:50%;-webkit-transform:translateX( -0.375rem);transform:translateX( -0.375rem)}.vxe-table--tooltip-wrapper .vxe-table--tooltip-arrow:before{content:"";position:absolute;border-color:transparent;border-width: 0.3125rem;border-style:solid;left: -0.3125rem}.vxe-table--tooltip-wrapper.placement--top.is--enterable:after{bottom: -0.375rem}.vxe-table--tooltip-wrapper.placement--top .vxe-table--tooltip-arrow{bottom: -0.75rem}.vxe-table--tooltip-wrapper.placement--top .vxe-table--tooltip-arrow:before{top: -0.4375rem}.vxe-table--tooltip-wrapper.placement--bottom.is--enterable:after{top: -0.375rem}.vxe-table--tooltip-wrapper.placement--bottom .vxe-table--tooltip-arrow{top: -0.75rem}.vxe-table--tooltip-wrapper.placement--bottom .vxe-table--tooltip-arrow:before{top: -0.25rem}.vxe-table--tooltip-wrapper.theme--light{background-color:#fff;border: 0.0625rem solid #dcdfe6}.vxe-table--tooltip-wrapper.theme--light.placement--top .vxe-table--tooltip-arrow{border-top-color:#dcdfe6}.vxe-table--tooltip-wrapper.theme--light.placement--top .vxe-table--tooltip-arrow:before{border-top-color:#fff}.vxe-table--tooltip-wrapper.theme--light.placement--bottom .vxe-table--tooltip-arrow{border-bottom-color:#dcdfe6}.vxe-table--tooltip-wrapper.theme--light.placement--bottom .vxe-table--tooltip-arrow:before{border-bottom-color:#fff}.vxe-table--tooltip-wrapper.theme--dark{background:#303133;color:#fff}.vxe-table--tooltip-wrapper.theme--dark.placement--top .vxe-table--tooltip-arrow,.vxe-table--tooltip-wrapper.theme--dark.placement--top .vxe-table--tooltip-arrow:before{border-top-color:#303133}.vxe-table--tooltip-wrapper.theme--dark.placement--bottom .vxe-table--tooltip-arrow,.vxe-table--tooltip-wrapper.theme--dark.placement--bottom .vxe-table--tooltip-arrow:before{border-bottom-color:#303133}.vxe-table--tooltip-wrapper.vxe-table--valid-error{background-color:#f56c6c;color:#fff}.vxe-form--item .vxe-default-input[type=reset]:hover,.vxe-form--item .vxe-default-input[type=submit]:hover{color:#5faeff;border-color:#73b8ff}.vxe-form{position:relative;font-size: 0.875rem;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;background-color:#fff;text-align:left}.vxe-form-slots{display:none}.vxe-form--item-content,.vxe-form--item-trigger-node{display:inline-block;vertical-align:middle}.vxe-form--item-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;max-width: 20rem;padding-right:.8em}.vxe-form--item-title.is--ellipsis .vxe-form--item-title-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-form--item-title .vxe-form--item-title-postfix,.vxe-form--item-title .vxe-form--item-title-prefix,.vxe-form--item-title .vxe-form--item-title-suffix{-ms-flex-negative:0;flex-shrink:0}.vxe-form--item-title .vxe-form--item-title-prefix,.vxe-form--item-title .vxe-form--item-title-suffix{cursor:help;vertical-align:middle}.vxe-form--item-title .vxe-form--item-title-prefix{margin-right:.25em}.vxe-form--item-title .vxe-form--item-title-suffix{margin-left:.2em}.vxe-form--item-title .vxe-form--item-title-postfix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-form--item-title .vxe-form--item-title-content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.vxe-form--item-title .vxe-form--item-title-label{vertical-align:middle}.vxe-form--item-trigger-node{font-size: 0.75rem;min-width: 6.25rem;color:#909399;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.vxe-form--item-trigger-node .vxe-form--item-trigger-icon{display:inline-block;margin:0 .25em;-webkit-transition:all .1s;transition:all .1s}.vxe-form--item-valid{position:absolute;width:100%;font-size: 0.75rem;line-height:1.2em;color:#f56c6c;background-color:inherit;z-index:1;opacity:0;-webkit-transform-origin:center top;transform-origin:center top;-webkit-transform:scaleY(0);transform:scaleY(0);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.vxe-form .vxe-form--gather{display:inline-block}.vxe-form .vxe-form--item{display:none;padding:.5em .8em .5em 0}.vxe-form .vxe-form--item.is--active:not(.is--hidden){display:inline-block}.vxe-form--item.is--colon .vxe-form--item-title-postfix:after{content:":";font-weight:400;margin-left:.2em}.vxe-form--item.is--asterisk.is--required .vxe-form--item-title-content:before{content:"*";color:#f56c6c;font-family:Verdana,Arial,Tahoma;margin-right:.2em;font-weight:400;vertical-align:middle}.vxe-form--item.is--span .vxe-default-input:not([type=submit]):not([type=reset]),.vxe-form--item.is--span .vxe-default-select,.vxe-form--item.is--span .vxe-default-textarea,.vxe-form--item.is--span .vxe-input,.vxe-form--item.is--span .vxe-select,.vxe-form--item.is--span .vxe-textarea{width:100%}.vxe-form--item.is--error .vxe-default-input,.vxe-form--item.is--error .vxe-default-input[type=search]:focus,.vxe-form--item.is--error .vxe-default-input[type=text]:focus,.vxe-form--item.is--error .vxe-default-select,.vxe-form--item.is--error .vxe-default-select:focus,.vxe-form--item.is--error .vxe-default-textarea,.vxe-form--item.is--error .vxe-default-textarea:focus,.vxe-form--item.is--error .vxe-input>.vxe-input--inner,.vxe-form--item.is--error .vxe-input>.vxe-input--inner:focus,.vxe-form--item.is--error .vxe-select,.vxe-form--item.is--error .vxe-select.is--active>.vxe-input .vxe-input--inner,.vxe-form--item.is--error .vxe-textarea>.vxe-textarea--inner,.vxe-form--item.is--error .vxe-textarea>.vxe-textarea--inner:focus{border-color:#f56c6c}.vxe-form--item.is--error .vxe-form--item-valid{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}.vxe-form--item .vxe-form--item-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-form--item .vxe-form--item-inner .vxe-form--item-title{-ms-flex-negative:0;flex-shrink:0}.vxe-form--item .vxe-form--item-inner .vxe-form--item-content{position:relative;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;word-break:break-all}.vxe-form--item .vxe-default-input,.vxe-form--item .vxe-default-select,.vxe-form--item .vxe-default-textarea{outline:0;border: 0.0625rem solid #dcdfe6;border-radius: 0.25rem}.vxe-form--item .vxe-default-input,.vxe-form--item .vxe-default-select{height: 2.125rem}.vxe-form--item .vxe-default-input{padding:0 .8em}.vxe-form--item .vxe-default-textarea{padding:.3em .6em}.vxe-form--item .vxe-default-input[type=number]{padding-right:.2em}.vxe-form--item .vxe-default-input[type=search],.vxe-form--item .vxe-default-input[type=text]{padding:0 1em}.vxe-form--item .vxe-default-input[type=search],.vxe-form--item .vxe-default-input[type=text],.vxe-form--item .vxe-default-select,.vxe-form--item .vxe-default-textarea{color:#606266}.vxe-form--item .vxe-default-input[type=search]:focus,.vxe-form--item .vxe-default-input[type=text]:focus,.vxe-form--item .vxe-default-select:focus,.vxe-form--item .vxe-default-textarea:focus{border: 0.0625rem solid #409eff}.vxe-form--item .vxe-default-input[type=search][disabled],.vxe-form--item .vxe-default-input[type=text][disabled],.vxe-form--item .vxe-default-select[disabled],.vxe-form--item .vxe-default-textarea[disabled]{cursor:not-allowed;background-color:#f3f3f3}.vxe-form--item .vxe-default-input[type=reset],.vxe-form--item .vxe-default-input[type=submit]{line-height: 2rem;background-color:#fff;cursor:pointer}.vxe-form--item .vxe-default-input[type=reset]:active,.vxe-form--item .vxe-default-input[type=submit]:active{color:#3699ff;border-color:#3699ff}.vxe-form--item .vxe-default-input[type=date]::-webkit-inner-spin-button{margin-top: 0.375rem}.vxe-form--item .vxe-default-input[type=date]::-webkit-inner-spin-button,.vxe-form--item .vxe-default-input[type=number]::-webkit-inner-spin-button{height: 1.5rem}.vxe-form--item .vxe-default-input::-webkit-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-input::-moz-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-input:-ms-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-input::-ms-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-input::placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-input[type=search],.vxe-form--item .vxe-default-input[type=text],.vxe-form--item .vxe-default-select,.vxe-form--item .vxe-default-textarea{width: 11.25rem}.vxe-form--item .vxe-default-textarea{resize:none;vertical-align:middle}.vxe-form--item .vxe-default-textarea::-webkit-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-textarea::-moz-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-textarea:-ms-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-textarea::-ms-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-textarea::placeholder{color:#c0c4cc}.vxe-form .vxe-form--item-inner{min-height: 2.25rem}.vxe-form .vxe-form--item-inner>.align--center{text-align:center}.vxe-form .vxe-form--item-inner>.align--left{text-align:left}.vxe-form .vxe-form--item-inner>.align--right{text-align:right}.vxe-form.size--medium{font-size: 0.875rem}.vxe-form.size--medium .vxe-form--item-inner{min-height: 2.125rem}.vxe-form.size--medium .vxe-default-input[type=reset],.vxe-form.size--medium .vxe-default-input[type=submit]{line-height: 1.875rem}.vxe-form.size--medium .vxe-default-input,.vxe-form.size--medium .vxe-default-select{height: 2rem}.vxe-form.size--small{font-size: 0.8125rem}.vxe-form.size--small .vxe-form--item-inner{min-height: 2rem}.vxe-form.size--small .vxe-default-input[type=reset],.vxe-form.size--small .vxe-default-input[type=submit]{line-height: 1.75rem}.vxe-form.size--small .vxe-default-input,.vxe-form.size--small .vxe-default-select{height: 1.875rem}.vxe-form.size--mini{font-size: 0.75rem}.vxe-form.size--mini .vxe-form--item-inner{min-height: 1.875rem}.vxe-form.size--mini .vxe-default-input[type=reset],.vxe-form.size--mini .vxe-default-input[type=submit]{line-height: 1.625rem}.vxe-form.size--mini .vxe-default-input,.vxe-form.size--mini .vxe-default-select{height: 1.75rem}.vxe-select{position:relative;display:inline-block;width: 11.25rem;color:#606266;text-align:left}.vxe-select>.vxe-input .vxe-input--inner{cursor:pointer}.vxe-select.is--disabled>.vxe-input .vxe-input--inner{cursor:no-drop}.vxe-select.is--loading>.vxe-input .vxe-input--inner{cursor:progress}.vxe-select>.vxe-input{width:100%}.vxe-select>.vxe-input .vxe-input--suffix-icon{display:inline-block;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.vxe-select.is--active:not(.is--filter)>.vxe-input .vxe-input--inner{border: 0.0625rem solid #409eff}.vxe-select-slots{display:none}.vxe-select--panel{display:none;position:absolute;left:0;padding: 0.25rem 0;color:#606266;text-align:left}.vxe-select--panel:not(.is--transfer){min-width:100%}.vxe-select--panel.is--transfer{position:fixed}.vxe-select--panel.animat--leave{display:block;opacity:0;-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.vxe-select--panel.animat--leave[placement=top]{-webkit-transform-origin:center bottom;transform-origin:center bottom}.vxe-select--panel.animat--enter{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}.vxe-select-filter--wrapper{display:block}.vxe-select-filter--wrapper .vxe-select-filter--input{width:100%}.vxe-select-option--wrapper{position:relative;overflow-x:hidden;overflow-y:auto;padding: 0.25rem 0;max-height: 12.5rem;border-radius: 0.25rem;border: 0.0625rem solid #dadce0;-webkit-box-shadow:0 0 0.375rem 0.125rem rgba(0,0,0,.1);box-shadow:0 0 0.375rem 0.125rem rgba(0,0,0,.1);background-color:#fff}.vxe-optgroup .vxe-optgroup--title{padding:0 0.375rem;color:#909399;font-size: 0.75rem}.vxe-optgroup--wrapper .vxe-select-option{padding:0 1.25rem}.vxe-select-option{padding:0 .6em;max-width: 37.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-select-option.is--selected{font-weight:700;color:#409eff}.vxe-select-option:not(.is--disabled){cursor:pointer}.vxe-select-option:not(.is--disabled).is--hover{background-color:#f5f7fa}.vxe-select-option.is--disabled{color:#bfbfbf;cursor:no-drop}.vxe-select--search-icon{margin-right:.5em}.vxe-select--empty-placeholder,.vxe-select--search-loading{padding:0 .6em;text-align:center;color:#c0c4cc}.vxe-select,.vxe-select--panel,.vxe-select--panel.size--medium,.vxe-select.size--medium{font-size: 0.875rem}.vxe-select--panel.size--small,.vxe-select.size--small{font-size: 0.8125rem}.vxe-select--panel.size--mini,.vxe-select.size--mini{font-size: 0.75rem}.vxe-select--panel .vxe-optgroup--title,.vxe-select--panel .vxe-select-option{height: 1.875rem}.vxe-select--panel .vxe-optgroup--title,.vxe-select--panel .vxe-select--empty-placeholder,.vxe-select--panel .vxe-select--search-loading,.vxe-select--panel .vxe-select-option{line-height: 1.875rem}.vxe-select--panel.size--medium .vxe-optgroup--title,.vxe-select--panel.size--medium .vxe-select-option{height: 1.75rem}.vxe-select--panel.size--medium .vxe-optgroup--title,.vxe-select--panel.size--medium .vxe-select--empty-placeholder,.vxe-select--panel.size--medium .vxe-select--search-loading,.vxe-select--panel.size--medium .vxe-select-option{line-height: 1.75rem}.vxe-select--panel.size--small .vxe-optgroup--title,.vxe-select--panel.size--small .vxe-select-option{height: 1.625rem}.vxe-select--panel.size--small .vxe-optgroup--title,.vxe-select--panel.size--small .vxe-select--empty-placeholder,.vxe-select--panel.size--small .vxe-select--search-loading,.vxe-select--panel.size--small .vxe-select-option{line-height: 1.625rem}.vxe-select--panel.size--mini .vxe-optgroup--title,.vxe-select--panel.size--mini .vxe-select-option{height: 1.5rem}.vxe-select--panel.size--mini .vxe-optgroup--title,.vxe-select--panel.size--mini .vxe-select--empty-placeholder,.vxe-select--panel.size--mini .vxe-select--search-loading,.vxe-select--panel.size--mini .vxe-select-option{line-height: 1.5rem}.vxe-switch{display:inline-block;color:#606266;vertical-align:middle;padding:.4em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center}.vxe-switch.is--animat .vxe-switch--button{-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s}.vxe-switch.is--animat .vxe-switch--icon{-webkit-transition:all .3s;transition:all .3s}.vxe-switch.is--on .vxe-switch--button{padding-right:1.7em;background-color:#409eff}.vxe-switch.is--on .vxe-switch--icon{left:100%;-webkit-transform:translateX(-1.4em);transform:translateX(-1.4em)}.vxe-switch.is--off .vxe-switch--button{padding-left:1.7em;background-color:rgba(0,0,0,.35)}.vxe-switch.is--off .vxe-switch--icon{left:.2em;-webkit-transform:translateX(0);transform:translateX(0)}.vxe-switch.is--off .vxe-switch--label-on,.vxe-switch.is--on .vxe-switch--label-off{height:0;visibility:hidden;overflow:hidden}.vxe-switch.is--off .vxe-switch--label,.vxe-switch.is--on .vxe-switch--label{opacity:1}.vxe-switch:not(.is--disabled) .vxe-switch--button{cursor:pointer}.vxe-switch:not(.is--disabled) .vxe-switch--button:focus{-webkit-box-shadow:0 0 .4em 0 #409eff;box-shadow:0 0 .4em 0 #409eff}.vxe-switch.is--disabled .vxe-switch--button{cursor:no-drop}.vxe-switch.is--disabled.is--on .vxe-switch--button{background-color:#a6d2ff}.vxe-switch.is--disabled.is--off .vxe-switch--button{background-color:rgba(0,0,0,.15)}.vxe-switch .vxe-switch--button{display:block;position:relative;height:1.6em;line-height:1;min-width:3.2em;padding:0 .6em;border-radius:1em;border:0;outline:0}.vxe-switch .vxe-switch--label{opacity:0;display:block;color:#fff;font-size:.8em}.vxe-switch .vxe-switch--icon{position:absolute;top:.2em;left:0;width:1.2em;height:1.2em;border-radius:50%;background-color:#fff}.vxe-switch .vxe-switch--label-icon{margin-right:.25em}.vxe-switch,.vxe-switch.size--medium{font-size: 0.875rem}.vxe-switch.size--small{font-size: 0.8125rem}.vxe-switch.size--mini{font-size: 0.75rem}.vxe-list{position:relative;display:block;padding:0;color:#606266;direction:ltr}.vxe-list .vxe-list--virtual-wrapper{position:relative;overflow:auto}.vxe-list .vxe-list--y-space{width:0;float:left}.vxe-list .vxe-list--body,.vxe-list .vxe-list--virtual-wrapper{padding:0;margin:0;border:0;outline:0}.vxe-list--virtual-wrapper{height: 6.25rem}.vxe-pulldown{position:relative;display:inline-block;color:#606266;text-align:left}.vxe-pulldown--panel{display:none;position:absolute;left:0;padding: 0.25rem 0;color:#606266;text-align:left}.vxe-pulldown--panel:not(.is--transfer){min-width:100%}.vxe-pulldown--panel.is--transfer{position:fixed}.vxe-pulldown--panel.animat--leave{display:block;opacity:0;-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.vxe-pulldown--panel.animat--leave[placement=top]{-webkit-transform-origin:center bottom;transform-origin:center bottom}.vxe-pulldown--panel.animat--enter{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}.vxe-pulldown--wrapper{background-color:#fff}.vxe-pulldown,.vxe-pulldown--panel,.vxe-pulldown--panel.size--medium,.vxe-pulldown.size--medium{font-size: 0.875rem}.vxe-pulldown--panel.size--small,.vxe-pulldown.size--small{font-size: 0.8125rem}.vxe-pulldown--panel.size--mini,.vxe-pulldown.size--mini{font-size: 0.75rem} \ No newline at end of file diff --git a/src/css/global/index.scss b/src/css/global/index.scss new file mode 100644 index 0000000..7f1a92f --- /dev/null +++ b/src/css/global/index.scss @@ -0,0 +1,157 @@ +html, body, #app { + width: 100%; + height: 100%; + padding: 0; + margin: 0; +} + +html { + font-size: 16px; +} + +#__testStringWide { + display: none; + height: 1.375rem !important; + visibility: unset; + font-size: 0.875rem !important; +} + + +.confirm-btn-box { + display: flex; + flex-direction: row; + justify-content: center; + margin-top: 1.25rem; +} + +/* 字体图标样式开始*/ +.iconfont { + color: #ffffff; + margin-left: 0.7rem; + font-size: 1.25rem !important; +} + +.iconfont:hover { + color: var(--theme-color); +} + +/* 字体图标样式结束*/ + + +.flex { + display: flex; +} + +.flex-center { + display: flex; + align-items: center; + justify-content: center; +} + +.flex-column-center { + display: flex; + align-items: center; +} + +.is-can-click { + cursor: pointer; +} + + +.static-title { + background: linear-gradient(to right, #703AAC 0%, rgba(112, 58, 172, 0) 100%); + box-shadow: 0 0 0.06rem 0 rgba(41, 137, 248, 0.5) inset; + width: 16.88rem; + height: 1.56rem; + font-size: 1rem; + font-family: MicrosoftYaHei-Bold, MicrosoftYaHei, serif; + font-weight: bold; + color: #FFFFFF; +} + +/* 滚动条样式 开始*/ +::-webkit-scrollbar { + height: 0.5rem; + width: 0.5rem; + background: var(--gun-dong-tiao-gb); +} + +::-webkit-scrollbar-thumb { + background: var(--theme-color); + border-radius: 0.31rem; +} + +::-webkit-scrollbar-thumb:hover { + cursor: pointer !important; +} + +/* 滚动条样式 结束*/ + +.mb-10 { + //margin-bottom: 0.1rem !important; + margin-bottom: 0.62rem !important; +} + +.ml-10 { + margin-left: 0.62rem !important; +} + +.ml-20 { + margin-left: 0.125rem !important; +} + +.mr-10 { + margin-right: 0.62rem !important; +} + +.mr-20 { + margin-right: 1.25rem !important; +} + +.mr-5 { + margin-right: 0.31rem !important; +} + +.mt-10 { + margin-top: 0.62rem !important; +} + +.w-100 { + width: 100% !important; +} + +.h-100 { + height: 100% !important; +} + +.center { + display: flex; + align-items: center; + justify-content: center; +} + +.token-box { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + + +.el-pagination { + display: flex; + align-content: center; + justify-content: center; +} + +.el-table__header-wrapper { + height: 40px !important; + + .el-table__header { + height: 40px !important; + } +} + +.el-table .el-table__cell { + padding: 0 !important; +} diff --git a/src/css/index.css b/src/css/index.css new file mode 100644 index 0000000..859f1fd --- /dev/null +++ b/src/css/index.css @@ -0,0 +1,24 @@ +@import url('./global/index.scss'); +@import url('./element/index.scss'); +@import url('./vxe-table/index.scss'); +@import url('./message/index.scss'); + +:root { + --theme-color: rgb(44, 70, 155); + --modal-bg-color: rgba(27, 26, 72, 0.75); + --white-font: #ffffff; + --aside-bg: rgb(44, 70, 155); + --cancel-btn-gb: rgba(0, 0, 0, 0); + --follow-list-bg: rgba(242, 242, 242, 0.9); + --table-header-row-bg: rgba(40, 39, 72, 1); + --gun-dong-tiao-gb: rgba(242, 242, 242, 0.9); + --aside-gbc: #2c469b; + --aside-font-color: #FFFFFF; + --map-control-gb: rgba(0, 60, 136, 0.3); + --map-control-font-color: #eee; + --dialog-bg: rgba(255, 255, 255, 0.6); + --dialog-header-bg: var(--aside-gbc); + --dialog-header-font-color: #FFFFFF; + --dialog-body-gb: rgba(255, 255, 255, 0.6) +} + diff --git a/src/css/message/index.scss b/src/css/message/index.scss new file mode 100644 index 0000000..6078010 --- /dev/null +++ b/src/css/message/index.scss @@ -0,0 +1,3 @@ +.toast-message { + font-size: 1rem !important; +} diff --git a/src/css/vxe-table/index.scss b/src/css/vxe-table/index.scss new file mode 100644 index 0000000..2a275ef --- /dev/null +++ b/src/css/vxe-table/index.scss @@ -0,0 +1,138 @@ +.vxe-modal--wrapper { +} + +.vxe-modal--body { + background: rgba(255, 255, 255, 0.95); + border-radius: 0 0 0.75rem 0.75rem !important; +} + +.vxe-modal--header { + background: #2c469b !important; + color: #ffffff !important; + border: none !important; + border-radius: 0.75rem 0.75rem 0 0 !important; + height: 2.5rem; + padding-left: 0.9rem; +} + +.vxe-modal--box { + background: transparent !important; + border: none !important; +} + + +/* table 样式开始*/ +.table-header-row-css { + background: rgb(148, 161, 204); + color: var(--white-font); + border: none !important; +} + +.vxe-table--main-wrapper { + border: none !important; +} + +.vxe-table--body-wrapper { + color: black; +} + +.custom-table-page { + background: transparent !important; + color: var(--white-font) !important; +} + +.vxe-table--border-line { +} + +.vxe-table .vxe-table--header-wrapper .vxe-table--header-border-line { + display: none !important; +} + +.vxe-header--gutter { + background-position: unset !important; +} + +.vxe-header--column { + border-bottom: none !important; + background-position: unset !important; +} + +.table-row-css { + border: none !important; + height: 2.5rem !important; +} + +.table-row-css:nth-child(odd) { + background: #343352 !important; + color: #B2B1CE !important; +} + +.table-cell-css { + height: 2.5rem !important; + border-bottom: none !important; +} + +.table-row-css:nth-child(even) { + background: #3C3B5B !important; + color: #B2B1CE !important; + border: none !important; +} + +/* table 样式结束*/ + + +/* header 按钮样式开始*/ +.is--filter-active .vxe-cell--filter .vxe-filter--btn { + color: var(--theme-color) !important; +} + +/* header 按钮样式结束*/ + + +/* 分页样式 开始*/ +.vxe-pager--wrapper .vxe-pager--prev-btn, .vxe-pager--wrapper .vxe-pager--next-btn { + background: var(--theme-color) !important; + color: var(--white-font) !important; +} + +.vxe-pager--wrapper .vxe-pager--prev-btn:hover, .vxe-pager--wrapper .vxe-pager--next-btn:hover { + background: var(--theme-color) !important; + color: var(--white-font) !important; + opacity: 0.7 !important; +} + +.vxe-pager--wrapper .vxe-pager--prev-btn:focus, .vxe-pager--wrapper .vxe-pager--next-btn:focus { + background: var(--theme-color) !important; + color: var(--white-font) !important; + opacity: 0.7 !important; +} + +.vxe-pager--wrapper .vxe-pager--sizes { + +} + +.vxe-pager--wrapper .vxe-pager--sizes .vxe-select--panel .vxe-select-option--wrapper .is--selected { + color: var(--theme-color) !important; +} + +.vxe-pager--wrapper .vxe-pager--sizes .vxe-select--panel .vxe-select-option--wrapper .is--hover { + color: var(--theme-color) !important; +} + +.vxe-pager--wrapper .vxe-pager--sizes .vxe-input .vxe-input--inner:focus { + border-color: var(--theme-color) !important; +} + +.vxe-pager--wrapper .vxe-pager--goto:focus { + border-color: var(--theme-color) !important; +} + +/* 分页样式 结束*/ + + +/* 表格中的加载 开始*/ +.vxe-loading .vxe-loading--spinner:after, .vxe-loading .vxe-loading--spinner:before { + background: var(--theme-color) !important; +} + +/* 表格中的加载 结束*/ diff --git a/src/css/vxe-table/source-index.css b/src/css/vxe-table/source-index.css new file mode 100644 index 0000000..8752bb5 --- /dev/null +++ b/src/css/vxe-table/source-index.css @@ -0,0 +1 @@ +@font-face{font-family:vxeiconfont;src:url("data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAEKoAAsAAAAAkOQAAEJUAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHFQGYACaUgqB5GSBuwQBNgIkA4UkC4JUAAQgBYULB5E8G+55B8TbRwjoDuDxYpVyjKJErcqRiLpEOVXJ/v+/Jx1ybXxV3g9Mbi5QZISlyaKI6yooyyLTe9FtaYk3TnQoEjbZkyjQlRDwBlSYgz8qC7uYnPbOYx9oo4OIQEQwPy31T/tQJ2sN9Ii2SKRT+bhxZgyyMUVKpOVMpuGq1kv2iKvwx0l1NE4/JCmaJg/YfuWb+bNbRFaEeEQFiZCcr6yQTV0dOSS9+9r6lMbrv/cke7x7VFKQO6IuPPCBN8zTSK2UdAfAVcJtuuv/wf38ZerogFYYlf7iXuVtDT6j71+0QWtbmllBCxagRLQN8eKt6f3xT67V380ND3Pr31izKOixaGpsLGBjwNgaehsDBKXGQAQlVDBAQDkBDyMJA8UEK04sTAz0W3dygVGHhRjfPjeyTWJjhGjuN91fqv+HvTNmezlxPSggx3oVEhWQhTI2+AwGm/C9xGGvgGIvA3ahi4SIOF9mfh0Ag/NCzrNP/nHvwAKxlALM/pqzehevFebzvVNrZpdnUi9JVhrvsu0kTZGXaaRx6pIhcQqYZf1Iv9IdSzOGlg2yHeQyydK7i/MImH/VVa00fp6FzWzK7MVUNAyXcpdSt1c0P8n460s2smwGWZjBeIIDsJbNBBHeejAzZ4znLZtSlu0J9sC+Z8EFcxEuhNCFkNqrrqju9Sm0VSpT0XZXFNVRpcc1qA0IXVYeet2LcnajqPuyH+AmiG6ttJ+x5vfwaPlr5dDwQkQlRSUzJbu2f11T7GrqpJeDNnjFbv4tEYDGHtPgm0vMdp7UgZgMT07A7owBxOuGA7XIeCJL1ahg3WAbNCc6Y+rwOsiBWO320uMa+fKHr+WA6iCKWbezs2RXn/e86t8pcgnZG/8MAth6BHJABgxVzJ/bVhxJGwB/SIcSRrx/DQLpmsdzRfKEj0U8v8/f8+/jRw8OFUkjlLFxpOoXw+n6X9y+fF3X5m1HB05fPjmn+JSf6tOZCjbCFyriCDrtz9/m5d07D565AAbYkEAOHRzgGnzG+GOmMdvY1LEZY/Vjv41dGLsy9ufY+xduL2AvGC9CXgy8pLyMf9n5quf13Lf73i9zuT4AhZ+f/NzLKXfoeQc/m5/vXNLaBsfdlpjWtI5V+x7797zzVvOHMTDGOzBhrJi/vP/rMdcTOf7bdZcI4DAYdJ//HLjkvOwY5m/yt/nHzuetjTsmWn5q5cduEOy+VAjNyWhmQTgQ3oGREBUfs388JHUZy/8reEmCZ/PPzx2tm3ai4bp7MsChoeZ0UrOws6uHj8yr66Cqh4EmeHr/wcNFJY+aOzrNs3sTTVI6O6eZx40l1UN0VLtn78ntN/ZdG+VEK/sXV15ZUDRG8Qxb2CuwXLmms6t7vXoHBMGKlQipadUWqy3dnpG5gcEMYrE5XB6aCCpqp1RWFEqsneMsjsdalTUpe1HO5CmO3DwV0mqM/KoYf2rB2oTEpOT5detQFsyuqS9r/kUeRo6bS/EAIQ9rNwVo8Mvoy2r8RwDvwzOCwEJyg4sEhfkEg/EIDtUIASUIBYkICz2IDDWIAr/IC1qRNxwlH+hCfjCP6FCBguEBhcJiEo0qSQGekByOUQQcJyUsoFh4RHFQhvRwjwxQi4zQhqxDbpMBfpMDvlIRfCMnfKfpsIRmww2qgR80F3LRfDhBdTAT1cMfWgBfqAGmoEaYipo+Nwnm0iJIQYshBy2Bn/QrZKJ2SEbL4T6tg07UBeVow5DVRoD9tAkOUA+coc2wi7bBOzoKB2kAntJpGIcuw2m6CgXoFhyiu7CMfoe79Cc8phewiDFwjbEwAePgOuNhNiZCKeZDOxbCEVbANBwHr1kL71kHH1gPH9kAn9gMc7gQ/nI5JOBayMNN8Jyb4QUvh1S8CpbzaljBa+AUr4WVvA5WcQes5k5Yw12wlrthHe+E9XwQPvMxqMO/QT0+Dh14ABrwCWjEJ6EJn4JmfBpa8BnIwOehD1+AJHwJpuMrQ9VuAUzEt2ES/h328D/QjZ9CPv4A5/kjXBAA9goI7BM8WCr4kE2Y4KVIgA0iETaKJNgkkuGWSIHNIhW2iDTYKiywW1hhm7DBdlEMM4gSSCOmwisxA7KIetghfoOT4gLMIi5DJXEFqog/Yad4DW/Em9H/xmFAb2FAEzCgdwCXxHu4LFzw1gCAdAYgcNWAG5w1AINzBhhwxUAIHDZwHG4bGIA7BinHZFI8HL1QJ0AhQz3Qb3juw7/vPrZPo8hnWARmTzHAf5CwTOJkzaf1wiAgZc2OJrnFGogaSzLReEASRMTIzTiI0hpKgJZ6lC9GbHNeknM0Rm4sk9MEWIhpCBFijdpBFRAiMpBLJCMFQkGTtomBOGNCaxEJeg8UQQaDEKoRU9JdPMKygKgFZpSWlZpELVQsA4t876Q6QchlrkUiTvpEBsVqS39t42b25p1Xp9vPU2EG6L4TloWJlnzsWwivzrrb2/Gwx+ZTaheeaDuwV4/H1bCQdtyG/bYi8qvagMEDjxQbnPZ7KgYpZmNOtGvt9Od5VLR/gb3xgRaAfAj7HSXbe4EGd/Go2Kpo53UvCz2VFZUyB86oABVSCzb1XTgNcvV3e+EcZz2zKIaNSoDXQyidm3rRnycMLWvBupgJiY7H2jgeH1UDtGhoyEyzBq0PChngfVquS8H0xnlOPPtJCG7pIOjS 0rem4BUvdzkLFiLcFhqtBBro47xXbG/f3pvrfzw9MapgC7NhIeX7wz/+dvxmSt+1JqM7QwiOR2T2wjO5wnQInra8QpJqXjKEXnVvhUYjwdRc7TeZZa6Lwg1P04lxKquOaHyQlULsBTgM5HEQJ2XMZSZgw8424duOsEFB3Htr1FpNBRWE88emqtTFh7KXXO598nW4bFPZNmdM9DO295hrs0aLguEFFgKLCvNRrYN4jf15ZMIfM83fexR6RCR91crMYq3tpq3mrvB0Wui2zz3BfN7bNbxrH7PtSP6qPkPjLhsleHtrHw4BDzoG82llWwT5dmKi+FWMJdMtYUbOJNzH/5/luzvu55MQOlP+9f1q88wHx8BeQFSXrg7NQUobhrvAHk4l16yvPWVz/RMM+pSA3Pg3qlI39+cBa76Mdgs9F451qj0cUg07lyqK9hY8Fze/F/eKcUg6yMrJjNinZWKPZp/dPYbc2iRl6ivFLKCcTCcY5pkqyC9+ZjxI4oE/NDXK8NxgauS1wgciPD2H3KljOEoou+UJ8OgVMtft3FdsVzdwqOUqW01mjIAUxCAHwTu80qII5Rg6j1XXb5/dwUt9knxoLbmX7MhFyEvonDeh2zVzUHkdWOLAxHmS69z60rCFst4wBQtbkVnkFUtfPo2+lNtinNbnnws099qD33v8v1Qx1c+NJHXHJ394QhSJPnjHXMbGgHjAxq2luSkielJxiUNVJzXRWIS4CSXEIKB3HL6yPuL6yNxEOUp8Q1PBiakTIN91LI0kIqaJsklWGLmgI/rJOCF1gSSXg3+L5s3LzYDGT4XuPOlbegPnJfNW62JfUC1CALpqq3JskODfciENEW99ai5QtivTsdCS0LjrPkbnMeFM0hW9AvpL3R2Oe1uS5jAUZYqlpoqbHhwRXp/gzbCli/dhv97l7ULq2hCW6UW9vl+7JZh3i4dRL7p+ONyDXsrZXsDRVg0KD2cJF0ZJ9NeOuvJ8rcBCOp9hqflb9iEmuf5q2Vg/h1pTY8ZYWLankifPWzIUgxvii2CVZpJD18+9OG7Gq0Mig1OpCCDJSssYvTkaoMEc4OdMQ7A0BmgQ0nH+HiT9767SbAeCh/PFJjNagFCerctIGDOVDkLEoTSU9czSRgCy1xDAeOHXXofJoPwtpzLmTUgheOzO1uMkuzcXaus0OGFwyORdT3obgwOlZ+F0wgv2JcWdAZUn24ztSt4++Lih+P8e1E2SqTbVR+X/ntpfrZLwNmZXOi/JRUMZ/T34N6UHmpOQBc3wLp4UKeqU8fCbvEmbqJyG7PLPGUcstTmo2L82dxt1rMCla2D4pkOWKXqiXMXqlXpFZa979/RubQ6VFgnEiG4vOq9jBp8RgGHZR82jqbxc1NpU2Rhmz3gxWH2O20PTxFDcbm8uao9x2zhGbLFu/Jken25plbKlta/e85D6pMUaIL0RljY3FrmFgnQJRxgDWGT8U0SzbPxjIVsOLK2EvCc23rnu1RhcF15IhrI+UlUeV2TS7lJvJW/XtLjZtm35c4RH1cYsRDACKK85uWYu8lji/2tsB0oJzXCxV8cWU/E7A5kGQes9uiLNoljF6RKOcp6wsw6gKlkQZ26qdfV64y2DS0JwzvK1JLikQXPKhFojnhRQ3ubweSXMmsFPR82ShmCXWDUGuGk8jOOSCeH8kKdhqOhqJ5KQRLFxlVHeKhYPDtHYgM4Q9LE2UbO2dBpbfHAq8Fy7ZNico2l9SdChOIrhxQWSmYGRRlOUdMlB4hqZz1KAcOaB6cPm/Cwkjo9JUHG3in+Wnjy1uPANSoT76+Q2/suZ/53z6j03jK4iGIg1Tx9HLHw5KrFhcEreDvZmTu2zL3g4tAPhz+ltBISSxhl05BS1TGBo2Rh5yp4CH9ozuy/4ubt8fhrbxVVh6sGExeuVGuF4fvh1Q5OvMW5KFCa2XduCyWIsLczXDxiKdc/2rzoB8qhCQBQUZCsqIFEDCumg9kT/S1Rb8qT1y/fnWqD9yjjdcwu8Qnr4zpfMuWxpeNT88N6njGGGtAEgwI8tBwzWZRT5uQMaZzjkXImQUxD1VhKJkD8lLFxeswKkG4UscMKYXXC1LJLEuUyTWI8bjBPZxPvQrles6v2IVeCRakQgsrl4tCdnHuDXdpMew0WznRxt5aX9F6p7U0jj3E88EamSGOwKmtCeyUZIKb7cW1QkHWQeMDQRatiLYYV2TYt81HzBCIdSscFFSYoaAJd/YNJ3XQphwhNlUQX3QO0QpJFNBSOMYTkEyxif2J/hi1cleilDj+qm1DOywQhTVB6TSrnfYrckigxiWHFKdlMBDANIm1QLhk025DW8yHQjZa6WNgZDXm1S5+pq1eMu7IhLs0VyI9gJ0J8nqGtEHY8LQSl32f+jrik1FDA7Dl7XL1DNEK41rDTstofwZsG47q+60BTGAkrvuX8ZCQRmGvQ6M+RoM91B4NlyFW/Gbqm296yIlmqeKXXs8S93WgQyOlDZWOOpU425iLYAjCVLjYwuhp6r8lnW45pZIqViEzqN17YGdfm4MuDYQoZ8wSPmAhOOjji/3NxLJtLn1sCzuINHvefH+QDGZzRZQ2yoP5ICsKDYTb4BaSRWFFqvCQE2GMcZrUbmYIaSs7W4tRwsUrUpznCVHgfKOsoaBt0VJLVlGyGzTdSrlTbNJFm3icqgGYlTBqLfZM0XCv8PqOzyUKPEFvOjQ3xZcHwwF2J57nymGRhu//rEBH5lzXE82cH9wmKrTXjxmkmKJwcuDstMohpojDJQeSb4T9KqACsEK0FXG2cT4n8mDcoY/eMW8NfxuHbhq3R+DskiFRXrBmZEE5LXkQRM3/ieR0P+bOSay656AwBKnZvGP1As740xW3BrLPZ/xWqoBsqvmDj/IziGLpBeUY2+s7aghFLWLzqbWkih5lKAL/CKhNZCMngQBQaju3kTYP1HLMBkmcWHCS8gj6l++DRJY38lCgL8MkrxX2bbwTLh4yhFizYwjk6fJRR0DBxc8oN0U5/jLLzqfr1h9pD43H+hNZs02uM8OSMQVhzJ2lpq1ZBtN5ueJBKRtJ3uyY6sKksmBvASm2pS60DExh/Lv7xjd3d/Gl2aXNfYx5ZaSEWYYXIULPZbCF7TUeQ5aHqQAdDoWuhEbNBGI2XNxV/R+2g2nVlpdvutCPSc+LE+dMuzzgoaCySIi7UKQNB4Nq9xIcMjln5zFXJcxVup5GyH014GiwB6FAH75PaD5HS4MQ1oeMKyJMvbjn1IDdHAJJhm/h4ndGYdSR2z0KlTOy+opZBXlx0MRqcKz1TpCrTcPyw2BYsd4AZAdkMAXngBTNS6U54PmlLiGaE7UypTvk6+JxkEEK2WGCSq3xWUiqjEJ+r7OQHq+Q37xB9CWssRCGL31NykgAplAgFiIcEevQkWQMoj7BDDJ8S5RtAtbZG9REUHcJJUgl87j4hV/KYTquaESFGcO8tlerlmSyd+mhMGXb97Chm2jTajAeBiVxmo1gAyW5X/aIpWonnKkwqM1Cu3HCe+zpvgrXft4PCWvR78szzZI53d+fLDD0muVhp3n0lGXBSrHQAXQXGdnF26rt23JitYN3fPyxOt5ovKG5D931TVc9On3/c1EZSCfBHSuB8Ucs6jYf7eQ3nsyHdJCYus0ncsCzyF/6m9qbgVqahrSyTlbsSlu5qillukYipi6q0sYz/0HpARgZiRmohzp9NP8FfX7T9zoFWH5FY+2Moaic1sqJUaEx54KaJKrStNwfljL18+cWrl9tS1vfZoZv/mmSaUJGrj6m8HwGtE5ImJ/9tum5gIGH2tpI7X2A57kRzZUYK/R2s2LptBQV039PW1pyrAKjlrNCOZKmDcygzA7+LTEwE0vDA4JgGTJ7n8IK9dLMTcmlVD20xmuJKINoHbJ/f1nJ4Kemsdb+CMQya0aeeLrJetPEP9ywOdQYRfp2lUzYa2m+Nuv5njGpa9IDIHbNjm5XbQFiVzOFQWEjGRm9oPQFUhFlNquXT/pIT1GarLfcDwcIs/jX3pjkG4LhWMwyQOocMz7Bt/x2fESzUMJkBFknaoOkhp12nCyokLcLMokqJZ2oQHZF0ppAZBsQq+cXoUspfoukicV03TOXba2qzD3mbSduW3n5vT7UZsC3s+BiogTUIZ1ATi5KxnH8cojbgHE1g+DsjdgRIlSUDEShVDQ4DQS87Zow0YHO6xBlFEL7BH70gQapqgEbc06AJCer47j4ZP00jHqqNtELCGepymujOg6T516ZPUsjavsMMsa4FEdW1ittqmJbQgx7Tst27mDM+IEIGsnxo3F7sFQpJKlcqEXiaQqFl6ikFfeUVPXLyPq0eeyze1mqaOBpCHMcDT6VTGlnhuZuIotG19haa8qTt5A1hhySCeyNHcC4vN2dB4S27RRXoJ6UnjyJzAWvlRz+0wgmZ5Sy+TYojHEuEa3IlTAtYYv9ogQBtthKTiRNUVYgFEEQgsJLVSCUF+rILFJfAxuVI4kPPwBG/fjK9w/Mb+99eAkA+7wqccKMRKmUo/DEEAMQfWEJjaH6AKvfMbthct219ul3Ti7t2zgVHtvqCIDx3v86stiFFaPvet5ODDSjq2i7DV0w5ih2DiOb6Utix1EMZLeQARea+LVs6kmNX15VaqgWJOWj5nuaMLdiIQpCZpUDInEerP8JwseMeVdrg9PtGw6Oj4d2KpM3bE14XSZKWzEcJqi 0.4375remxcQhT6JtOltxQqd1RaWylF5jSTYpvCkBUFkj0pyuAIKBKJdWIxiiImGClF5JwJkBqilQ7ZxjJ4ycKpoML1IOWnW5RFh2ICKUeVfC1m3rt0Z4MZCx8TPrajz0ZlEI/VENljqKHCSFQJliuDVl1qNEmsFR5aPLMYHAVFD1FzEsIZ7R2xyiGPgDRnz0Zk6JxTRZIuYJ+ex95KK+dboBFkkjwEG7ZSOq/vrZQ0QFNrt93VJuIMacPt858WK1LIByeWLOjvSwIRusf/BrWtxLXveV+qhamUR7cs2NVofVQfWVK7HWUCvWA2zqJlWOCwmdStyjMU+aPufflZHg0LBjmuzhnD1VI1++Gjz+t5W0l25DsqZ75VXxZHEVyaA04IqFOGavGA6IVUAVFILMI61EAm8ru13a3FtIPI1meGGd 0.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") format("woff2")}@-webkit-keyframes rollCircle{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes rollCircle{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}[class*=vxe-icon-]{font-family:vxeiconfont!important;font-style:normal;font-weight:400;font-size:1.1em;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}[class*=vxe-icon-].animat,[class*=vxe-icon-].roll{display:inline-block}[class*=vxe-icon-].animat{-webkit-transition:-webkit-transform .25s ease-in-out;transition:-webkit-transform .25s ease-in-out;transition:transform .25s ease-in-out;transition:transform .25s ease-in-out,-webkit-transform .25s ease-in-out}[class*=vxe-icon-].rotate45{-webkit-transform:rotate(45deg);transform:rotate(45deg)}[class*=vxe-icon-].rotate90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}[class*=vxe-icon-].rotate180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}[class*=vxe-icon-].roll{-webkit-animation:rollCircle 1s linear infinite;animation:rollCircle 1s linear infinite}.vxe-icon-lightning:before{content:""}.vxe-icon-cloudy:before{content:""}.vxe-icon-heavy-rain:before{content:""}.vxe-icon-moon:before{content:""}.vxe-icon-sunny:before{content:""}.vxe-icon-location:before{content:""}.vxe-icon-location-fill:before{content:""}.vxe-icon-microphone-fill:before{content:""}.vxe-icon-microphone:before{content:""}.vxe-icon-share:before{content:""}.vxe-icon-share-fill:before{content:""}.vxe-icon-flag:before{content:""}.vxe-icon-flag-fill:before{content:""}.vxe-icon-platform:before{content:""}.vxe-icon-goods-fill:before{content:""}.vxe-icon-goods:before{content:""}.vxe-icon-funnel-clear:before{content:""}.vxe-icon-envelope:before{content:""}.vxe-icon-envelope-open-fill:before{content:""}.vxe-icon-envelope-open:before{content:""}.vxe-icon-envelope-fill:before{content:""}.vxe-icon-message-fill:before{content:""}.vxe-icon-chat:before{content:""}.vxe-icon-chat-fill:before{content:""}.vxe-icon-send:before{content:""}.vxe-icon-send-fill:before{content:""}.vxe-icon-user:before{content:""}.vxe-icon-user-fill:before{content:""}.vxe-icon-wechat:before{content:""}.vxe-icon-alipay:before{content:""}.vxe-icon-indicator:before{content:""}.vxe-icon-file-excel:before{content:""}.vxe-icon-file-pdf:before{content:""}.vxe-icon-file-image:before{content:""}.vxe-icon-file-markdown:before{content:""}.vxe-icon-file-ppt:before{content:""}.vxe-icon-file-word:before{content:""}.vxe-icon-file-zip:before{content:""}.vxe-icon-file-txt:before{content:""}.vxe-icon-refresh:before{content:""}.vxe-icon-checkbox-unchecked:before{content:""}.vxe-icon-information:before{content:""}.vxe-icon-info-circle-fill:before{content:""}.vxe-icon-info-circle:before{content:""}.vxe-icon-chart-radar:before{content:""}.vxe-icon-chart-bar-x:before{content:""}.vxe-icon-repeat:before{content:""}.vxe-icon-voice-fill:before{content:""}.vxe-icon-voice:before{content:""}.vxe-icon-flow-branch:before{content:""}.vxe-icon-comment:before{content:""}.vxe-icon-folder:before{content:""}.vxe-icon-folder-open:before{content:""}.vxe-icon-picture:before{content:""}.vxe-icon-picture-fill:before{content:""}.vxe-icon-bell:before{content:""}.vxe-icon-bell-fill:before{content:""}.vxe-icon-undo:before{content:""}.vxe-icon-home:before{content:""}.vxe-icon-home-fill:before{content:""}.vxe-icon-checkbox-checked:before{content:""}.vxe-icon-checkbox-indeterminate:before{content:""}.vxe-icon-fullscreen:before{content:""}.vxe-icon-minimize:before{content:""}.vxe-icon-print:before{content:""}.vxe-icon-upload:before{content:""}.vxe-icon-download:before{content:""}.vxe-icon-cloud-upload:before{content:""}.vxe-icon-cloud-download:before{content:""}.vxe-icon-spinner:before{content:""}.vxe-icon-close:before{content:""}.vxe-icon-custom-column:before{content:""}.vxe-icon-edit:before{content:""}.vxe-icon-zoom-in:before{content:""}.vxe-icon-caret-down:before{content:""}.vxe-icon-caret-up:before{content:""}.vxe-icon-caret-right:before{content:""}.vxe-icon-caret-left:before{content:""}.vxe-icon-square-checked-fill:before{content:""}.vxe-icon-square-close:before{content:""}.vxe-icon-square-down:before{content:""}.vxe-icon-square-left:before{content:""}.vxe-icon-square-caret-right:before{content:""}.vxe-icon-square-minus:before{content:""}.vxe-icon-square-plus:before{content:""}.vxe-icon-square-right:before{content:""}.vxe-icon-square-up:before{content:""}.vxe-icon-square-checked:before{content:""}.vxe-icon-square-down-fill:before{content:""}.vxe-icon-square-minus-fill:before{content:""}.vxe-icon-square-close-fill:before{content:""}.vxe-icon-square-left-fill:before{content:""}.vxe-icon-square-caret-right-fill:before{content:""}.vxe-icon-square-up-fill:before{content:""}.vxe-icon-square-right-fill:before{content:""}.vxe-icon-square-plus-fill:before{content:""}.vxe-icon-square-plus-square:before{content:""}.vxe-icon-square-fill:before{content:""}.vxe-icon-square-square:before{content:""}.vxe-icon-sort-alpha-desc:before{content:""}.vxe-icon-sort-alpha-asc:before{content:""}.vxe-icon-sort-numeric-asc:before{content:""}.vxe-icon-sort-numeric-desc:before{content:""}.vxe-icon-star-fill:before{content:""}.vxe-icon-star:before{content:""}.vxe-icon-star-half:before{content:""}.vxe-icon-lock-fill:before{content:""}.vxe-icon-unlock-fill:before{content:""}.vxe-icon-question:before{content:""}.vxe-icon-exclamation:before{content:""}.vxe-icon-ellipsis-h:before{content:""}.vxe-icon-ellipsis-v:before{content:""}.vxe-icon-save:before{content:""}.vxe-icon-setting:before{content:""}.vxe-icon-setting-fill:before{content:""}.vxe-icon-link:before{content:""}.vxe-icon-sort:before{content:""}.vxe-icon-chart-pie:before{content:""}.vxe-icon-chart-line:before{content:""}.vxe-icon-swap:before{content:""}.vxe-icon-num-list:before{content:""}.vxe-icon-copy:before{content:""}.vxe-icon-company:before{content:""}.vxe-icon-swap-right:before{content:""}.vxe-icon-swap-left:before{content:""}.vxe-icon-table:before{content:""}.vxe-icon-merge-cells:before{content:""}.vxe-icon-paste:before{content:""}.vxe-icon-cut:before{content:""}.vxe-icon-lock:before{content:""}.vxe-icon-unlock:before{content:""}.vxe-icon-chart-bar-y:before{content:""}.vxe-icon-fixed-fill:before{content:""}.vxe-icon-fixed:before{content:""}.vxe-icon-square:before{content:""}.vxe-icon-check:before{content:""}.vxe-icon-question-circle-fill:before{content:""}.vxe-icon-error-circle-fill:before{content:""}.vxe-icon-delete:before{content:""}.vxe-icon-dot:before{content:""}.vxe-icon-success-circle:before{content:""}.vxe-icon-delete-fill:before{content:""}.vxe-icon-minus:before{content:""}.vxe-icon-maximize:before{content:""}.vxe-icon-question-circle:before{content:""}.vxe-icon-warning-circle:before{content:""}.vxe-icon-warnion-circle-fill:before{content:""}.vxe-icon-eye-fill:before{content:""}.vxe-icon-search:before{content:""}.vxe-icon-funnel:before{content:""}.vxe-icon-eye-fill-close:before{content:""}.vxe-icon-search-zoom-in:before{content:""}.vxe-icon-arrow-right:before{content:""}.vxe-icon-arrow-left:before{content:""}.vxe-icon-arrow-up:before{content:""}.vxe-icon-calendar:before{content:""}.vxe-icon-arrow-down:before{content:""}.vxe-icon-warning-triangle:before{content:""}.vxe-icon-add:before{content:""}.vxe-icon-arrow-double-left:before{content:""}.vxe-icon-arrow-double-right:before{content:""}.vxe-icon-menu:before{content:""}.vxe-icon-warning-triangle-fill:before{content:""}.vxe-icon-error-circle:before{content:""}.vxe-icon-zoom-out:before{content:""}.vxe-icon-success-circle-fill:before{content:""}.vxe-icon-radio-checked:before{content:""}.vxe-icon-radio-unchecked:before{content:""}.vxe-cell--filter{padding:0 .1em 0 .25em;text-align:center;vertical-align:middle;display:inline-block;line-height:0}.vxe-cell--filter.col--filter .vxe-filter--btn{color:#606266}.vxe-cell--filter .vxe-filter--btn{color:#c0c4cc;cursor:pointer}.vxe-cell--filter .vxe-filter--btn:hover{color:#606266}.is--filter-active .vxe-cell--filter .vxe-filter--btn{color:#409eff}.vxe-table--filter-wrapper{display:none;position:absolute;top:0;min-width: 6.25rem;border-radius: 0.25rem;background-color:#fff;border: 0.0625rem solid #dadce0;-webkit-box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2);box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2);z-index:10}.vxe-table--filter-wrapper:not(.is--multiple){text-align:center}.vxe-table--filter-wrapper.is--active{display:block}.vxe-table--filter-wrapper .vxe-table--filter-body>li,.vxe-table--filter-wrapper .vxe-table--filter-header>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width: 22.5rem;padding:.25em .8em;cursor:pointer}.vxe-table--filter-wrapper .vxe-table--filter-body>li.is--checked,.vxe-table--filter-wrapper .vxe-table--filter-header>li.is--checked{color:#409eff}.vxe-table--filter-wrapper .vxe-table--filter-body>li:hover,.vxe-table--filter-wrapper .vxe-table--filter-header>li:hover{background-color:#f5f7fa}.vxe-table--filter-wrapper .vxe-table--filter-header{padding-top:.2em}.vxe-table--filter-wrapper .vxe-table--filter-body{max-height: 12.5rem;padding-bottom:.2em}.vxe-table--filter-wrapper>ul{list-style-type:none;padding:0;margin:0;overflow:auto;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-table--filter-wrapper.is--multiple>ul>li{padding:.25em .8em .25em 1em}.vxe-table--filter-wrapper .vxe-table--filter-footer{border-top: 0.0625rem solid #dadce0;padding:.6em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-table--filter-wrapper .vxe-table--filter-footer button{background-color:transparent;padding:0 .4em;border:0;color:#606266;cursor:pointer}.vxe-table--filter-wrapper .vxe-table--filter-footer button:focus{outline:none}.vxe-table--filter-wrapper .vxe-table--filter-footer button:hover{color:#409eff}.vxe-table--filter-wrapper .vxe-table--filter-footer button.is--disabled{color:#bfbfbf;cursor:not-allowed}.vxe-table--context-menu-clild-wrapper,.vxe-table--context-menu-wrapper{position:absolute;top:0;left:0;font-size: 0.75rem;border: 0.0625rem solid #dadce0;-webkit-box-shadow: 0.1875rem 0.1875rem 0.25rem -0.125rem rgba(0,0,0,.6);box-shadow: 0.1875rem 0.1875rem 0.25rem -0.125rem rgba(0,0,0,.6);padding:0 0.0625rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;background-color:#fff}.vxe-context-menu--link{display:block;padding:0 2.5em;width: 11.125rem;line-height: 1.625rem;color:#606266;cursor:pointer}.vxe-context-menu--link .vxe-context-menu--link-prefix,.vxe-context-menu--link .vxe-context-menu--link-suffix{position:absolute;top: 0.3125rem;margin-right: 0.3125rem;font-size: 1rem}.vxe-context-menu--link .vxe-context-menu--link-prefix{left: 0.3125rem}.vxe-context-menu--link .vxe-context-menu--link-suffix{right: 0.3125rem}.vxe-context-menu--link .vxe-context-menu--link-suffix.suffix--haschild{top: 0.5rem}.vxe-context-menu--link .vxe-context-menu--link-suffix.suffix--haschild:before{position:absolute;content:"";border: 0.25rem solid transparent;border-left-color:#727272}.vxe-context-menu--link .vxe-context-menu--link-content{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-table--context-menu-clild-wrapper .vxe-context-menu--link{padding:0 2em 0 2.5em}.vxe-context-menu--option-wrapper,.vxe-table--context-menu-clild-wrapper{margin:0;padding:0;list-style-type:none;border-bottom: 0.0625rem solid #e8eaed}.vxe-context-menu--option-wrapper li,.vxe-table--context-menu-clild-wrapper li{position:relative;margin: 0.0625rem 0;border: 0.0625rem solid transparent}.vxe-context-menu--option-wrapper li:last-child,.vxe-table--context-menu-clild-wrapper li:last-child{border:0}.vxe-context-menu--option-wrapper li.link--active,.vxe-table--context-menu-clild-wrapper li.link--active{background-color:#c5c5c5;border-color:#c5c5c5}.vxe-context-menu--option-wrapper li.link--active>.vxe-context-menu--link,.vxe-table--context-menu-clild-wrapper li.link--active>.vxe-context-menu--link{color:#2b2b2b}.vxe-context-menu--option-wrapper li.link--disabled>.vxe-context-menu--link,.vxe-table--context-menu-clild-wrapper li.link--disabled>.vxe-context-menu--link{color:#bfbfbf;cursor:no-drop}.vxe-context-menu--option-wrapper li.link--disabled.link--active,.vxe-table--context-menu-clild-wrapper li.link--disabled.link--active{border-color:#c0c1c2;background-color:#eee}.vxe-context-menu--option-wrapper li.link--disabled.link--active:hover,.vxe-table--context-menu-clild-wrapper li.link--disabled.link--active:hover{background-color:inherit}.vxe-table--context-menu-clild-wrapper{display:none;top:0;left:100%}.vxe-table--context-menu-clild-wrapper.is--show{display:block}.vxe-export--panel-column>ul{list-style-type:none;overflow:auto;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-export--panel-column>ul>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.vxe-export--panel>table{width:100%;border:0;table-layout:fixed}.vxe-export--panel>table tr td{padding:0 0.625rem}.vxe-export--panel>table tr td:first-child{text-align:right;width:30%;font-weight:700;padding: 0.5rem 0.625rem}.vxe-export--panel>table tr td:nth-child(2){width:70%}.vxe-export--panel>table tr td>.vxe-input,.vxe-export--panel>table tr td>.vxe-select{width:80%}.vxe-export--panel>table tr td>.vxe-export--panel-option-row{padding:.25em 0}.vxe-export--panel .vxe-export--panel-column{width:80%;border: 0.0625rem solid #dcdfe6;margin: 0.1875rem 0;border-radius: 0.25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-export--panel .vxe-export--panel-column>ul>li{padding:.2em 1em .2em 1em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--2{padding-left:3.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--2 .vxe-checkbox--icon{left:1.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--3{padding-left:4.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--3 .vxe-checkbox--icon{left:2.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--4{padding-left:5.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--4 .vxe-checkbox--icon{left:3.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--5{padding-left:6.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--5 .vxe-checkbox--icon{left:4.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--6{padding-left:7.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--6 .vxe-checkbox--icon{left:5.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--7{padding-left:8.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--7 .vxe-checkbox--icon{left:6.8em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--8{padding-left:9.5em}.vxe-export--panel .vxe-export--panel-column>ul>li.level--8 .vxe-checkbox--icon{left:7.8em}.vxe-export--panel .vxe-export--panel-column .vxe-export--panel-column-header{padding:.1em 0;background-color:#f8f8f9;font-weight:700;border-bottom: 0.0625rem solid #e8eaec}.vxe-export--panel .vxe-export--panel-column .vxe-export--panel-column-body{padding:.2em 0;min-height:10em;max-height:17.6em}.vxe-export--panel .vxe-import-selected--file{padding-right: 2.5rem;position:relative;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-export--panel .vxe-import-selected--file>i{display:none;position:absolute;top:50%;right: 0.9375rem;-webkit-transform:translateY(-50%);transform:translateY(-50%);font-size: 1rem;cursor:pointer}.vxe-export--panel .vxe-import-selected--file:hover{color:#409eff}.vxe-export--panel .vxe-import-selected--file:hover>i{display:block}.vxe-export--panel .vxe-import-select--file{border: 0.0625rem dashed #dcdfe6;padding: 0.375rem 2.125rem;outline:0;border-radius: 0.25rem;background-color:#fff;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.vxe-export--panel .vxe-import-select--file:focus{border-color:#409eff;-webkit-box-shadow:0 0 .25em 0 #409eff;box-shadow:0 0 .25em 0 #409eff}.vxe-export--panel .vxe-import-select--file:hover{color:#409eff;border-color:#409eff}.vxe-export--panel .vxe-export--panel-btns{text-align:right;padding:.25em}.vxe-loading{display:none;position:absolute;width:100%;height:100%;top:0;left:0;z-index:99;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:hsla(0,0%,100%,.5)}.vxe-loading.is--visible{display:block}.vxe-loading>.vxe-loading--chunk{width:100%;position:absolute;top:50%;left:0;-webkit-transform:translateY(-50%);transform:translateY(-50%);text-align:center;color:#409eff}.vxe-loading .vxe-loading--default-icon{font-size:1.4em}.vxe-loading .vxe-loading--text{padding:.4em 0}.vxe-loading .vxe-loading--spinner{display:inline-block;position:relative;width: 3.5rem;height: 3.5rem}.vxe-loading .vxe-loading--spinner:after,.vxe-loading .vxe-loading--spinner:before{content:"";width:100%;height:100%;border-radius:50%;background-color:#409eff;opacity:.6;position:absolute;top:0;left:0;-webkit-animation:bounce 2s ease-in-out infinite;animation:bounce 2s ease-in-out infinite}.vxe-loading .vxe-loading--spinner:after{-webkit-animation-delay:-1s;animation-delay:-1s}@-webkit-keyframes bounce{0%,to{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounce{0%,to{-webkit-transform:scale(0);transform:scale(0)}50%{-webkit-transform:scale(1);transform:scale(1)}}.size--mini .vxe-loading .vxe-loading--spinner{width: 2.375rem;height: 2.375rem}.size--small .vxe-loading .vxe-loading--spinner{width: 2.75rem;height: 2.75rem}.size--medium .vxe-loading .vxe-loading--spinner{width: 3.125rem;height: 3.125rem}.vxe-table--render-default .vxe-body--column.col--ellipsis,.vxe-table--render-default.vxe-editable .vxe-body--column,.vxe-table--render-default .vxe-footer--column.col--ellipsis,.vxe-table--render-default .vxe-header--column.col--ellipsis{height: 3rem}.vxe-table--render-default.size--medium .vxe-body--column.col--ellipsis,.vxe-table--render-default.size--medium .vxe-footer--column.col--ellipsis,.vxe-table--render-default.size--medium .vxe-header--column.col--ellipsis,.vxe-table--render-default.vxe-editable.size--medium .vxe-body--column{height: 2.75rem}.vxe-table--render-default.size--small .vxe-body--column.col--ellipsis,.vxe-table--render-default.size--small .vxe-footer--column.col--ellipsis,.vxe-table--render-default.size--small .vxe-header--column.col--ellipsis,.vxe-table--render-default.vxe-editable.size--small .vxe-body--column{height: 2.5rem}.vxe-table--render-default.size--mini .vxe-body--column.col--ellipsis,.vxe-table--render-default.size--mini .vxe-footer--column.col--ellipsis,.vxe-table--render-default.size--mini .vxe-header--column.col--ellipsis,.vxe-table--render-default.vxe-editable.size--mini .vxe-body--column{height: 2.25rem}.vxe-table--file-form,.vxe-table-slots{display:none}.vxe-table--print-frame{position:fixed;bottom:-100%;left:-100%;height:0;width:0;border:0}.vxe-table--body-wrapper{scroll-behavior:auto}.vxe-table--body-wrapper,.vxe-table--fixed-left-body-wrapper,.vxe-table--fixed-right-body-wrapper{overflow-y:auto;overflow-x:auto}.vxe-cell .vxe-default-input,.vxe-cell .vxe-default-textarea,.vxe-table--filter-wrapper .vxe-default-input,.vxe-table--filter-wrapper .vxe-default-textarea{background-color:#fff}.vxe-cell .vxe-default-input,.vxe-cell .vxe-default-select,.vxe-cell .vxe-default-textarea,.vxe-table--filter-wrapper .vxe-default-input,.vxe-table--filter-wrapper .vxe-default-select,.vxe-table--filter-wrapper .vxe-default-textarea{outline:0;padding:0 0.125rem;width:100%;color:#606266;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6}.vxe-cell .vxe-default-input:focus,.vxe-cell .vxe-default-select:focus,.vxe-cell .vxe-default-textarea:focus,.vxe-table--filter-wrapper .vxe-default-input:focus,.vxe-table--filter-wrapper .vxe-default-select:focus,.vxe-table--filter-wrapper .vxe-default-textarea:focus{border: 0.0625rem solid #409eff}.vxe-cell .vxe-default-input[disabled],.vxe-cell .vxe-default-select[disabled],.vxe-cell .vxe-default-textarea[disabled],.vxe-table--filter-wrapper .vxe-default-input[disabled],.vxe-table--filter-wrapper .vxe-default-select[disabled],.vxe-table--filter-wrapper .vxe-default-textarea[disabled]{cursor:not-allowed;background-color:#f3f3f3}.vxe-cell .vxe-default-input,.vxe-cell .vxe-default-select,.vxe-cell .vxe-default-textarea,.vxe-table--filter-wrapper .vxe-default-input,.vxe-table--filter-wrapper .vxe-default-select,.vxe-table--filter-wrapper .vxe-default-textarea{height: 2.125rem}.vxe-cell .vxe-default-input[type=date]::-webkit-inner-spin-button,.vxe-table--filter-wrapper .vxe-default-input[type=date]::-webkit-inner-spin-button{margin-top: 0.25rem}.vxe-cell .vxe-default-input[type=date]::-webkit-inner-spin-button,.vxe-cell .vxe-default-input[type=number]::-webkit-inner-spin-button,.vxe-table--filter-wrapper .vxe-default-input[type=date]::-webkit-inner-spin-button,.vxe-table--filter-wrapper .vxe-default-input[type=number]::-webkit-inner-spin-button{height: 1.5rem}.vxe-cell .vxe-default-input::-webkit-input-placeholder,.vxe-table--filter-wrapper .vxe-default-input::-webkit-input-placeholder{color:#c0c4cc}.vxe-cell .vxe-default-input::-moz-placeholder,.vxe-table--filter-wrapper .vxe-default-input::-moz-placeholder{color:#c0c4cc}.vxe-cell .vxe-default-input:-ms-input-placeholder,.vxe-table--filter-wrapper .vxe-default-input:-ms-input-placeholder{color:#c0c4cc}.vxe-cell .vxe-default-input::-ms-input-placeholder,.vxe-table--filter-wrapper .vxe-default-input::-ms-input-placeholder{color:#c0c4cc}.vxe-cell .vxe-default-input::placeholder,.vxe-table--filter-wrapper .vxe-default-input::placeholder{color:#c0c4cc}.vxe-cell .vxe-default-textarea,.vxe-table--filter-wrapper .vxe-default-textarea{resize:none;vertical-align:middle}.vxe-cell .vxe-input,.vxe-cell .vxe-select,.vxe-cell .vxe-textarea,.vxe-table--filter-wrapper .vxe-input,.vxe-table--filter-wrapper .vxe-select,.vxe-table--filter-wrapper .vxe-textarea{width:100%;display:block}.vxe-cell .vxe-input>.vxe-input--inner,.vxe-cell .vxe-textarea>.vxe-textarea--inner,.vxe-table--filter-wrapper .vxe-input>.vxe-input--inner,.vxe-table--filter-wrapper .vxe-textarea>.vxe-textarea--inner{padding:0 0.125rem}.vxe-cell .vxe-default-textarea,.vxe-cell .vxe-textarea--inner,.vxe-table--filter-wrapper .vxe-default-textarea,.vxe-table--filter-wrapper .vxe-textarea--inner{resize:none}.vxe-table--cell-active-area,.vxe-table--cell-copy-area,.vxe-table--cell-extend-area,.vxe-table--cell-main-area,.vxe-table--checkbox-range{display:none;position:absolute;pointer-events:none;z-index:1}.vxe-table--fixed-left-wrapper .vxe-table--cell-active-area,.vxe-table--fixed-left-wrapper .vxe-table--cell-copy-area,.vxe-table--fixed-left-wrapper .vxe-table--cell-extend-area,.vxe-table--fixed-left-wrapper .vxe-table--cell-main-area,.vxe-table--fixed-left-wrapper .vxe-table--checkbox-range,.vxe-table--fixed-right-wrapper .vxe-table--cell-active-area,.vxe-table--fixed-right-wrapper .vxe-table--cell-copy-area,.vxe-table--fixed-right-wrapper .vxe-table--cell-extend-area,.vxe-table--fixed-right-wrapper .vxe-table--cell-main-area,.vxe-table--fixed-right-wrapper .vxe-table--checkbox-range{z-index:2}.vxe-table--fixed-left-wrapper .vxe-table--cell-active-area[half="1"],.vxe-table--fixed-left-wrapper .vxe-table--cell-extend-area[half="1"],.vxe-table--fixed-left-wrapper .vxe-table--cell-main-area[half="1"]{border-right:0}.vxe-table--fixed-left-wrapper .vxe-table--cell-copy-area[half="1"]{background-size: 0.1875rem 0.75rem,0 0.75rem, 0.75rem 0.1875rem, 0.75rem 0.1875rem}.vxe-table--fixed-right-wrapper .vxe-table--cell-active-area[half="1"],.vxe-table--fixed-right-wrapper .vxe-table--cell-extend-area[half="1"],.vxe-table--fixed-right-wrapper .vxe-table--cell-main-area[half="1"]{border-left:0}.vxe-table--fixed-right-wrapper .vxe-table--cell-copy-area[half="1"]{background-size:0 0.75rem, 0.1875rem 0.75rem, 0.75rem 0.1875rem, 0.75rem 0.1875rem}.vxe-table--checkbox-range{background-color:rgba(50,128,252,.2);border: 0.0625rem solid #006af1}.vxe-table--cell-area{height:0;font-size:0;display:none}.vxe-table--cell-area>.vxe-table--cell-main-area{background-color:rgba(64,158,255,.2);border: 0.0625rem solid #409eff}.vxe-table--cell-area .vxe-table--cell-main-area-btn{display:none;position:absolute;right: -0.0625rem;bottom: -0.0625rem;width: 0.4375rem;height: 0.4375rem;border-style:solid;border-color:#fff;border-width: 0.0625rem 0 0 0.0625rem;background-color:#409eff;pointer-events:auto;cursor:crosshair}.vxe-table--cell-area .vxe-table--cell-extend-area{border: 0.125rem solid #409eff}@-webkit-keyframes moveCopyCellBorder{to{background-position:0 -0.75rem,100% 0.75rem, 0.75rem 0, -0.75rem 100%}}@keyframes moveCopyCellBorder{to{background-position:0 -0.75rem,100% 0.75rem, 0.75rem 0, -0.75rem 100%}}.vxe-table--cell-copy-area{background:linear-gradient(0deg,transparent 0.375rem,#409eff 0) repeat-y,linear-gradient(0deg,transparent 50%,#409eff 0) repeat-y,linear-gradient(90deg,transparent 50%,#409eff 0) repeat-x,linear-gradient(90deg,transparent 50%,#409eff 0) repeat-x;background-size: 0.1875rem 0.75rem, 0.1875rem 0.75rem, 0.75rem 0.1875rem, 0.75rem 0.1875rem;background-position:0 0,100% 0,0 0,0 100%;-webkit-animation:moveCopyCellBorder .5s linear infinite;animation:moveCopyCellBorder .5s linear infinite}.vxe-table--cell-active-area{border: 0.125rem solid #409eff}.vxe-table--cell-multi-area>.vxe-table--cell-main-area{background-color:rgba(64,158,255,.2)}.vxe-table--render-default.is--round .vxe-table--border-line,.vxe-table--render-default.is--round .vxe-table--render-default.is--round,.vxe-table--render-default.is--round:not(.is--header):not(.is--footer) .vxe-table--body-wrapper.body--wrapper{border-radius: 0.25rem}.vxe-table--render-default.is--round.is--footer:not(.is--header) .vxe-table--body-wrapper.body--wrapper,.vxe-table--render-default.is--round.is--header .vxe-table--header-wrapper.body--wrapper{border-radius: 0.25rem 0.25rem 0 0}.vxe-table--render-default.is--round.is--header .vxe-table--header-wrapper.fixed-left--wrapper{border-radius: 0.25rem 0 0 0}.vxe-table--render-default.is--round.is--header .vxe-table--header-wrapper.fixed-right--wrapper{border-radius:0 0.25rem 0 0}.vxe-table--render-default.is--round.is--footer .vxe-table--footer-wrapper.body--wrapper,.vxe-table--render-default.is--round.is--header:not(.is--footer) .vxe-table--body-wrapper.body--wrapper{border-radius:0 0 0.25rem 0.25rem}.vxe-table--render-default.is--round.is--footer .vxe-table--footer-wrapper.fixed-left--wrapper,.vxe-table--render-default.is--round.is--footer:not(.is--header) .vxe-table--body-wrapper.fixed-left--wrapper,.vxe-table--render-default.is--round.is--header:not(.is--footer) .vxe-table--body-wrapper.fixed-left--wrapper{border-radius:0 0 0 0.25rem}.vxe-table--render-default.is--round.is--footer .vxe-table--footer-wrapper.fixed-right--wrapper,.vxe-table--render-default.is--round.is--footer:not(.is--header) .vxe-table--body-wrapper.fixed-right--wrapper,.vxe-table--render-default.is--round.is--header:not(.is--footer) .vxe-table--body-wrapper.fixed-right--wrapper{border-radius:0 0 0.25rem 0}.vxe-table .vxe-table--header-wrapper{color:#606266}.vxe-table .vxe-table--header-wrapper .vxe-table--header-border-line{position:absolute;left:0;bottom:0;height:0;border-bottom: 0.0625rem solid #e8eaec}.vxe-table .vxe-cell--sort{width:1.5em;height:1.35em;vertical-align:middle;text-align:center;display:inline-block;position:relative}.vxe-table .vxe-sort--asc-btn,.vxe-table .vxe-sort--desc-btn{position:absolute;left:.2em;color:#c0c4cc;width:1em;text-align:center;height:.8em;line-height:.8em;cursor:pointer}.vxe-table .vxe-sort--asc-btn:hover,.vxe-table .vxe-sort--desc-btn:hover{color:#606266}.vxe-table .vxe-sort--asc-btn.sort--active,.vxe-table .vxe-sort--desc-btn.sort--active{color:#409eff}.vxe-table .vxe-sort--asc-btn{top:-.1em}.vxe-table .vxe-sort--desc-btn{bottom:-.2em}.vxe-header--column{position:relative;font-weight:700}.vxe-header--column.col--ellipsis>.vxe-cell{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-header--column.col--ellipsis>.vxe-cell .vxe-cell--title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-header--column.col--ellipsis>.vxe-cell>i:not(.vxe-cell--title),.vxe-header--column.col--ellipsis>.vxe-cell>span:not(.vxe-cell--title){-ms-flex-negative:0;flex-shrink:0}.vxe-header--column .vxe-cell--required-icon{display:inline-block;color:#f56c6c;width:.8em;height:1em;line-height:1em;font-family:Verdana,Arial,Tahoma;font-weight:400;position:relative}.vxe-header--column .vxe-cell--required-icon:before{content:"*";position:absolute;left:0;top:.2em}.vxe-header--column .vxe-cell--required-icon{margin-right:.1em}.vxe-header--column .vxe-cell--edit-icon,.vxe-header--column .vxe-cell-help-icon{margin-right:.2em}.vxe-header--column .vxe-cell-help-icon{cursor:help}.vxe-header--column .vxe-resizable{position:absolute;right: -0.4375rem;bottom:0;width: 0.875rem;height:100%;text-align:center;z-index:1;cursor:col-resize}.vxe-header--column .vxe-resizable.is--line:after,.vxe-header--column .vxe-resizable.is--line:before{content:"";display:inline-block;vertical-align:middle}.vxe-header--column .vxe-resizable.is--line:before{width: 0.0625rem;height:50%;background-color:#d9dddf}.vxe-header--column .vxe-resizable.is--line:after{width:0;height:100%}.vxe-table--fixed-right-wrapper .vxe-header--column .vxe-resizable{right:auto;left: -0.4375rem}.vxe-table--render-default{position:relative;font-size: 0.875rem;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;direction:ltr}.vxe-table--render-default .vxe-table--body-wrapper,.vxe-table--render-default .vxe-table--footer-wrapper{background-color:#fff}.vxe-table--render-default .vxe-table--body,.vxe-table--render-default .vxe-table--footer,.vxe-table--render-default .vxe-table--header{border:0;border-spacing:0;border-collapse:separate;table-layout:fixed}.vxe-table--render-default .vxe-table--footer-wrapper,.vxe-table--render-default .vxe-table--header-wrapper{overflow-x:hidden;overflow-y:hidden}.vxe-table--render-default:not(.is--empty).is--footer.is--scroll-x .vxe-table--body-wrapper{overflow-x:scroll}.vxe-table--render-default .vxe-body--row.row--stripe{background-color:#fafafa}.vxe-table--render-default .vxe-body--row.row--checked,.vxe-table--render-default .vxe-body--row.row--radio{background-color:#fff3e0}.vxe-table--render-default .vxe-body--row.row--current{background-color:#e6f7ff}.vxe-table--render-default .vxe-body--row.row--hover,.vxe-table--render-default .vxe-body--row.row--hover.row--stripe{background-color:#f5f7fa}.vxe-table--render-default .vxe-body--row.row--hover.row--checked,.vxe-table--render-default .vxe-body--row.row--hover.row--radio{background-color:#ffebbc}.vxe-table--render-default .vxe-body--row.row--hover.row--current{background-color:#d7effb}.vxe-table--render-default.drag--resize .vxe-table--fixed-left-wrapper *,.vxe-table--render-default.drag--resize .vxe-table--fixed-right-wrapper *,.vxe-table--render-default.drag--resize .vxe-table--main-wrapper *{cursor:col-resize}.vxe-table--render-default.drag--area .vxe-table--fixed-left-wrapper *,.vxe-table--render-default.drag--area .vxe-table--fixed-right-wrapper *,.vxe-table--render-default.drag--area .vxe-table--main-wrapper *,.vxe-table--render-default.drag--range .vxe-table--fixed-left-wrapper *,.vxe-table--render-default.drag--range .vxe-table--fixed-right-wrapper *,.vxe-table--render-default.drag--range .vxe-table--main-wrapper *{cursor:default}.vxe-table--render-default.drag--extend-range .vxe-table--fixed-left-wrapper *,.vxe-table--render-default.drag--extend-range .vxe-table--fixed-right-wrapper *,.vxe-table--render-default.drag--extend-range .vxe-table--main-wrapper *{cursor:crosshair}.vxe-table--render-default.column--highlight .vxe-header--column:not(.col--seq):hover{background-color:#d7effb}.vxe-table--render-default.cell--area .vxe-table--main-wrapper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-table--render-default .vxe-body--column,.vxe-table--render-default .vxe-footer--column,.vxe-table--render-default .vxe-header--column{position:relative;line-height: 1.375rem;text-align:left}.vxe-table--render-default .vxe-body--column:not(.col--ellipsis),.vxe-table--render-default .vxe-footer--column:not(.col--ellipsis),.vxe-table--render-default .vxe-header--column:not(.col--ellipsis){padding: 0.8125rem 0}.vxe-table--render-default .vxe-body--column.col--current,.vxe-table--render-default .vxe-footer--column.col--current,.vxe-table--render-default .vxe-header--column.col--current{background-color:#e6f7ff}.vxe-table--render-default .vxe-body--column.col--center,.vxe-table--render-default .vxe-footer--column.col--center,.vxe-table--render-default .vxe-header--column.col--center{text-align:center}.vxe-table--render-default .vxe-body--column.col--right,.vxe-table--render-default .vxe-footer--column.col--right,.vxe-table--render-default .vxe-header--column.col--right{text-align:right}.vxe-table--render-default .vxe-footer--column.col--ellipsis.col--center .vxe-cell,.vxe-table--render-default .vxe-header--column.col--ellipsis.col--center .vxe-cell{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.vxe-table--render-default .vxe-footer--column.col--ellipsis.col--right .vxe-cell,.vxe-table--render-default .vxe-header--column.col--ellipsis.col--right .vxe-cell{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.vxe-table--render-default .vxe-body--column.col--checkbox{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-table--render-default .vxe-table--footer-wrapper{border-top: 0.0625rem solid #e8eaec}.vxe-table--render-default.border--default .vxe-table--header-wrapper,.vxe-table--render-default.border--full .vxe-table--header-wrapper,.vxe-table--render-default.border--outer .vxe-table--header-wrapper{background-color:#f8f8f9}.vxe-table--render-default.border--default .vxe-body--column,.vxe-table--render-default.border--default .vxe-footer--column,.vxe-table--render-default.border--default .vxe-header--column,.vxe-table--render-default.border--inner .vxe-body--column,.vxe-table--render-default.border--inner .vxe-footer--column,.vxe-table--render-default.border--inner .vxe-header--column{background-image:-webkit-gradient(linear,left top,left bottom,from(#e8eaec),to(#e8eaec));background-image:linear-gradient(#e8eaec,#e8eaec);background-repeat:no-repeat;background-size:100% 0.0625rem;background-position:100% 100%}.vxe-table--render-default.border--full .vxe-body--column,.vxe-table--render-default.border--full .vxe-footer--column,.vxe-table--render-default.border--full .vxe-header--column{background-image:-webkit-gradient(linear,left top,left bottom,from(#e8eaec),to(#e8eaec)),-webkit-gradient(linear,left top,left bottom,from(#e8eaec),to(#e8eaec));background-image:linear-gradient(#e8eaec,#e8eaec),linear-gradient(#e8eaec,#e8eaec);background-repeat:no-repeat;background-size: 0.0625rem 100%,100% 0.0625rem;background-position:100% 0,100% 100%}.vxe-table--render-default.border--full .vxe-table--fixed-left-wrapper .vxe-body--column{border-right-color:#e8eaec}.vxe-table--render-default.border--default .vxe-table--header-wrapper .vxe-header--row:last-child .vxe-header--gutter,.vxe-table--render-default.border--full .vxe-table--header-wrapper .vxe-header--row:last-child .vxe-header--gutter,.vxe-table--render-default.border--inner .vxe-table--header-wrapper .vxe-header--row:last-child .vxe-header--gutter,.vxe-table--render-default.border--outer .vxe-table--header-wrapper .vxe-header--row:last-child .vxe-header--gutter{background-image:-webkit-gradient(linear,left top,left bottom,from(#e8eaec),to(#e8eaec));background-image:linear-gradient(#e8eaec,#e8eaec);background-repeat:no-repeat;background-size:100% 0.0625rem;background-position:100% 100%}.vxe-table--render-default.border--inner .vxe-table--header-wrapper,.vxe-table--render-default.border--none .vxe-table--header-wrapper{background-color:#fff}.vxe-table--render-default.border--inner .vxe-table--fixed-left-wrapper,.vxe-table--render-default.border--none .vxe-table--fixed-left-wrapper{border-right:0}.vxe-table--render-default.border--inner .vxe-table--border-line{border-width:0 0 0.0625rem 0}.vxe-table--render-default.border--none .vxe-table--border-line,.vxe-table--render-default.border--none .vxe-table--header-border-line{display:none}.vxe-table--render-default.size--medium{font-size: 0.875rem}.vxe-table--render-default.size--medium .vxe-table--empty-block,.vxe-table--render-default.size--medium .vxe-table--empty-placeholder{min-height: 2.75rem}.vxe-table--render-default.size--medium .vxe-body--column:not(.col--ellipsis),.vxe-table--render-default.size--medium .vxe-footer--column:not(.col--ellipsis),.vxe-table--render-default.size--medium .vxe-header--column:not(.col--ellipsis){padding: 0.6875rem 0}.vxe-table--render-default.size--medium .vxe-cell .vxe-default-input,.vxe-table--render-default.size--medium .vxe-cell .vxe-default-select,.vxe-table--render-default.size--medium .vxe-cell .vxe-default-textarea{height: 2rem}.vxe-table--render-default.size--medium .vxe-cell .vxe-default-input[type=date]::-webkit-inner-spin-button{margin-top: 0.1875rem}.vxe-table--render-default.size--small{font-size: 0.8125rem}.vxe-table--render-default.size--small .vxe-table--empty-block,.vxe-table--render-default.size--small .vxe-table--empty-placeholder{min-height: 2.5rem}.vxe-table--render-default.size--small .vxe-body--column:not(.col--ellipsis),.vxe-table--render-default.size--small .vxe-footer--column:not(.col--ellipsis),.vxe-table--render-default.size--small .vxe-header--column:not(.col--ellipsis){padding: 0.5625rem 0}.vxe-table--render-default.size--small .vxe-cell .vxe-default-input,.vxe-table--render-default.size--small .vxe-cell .vxe-default-select,.vxe-table--render-default.size--small .vxe-cell .vxe-default-textarea{height: 1.875rem}.vxe-table--render-default.size--small .vxe-cell .vxe-default-input[type=date]::-webkit-inner-spin-button{margin-top: 0.125rem}.vxe-table--render-default.size--mini{font-size: 0.75rem}.vxe-table--render-default.size--mini .vxe-table--empty-block,.vxe-table--render-default.size--mini .vxe-table--empty-placeholder{min-height: 2.25rem}.vxe-table--render-default.size--mini .vxe-body--column:not(.col--ellipsis),.vxe-table--render-default.size--mini .vxe-footer--column:not(.col--ellipsis),.vxe-table--render-default.size--mini .vxe-header--column:not(.col--ellipsis){padding: 0.4375rem 0}.vxe-table--render-default.size--mini .vxe-cell .vxe-default-input,.vxe-table--render-default.size--mini .vxe-cell .vxe-default-select,.vxe-table--render-default.size--mini .vxe-cell .vxe-default-textarea{height: 1.75rem}.vxe-table--render-default.size--mini .vxe-cell .vxe-default-input[type=date]::-webkit-inner-spin-button{margin-top: 0.0625rem}.vxe-table--render-default .vxe-cell{white-space:pre-line;word-break:break-all;padding-left: 0.625rem;padding-right: 0.625rem}.vxe-table--render-default .vxe-cell--placeholder{color:#c0c4cc}.vxe-table--render-default .fixed--hidden{visibility:hidden}.vxe-table--render-default .vxe-table--fixed-left-wrapper,.vxe-table--render-default .vxe-table--fixed-right-wrapper{width:100%;position:absolute;top:0;z-index:5;overflow:hidden;background-color:inherit;-webkit-transition:box-shadow .3s;transition:box-shadow .3s}.vxe-table--render-default .vxe-table--fixed-left-wrapper .vxe-table--body-wrapper,.vxe-table--render-default .vxe-table--fixed-right-wrapper .vxe-table--body-wrapper{overflow-x:hidden}.vxe-table--render-default .vxe-table--fixed-left-wrapper .vxe-table--body-wrapper{width:calc(100% + 2.5rem)}.vxe-table--render-default.is--header .vxe-table--fixed-left-wrapper .vxe-table--body-wrapper:before,.vxe-table--render-default.is--header .vxe-table--fixed-right-wrapper .vxe-table--body-wrapper:before{display:none}.vxe-table--render-default .vxe-table--fixed-left-wrapper{left:0;width: 12.5rem}.vxe-table--render-default .vxe-table--fixed-left-wrapper.scrolling--middle{-webkit-box-shadow: 0.25rem 0.1875rem 0.25rem 0 rgba(0,0,0,.12);box-shadow: 0.25rem 0.1875rem 0.25rem 0 rgba(0,0,0,.12)}.vxe-table--render-default .vxe-table--fixed-right-wrapper{right:0}.vxe-table--render-default .vxe-table--fixed-right-wrapper.scrolling--middle{-webkit-box-shadow: -0.25rem 0.1875rem 0.25rem 0 rgba(0,0,0,.12);box-shadow: -0.25rem 0.1875rem 0.25rem 0 rgba(0,0,0,.12)}.vxe-table--render-default .vxe-table--body-wrapper,.vxe-table--render-default .vxe-table--footer-wrapper,.vxe-table--render-default .vxe-table--header-wrapper{position:relative}.vxe-table--render-default .vxe-table--body-wrapper.fixed-left--wrapper,.vxe-table--render-default .vxe-table--body-wrapper.fixed-right--wrapper,.vxe-table--render-default .vxe-table--footer-wrapper.fixed-left--wrapper,.vxe-table--render-default .vxe-table--footer-wrapper.fixed-right--wrapper,.vxe-table--render-default .vxe-table--header-wrapper.fixed-left--wrapper,.vxe-table--render-default .vxe-table--header-wrapper.fixed-right--wrapper{position:absolute;top:0}.vxe-table--render-default .vxe-table--body-wrapper.fixed-left--wrapper,.vxe-table--render-default .vxe-table--footer-wrapper.fixed-left--wrapper,.vxe-table--render-default .vxe-table--header-wrapper.fixed-left--wrapper{left:0}.vxe-table--render-default .vxe-table--body-wrapper.fixed-right--wrapper,.vxe-table--render-default .vxe-table--footer-wrapper.fixed-right--wrapper,.vxe-table--render-default .vxe-table--header-wrapper.fixed-right--wrapper{right:0;overflow-y:auto}.vxe-table--render-default .vxe-body--x-space{width:100%;height: 0.0625rem;margin-bottom: -0.0625rem}.vxe-table--render-default .vxe-body--y-space{width:0;float:left}.vxe-table--render-default .vxe-table--resizable-bar{display:none;position:absolute;top:0;left:0;width: 0.0625rem;height:100%;z-index:9;cursor:col-resize}.vxe-table--render-default .vxe-table--resizable-bar:before{content:"";display:block;height:100%;background-color:#409eff}.vxe-table--render-default .vxe-table--border-line{position:absolute;top:0;left:0;width:100%;height:100%;z-index:10;pointer-events:none;border: 0.0625rem solid #e8eaec}.vxe-table--render-default.is--tree-line .vxe-body--row:first-child .vxe-tree--line{border-width:0 0 0.0625rem 0}.vxe-table--render-default.is--tree-line .vxe-body--row .vxe-body--column{background-image:none}.vxe-table--render-default .vxe-tree--line-wrapper{position:relative;display:block;height:0}.vxe-table--render-default .vxe-tree--line{content:"";position:absolute;bottom:-.9em;width:.8em;border-width:0 0 0.0625rem 0.0625rem;border-style:dotted;border-color:#909399;pointer-events:none}.vxe-table--render-default .vxe-cell--tree-node{position:relative}.vxe-table--render-default .vxe-tree--btn-wrapper{position:absolute;top:50%;width:1em;height:1em;text-align:center;-webkit-transform:translateY(-50%);transform:translateY(-50%);z-index:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.vxe-table--render-default .vxe-tree--node-btn{display:block;color:#939599}.vxe-table--render-default .vxe-tree--node-btn:hover{color:#606266}.vxe-table--render-default .vxe-tree-cell{display:block;padding-left:1.5em}.vxe-table--render-default .vxe-body--column.col--ellipsis>.vxe-cell .vxe-tree-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-table--render-default .vxe-table--expanded{cursor:pointer}.vxe-table--render-default .vxe-table--expanded .vxe-table--expand-btn{display:inline-block;width:1em;height:1em;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:#939599}.vxe-table--render-default .vxe-table--expanded .vxe-table--expand-btn:hover{color:#606266}.vxe-table--render-default .vxe-table--expanded+.vxe-table--expand-label{padding-left:.5em}.vxe-table--render-default .vxe-body--expanded-column{border-bottom: 0.0625rem solid #e8eaec}.vxe-table--render-default .vxe-body--expanded-column.col--ellipsis>.vxe-body--expanded-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-table--render-default .vxe-body--expanded-cell{position:relative;z-index:1}.vxe-table--render-default .vxe-body--expanded-cell.is--ellipsis{overflow:auto}.vxe-table--render-default .vxe-body--column.col--ellipsis>.vxe-cell,.vxe-table--render-default .vxe-footer--column.col--ellipsis>.vxe-cell,.vxe-table--render-default .vxe-header--column.col--ellipsis>.vxe-cell{max-height: 3rem}.vxe-table--render-default.size--medium .vxe-body--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--medium .vxe-footer--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--medium .vxe-header--column.col--ellipsis>.vxe-cell{max-height: 2.75rem}.vxe-table--render-default.size--medium .vxe-cell--checkbox,.vxe-table--render-default.size--medium .vxe-cell--radio{font-size: 0.875rem}.vxe-table--render-default.size--small .vxe-body--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--small .vxe-footer--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--small .vxe-header--column.col--ellipsis>.vxe-cell{max-height: 2.5rem}.vxe-table--render-default.size--small .vxe-cell--checkbox,.vxe-table--render-default.size--small .vxe-cell--radio{font-size: 0.8125rem}.vxe-table--render-default.size--mini .vxe-body--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--mini .vxe-footer--column.col--ellipsis>.vxe-cell,.vxe-table--render-default.size--mini .vxe-header--column.col--ellipsis>.vxe-cell{max-height: 2.25rem}.vxe-table--render-default.size--mini .vxe-cell--checkbox,.vxe-table--render-default.size--mini .vxe-cell--radio{font-size: 0.75rem}.vxe-table--render-default .vxe-table--empty-block,.vxe-table--render-default .vxe-table--empty-placeholder{min-height: 3rem;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;text-align:center;overflow:hidden;width:100%;pointer-events:none}.vxe-table--render-default .vxe-table--empty-block{display:none;visibility:hidden}.vxe-table--render-default .vxe-table--empty-placeholder{display:none;position:absolute;top:0;z-index:5}.vxe-table--render-default .vxe-table--empty-content{display:block;width:50%;pointer-events:auto}.vxe-table--render-default.is--empty .vxe-table--empty-block,.vxe-table--render-default.is--empty .vxe-table--empty-placeholder{display:-webkit-box;display:-ms-flexbox;display:flex}.vxe-table--render-default .vxe-body--column.col--selected{-webkit-box-shadow:inset 0 0 0 0.125rem #409eff;box-shadow:inset 0 0 0 0.125rem #409eff}.vxe-table--render-default .vxe-body--column.col--actived,.vxe-table--render-default .vxe-body--column.col--selected{position:relative}.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-cell--valid{width: 20rem;position:absolute;bottom:calc(100% + 0.25rem);left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);text-align:center;pointer-events:none;z-index:4}.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-cell--valid .vxe-cell--valid-msg{display:inline-block;border-radius: 0.25rem;padding: 0.5rem 0.75rem;color:#fff;background-color:#f56c6c;pointer-events:auto}.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-default-input,.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-default-select,.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-default-textarea,.vxe-table--render-default .vxe-body--column.col--valid-error .vxe-input>.vxe-input--inner{border-color:#f56c6c}.vxe-table--render-default .vxe-body--row:first-child .vxe-cell--valid{bottom:auto;top:calc(100% + 0.25rem)}.vxe-table--render-default .vxe-body--column:first-child .vxe-cell--valid{left: 0.625rem;-webkit-transform:translateX(0);transform:translateX(0);text-align:left}.vxe-table--render-default .vxe-body--row.row--new>.vxe-body--column{position:relative}.vxe-table--render-default .vxe-body--row.row--new>.vxe-body--column:before{content:"";top: -0.3125rem;left: -0.3125rem;position:absolute;border-width: 0.3125rem;border-style:solid;border-color:transparent #19a15f transparent transparent;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.vxe-table--render-default .vxe-body--column.col--dirty{position:relative}.vxe-table--render-default .vxe-body--column.col--dirty:before{content:"";top: -0.3125rem;left: -0.3125rem;position:absolute;border-width: 0.3125rem;border-style:solid;border-color:transparent #f56c6c transparent transparent;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived{-webkit-box-shadow:inset 0 0 0 0.125rem #409eff;box-shadow:inset 0 0 0 0.125rem #409eff}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived.col--valid-error{-webkit-box-shadow:inset 0 0 0 0.125rem #f56c6c;box-shadow:inset 0 0 0 0.125rem #f56c6c}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-default-input,.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-default-textarea{border:0;padding:0}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-default-input{height: 1.375rem}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-input .vxe-input--inner{border:0;padding-left:0}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-textarea{height: 1.3125rem}.vxe-table--render-default.vxe-editable.cell--highlight .vxe-body--column.col--actived .vxe-cell .vxe-textarea .vxe-textarea--inner{border:0}.vxe-table--render-default.vxe-editable .vxe-body--column,.vxe-table--render-default.vxe-editable .vxe-body--column.col--actived{padding:0}.vxe-table--footer-wrapper{color:#606266;margin-top: -0.0625rem}.vxe-table--footer-wrapper.body--wrapper{overflow-x:auto}.vxe-footer--column.col--ellipsis>.vxe-cell{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-footer--column.col--ellipsis>.vxe-cell .vxe-cell--item{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-grid{position:relative}.vxe-grid.is--loading:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:99;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:hsla(0,0%,100%,.5)}.vxe-grid.is--loading>.vxe-table .vxe-loading{background-color:transparent}.vxe-grid.is--maximize{position:fixed;top:0;left:0;width:100%;height:100%;padding:.5em 1em;background-color:#fff}.vxe-grid .vxe-body--row.row--pending{color:#f56c6c;text-decoration:line-through;cursor:no-drop}.vxe-grid .vxe-body--row.row--pending .vxe-body--column{position:relative}.vxe-grid .vxe-body--row.row--pending .vxe-body--column:after{content:"";position:absolute;top:50%;left:0;width:100%;height:0;border-bottom: 0.0625rem solid #f56c6c;z-index:1}.vxe-grid .vxe-grid--bottom-wrapper,.vxe-grid .vxe-grid--form-wrapper,.vxe-grid .vxe-grid--top-wrapper{position:relative}.vxe-grid,.vxe-grid.size--medium{font-size: 0.875rem}.vxe-grid.size--small{font-size: 0.8125rem}.vxe-grid.size--mini{font-size: 0.75rem}.vxe-toolbar{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:.6em 0;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;background-color:#fff}.vxe-toolbar:after{content:"";display:block;clear:both;height:0;overflow:hidden;visibility:hidden}.vxe-toolbar.is--perfect{border: 0.0625rem solid #e8eaec;border-bottom-width:0;background-color:#f8f8f9}.vxe-toolbar.is--loading:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:hsla(0,0%,100%,.5)}.vxe-toolbar .vxe-buttons--wrapper{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.vxe-toolbar .vxe-buttons--wrapper>.vxe-button+.vxe-button--item,.vxe-toolbar .vxe-buttons--wrapper>.vxe-button--item+.vxe-button,.vxe-toolbar .vxe-buttons--wrapper>.vxe-button--item+.vxe-button--item{margin-left:.8em}.vxe-toolbar .vxe-buttons--wrapper>.vxe-button--item{display:inline-block}.vxe-toolbar .vxe-tools--wrapper>.vxe-button+.vxe-tool--item,.vxe-toolbar .vxe-tools--wrapper>.vxe-tool--item+.vxe-button,.vxe-toolbar .vxe-tools--wrapper>.vxe-tool--item+.vxe-tool--item{margin-left:.8em}.vxe-toolbar .vxe-tools--wrapper>.vxe-tool--item{display:inline-block}.vxe-toolbar .vxe-tools--wrapper>.vxe-button{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.vxe-toolbar .vxe-buttons--wrapper,.vxe-toolbar .vxe-tools--operate,.vxe-toolbar .vxe-tools--wrapper,.vxe-toolbar .vxe-tools--wrapper>.vxe-button{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-toolbar .vxe-buttons--wrapper,.vxe-toolbar .vxe-tools--wrapper{-ms-flex-wrap:wrap;flex-wrap:wrap}.vxe-toolbar .vxe-tools--operate{-ms-flex-negative:0;flex-shrink:0}.vxe-toolbar .vxe-custom--wrapper{position:relative;margin-left:.8em}.vxe-toolbar .vxe-custom--wrapper.is--active>.vxe-button{background-color:#d9dadb;border-radius:50%}.vxe-toolbar .vxe-custom--wrapper.is--active .vxe-custom--option-wrapper{display:block}.vxe-toolbar .vxe-custom--option-wrapper{display:none;position:absolute;right: 0.125rem;text-align:left;background-color:#fff;z-index:19;border: 0.0625rem solid #e8eaec;border-radius: 0.25rem;-webkit-box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2);box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2)}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header{padding:.28em 0;font-weight:700;border-bottom: 0.0625rem solid #dadce0}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body{padding:.2em 0;max-height:17.6em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body .vxe-custom--option:hover{background-color:#f5f7fa}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li{max-width:16em;min-width:12.5em;padding:.2em 1em .2em 1em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--2,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--2{padding-left:3.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--2 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--2 .vxe-checkbox--icon{left:1.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--3,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--3{padding-left:4.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--3 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--3 .vxe-checkbox--icon{left:2.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--4,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--4{padding-left:5.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--4 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--4 .vxe-checkbox--icon{left:3.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--5,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--5{padding-left:6.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--5 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--5 .vxe-checkbox--icon{left:4.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--6,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--6{padding-left:7.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--6 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--6 .vxe-checkbox--icon{left:5.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--7,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--7{padding-left:8.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--7 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--7 .vxe-checkbox--icon{left:6.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--8,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--8{padding-left:9.5em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--body>li.level--8 .vxe-checkbox--icon,.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--header>li.level--8 .vxe-checkbox--icon{left:7.8em}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer{border-top: 0.0625rem solid #dadce0;text-align:right}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer button{background-color:transparent;width:50%;height:2.5em;border:0;color:#606266;text-align:center;cursor:pointer}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer button:focus{outline:none}.vxe-toolbar .vxe-custom--option-wrapper .vxe-custom--footer button:hover{color:#409eff}.vxe-custom--option-wrapper .vxe-custom--body,.vxe-custom--option-wrapper .vxe-custom--header{list-style-type:none;overflow-x:hidden;overflow-y:auto;margin:0;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-custom--option-wrapper .vxe-custom--body>li,.vxe-custom--option-wrapper .vxe-custom--header>li{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-toolbar,.vxe-toolbar.size--medium{font-size: 0.875rem}.vxe-toolbar.size--small{font-size: 0.8125rem}.vxe-toolbar.size--mini{font-size: 0.75rem}.vxe-pager{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;text-align:right;background-color:#fff}.vxe-pager.is--hidden{display:none}.vxe-pager.align--left{text-align:left}.vxe-pager.align--center{text-align:center}.vxe-pager.is--loading:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:hsla(0,0%,100%,.5)}.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--num-btn,.vxe-pager .vxe-pager--prev-btn{color:inherit;outline:0;padding:0;border: 0.0625rem solid transparent}.vxe-pager .vxe-pager--jump-next:not(.is--disabled):focus,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled):focus,.vxe-pager .vxe-pager--next-btn:not(.is--disabled):focus,.vxe-pager .vxe-pager--num-btn:not(.is--disabled):focus,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled):focus{-webkit-box-shadow:0 0 .25em 0 #409eff;box-shadow:0 0 .25em 0 #409eff}.vxe-pager .vxe-pager--jump-next:not(.is--disabled):active,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled):active,.vxe-pager .vxe-pager--next-btn:not(.is--disabled):active,.vxe-pager .vxe-pager--num-btn:not(.is--disabled):active,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled):active{background-color:#f7f7f7}.vxe-pager.is--border:not(.is--background) .vxe-pager--jump-next,.vxe-pager.is--border:not(.is--background) .vxe-pager--jump-prev,.vxe-pager.is--border:not(.is--background) .vxe-pager--next-btn,.vxe-pager.is--border:not(.is--background) .vxe-pager--num-btn,.vxe-pager.is--border:not(.is--background) .vxe-pager--prev-btn,.vxe-pager.is--perfect:not(.is--background) .vxe-pager--jump-next,.vxe-pager.is--perfect:not(.is--background) .vxe-pager--jump-prev,.vxe-pager.is--perfect:not(.is--background) .vxe-pager--next-btn,.vxe-pager.is--perfect:not(.is--background) .vxe-pager--num-btn,.vxe-pager.is--perfect:not(.is--background) .vxe-pager--prev-btn{border-color:#dcdfe6}.vxe-pager.is--background .vxe-pager--jump-next,.vxe-pager.is--background .vxe-pager--jump-prev,.vxe-pager.is--background .vxe-pager--next-btn,.vxe-pager.is--background .vxe-pager--num-btn,.vxe-pager.is--background .vxe-pager--prev-btn,.vxe-pager.is--perfect .vxe-pager--jump-next,.vxe-pager.is--perfect .vxe-pager--jump-prev,.vxe-pager.is--perfect .vxe-pager--next-btn,.vxe-pager.is--perfect .vxe-pager--num-btn,.vxe-pager.is--perfect .vxe-pager--prev-btn{background-color:#f4f4f5}.vxe-pager.is--background .vxe-pager--jump-next:not(.is--disabled).is--active,.vxe-pager.is--background .vxe-pager--jump-prev:not(.is--disabled).is--active,.vxe-pager.is--background .vxe-pager--num-btn:not(.is--disabled).is--active,.vxe-pager.is--perfect .vxe-pager--jump-next:not(.is--disabled).is--active,.vxe-pager.is--perfect .vxe-pager--jump-prev:not(.is--disabled).is--active,.vxe-pager.is--perfect .vxe-pager--num-btn:not(.is--disabled).is--active{color:#fff;background-color:#409eff}.vxe-pager.is--background .vxe-pager--jump-next:not(.is--disabled).is--active:hover,.vxe-pager.is--background .vxe-pager--jump-prev:not(.is--disabled).is--active:hover,.vxe-pager.is--background .vxe-pager--num-btn:not(.is--disabled).is--active:hover,.vxe-pager.is--perfect .vxe-pager--jump-next:not(.is--disabled).is--active:hover,.vxe-pager.is--perfect .vxe-pager--jump-prev:not(.is--disabled).is--active:hover,.vxe-pager.is--perfect .vxe-pager--num-btn:not(.is--disabled).is--active:hover{background-color:#5faeff}.vxe-pager.is--background .vxe-pager--jump-next:not(.is--disabled).is--active:focus,.vxe-pager.is--background .vxe-pager--jump-prev:not(.is--disabled).is--active:focus,.vxe-pager.is--background .vxe-pager--num-btn:not(.is--disabled).is--active:focus,.vxe-pager.is--perfect .vxe-pager--jump-next:not(.is--disabled).is--active:focus,.vxe-pager.is--perfect .vxe-pager--jump-prev:not(.is--disabled).is--active:focus,.vxe-pager.is--perfect .vxe-pager--num-btn:not(.is--disabled).is--active:focus{border-color:#409eff}.vxe-pager.is--background .vxe-pager--jump-next:not(.is--disabled).is--active:active,.vxe-pager.is--background .vxe-pager--jump-prev:not(.is--disabled).is--active:active,.vxe-pager.is--background .vxe-pager--num-btn:not(.is--disabled).is--active:active,.vxe-pager.is--perfect .vxe-pager--jump-next:not(.is--disabled).is--active:active,.vxe-pager.is--perfect .vxe-pager--jump-prev:not(.is--disabled).is--active:active,.vxe-pager.is--perfect .vxe-pager--num-btn:not(.is--disabled).is--active:active{border-color:#3196ff;background-color:#3196ff}.vxe-pager.is--perfect{border: 0.0625rem solid #e8eaec;border-top-width:0;background-color:#fff}.vxe-pager.is--border .vxe-pager--num-btn.is--active{border-color:#409eff}.vxe-pager .vxe-pager--wrapper{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.vxe-pager .vxe-pager--btn-icon,.vxe-pager .vxe-pager--jump-icon{position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.vxe-pager .vxe-pager--count,.vxe-pager .vxe-pager--jump,.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--left-wrapper,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--prev-btn,.vxe-pager .vxe-pager--right-wrapper,.vxe-pager .vxe-pager--sizes,.vxe-pager .vxe-pager--total{margin:0 .4em;vertical-align:middle;display:inline-block}.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--num-btn,.vxe-pager .vxe-pager--prev-btn{position:relative;cursor:pointer}.vxe-pager .vxe-pager--count,.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--left-wrapper,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--num-btn,.vxe-pager .vxe-pager--prev-btn,.vxe-pager .vxe-pager--right-wrapper{height:2.15em;line-height:2em;display:inline-block}.vxe-pager .vxe-pager--jump .vxe-pager--goto,.vxe-pager .vxe-pager--sizes>.vxe-input{height:2.15em;line-height:2.15em}.vxe-pager .vxe-pager--sizes>.vxe-select--panel .vxe-select-option{text-align:center}.vxe-pager .vxe-pager--count,.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--num-btn,.vxe-pager .vxe-pager--prev-btn{min-width:2.15em}.vxe-pager .vxe-pager--btn-wrapper{padding:0;margin:0;display:inline-block;text-align:center}.vxe-pager .vxe-pager--btn-wrapper .vxe-pager--jump-next:hover .vxe-pager--jump-more-icon,.vxe-pager .vxe-pager--btn-wrapper .vxe-pager--jump-prev:hover .vxe-pager--jump-more-icon{display:none}.vxe-pager .vxe-pager--btn-wrapper .vxe-pager--jump-next:hover .vxe-pager--jump-icon,.vxe-pager .vxe-pager--btn-wrapper .vxe-pager--jump-prev:hover .vxe-pager--jump-icon{display:inline-block}.vxe-pager .vxe-pager--btn-wrapper .vxe-pager--jump-icon{display:none}.vxe-pager .vxe-pager--jump-next,.vxe-pager .vxe-pager--jump-prev,.vxe-pager .vxe-pager--next-btn,.vxe-pager .vxe-pager--num-btn,.vxe-pager .vxe-pager--prev-btn{text-align:center;border-radius: 0.25rem;margin:0 .25em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff}.vxe-pager .vxe-pager--jump-next:not(.is--disabled):hover,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled):hover,.vxe-pager .vxe-pager--next-btn:not(.is--disabled):hover,.vxe-pager .vxe-pager--num-btn:not(.is--disabled):hover,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled):hover{color:#5faeff}.vxe-pager .vxe-pager--jump-next:not(.is--disabled).is--active,.vxe-pager .vxe-pager--jump-next:not(.is--disabled):focus,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled).is--active,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled):focus,.vxe-pager .vxe-pager--next-btn:not(.is--disabled).is--active,.vxe-pager .vxe-pager--next-btn:not(.is--disabled):focus,.vxe-pager .vxe-pager--num-btn:not(.is--disabled).is--active,.vxe-pager .vxe-pager--num-btn:not(.is--disabled):focus,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled).is--active,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled):focus{color:#409eff}.vxe-pager .vxe-pager--jump-next:not(.is--disabled):active,.vxe-pager .vxe-pager--jump-prev:not(.is--disabled):active,.vxe-pager .vxe-pager--next-btn:not(.is--disabled):active,.vxe-pager .vxe-pager--num-btn:not(.is--disabled):active,.vxe-pager .vxe-pager--prev-btn:not(.is--disabled):active{color:#3196ff}.vxe-pager .vxe-pager--jump-next.is--disabled,.vxe-pager .vxe-pager--jump-prev.is--disabled,.vxe-pager .vxe-pager--next-btn.is--disabled,.vxe-pager .vxe-pager--num-btn.is--disabled,.vxe-pager .vxe-pager--prev-btn.is--disabled{cursor:no-drop;color:#bfbfbf}.vxe-pager .vxe-pager--jump-next.is--disabled:hover,.vxe-pager .vxe-pager--jump-prev.is--disabled:hover,.vxe-pager .vxe-pager--next-btn.is--disabled:hover,.vxe-pager .vxe-pager--num-btn.is--disabled:hover,.vxe-pager .vxe-pager--prev-btn.is--disabled:hover{color:#bfbfbf}.vxe-pager .vxe-pager--num-btn{vertical-align:middle}.vxe-pager .vxe-pager--num-btn.is--active{font-weight:700}.vxe-pager .vxe-pager--sizes{width:7em;text-align:center;cursor:pointer}.vxe-pager .vxe-pager--count,.vxe-pager .vxe-pager--sizes .vxe-input--inner{text-align:center}.vxe-pager .vxe-pager--count>span{vertical-align:middle}.vxe-pager .vxe-pager--count .vxe-pager--separator{margin-right:.2em}.vxe-pager .vxe-pager--count .vxe-pager--separator:before{content:"/"}.vxe-pager .vxe-pager--jump .vxe-pager--goto{border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6;color:#606266;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out;padding:0 .4em;background-color:#fff}.vxe-pager .vxe-pager--jump .vxe-pager--goto:focus{border: 0.0625rem solid #409eff;outline:0}.vxe-pager .vxe-pager--jump .vxe-pager--goto-text{margin-right:.25em}.vxe-pager .vxe-pager--jump .vxe-pager--classifier-text{margin-left:.25em}.vxe-pager .vxe-pager--jump .vxe-pager--goto{width:3.2em;text-align:center}.vxe-pager{font-size: 0.875rem;height: 3rem}.vxe-pager.size--medium{font-size: 0.875rem;height: 2.75rem}.vxe-pager.size--small{font-size: 0.8125rem;height: 2.5rem}.vxe-pager.size--mini{font-size: 0.75rem;height: 2.25rem}.vxe-checkbox,.vxe-checkbox-group{display:inline-block;vertical-align:middle;line-height:1}.vxe-checkbox{white-space:nowrap}.vxe-checkbox+.vxe-checkbox{margin-left: 0.625rem}.vxe-checkbox>input[type=checkbox]{position:absolute;width:0;height:0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.vxe-checkbox.is--indeterminate>input:not(:checked)+.vxe-checkbox--icon{color:#409eff}.vxe-checkbox:not(.is--disabled)>input:focus+.vxe-checkbox--icon{color:#409eff;-webkit-box-shadow:0 0 .2em 0 #409eff;box-shadow:0 0 .2em 0 #409eff}.vxe-checkbox:not(.is--disabled):hover>input+.vxe-checkbox--icon{border-color:#409eff}.vxe-checkbox.is--disabled{cursor:not-allowed}.vxe-checkbox.is--disabled>input+.vxe-checkbox--icon{color:#dcdfe6}.vxe-checkbox.is--disabled>input+.vxe-checkbox--icon+.vxe-checkbox--label{color:#bfbfbf}.vxe-checkbox.is--disabled>input:checked+.vxe-checkbox--icon{color:#dcdfe6}.vxe-checkbox .vxe-checkbox--label{padding-left:.5em;vertical-align:middle;display:inline-block;max-width:50em}.vxe-checkbox,.vxe-checkbox.size--medium{font-size: 0.875rem}.vxe-checkbox.size--small{font-size: 0.8125rem}.vxe-checkbox.size--mini{font-size: 0.75rem}[class*=vxe-],[class*=vxe-]:after,[class*=vxe-] :after,[class*=vxe-]:before,[class*=vxe-] :before{-webkit-box-sizing:border-box;box-sizing:border-box}.vxe-checkbox .vxe-checkbox--label,.vxe-radio-button .vxe-radio--label,.vxe-radio .vxe-radio--label,.vxe-table--render-default .vxe-body--column.col--ellipsis:not(.col--actived)>.vxe-cell,.vxe-table--render-default .vxe-footer--column.col--ellipsis:not(.col--actived)>.vxe-cell,.vxe-table--render-default .vxe-header--column.col--ellipsis:not(.col--actived)>.vxe-cell{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}[class*=vxe-]{font-variant:tabular-nums;-webkit-font-feature-settings:"tnum";font-feature-settings:"tnum"}.vxe-primary-color{color:#409eff}.vxe-success-color{color:#67c23a}.vxe-info-color{color:#909399}.vxe-warning-color{color:#e6a23c}.vxe-danger-color{color:#f56c6c}.vxe-perfect-color{color:#f8f8f9}.vxe-row:after{content:"";display:block;clear:both;height:0;overflow:hidden;visibility:hidden}.vxe-row>.vxe-col--1{float:left;width:4.16667%}.vxe-row>.vxe-col--2{float:left;width:8.33333%}.vxe-row>.vxe-col--3{float:left;width:12.5%}.vxe-row>.vxe-col--4{float:left;width:16.66667%}.vxe-row>.vxe-col--5{float:left;width:20.83333%}.vxe-row>.vxe-col--6{float:left;width:25%}.vxe-row>.vxe-col--7{float:left;width:29.16667%}.vxe-row>.vxe-col--8{float:left;width:33.33333%}.vxe-row>.vxe-col--9{float:left;width:37.5%}.vxe-row>.vxe-col--10{float:left;width:41.66667%}.vxe-row>.vxe-col--11{float:left;width:45.83333%}.vxe-row>.vxe-col--12{float:left;width:50%}.vxe-row>.vxe-col--13{float:left;width:54.16667%}.vxe-row>.vxe-col--14{float:left;width:58.33333%}.vxe-row>.vxe-col--15{float:left;width:62.5%}.vxe-row>.vxe-col--16{float:left;width:66.66667%}.vxe-row>.vxe-col--17{float:left;width:70.83333%}.vxe-row>.vxe-col--18{float:left;width:75%}.vxe-row>.vxe-col--19{float:left;width:79.16667%}.vxe-row>.vxe-col--20{float:left;width:83.33333%}.vxe-row>.vxe-col--21{float:left;width:87.5%}.vxe-row>.vxe-col--22{float:left;width:91.66667%}.vxe-row>.vxe-col--23{float:left;width:95.83333%}.vxe-row>.vxe-col--24{float:left;width:100%}.is--animat .vxe-filter--btn:after,.is--animat .vxe-filter--btn:before,.is--animat .vxe-input--wrapper .vxe-input,.is--animat .vxe-sort--asc-btn:after,.is--animat .vxe-sort--asc-btn:before,.is--animat .vxe-sort--desc-btn:after,.is--animat .vxe-sort--desc-btn:before{-webkit-transition:border .1s ease-in-out;transition:border .1s ease-in-out}.is--animat .vxe-table--expand-btn,.is--animat .vxe-tree--node-btn{-webkit-transition:-webkit-transform .1s ease-in-out;transition:-webkit-transform .1s ease-in-out;transition:transform .1s ease-in-out;transition:transform .1s ease-in-out,-webkit-transform .1s ease-in-out}.is--animat .vxe-checkbox>input:checked+span,.is--animat .vxe-radio>input:checked+span{-webkit-transition:background-color .1s ease-in-out;transition:background-color .1s ease-in-out}.vxe-checkbox .vxe-checkbox--icon,.vxe-custom--option .vxe-checkbox--icon,.vxe-export--panel-column-option .vxe-checkbox--icon,.vxe-table--filter-option .vxe-checkbox--icon,.vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--icon{font-size:1.34em;color:#dcdfe6;vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.is--checked.vxe-checkbox,.is--checked.vxe-checkbox .vxe-checkbox--icon,.is--checked.vxe-custom--option,.is--checked.vxe-custom--option .vxe-checkbox--icon,.is--checked.vxe-export--panel-column-option,.is--checked.vxe-export--panel-column-option .vxe-checkbox--icon,.is--checked.vxe-table--filter-option,.is--checked.vxe-table--filter-option .vxe-checkbox--icon,.is--indeterminate.vxe-checkbox,.is--indeterminate.vxe-checkbox .vxe-checkbox--icon,.is--indeterminate.vxe-custom--option,.is--indeterminate.vxe-custom--option .vxe-checkbox--icon,.is--indeterminate.vxe-export--panel-column-option,.is--indeterminate.vxe-export--panel-column-option .vxe-checkbox--icon,.is--indeterminate.vxe-table--filter-option,.is--indeterminate.vxe-table--filter-option .vxe-checkbox--icon,.vxe-table--render-default .is--checked.vxe-cell--checkbox,.vxe-table--render-default .is--checked.vxe-cell--checkbox .vxe-checkbox--icon,.vxe-table--render-default .is--indeterminate.vxe-cell--checkbox,.vxe-table--render-default .is--indeterminate.vxe-cell--checkbox .vxe-checkbox--icon{color:#409eff}.vxe-checkbox:not(.is--disabled),.vxe-custom--option:not(.is--disabled),.vxe-export--panel-column-option:not(.is--disabled),.vxe-table--filter-option:not(.is--disabled),.vxe-table--render-default .vxe-cell--checkbox:not(.is--disabled){cursor:pointer}.vxe-checkbox:not(.is--disabled):hover .vxe-checkbox--icon,.vxe-custom--option:not(.is--disabled):hover .vxe-checkbox--icon,.vxe-export--panel-column-option:not(.is--disabled):hover .vxe-checkbox--icon,.vxe-table--filter-option:not(.is--disabled):hover .vxe-checkbox--icon,.vxe-table--render-default .vxe-cell--checkbox:not(.is--disabled):hover .vxe-checkbox--icon{color:#409eff}.is--disabled.vxe-checkbox,.is--disabled.vxe-custom--option,.is--disabled.vxe-export--panel-column-option,.is--disabled.vxe-table--filter-option,.vxe-table--render-default .is--disabled.vxe-cell--checkbox{color:#bfbfbf;cursor:not-allowed}.is--disabled.vxe-checkbox .vxe-checkbox--icon,.is--disabled.vxe-custom--option .vxe-checkbox--icon,.is--disabled.vxe-export--panel-column-option .vxe-checkbox--icon,.is--disabled.vxe-table--filter-option .vxe-checkbox--icon,.vxe-table--render-default .is--disabled.vxe-cell--checkbox .vxe-checkbox--icon{color:#dcdfe6}.vxe-checkbox .vxe-checkbox--label,.vxe-custom--option .vxe-checkbox--label,.vxe-export--panel-column-option .vxe-checkbox--label,.vxe-table--filter-option .vxe-checkbox--label,.vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--label{padding-left:.5em;vertical-align:middle}.vxe-radio,.vxe-table--render-default .vxe-cell--radio{cursor:pointer}.vxe-radio .vxe-radio--icon,.vxe-table--render-default .vxe-cell--radio .vxe-radio--icon{font-size:1.4em;color:#dcdfe6;vertical-align:middle;font-weight:700;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.is--checked.vxe-radio,.is--checked.vxe-radio .vxe-radio--icon,.vxe-table--render-default .is--checked.vxe-cell--radio,.vxe-table--render-default .is--checked.vxe-cell--radio .vxe-radio--icon{color:#409eff}.vxe-radio:not(.is--disabled),.vxe-table--render-default .vxe-cell--radio:not(.is--disabled){cursor:pointer}.vxe-radio:not(.is--disabled):hover .vxe-radio--icon,.vxe-table--render-default .vxe-cell--radio:not(.is--disabled):hover .vxe-radio--icon{color:#409eff}.is--disabled.vxe-radio,.vxe-table--render-default .is--disabled.vxe-cell--radio{color:#bfbfbf;cursor:not-allowed}.is--disabled.vxe-radio .vxe-radio--icon,.vxe-table--render-default .is--disabled.vxe-cell--radio .vxe-radio--icon{color:#dcdfe6}.vxe-radio .vxe-radio--label,.vxe-table--render-default .vxe-cell--radio .vxe-radio--label{padding-left:.5em;vertical-align:middle}.vxe-radio-group{display:inline-block;vertical-align:middle;line-height:1;font-size:0}.vxe-radio-group+.vxe-radio-group{margin-left: 0.625rem}.vxe-radio{display:inline-block;vertical-align:middle;white-space:nowrap;line-height:1}.vxe-radio>input[type=radio]{position:absolute;width:0;height:0;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.vxe-radio .vxe-radio--label{vertical-align:middle;display:inline-block;max-width:50em}.vxe-radio:not(.is--disabled)>input:focus+.vxe-radio--icon{color:#409eff}.vxe-radio:not(.vxe-radio-button)+.vxe-radio{margin-left: 0.625rem}.vxe-radio-button .vxe-radio--label{background-color:#fff}.vxe-radio-button:first-child .vxe-radio--label{border-left: 0.0625rem solid #dcdfe6;border-radius: 0.25rem 0 0 0.25rem}.vxe-radio-button:last-child .vxe-radio--label{border-radius:0 0.25rem 0.25rem 0}.vxe-radio-button>input:checked+.vxe-radio--label{color:#fff;background-color:#409eff;border-color:#409eff}.vxe-radio-button .vxe-radio--label{padding:0 1em;line-height: 2rem;display:inline-block;border-style:solid;border-color:#dcdfe6;border-width: 0.0625rem 0.0625rem 0.0625rem 0;max-width:50em}.vxe-radio-button.is--disabled{cursor:not-allowed}.vxe-radio-button.is--disabled>input:not(:checked)+.vxe-radio--label{color:#dcdfe6}.vxe-radio-button.is--disabled>input:checked+.vxe-radio--label{border-color:#a6d2ff;background-color:#a6d2ff}.vxe-radio-button:not(.is--disabled)>input:focus+.vxe-radio--label{border-color:#409eff;-webkit-box-shadow:0 0 .2em 0 #409eff;box-shadow:0 0 .2em 0 #409eff}.vxe-radio-button:not(.is--disabled):hover>input:not(:checked)+.vxe-radio--label{color:#409eff}.vxe-radio-button.size--medium .vxe-radio--label{line-height: 1.875rem}.vxe-radio-button.size--small .vxe-radio--label{line-height: 1.75rem}.vxe-radio-button.size--mini .vxe-radio--label{line-height: 1.625rem}.vxe-radio,.vxe-radio.size--medium{font-size: 0.875rem}.vxe-radio.size--small{font-size: 0.8125rem}.vxe-radio.size--mini{font-size: 0.75rem}.vxe-input--inner{width:100%;height:100%;border-radius: 0.25rem;outline:0;margin:0;font-size:inherit;font-family:inherit;line-height:inherit;padding:0 .6em;color:#606266;border: 0.0625rem solid #dcdfe6;background-color:#fff;-webkit-box-shadow:none;box-shadow:none}.vxe-input--inner::-webkit-input-placeholder{color:#c0c4cc}.vxe-input--inner::-moz-placeholder{color:#c0c4cc}.vxe-input--inner:-ms-input-placeholder{color:#c0c4cc}.vxe-input--inner::-ms-input-placeholder{color:#c0c4cc}.vxe-input--inner::placeholder{color:#c0c4cc}.vxe-input--inner::-webkit-autofill{background-color:#fff}.vxe-input--inner[type=number]{-webkit-appearance:none;appearance:none;-moz-appearance:textfield}.vxe-input--inner[type=number]::-webkit-inner-spin-button,.vxe-input--inner[type=number]::-webkit-outer-spin-button,.vxe-input--inner[type=search],.vxe-input--inner[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none}.vxe-input--inner[disabled]{cursor:not-allowed;color:#bfbfbf;background-color:#f3f3f3}.vxe-input{display:inline-block;position:relative;width: 11.25rem}.vxe-input.is--disabled .vxe-input--date-picker-suffix,.vxe-input.is--disabled .vxe-input--number-suffix,.vxe-input.is--disabled .vxe-input--password-suffix,.vxe-input.is--disabled .vxe-input--search-suffix,.vxe-input.is--disabled .vxe-input--suffix{cursor:no-drop}.vxe-input:not(.is--disabled) .vxe-input--clear-icon,.vxe-input:not(.is--disabled) .vxe-input--number-suffix,.vxe-input:not(.is--disabled) .vxe-input--password-suffix,.vxe-input:not(.is--disabled) .vxe-input--search-suffix{cursor:pointer}.vxe-input:not(.is--disabled).is--active .vxe-input--inner{border: 0.0625rem solid #409eff}.vxe-input .vxe-input--extra-suffix,.vxe-input .vxe-input--prefix,.vxe-input .vxe-input--suffix{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:0;width:1.6em;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;color:#c0c4cc}.vxe-input .vxe-input--prefix{left:.2em}.vxe-input.is--prefix .vxe-input--inner{padding-left:1.8em}.vxe-input .vxe-input--clear-icon{display:none}.vxe-input .vxe-input--extra-suffix,.vxe-input .vxe-input--suffix{right:.2em}.vxe-input.is--suffix .vxe-input--inner{padding-right:1.8em}.vxe-input.is--left .vxe-input--inner{text-align:left}.vxe-input.is--center .vxe-input--inner{text-align:center}.vxe-input.is--right .vxe-input--inner{text-align:right}.vxe-input.is--controls.type--date .vxe-input--inner,.vxe-input.is--controls.type--datetime .vxe-input--inner,.vxe-input.is--controls.type--float .vxe-input--inner,.vxe-input.is--controls.type--integer .vxe-input--inner,.vxe-input.is--controls.type--month .vxe-input--inner,.vxe-input.is--controls.type--number .vxe-input--inner,.vxe-input.is--controls.type--password .vxe-input--inner,.vxe-input.is--controls.type--quarter .vxe-input--inner,.vxe-input.is--controls.type--search .vxe-input--inner,.vxe-input.is--controls.type--time .vxe-input--inner,.vxe-input.is--controls.type--week .vxe-input--inner,.vxe-input.is--controls.type--year .vxe-input--inner{padding-right:1.8em}.vxe-input.is--controls.type--date .vxe-input--suffix,.vxe-input.is--controls.type--datetime .vxe-input--suffix,.vxe-input.is--controls.type--float .vxe-input--suffix,.vxe-input.is--controls.type--integer .vxe-input--suffix,.vxe-input.is--controls.type--month .vxe-input--suffix,.vxe-input.is--controls.type--number .vxe-input--suffix,.vxe-input.is--controls.type--password .vxe-input--suffix,.vxe-input.is--controls.type--quarter .vxe-input--suffix,.vxe-input.is--controls.type--search .vxe-input--suffix,.vxe-input.is--controls.type--time .vxe-input--suffix,.vxe-input.is--controls.type--week .vxe-input--suffix,.vxe-input.is--controls.type--year .vxe-input--suffix{right:1.6em}.vxe-input.is--suffix.is--controls.type--date .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--datetime .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--float .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--integer .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--month .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--number .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--password .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--quarter .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--search .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--time .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--week .vxe-input--inner,.vxe-input.is--suffix.is--controls.type--year .vxe-input--inner{padding-right:3.2em}.vxe-input.is--suffix:hover .vxe-input--suffix.is--clear .vxe-input--suffix-icon{display:none}.vxe-input.is--suffix:hover .vxe-input--suffix.is--clear .vxe-input--clear-icon{display:inline}.vxe-input:not(.is--disabled) .vxe-input--suffix:hover .vxe-input--clear-icon{color:#606266}.vxe-input:not(.is--disabled) .vxe-input--suffix:active .vxe-input--clear-icon{color:#409eff}.vxe-input:not(.is--disabled) .vxe-input--extra-suffix:hover .vxe-input--password-suffix,.vxe-input:not(.is--disabled) .vxe-input--extra-suffix:hover .vxe-input--search-suffix{color:#606266}.vxe-input:not(.is--disabled) .vxe-input--extra-suffix:active .vxe-input--password-suffix,.vxe-input:not(.is--disabled) .vxe-input--extra-suffix:active .vxe-input--search-suffix{color:#409eff}.vxe-input:not(.is--disabled) .vxe-input--number-next:hover,.vxe-input:not(.is--disabled) .vxe-input--number-prev:hover{color:#606266}.vxe-input:not(.is--disabled) .vxe-input--number-next:active,.vxe-input:not(.is--disabled) .vxe-input--number-prev:active{color:#409eff}.vxe-input:not(.is--disabled) .vxe-input--number-next.is--disabled,.vxe-input:not(.is--disabled) .vxe-input--number-prev.is--disabled{cursor:no-drop;color:#e4e7ed}.vxe-input .vxe-input--date-picker-suffix,.vxe-input .vxe-input--number-suffix,.vxe-input .vxe-input--password-suffix,.vxe-input .vxe-input--search-suffix{position:relative;width:100%;height:100%}.vxe-input .vxe-input--date-picker-icon,.vxe-input .vxe-input--password-icon,.vxe-input .vxe-input--search-icon{position:absolute;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.vxe-input .vxe-input--date-picker-icon[class*=vxe-icon-],.vxe-input .vxe-input--password-icon[class*=vxe-icon-],.vxe-input .vxe-input--search-icon[class*=vxe-icon-]{font-size:1.2em}.vxe-input .vxe-input--date-picker-suffix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.vxe-input .vxe-input--date-picker-suffix .vxe-input--panel-icon{-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.vxe-input .vxe-input--number-next,.vxe-input .vxe-input--number-prev{position:relative;display:block;height:50%;width:100%;text-align:center}.vxe-input .vxe-input--number-next-icon,.vxe-input .vxe-input--number-prev-icon{line-height:.8em;position:absolute;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.vxe-input .vxe-input--number-prev-icon{bottom:0}.vxe-input .vxe-input--number-next-icon{top:0}.vxe-input--panel{display:none;position:absolute;left:0;padding: 0.25rem 0;color:#606266;text-align:left}.vxe-input--panel:not(.is--transfer){min-width:100%}.vxe-input--panel.is--transfer{position:fixed}.vxe-input--panel.animat--leave{display:block;opacity:0;-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.vxe-input--panel.animat--leave[placement=top]{-webkit-transform-origin:center bottom;transform-origin:center bottom}.vxe-input--panel.animat--enter{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}.vxe-input--panel-layout-wrapper,.vxe-input--panel-wrapper{background-color:#fff;border: 0.0625rem solid #dadce0;-webkit-box-shadow:0 0 0.375rem 0.125rem rgba(0,0,0,.1);box-shadow:0 0 0.375rem 0.125rem rgba(0,0,0,.1);border-radius: 0.25rem}.vxe-input--panel-wrapper{overflow-x:hidden;overflow-y:auto}.vxe-input--panel-layout-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.vxe-input--panel.type--date,.vxe-input--panel.type--month,.vxe-input--panel.type--quarter,.vxe-input--panel.type--week,.vxe-input--panel.type--year{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-input--panel.type--datetime .vxe-input--panel-right-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-left: 0.0625rem solid #dcdfe6}.vxe-input--panel.type--date .vxe-input--date-picker-body th,.vxe-input--panel.type--datetime .vxe-input--date-picker-body th{width:14.28571%}.vxe-input--panel.type--week .vxe-input--date-picker-body table th{width:12%}.vxe-input--panel.type--week .vxe-input--date-picker-body table th:first-child{width:14%}.vxe-input--panel.type--quarter .vxe-input--date-picker-body table th{width:50%}.vxe-input--panel.type--month .vxe-input--date-picker-body td,.vxe-input--panel.type--year .vxe-input--date-picker-body td{width:25%}.vxe-input--time-picker-title{display:inline-block;text-align:center;border: 0.0625rem solid #dcdfe6;border-radius: 0.25rem}.vxe-input--time-picker-confirm{position:absolute;right:0;top:0}.vxe-input--date-picker-confirm,.vxe-input--time-picker-confirm{outline:0;border: 0.0625rem solid #dcdfe6;border-radius: 0.25rem;cursor:pointer;color:#fff;border-color:#409eff;background-color:#409eff}.vxe-input--date-picker-confirm:hover,.vxe-input--time-picker-confirm:hover{background-color:#5faeff;border-color:#5faeff}.vxe-input--date-picker-confirm:active,.vxe-input--time-picker-confirm:active{background-color:#3196ff;border-color:#3196ff}.vxe-input--time-picker-header{display:-webkit-box;display:-ms-flexbox;display:flex;position:relative;-ms-flex-negative:0;flex-shrink:0}.vxe-input--date-picker-header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-input--date-picker-header .vxe-input--date-picker-type-wrapper{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.vxe-input--date-picker-header .vxe-input--date-picker-btn-wrapper{-ms-flex-negative:0;flex-shrink:0;text-align:center}.vxe-input--date-picker-type-wrapper .vxe-input--date-picker-btn,.vxe-input--date-picker-type-wrapper .vxe-input--date-picker-label{display:inline-block}.vxe-input--date-picker-btn-wrapper{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.vxe-input--date-picker-btn,.vxe-input--date-picker-label{display:inline-block;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;background-color:#fff}.vxe-input--date-picker-btn.is--disabled{color:#bfbfbf;cursor:no-drop}.vxe-input--date-picker-btn:not(.is--disabled){cursor:pointer}.vxe-input--date-picker-btn:not(.is--disabled):hover{background-color:#fff}.vxe-input--date-picker-btn:not(.is--disabled):active{background-color:#f7f7f7}.vxe-input--date-picker-body{border-radius: 0.25rem;border: 0.0625rem solid #dadce0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-input--date-picker-body table{border:0;width:100%;border-spacing:0;border-collapse:separate;text-align:center;table-layout:fixed}.vxe-input--date-picker-body td,.vxe-input--date-picker-body th{font-weight:400}.vxe-input--date-picker-body th{-webkit-box-shadow:inset 0 -0.0625rem 0 0 #dadce0;box-shadow:inset 0 -0.0625rem 0 0 #dadce0}.vxe-input--date-picker-body td.is--next,.vxe-input--date-picker-body td.is--next .vxe-input--date-festival,.vxe-input--date-picker-body td.is--next .vxe-input--date-label,.vxe-input--date-picker-body td.is--prev,.vxe-input--date-picker-body td.is--prev .vxe-input--date-festival,.vxe-input--date-picker-body td.is--prev .vxe-input--date-label{color:#bfbfbf}.vxe-input--date-picker-body td.is--now{-webkit-box-shadow:inset 0 0 0 0.0625rem #dadce0;box-shadow:inset 0 0 0 0.0625rem #dadce0}.vxe-input--date-picker-body td.is--now:not(.is--selected).is--current,.vxe-input--date-picker-body td.is--now:not(.is--selected).is--current .vxe-input--date-festival,.vxe-input--date-picker-body td.is--now:not(.is--selected).is--current .vxe-input--date-label{color:#409eff}.vxe-input--date-picker-body td.is--hover{background-color:#f2f6fc}.vxe-input--date-picker-body td.is--selected{color:#fff;background-color:#409eff}.vxe-input--date-picker-body td.is--selected.is--next,.vxe-input--date-picker-body td.is--selected.is--prev{background-color:#73b8ff}.vxe-input--date-picker-body td.is--selected .vxe-input--date-festival,.vxe-input--date-picker-body td.is--selected .vxe-input--date-label{color:#fff}.vxe-input--date-picker-body td.is--selected .vxe-input--date-label.is-notice:before{background-color:#fff}.vxe-input--date-picker-body td:not(.is--disabled){cursor:pointer}.vxe-input--date-picker-body td.is--disabled{cursor:no-drop;color:#dcdfe6;background-color:#f3f3f3}.vxe-input--date-picker-body td.is--disabled .vxe-input--date-festival,.vxe-input--date-picker-body td.is--disabled .vxe-input--date-label{color:#dcdfe6}.vxe-input--date-week-view th:first-child{-webkit-box-shadow:inset -0.0625rem -0.0625rem 0 0 #dadce0;box-shadow:inset -0.0625rem -0.0625rem 0 0 #dadce0}.vxe-input--date-week-view td:first-child{-webkit-box-shadow:inset -0.0625rem 0 0 0 #dadce0;box-shadow:inset -0.0625rem 0 0 0 #dadce0}.vxe-input--date-festival,.vxe-input--date-label{display:block;overflow:hidden}.vxe-input--date-label{position:relative}.vxe-input--date-label.is-notice:before{content:"";position:absolute;width: 0.25rem;height: 0.25rem;left:.8em;top:.1em;-webkit-transform:translateX(-50%);transform:translateX(-50%);border-radius:100%;background-color:red}.vxe-input--date-label--extra{position:absolute;right:.1em;top:-.2em;font-size: 0.75rem;line-height: 0.75rem;-webkit-transform:scale(.7);transform:scale(.7);color:#67c23a}.vxe-input--date-label--extra.is-important{color:#fd2222}.vxe-input--date-festival{color:#999;height: 0.875rem;line-height:1;overflow:hidden}.vxe-input--date-festival.is-important{color:#409eff}.vxe-input--date-festival--label{display:block;font-size: 0.75rem;-webkit-transform:scale(.8);transform:scale(.8)}@-webkit-keyframes festivalOverlap2{0%,45%,to{-webkit-transform:translateY(0);transform:translateY(0)}50%,95%{-webkit-transform:translateY( -0.875rem);transform:translateY( -0.875rem)}}@keyframes festivalOverlap2{0%,45%,to{-webkit-transform:translateY(0);transform:translateY(0)}50%,95%{-webkit-transform:translateY( -0.875rem);transform:translateY( -0.875rem)}}@-webkit-keyframes festivalOverlap3{0%,20%,to{-webkit-transform:translateY(0);transform:translateY(0)}25%,45%,75%,95%{-webkit-transform:translateY( -0.875rem);transform:translateY( -0.875rem)}50%,70%{-webkit-transform:translateY( -1.75rem);transform:translateY( -1.75rem)}}@keyframes festivalOverlap3{0%,20%,to{-webkit-transform:translateY(0);transform:translateY(0)}25%,45%,75%,95%{-webkit-transform:translateY( -0.875rem);transform:translateY( -0.875rem)}50%,70%{-webkit-transform:translateY( -1.75rem);transform:translateY( -1.75rem)}}.vxe-input--date-festival--overlap{display:block;font-size: 0.75rem}.vxe-input--date-festival--overlap.overlap--2{-webkit-animation:festivalOverlap2 6s ease-in-out infinite;animation:festivalOverlap2 6s ease-in-out infinite}.vxe-input--date-festival--overlap.overlap--3{-webkit-animation:festivalOverlap3 9s ease-in-out infinite;animation:festivalOverlap3 9s ease-in-out infinite}.vxe-input--date-festival--overlap>span{height: 0.875rem;display:block;-webkit-transform:scale(.8);transform:scale(.8)}.vxe-input--time-picker-body{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;border: 0.0625rem solid #dadce0;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;border-radius: 0.25rem;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-input--time-picker-body>ul{height:100%;overflow:hidden;margin:0;padding:0}.vxe-input--time-picker-body>ul:after,.vxe-input--time-picker-body>ul:before{content:" ";display:block}.vxe-input--time-picker-body>ul:hover{overflow-y:auto}.vxe-input--time-picker-body>ul>li{display:block}.vxe-input--time-picker-body>ul>li:hover{background-color:#f2f6fc;cursor:pointer}.vxe-input--time-picker-body>ul>li.is--selected{font-weight:700;color:#409eff}.vxe-input--time-picker-body .vxe-input--time-picker-minute-list,.vxe-input--time-picker-body .vxe-input--time-picker-second-list{border-left: 0.0625rem solid #dadce0}.vxe-input{font-size: 0.875rem;height: 2.125rem;line-height: 2.125rem}.vxe-input .vxe-input--inner[type=date]::-webkit-inner-spin-button,.vxe-input .vxe-input--inner[type=month]::-webkit-inner-spin-button,.vxe-input .vxe-input--inner[type=week]::-webkit-inner-spin-button{margin-top: 0.375rem}.vxe-input .vxe-input--inner[type=date]::-webkit-inner-spin-button,.vxe-input .vxe-input--inner[type=month]::-webkit-inner-spin-button,.vxe-input .vxe-input--inner[type=number]::-webkit-inner-spin-button,.vxe-input .vxe-input--inner[type=week]::-webkit-inner-spin-button{height: 1.5rem}.vxe-input.size--medium{font-size: 0.875rem;height: 2rem;line-height: 2rem}.vxe-input.size--medium .vxe-input--inner[type=date]::-webkit-inner-spin-button,.vxe-input.size--medium .vxe-input--inner[type=month]::-webkit-inner-spin-button,.vxe-input.size--medium .vxe-input--inner[type=week]::-webkit-inner-spin-button{margin-top: 0.25rem}.vxe-input.size--small{font-size: 0.8125rem;height: 1.875rem;line-height: 1.875rem}.vxe-input.size--small .vxe-input--inner[type=date]::-webkit-inner-spin-button,.vxe-input.size--small .vxe-input--inner[type=month]::-webkit-inner-spin-button,.vxe-input.size--small .vxe-input--inner[type=week]::-webkit-inner-spin-button{margin-top: 0.125rem}.vxe-input.size--mini{font-size: 0.75rem;height: 1.75rem;line-height: 1.75rem}.vxe-input.size--mini .vxe-input--inner[type=date]::-webkit-inner-spin-button,.vxe-input.size--mini .vxe-input--inner[type=month]::-webkit-inner-spin-button,.vxe-input.size--mini .vxe-input--inner[type=week]::-webkit-inner-spin-button{margin-top:0}.vxe-input--panel{font-size: 0.875rem}.vxe-input--panel .vxe-input--panel-wrapper{max-height: 23.75rem}.vxe-input--panel.type--date .vxe-input--panel-wrapper,.vxe-input--panel.type--month .vxe-input--panel-wrapper,.vxe-input--panel.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.type--time .vxe-input--panel-wrapper,.vxe-input--panel.type--week .vxe-input--panel-wrapper,.vxe-input--panel.type--year .vxe-input--panel-wrapper{padding: 0.6875rem}.vxe-input--panel.type--date .vxe-input--panel-wrapper,.vxe-input--panel.type--month .vxe-input--panel-wrapper,.vxe-input--panel.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.type--year .vxe-input--panel-wrapper{width: 21rem}.vxe-input--panel.type--week .vxe-input--panel-wrapper{width: 23.75rem}.vxe-input--panel.type--time .vxe-input--panel-wrapper{width: 10.625rem}.vxe-input--panel.type--datetime .vxe-input--panel-left-wrapper{width: 21rem}.vxe-input--panel.type--datetime .vxe-input--panel-left-wrapper,.vxe-input--panel.type--datetime .vxe-input--panel-right-wrapper{padding: 0.6875rem}.vxe-input--panel .vxe-input--time-picker-title{height: 1.875rem;line-height: 1.875rem;padding:0 0.6875rem}.vxe-input--panel .vxe-input--date-picker-btn,.vxe-input--panel .vxe-input--date-picker-label{height: 1.875rem;line-height: 1.875rem}.vxe-input--panel .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-btn{margin-left: 0.5rem}.vxe-input--panel .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-current-btn,.vxe-input--panel .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-next-btn,.vxe-input--panel .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-prev-btn{width: 1.875rem;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6}.vxe-input--panel .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-btn,.vxe-input--panel .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-label{padding:0 0.5625rem}.vxe-input--panel .vxe-input--date-picker-header,.vxe-input--panel .vxe-input--time-picker-header{padding-bottom: 0.5rem}.vxe-input--panel .vxe-input--date-picker-body table,.vxe-input--panel .vxe-input--time-picker-body{height: 16.125rem}.vxe-input--panel .vxe-input--time-picker-body>ul{width: 3rem}.vxe-input--panel .vxe-input--time-picker-body>ul:after,.vxe-input--panel .vxe-input--time-picker-body>ul:before{height: 7.5rem}.vxe-input--panel .vxe-input--time-picker-body>ul>li{height: 1.625rem;padding-left: 0.5625rem}.vxe-input--panel .vxe-input--time-picker-body .vxe-input--time-picker-minute-list{left: 3rem}.vxe-input--panel .vxe-input--time-picker-body .vxe-input--time-picker-second-list{left: 6rem}.vxe-input--panel .vxe-input--date-day-view td,.vxe-input--panel .vxe-input--date-week-view td{height: 2.375rem}.vxe-input--panel .vxe-input--date-quarter-view td{height: 3.75rem}.vxe-input--panel .vxe-input--date-month-view td,.vxe-input--panel .vxe-input--date-year-view td{height: 3rem}.vxe-input--panel .vxe-input--date-picker-body th{height: 1.875rem}.vxe-input--panel .vxe-input--date-picker-confirm,.vxe-input--panel .vxe-input--time-picker-confirm{height: 1.875rem;padding:0 0.5625rem}.vxe-input--panel .vxe-input--date-label{line-height: 0.9375rem}.vxe-input--panel.size--medium{font-size: 0.875rem}.vxe-input--panel.size--medium .vxe-input--panel-wrapper{max-height: 22.5rem}.vxe-input--panel.size--medium.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--time .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--week .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--year .vxe-input--panel-wrapper{padding: 0.625rem}.vxe-input--panel.size--medium.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--medium.type--year .vxe-input--panel-wrapper{width: 21rem}.vxe-input--panel.size--medium.type--week .vxe-input--panel-wrapper{width: 23.75rem}.vxe-input--panel.size--medium.type--time .vxe-input--panel-wrapper{width: 10.5rem}.vxe-input--panel.size--medium.type--datetime .vxe-input--panel-left-wrapper{width: 21rem}.vxe-input--panel.size--medium.type--datetime .vxe-input--panel-left-wrapper,.vxe-input--panel.size--medium.type--datetime .vxe-input--panel-right-wrapper{padding: 0.625rem}.vxe-input--panel.size--medium .vxe-input--time-picker-title{height: 1.8125rem;line-height: 1.8125rem;padding:0 0.625rem}.vxe-input--panel.size--medium .vxe-input--date-picker-btn,.vxe-input--panel.size--medium .vxe-input--date-picker-label{height: 1.8125rem;line-height: 1.8125rem}.vxe-input--panel.size--medium .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-btn{margin-left: 0.4375rem}.vxe-input--panel.size--medium .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-current-btn,.vxe-input--panel.size--medium .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-next-btn,.vxe-input--panel.size--medium .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-prev-btn{width: 1.8125rem;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6}.vxe-input--panel.size--medium .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-btn,.vxe-input--panel.size--medium .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-label{padding:0 0.5rem}.vxe-input--panel.size--medium .vxe-input--date-picker-header,.vxe-input--panel.size--medium .vxe-input--time-picker-header{padding-bottom: 0.4375rem}.vxe-input--panel.size--medium .vxe-input--date-picker-body table,.vxe-input--panel.size--medium .vxe-input--time-picker-body{height: 15.3125rem}.vxe-input--panel.size--medium .vxe-input--time-picker-body>ul{width: 3rem}.vxe-input--panel.size--medium .vxe-input--time-picker-body>ul:after,.vxe-input--panel.size--medium .vxe-input--time-picker-body>ul:before{height: 7.5rem}.vxe-input--panel.size--medium .vxe-input--time-picker-body>ul>li{height: 1.625rem;padding-left: 0.5rem}.vxe-input--panel.size--medium .vxe-input--time-picker-body .vxe-input--time-picker-minute-list{left: 3rem}.vxe-input--panel.size--medium .vxe-input--time-picker-body .vxe-input--time-picker-second-list{left: 6rem}.vxe-input--panel.size--medium .vxe-input--date-day-view td,.vxe-input--panel.size--medium .vxe-input--date-week-view td{height: 2.25rem}.vxe-input--panel.size--medium .vxe-input--date-quarter-view td{height: 3.625rem}.vxe-input--panel.size--medium .vxe-input--date-month-view td,.vxe-input--panel.size--medium .vxe-input--date-year-view td{height: 2.875rem}.vxe-input--panel.size--medium .vxe-input--date-picker-body th{height: 1.8125rem}.vxe-input--panel.size--medium .vxe-input--date-picker-confirm,.vxe-input--panel.size--medium .vxe-input--time-picker-confirm{height: 1.8125rem;padding:0 0.5rem}.vxe-input--panel.size--medium .vxe-input--date-label{line-height: 0.9375rem}.vxe-input--panel.size--small{font-size: 0.8125rem}.vxe-input--panel.size--small .vxe-input--panel-wrapper{max-height: 21.25rem}.vxe-input--panel.size--small.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--time .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--week .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--year .vxe-input--panel-wrapper{padding: 0.5625rem}.vxe-input--panel.size--small.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--small.type--year .vxe-input--panel-wrapper{width: 19.5rem}.vxe-input--panel.size--small.type--week .vxe-input--panel-wrapper{width: 22.125rem}.vxe-input--panel.size--small.type--time .vxe-input--panel-wrapper{width: 9.625rem}.vxe-input--panel.size--small.type--datetime .vxe-input--panel-left-wrapper{width: 19.5rem}.vxe-input--panel.size--small.type--datetime .vxe-input--panel-left-wrapper,.vxe-input--panel.size--small.type--datetime .vxe-input--panel-right-wrapper{padding: 0.5625rem}.vxe-input--panel.size--small .vxe-input--time-picker-title{height: 1.75rem;line-height: 1.75rem;padding:0 0.5625rem}.vxe-input--panel.size--small .vxe-input--date-picker-btn,.vxe-input--panel.size--small .vxe-input--date-picker-label{height: 1.75rem;line-height: 1.75rem}.vxe-input--panel.size--small .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-btn{margin-left: 0.375rem}.vxe-input--panel.size--small .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-current-btn,.vxe-input--panel.size--small .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-next-btn,.vxe-input--panel.size--small .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-prev-btn{width: 1.75rem;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6}.vxe-input--panel.size--small .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-btn,.vxe-input--panel.size--small .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-label{padding:0 0.4375rem}.vxe-input--panel.size--small .vxe-input--date-picker-header,.vxe-input--panel.size--small .vxe-input--time-picker-header{padding-bottom: 0.375rem}.vxe-input--panel.size--small .vxe-input--date-picker-body table,.vxe-input--panel.size--small .vxe-input--time-picker-body{height: 14.5rem}.vxe-input--panel.size--small .vxe-input--time-picker-body>ul{width: 2.75rem}.vxe-input--panel.size--small .vxe-input--time-picker-body>ul:after,.vxe-input--panel.size--small .vxe-input--time-picker-body>ul:before{height: 6.875rem}.vxe-input--panel.size--small .vxe-input--time-picker-body>ul>li{height: 1.625rem;padding-left: 0.4375rem}.vxe-input--panel.size--small .vxe-input--time-picker-body .vxe-input--time-picker-minute-list{left: 2.75rem}.vxe-input--panel.size--small .vxe-input--time-picker-body .vxe-input--time-picker-second-list{left: 5.5rem}.vxe-input--panel.size--small .vxe-input--date-day-view td,.vxe-input--panel.size--small .vxe-input--date-week-view td{height: 2.125rem}.vxe-input--panel.size--small .vxe-input--date-quarter-view td{height: 3.5rem}.vxe-input--panel.size--small .vxe-input--date-month-view td,.vxe-input--panel.size--small .vxe-input--date-year-view td{height: 2.75rem}.vxe-input--panel.size--small .vxe-input--date-picker-body th{height: 1.75rem}.vxe-input--panel.size--small .vxe-input--date-picker-confirm,.vxe-input--panel.size--small .vxe-input--time-picker-confirm{height: 1.75rem;padding:0 0.4375rem}.vxe-input--panel.size--small .vxe-input--date-label{line-height: 0.875rem}.vxe-input--panel.size--mini{font-size: 0.75rem}.vxe-input--panel.size--mini .vxe-input--panel-wrapper{max-height: 20rem}.vxe-input--panel.size--mini.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--time .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--week .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--year .vxe-input--panel-wrapper{padding: 0.5rem}.vxe-input--panel.size--mini.type--date .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--month .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--quarter .vxe-input--panel-wrapper,.vxe-input--panel.size--mini.type--year .vxe-input--panel-wrapper{width: 18rem}.vxe-input--panel.size--mini.type--week .vxe-input--panel-wrapper{width: 20.375rem}.vxe-input--panel.size--mini.type--time .vxe-input--panel-wrapper{width: 9.125rem}.vxe-input--panel.size--mini.type--datetime .vxe-input--panel-left-wrapper{width: 18rem}.vxe-input--panel.size--mini.type--datetime .vxe-input--panel-left-wrapper,.vxe-input--panel.size--mini.type--datetime .vxe-input--panel-right-wrapper{padding: 0.5rem}.vxe-input--panel.size--mini .vxe-input--time-picker-title{height: 1.6875rem;line-height: 1.6875rem;padding:0 0.5rem}.vxe-input--panel.size--mini .vxe-input--date-picker-btn,.vxe-input--panel.size--mini .vxe-input--date-picker-label{height: 1.6875rem;line-height: 1.6875rem}.vxe-input--panel.size--mini .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-btn{margin-left: 0.3125rem}.vxe-input--panel.size--mini .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-current-btn,.vxe-input--panel.size--mini .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-next-btn,.vxe-input--panel.size--mini .vxe-input--date-picker-btn-wrapper .vxe-input--date-picker-prev-btn{width: 1.6875rem;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6}.vxe-input--panel.size--mini .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-btn,.vxe-input--panel.size--mini .vxe-input--date-picker-type-wrapper .vxe-input--date-picker-label{padding:0 0.375rem}.vxe-input--panel.size--mini .vxe-input--date-picker-header,.vxe-input--panel.size--mini .vxe-input--time-picker-header{padding-bottom: 0.3125rem}.vxe-input--panel.size--mini .vxe-input--date-picker-body table,.vxe-input--panel.size--mini .vxe-input--time-picker-body{height: 13.625rem}.vxe-input--panel.size--mini .vxe-input--time-picker-body>ul{width: 2.625rem}.vxe-input--panel.size--mini .vxe-input--time-picker-body>ul:after,.vxe-input--panel.size--mini .vxe-input--time-picker-body>ul:before{height: 6.25rem}.vxe-input--panel.size--mini .vxe-input--time-picker-body>ul>li{height: 1.625rem;padding-left: 0.375rem}.vxe-input--panel.size--mini .vxe-input--time-picker-body .vxe-input--time-picker-minute-list{left: 2.625rem}.vxe-input--panel.size--mini .vxe-input--time-picker-body .vxe-input--time-picker-second-list{left: 5.25rem}.vxe-input--panel.size--mini .vxe-input--date-day-view td,.vxe-input--panel.size--mini .vxe-input--date-week-view td{height: 2rem}.vxe-input--panel.size--mini .vxe-input--date-quarter-view td{height: 3.375rem}.vxe-input--panel.size--mini .vxe-input--date-month-view td,.vxe-input--panel.size--mini .vxe-input--date-year-view td{height: 2.625rem}.vxe-input--panel.size--mini .vxe-input--date-picker-body th{height: 1.625rem}.vxe-input--panel.size--mini .vxe-input--date-picker-confirm,.vxe-input--panel.size--mini .vxe-input--time-picker-confirm{height: 1.6875rem;padding:0 0.375rem}.vxe-input--panel.size--mini .vxe-input--date-label{line-height: 0.8125rem}.vxe-textarea{position:relative;display:inline-block}.vxe-textarea:not(.def--cols),.vxe-textarea:not(.def--cols) .vxe-textarea--inner{width:100%}.vxe-textarea--inner{border-radius: 0.25rem;outline:0;font-size:inherit;padding:0 .6em;color:#606266;line-height:inherit;border: 0.0625rem solid #dcdfe6;background-color:#fff;display:block;padding:.3em .6em}.vxe-textarea--inner::-webkit-input-placeholder{color:#c0c4cc}.vxe-textarea--inner::-moz-placeholder{color:#c0c4cc}.vxe-textarea--inner:-ms-input-placeholder{color:#c0c4cc}.vxe-textarea--inner::-ms-input-placeholder{color:#c0c4cc}.vxe-textarea--inner::placeholder{color:#c0c4cc}.vxe-textarea--inner:focus{border: 0.0625rem solid #409eff}.vxe-textarea--inner[disabled]{cursor:not-allowed;background-color:#f3f3f3}.vxe-textarea--autosize,.vxe-textarea--inner{line-height:1.5715;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.vxe-textarea--autosize{display:block;position:fixed;top:0;left:0;width:100%;margin:0;padding:.3em .6em;word-wrap:break-word;white-space:pre-wrap;z-index:-1;visibility:hidden}.vxe-textarea--count{position:absolute;bottom:.2em;right:1.4em;padding-left:.2em;color:#999;background-color:#fff}.vxe-textarea--count.is--error{color:#f56c6c}.vxe-textarea,.vxe-textarea--autosize,.vxe-textarea--autosize.size--medium,.vxe-textarea.size--medium{font-size: 0.875rem}.vxe-textarea--autosize.size--small,.vxe-textarea.size--small{font-size: 0.8125rem}.vxe-textarea--autosize.size--mini,.vxe-textarea.size--mini{font-size: 0.75rem}.vxe-textarea:not(.is--autosize){min-height: 2.125rem}.vxe-textarea.size--medium{font-size: 0.875rem}.vxe-textarea.size--medium:not(.is--autosize){min-height: 2rem}.vxe-textarea.size--small:not(.is--autosize){min-height: 1.875rem}.vxe-textarea.size--mini:not(.is--autosize){min-height: 1.75rem}.vxe-button{position:relative;text-align:center;background-color:#fff;outline:0;font-size: 0.875rem;max-width: 31.25rem;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.vxe-button:not(.is--disabled){color:#606266;cursor:pointer}.vxe-button.is--loading{cursor:progress}.vxe-button.is--loading:before{content:"";position:absolute;left: -0.0625rem;top: -0.0625rem;right: -0.0625rem;bottom: -0.0625rem;border-radius:inherit;background-color:hsla(0,0%,100%,.35);pointer-events:none}.vxe-button.is--disabled{color:#bfbfbf}.vxe-button.is--disabled:not(.is--loading){cursor:no-drop}.vxe-button.type--text{text-decoration:none;border:0;padding:.1em .5em;background-color:transparent}.vxe-button.type--text:not(.is--disabled):focus{color:#2f3031}.vxe-button.type--text:not(.is--disabled):hover{color:#73b8ff}.vxe-button.type--text.theme--primary{color:#409eff}.vxe-button.type--text.theme--primary:not(.is--disabled):focus{color:#0d84ff}.vxe-button.type--text.theme--primary:not(.is--disabled):hover{color:#73b8ff}.vxe-button.type--text.theme--primary.is--disabled{color:#a6d2ff}.vxe-button.type--text.theme--success{color:#67c23a}.vxe-button.type--text.theme--success:not(.is--disabled):focus{color:#529b2e}.vxe-button.type--text.theme--success:not(.is--disabled):hover{color:#85cf60}.vxe-button.type--text.theme--success.is--disabled{color:#a3db87}.vxe-button.type--text.theme--info{color:#909399}.vxe-button.type--text.theme--info:not(.is--disabled):focus{color:#767980}.vxe-button.type--text.theme--info:not(.is--disabled):hover{color:#abadb1}.vxe-button.type--text.theme--info.is--disabled{color:#c5c7ca}.vxe-button.type--text.theme--warning{color:#e6a23c}.vxe-button.type--text.theme--warning:not(.is--disabled):focus{color:#d48a1b}.vxe-button.type--text.theme--warning:not(.is--disabled):hover{color:#ecb869}.vxe-button.type--text.theme--warning.is--disabled{color:#f2cd96}.vxe-button.type--text.theme--danger{color:#f56c6c}.vxe-button.type--text.theme--danger:not(.is--disabled):focus{color:#f23c3c}.vxe-button.type--text.theme--danger:not(.is--disabled):hover{color:#f89c9c}.vxe-button.type--text.theme--danger.is--disabled{color:#fbcccc}.vxe-button.type--text.theme--perfect{color:#f8f8f9}.vxe-button.type--text.theme--perfect:not(.is--disabled):focus{color:#dddde1}.vxe-button.type--text.theme--perfect.is--disabled,.vxe-button.type--text.theme--perfect:not(.is--disabled):hover{color:#fff}.vxe-button.type--button{font-family:inherit;height: 2.125rem;line-height:1;border: 0.0625rem solid #dcdfe6}.vxe-button.type--button.is--round{border-radius: 1.0625rem}.vxe-button.type--button:not(.is--round){border-radius: 0.25rem}.vxe-button.type--button.is--circle{padding:0 .5em;min-width: 2.125rem;border-radius:50%}.vxe-button.type--button:not(.is--circle){padding:0 1em}.vxe-button.type--button:not(.is--disabled):hover{color:#5faeff}.vxe-button.type--button:not(.is--disabled):focus{border-color:#409eff}.vxe-button.type--button:not(.is--disabled):active{color:#3196ff;border-color:#3196ff;background-color:#f7f7f7}.vxe-button.type--button.theme--primary{color:#fff}.vxe-button.type--button.theme--primary:not(.is--disabled){border-color:#409eff;background-color:#409eff}.vxe-button.type--button.theme--primary:not(.is--disabled):hover{color:#fff;background-color:#5faeff;border-color:#5faeff}.vxe-button.type--button.theme--primary:not(.is--disabled):active{color:#fff;background-color:#3196ff;border-color:#3196ff}.vxe-button.type--button.theme--primary.is--disabled{border-color:#a6d2ff;background-color:#a6d2ff}.vxe-button.type--button.theme--primary.is--loading{border-color:#409eff;background-color:#409eff}.vxe-button.type--button.theme--success{color:#fff}.vxe-button.type--button.theme--success:not(.is--disabled){border-color:#67c23a;background-color:#67c23a}.vxe-button.type--button.theme--success:not(.is--disabled):hover{color:#fff;background-color:#79cb50;border-color:#79cb50}.vxe-button.type--button.theme--success:not(.is--disabled):active{color:#fff;background-color:#61b636;border-color:#61b636}.vxe-button.type--button.theme--success.is--disabled{border-color:#a3db87;background-color:#a3db87}.vxe-button.type--button.theme--success.is--loading{border-color:#67c23a;background-color:#67c23a}.vxe-button.type--button.theme--info{color:#fff}.vxe-button.type--button.theme--info:not(.is--disabled){border-color:#909399;background-color:#909399}.vxe-button.type--button.theme--info:not(.is--disabled):hover{color:#fff;background-color:#a0a3a8;border-color:#a0a3a8}.vxe-button.type--button.theme--info:not(.is--disabled):active{color:#fff;background-color:#888b92;border-color:#888b92}.vxe-button.type--button.theme--info.is--disabled{border-color:#c5c7ca;background-color:#c5c7ca}.vxe-button.type--button.theme--info.is--loading{border-color:#909399;background-color:#909399}.vxe-button.type--button.theme--warning{color:#fff}.vxe-button.type--button.theme--warning:not(.is--disabled){border-color:#e6a23c;background-color:#e6a23c}.vxe-button.type--button.theme--warning:not(.is--disabled):hover{color:#fff;background-color:#e9af57;border-color:#e9af57}.vxe-button.type--button.theme--warning:not(.is--disabled):active{color:#fff;background-color:#e49c2e;border-color:#e49c2e}.vxe-button.type--button.theme--warning.is--disabled{border-color:#f2cd96;background-color:#f2cd96}.vxe-button.type--button.theme--warning.is--loading{border-color:#e6a23c;background-color:#e6a23c}.vxe-button.type--button.theme--danger{color:#fff}.vxe-button.type--button.theme--danger:not(.is--disabled){border-color:#f56c6c;background-color:#f56c6c}.vxe-button.type--button.theme--danger:not(.is--disabled):hover{color:#fff;background-color:#f78989;border-color:#f78989}.vxe-button.type--button.theme--danger:not(.is--disabled):active{color:#fff;background-color:#f45e5e;border-color:#f45e5e}.vxe-button.type--button.theme--danger.is--disabled{border-color:#fbcccc;background-color:#fbcccc}.vxe-button.type--button.theme--danger.is--loading{border-color:#f56c6c;background-color:#f56c6c}.vxe-button.type--button.theme--perfect{color:#606266}.vxe-button.type--button.theme--perfect:not(.is--disabled){border-color:#f8f8f9;background-color:#f8f8f9}.vxe-button.type--button.theme--perfect:not(.is--disabled):hover{color:#606266;background-color:#fff;border-color:#fff}.vxe-button.type--button.theme--perfect:not(.is--disabled):active{color:#606266;background-color:#f0f0f2;border-color:#f0f0f2}.vxe-button.type--button.theme--perfect.is--disabled{border-color:#fff;background-color:#fff}.vxe-button.type--button.theme--perfect.is--loading{border-color:#f8f8f9;background-color:#f8f8f9}.vxe-button.size--medium{font-size: 0.875rem}.vxe-button.size--medium.type--button{height: 2rem}.vxe-button.size--medium.type--button.is--circle{min-width: 2rem}.vxe-button.size--medium.type--button.is--round{border-radius: 1rem}.vxe-button.size--medium .vxe-button--icon,.vxe-button.size--medium .vxe-button--loading-icon{min-width: 0.875rem}.vxe-button.size--small{font-size: 0.8125rem}.vxe-button.size--small.type--button{height: 1.875rem}.vxe-button.size--small.type--button.is--circle{min-width: 1.875rem}.vxe-button.size--small.type--button.is--round{border-radius: 0.9375rem}.vxe-button.size--small .vxe-button--icon,.vxe-button.size--small .vxe-button--loading-icon{min-width: 0.8125rem}.vxe-button.size--mini{font-size: 0.75rem}.vxe-button.size--mini.type--button{height: 1.75rem}.vxe-button.size--mini.type--button.is--circle{min-width: 1.75rem}.vxe-button.size--mini.type--button.is--round{border-radius: 0.875rem}.vxe-button.size--mini .vxe-button--icon,.vxe-button.size--mini .vxe-button--loading-icon{min-width: 0.75rem}.vxe-button+.vxe-button,.vxe-button+.vxe-button--dropdown,.vxe-input+.vxe-button,.vxe-input+.vxe-button--dropdown{margin-left: 0.75rem}.vxe-button--icon,.vxe-button--loading-icon{min-width: 0.875rem}.vxe-button--icon+.vxe-button--content,.vxe-button--loading-icon+.vxe-button--content{margin-left: 0.25rem}.vxe-button--dropdown,.vxe-button--wrapper{display:inline-block}.vxe-button--dropdown{position:relative}.vxe-button--dropdown+.vxe-button,.vxe-button--dropdown+.vxe-button--dropdown{margin-left: 0.75rem}.vxe-button--dropdown>.vxe-button.type--button.theme--danger,.vxe-button--dropdown>.vxe-button.type--button.theme--info,.vxe-button--dropdown>.vxe-button.type--button.theme--primary,.vxe-button--dropdown>.vxe-button.type--button.theme--success,.vxe-button--dropdown>.vxe-button.type--button.theme--warning{color:#fff}.vxe-button--dropdown>.vxe-button.type--button.theme--perfect{color:#606266}.vxe-button--dropdown.is--active>.vxe-button:not(.is--disabled){color:#5faeff}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--primary{color:#73b8ff}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--success{color:#85cf60}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--info{color:#abadb1}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--warning{color:#ecb869}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--danger{color:#f89c9c}.vxe-button--dropdown.is--active>.vxe-button.type--text.theme--perfect{color:#fff}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--primary{color:#fff;background-color:#5faeff;border-color:#5faeff}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--success{color:#fff;background-color:#79cb50;border-color:#79cb50}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--info{color:#fff;background-color:#a0a3a8;border-color:#a0a3a8}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--warning{color:#fff;background-color:#e9af57;border-color:#e9af57}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--danger{color:#fff;background-color:#f78989;border-color:#f78989}.vxe-button--dropdown.is--active>.vxe-button.type--button.theme--perfect{color:#606266;background-color:#fff;border-color:#fff}.vxe-button--dropdown.is--active .vxe-button--dropdown-arrow{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.vxe-button--dropdown-arrow{display:inline-block;font-size: 0.75rem;margin-left: 0.25rem;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.vxe-button--dropdown-panel{display:none;position:absolute;right:0;padding: 0.25rem 0}.vxe-button--dropdown-panel.animat--leave{display:block;opacity:0;-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.vxe-button--dropdown-panel.animat--leave[placement=top]{-webkit-transform-origin:center bottom;transform-origin:center bottom}.vxe-button--dropdown-panel.animat--enter{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}.vxe-button--dropdown-wrapper{padding: 0.3125rem;background-color:#fff;border-radius: 0.25rem;border: 0.0625rem solid #dcdfe6;-webkit-box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2);box-shadow:0 0.0625rem 0.375rem rgba(0,0,0,.2)}.vxe-button--dropdown-wrapper>.vxe-button{margin-left:0;margin-top:.4em;display:block;width:100%;border:0}.vxe-button--dropdown-wrapper>.vxe-button.type--text{padding: 0.125rem 0.5rem}.vxe-button--dropdown-wrapper>.vxe-button:first-child{margin-top:0}.vxe-button--dropdown-wrapper>.vxe-button:last-child{margin-bottom:0}.vxe-modal--wrapper{display:none;position:fixed;top:0;left:0;line-height:1.5;width:calc(100% + 1.125rem);height:calc(100% + 1.125rem);color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;-webkit-transition:top .4s ease-in-out;transition:top .4s ease-in-out}.vxe-modal--wrapper.is--active{display:block}.vxe-modal--wrapper.is--visible.is--mask:before{background-color:rgba(0,0,0,.5)}.vxe-modal--wrapper.is--visible.type--message .vxe-modal--box{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}.vxe-modal--wrapper.is--visible .vxe-modal--box{opacity:1;visibility:visible}.vxe-modal--wrapper.is--loading .vxe-modal--footer,.vxe-modal--wrapper.is--loading .vxe-modal--header{position:relative;border-bottom-color:hsla(0,0%,100%,.5)}.vxe-modal--wrapper.is--loading .vxe-modal--footer:before,.vxe-modal--wrapper.is--loading .vxe-modal--header:before{content:"";position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:hsla(0,0%,100%,.5)}.vxe-modal--wrapper:not(.lock--view){pointer-events:none}.vxe-modal--wrapper:not(.type--message).lock--scroll{overflow:hidden}.vxe-modal--wrapper:not(.type--message):not(.lock--scroll){overflow:auto}.vxe-modal--wrapper.is--mask:before,.vxe-modal--wrapper.lock--view:before{content:"";position:fixed;top:0;left:0;width:100%;height:100%;z-index:-1;pointer-events:auto}.vxe-modal--wrapper.is--mask:before{background-color:transparent}.vxe-modal--wrapper.is--animat.is--mask:before{-webkit-transition:background-color .2s ease-in-out;transition:background-color .2s ease-in-out}.vxe-modal--wrapper.is--animat.type--message .vxe-modal--box:not(.is--drag){-webkit-transition:all .4s ease-out;transition:all .4s ease-out}.vxe-modal--wrapper.type--alert .vxe-modal--body,.vxe-modal--wrapper.type--confirm .vxe-modal--body,.vxe-modal--wrapper.type--message .vxe-modal--body{white-space:normal;word-break:break-word}.vxe-modal--wrapper.type--message{text-align:center}.vxe-modal--wrapper.type--message .vxe-modal--box{display:inline-block;padding: 0.125rem 0;margin-top:0;width:auto;-webkit-box-shadow:0 0 0.5rem 0 rgba(0,0,0,.1);box-shadow:0 0 0.5rem 0 rgba(0,0,0,.1);opacity:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.vxe-modal--wrapper.type--message .vxe-modal--box .vxe-modal--body:after{content:"";display:block;clear:both;height:0;overflow:hidden;visibility:hidden}.vxe-modal--wrapper.type--message .vxe-modal--box .vxe-modal--content{max-width: 50rem;float:left}.vxe-modal--wrapper.type--message .vxe-modal--status-wrapper{font-size:1.4em;padding-left: 0.625rem}.vxe-modal--wrapper.type--alert .vxe-modal--box,.vxe-modal--wrapper.type--confirm .vxe-modal--box,.vxe-modal--wrapper.type--modal .vxe-modal--box{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:fixed;left:50%;top:0;-webkit-box-shadow:0 0 0.625rem 0 rgba(0,0,0,.2);box-shadow:0 0 0.625rem 0 rgba(0,0,0,.2)}.vxe-modal--wrapper.type--alert .vxe-modal--body,.vxe-modal--wrapper.type--alert .vxe-modal--body .vxe-modal--content,.vxe-modal--wrapper.type--confirm .vxe-modal--body,.vxe-modal--wrapper.type--confirm .vxe-modal--body .vxe-modal--content,.vxe-modal--wrapper.type--modal .vxe-modal--body,.vxe-modal--wrapper.type--modal .vxe-modal--body .vxe-modal--content{overflow:auto}.vxe-modal--wrapper.type--alert .vxe-modal--status-wrapper,.vxe-modal--wrapper.type--confirm .vxe-modal--status-wrapper{font-size:1.6em;padding-left: 0.625rem}.vxe-modal--wrapper .vxe-modal--box{visibility:hidden;width: 26.25rem;background-color:#fff;border-radius: 0.25rem;border: 0.0625rem solid #ebeef5;text-align:left;pointer-events:auto;opacity:0}.vxe-modal--wrapper .vxe-modal--box.is--drag{cursor:move}.vxe-modal--wrapper .vxe-modal--box.is--drag .vxe-modal--body:after,.vxe-modal--wrapper .vxe-modal--box.is--drag .vxe-modal--footer:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%}.vxe-modal--wrapper .vxe-modal--box.is--drag .vxe-modal--body,.vxe-modal--wrapper .vxe-modal--box.is--drag .vxe-modal--body .vxe-modal--content{overflow:hidden}.vxe-modal--wrapper.status--info .vxe-modal--status-wrapper{color:#909399}.vxe-modal--wrapper.status--question .vxe-modal--status-wrapper,.vxe-modal--wrapper.status--warning .vxe-modal--status-wrapper{color:#e6a23c}.vxe-modal--wrapper.status--success .vxe-modal--status-wrapper{color:#67c23a}.vxe-modal--wrapper.status--error .vxe-modal--status-wrapper{color:#f56c6c}.vxe-modal--wrapper.status--loading .vxe-modal--status-wrapper{color:#bfbfbf}.vxe-modal--wrapper .vxe-modal--status-wrapper{-ms-flex-negative:0;flex-shrink:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-modal--wrapper .vxe-modal--content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:.8em 1em;white-space:pre-line}.vxe-modal--wrapper .vxe-modal--body,.vxe-modal--wrapper .vxe-modal--footer,.vxe-modal--wrapper .vxe-modal--header{position:relative}.vxe-modal--wrapper .vxe-modal--body{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.vxe-modal--wrapper .vxe-modal--header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-negative:0;flex-shrink:0;font-size:1.1em;font-weight:700;border-bottom: 0.0625rem solid #ebeef5;background-color:#f8f8f8;border-radius: 0.25rem 0.25rem 0 0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-modal--wrapper .vxe-modal--header.is--draggable .vxe-modal--header-title{cursor:move}.vxe-modal--wrapper .vxe-modal--header.is--ellipsis .vxe-modal--header-title{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-modal--wrapper .vxe-modal--header-title{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:.6em 0 .6em 1em}.vxe-modal--wrapper .vxe-modal--header-right{-ms-flex-negative:0;flex-shrink:0;padding:.6em 1em .6em 0}.vxe-modal--wrapper .vxe-modal--close-btn,.vxe-modal--wrapper .vxe-modal--zoom-btn{cursor:pointer;margin-left:.6em}.vxe-modal--wrapper .vxe-modal--close-btn:hover,.vxe-modal--wrapper .vxe-modal--zoom-btn:hover{color:#409eff}.vxe-modal--wrapper .vxe-modal--footer{-ms-flex-negative:0;flex-shrink:0;text-align:right;padding:.4em 1em .8em 1em}.vxe-modal--wrapper.is--maximize .vxe-modal--box .vxe-modal--header{cursor:default}.vxe-modal--wrapper.is--maximize .vxe-modal--resize .sb-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .selb-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .sest-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .st-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .swlb-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .swst-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .wl-resize,.vxe-modal--wrapper.is--maximize .vxe-modal--resize .wr-resize{display:none}.vxe-modal--wrapper .vxe-modal--resize .sb-resize,.vxe-modal--wrapper .vxe-modal--resize .selb-resize,.vxe-modal--wrapper .vxe-modal--resize .sest-resize,.vxe-modal--wrapper .vxe-modal--resize .st-resize,.vxe-modal--wrapper .vxe-modal--resize .swlb-resize,.vxe-modal--wrapper .vxe-modal--resize .swst-resize,.vxe-modal--wrapper .vxe-modal--resize .wl-resize,.vxe-modal--wrapper .vxe-modal--resize .wr-resize{position:absolute;z-index:100}.vxe-modal--wrapper .vxe-modal--resize .wl-resize,.vxe-modal--wrapper .vxe-modal--resize .wr-resize{width: 0.5rem;height:100%;top:0;cursor:w-resize}.vxe-modal--wrapper .vxe-modal--resize .wl-resize{left: -0.3125rem}.vxe-modal--wrapper .vxe-modal--resize .wr-resize{right: -0.3125rem}.vxe-modal--wrapper .vxe-modal--resize .selb-resize,.vxe-modal--wrapper .vxe-modal--resize .sest-resize,.vxe-modal--wrapper .vxe-modal--resize .swlb-resize,.vxe-modal--wrapper .vxe-modal--resize .swst-resize{width: 0.625rem;height: 0.625rem;z-index:101}.vxe-modal--wrapper .vxe-modal--resize .sest-resize,.vxe-modal--wrapper .vxe-modal--resize .swst-resize{top: -0.5rem}.vxe-modal--wrapper .vxe-modal--resize .selb-resize,.vxe-modal--wrapper .vxe-modal--resize .swlb-resize{bottom: -0.5rem}.vxe-modal--wrapper .vxe-modal--resize .sest-resize,.vxe-modal--wrapper .vxe-modal--resize .swlb-resize{cursor:sw-resize}.vxe-modal--wrapper .vxe-modal--resize .selb-resize,.vxe-modal--wrapper .vxe-modal--resize .swst-resize{cursor:se-resize}.vxe-modal--wrapper .vxe-modal--resize .swlb-resize,.vxe-modal--wrapper .vxe-modal--resize .swst-resize{left: -0.5rem}.vxe-modal--wrapper .vxe-modal--resize .selb-resize,.vxe-modal--wrapper .vxe-modal--resize .sest-resize{right: -0.5rem}.vxe-modal--wrapper .vxe-modal--resize .sb-resize,.vxe-modal--wrapper .vxe-modal--resize .st-resize{width:100%;height: 0.5rem;left:0;cursor:s-resize}.vxe-modal--wrapper .vxe-modal--resize .st-resize{top: -0.3125rem}.vxe-modal--wrapper .vxe-modal--resize .sb-resize{bottom: -0.3125rem}.vxe-modal--wrapper,.vxe-modal--wrapper.size--medium{font-size: 0.875rem}.vxe-modal--wrapper.size--small{font-size: 0.8125rem}.vxe-modal--wrapper.size--mini{font-size: 0.75rem}.vxe-table--tooltip-wrapper{display:none;position:absolute;top:-100%;left:-100%;font-size: 0.75rem;max-width: 37.5rem;border-radius: 0.25rem;padding: 0.5rem 0.75rem;white-space:normal;word-break:break-word;-webkit-box-shadow: 0.125rem 0.125rem 0.25rem -0.125rem rgba(0,0,0,.2);box-shadow: 0.125rem 0.125rem 0.25rem -0.125rem rgba(0,0,0,.2);color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol}.vxe-table--tooltip-wrapper:not(.is--enterable){pointer-events:none}.vxe-table--tooltip-wrapper.is--arrow .vxe-table--tooltip-arrow,.vxe-table--tooltip-wrapper.is--visible{display:block}.vxe-table--tooltip-wrapper.is--enterable:after{content:"";position:absolute;left:0;width:100%;height: 0.375rem;background-color:transparent}.vxe-table--tooltip-wrapper .vxe-table--tooltip-content{white-space:pre-line}.vxe-table--tooltip-wrapper .vxe-table--tooltip-arrow{display:none;position:absolute;border-color:transparent;border-width: 0.375rem;border-style:solid;left:50%;-webkit-transform:translateX( -0.375rem);transform:translateX( -0.375rem)}.vxe-table--tooltip-wrapper .vxe-table--tooltip-arrow:before{content:"";position:absolute;border-color:transparent;border-width: 0.3125rem;border-style:solid;left: -0.3125rem}.vxe-table--tooltip-wrapper.placement--top.is--enterable:after{bottom: -0.375rem}.vxe-table--tooltip-wrapper.placement--top .vxe-table--tooltip-arrow{bottom: -0.75rem}.vxe-table--tooltip-wrapper.placement--top .vxe-table--tooltip-arrow:before{top: -0.4375rem}.vxe-table--tooltip-wrapper.placement--bottom.is--enterable:after{top: -0.375rem}.vxe-table--tooltip-wrapper.placement--bottom .vxe-table--tooltip-arrow{top: -0.75rem}.vxe-table--tooltip-wrapper.placement--bottom .vxe-table--tooltip-arrow:before{top: -0.25rem}.vxe-table--tooltip-wrapper.theme--light{background-color:#fff;border: 0.0625rem solid #dcdfe6}.vxe-table--tooltip-wrapper.theme--light.placement--top .vxe-table--tooltip-arrow{border-top-color:#dcdfe6}.vxe-table--tooltip-wrapper.theme--light.placement--top .vxe-table--tooltip-arrow:before{border-top-color:#fff}.vxe-table--tooltip-wrapper.theme--light.placement--bottom .vxe-table--tooltip-arrow{border-bottom-color:#dcdfe6}.vxe-table--tooltip-wrapper.theme--light.placement--bottom .vxe-table--tooltip-arrow:before{border-bottom-color:#fff}.vxe-table--tooltip-wrapper.theme--dark{background:#303133;color:#fff}.vxe-table--tooltip-wrapper.theme--dark.placement--top .vxe-table--tooltip-arrow,.vxe-table--tooltip-wrapper.theme--dark.placement--top .vxe-table--tooltip-arrow:before{border-top-color:#303133}.vxe-table--tooltip-wrapper.theme--dark.placement--bottom .vxe-table--tooltip-arrow,.vxe-table--tooltip-wrapper.theme--dark.placement--bottom .vxe-table--tooltip-arrow:before{border-bottom-color:#303133}.vxe-table--tooltip-wrapper.vxe-table--valid-error{background-color:#f56c6c;color:#fff}.vxe-form--item .vxe-default-input[type=reset]:hover,.vxe-form--item .vxe-default-input[type=submit]:hover{color:#5faeff;border-color:#73b8ff}.vxe-form{position:relative;font-size: 0.875rem;color:#606266;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;background-color:#fff;text-align:left}.vxe-form-slots{display:none}.vxe-form--item-content,.vxe-form--item-trigger-node{display:inline-block;vertical-align:middle}.vxe-form--item-title{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;max-width: 20rem;padding-right:.8em}.vxe-form--item-title.is--ellipsis .vxe-form--item-title-content{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vxe-form--item-title .vxe-form--item-title-postfix,.vxe-form--item-title .vxe-form--item-title-prefix,.vxe-form--item-title .vxe-form--item-title-suffix{-ms-flex-negative:0;flex-shrink:0}.vxe-form--item-title .vxe-form--item-title-prefix,.vxe-form--item-title .vxe-form--item-title-suffix{cursor:help;vertical-align:middle}.vxe-form--item-title .vxe-form--item-title-prefix{margin-right:.25em}.vxe-form--item-title .vxe-form--item-title-suffix{margin-left:.2em}.vxe-form--item-title .vxe-form--item-title-postfix{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-form--item-title .vxe-form--item-title-content{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.vxe-form--item-title .vxe-form--item-title-label{vertical-align:middle}.vxe-form--item-trigger-node{font-size: 0.75rem;min-width: 6.25rem;color:#909399;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer}.vxe-form--item-trigger-node .vxe-form--item-trigger-icon{display:inline-block;margin:0 .25em;-webkit-transition:all .1s;transition:all .1s}.vxe-form--item-valid{position:absolute;width:100%;font-size: 0.75rem;line-height:1.2em;color:#f56c6c;background-color:inherit;z-index:1;opacity:0;-webkit-transform-origin:center top;transform-origin:center top;-webkit-transform:scaleY(0);transform:scaleY(0);-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.vxe-form .vxe-form--gather{display:inline-block}.vxe-form .vxe-form--item{display:none;padding:.5em .8em .5em 0}.vxe-form .vxe-form--item.is--active:not(.is--hidden){display:inline-block}.vxe-form--item.is--colon .vxe-form--item-title-postfix:after{content:":";font-weight:400;margin-left:.2em}.vxe-form--item.is--asterisk.is--required .vxe-form--item-title-content:before{content:"*";color:#f56c6c;font-family:Verdana,Arial,Tahoma;margin-right:.2em;font-weight:400;vertical-align:middle}.vxe-form--item.is--span .vxe-default-input:not([type=submit]):not([type=reset]),.vxe-form--item.is--span .vxe-default-select,.vxe-form--item.is--span .vxe-default-textarea,.vxe-form--item.is--span .vxe-input,.vxe-form--item.is--span .vxe-select,.vxe-form--item.is--span .vxe-textarea{width:100%}.vxe-form--item.is--error .vxe-default-input,.vxe-form--item.is--error .vxe-default-input[type=search]:focus,.vxe-form--item.is--error .vxe-default-input[type=text]:focus,.vxe-form--item.is--error .vxe-default-select,.vxe-form--item.is--error .vxe-default-select:focus,.vxe-form--item.is--error .vxe-default-textarea,.vxe-form--item.is--error .vxe-default-textarea:focus,.vxe-form--item.is--error .vxe-input>.vxe-input--inner,.vxe-form--item.is--error .vxe-input>.vxe-input--inner:focus,.vxe-form--item.is--error .vxe-select,.vxe-form--item.is--error .vxe-select.is--active>.vxe-input .vxe-input--inner,.vxe-form--item.is--error .vxe-textarea>.vxe-textarea--inner,.vxe-form--item.is--error .vxe-textarea>.vxe-textarea--inner:focus{border-color:#f56c6c}.vxe-form--item.is--error .vxe-form--item-valid{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}.vxe-form--item .vxe-form--item-inner{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.vxe-form--item .vxe-form--item-inner .vxe-form--item-title{-ms-flex-negative:0;flex-shrink:0}.vxe-form--item .vxe-form--item-inner .vxe-form--item-content{position:relative;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;word-break:break-all}.vxe-form--item .vxe-default-input,.vxe-form--item .vxe-default-select,.vxe-form--item .vxe-default-textarea{outline:0;border: 0.0625rem solid #dcdfe6;border-radius: 0.25rem}.vxe-form--item .vxe-default-input,.vxe-form--item .vxe-default-select{height: 2.125rem}.vxe-form--item .vxe-default-input{padding:0 .8em}.vxe-form--item .vxe-default-textarea{padding:.3em .6em}.vxe-form--item .vxe-default-input[type=number]{padding-right:.2em}.vxe-form--item .vxe-default-input[type=search],.vxe-form--item .vxe-default-input[type=text]{padding:0 1em}.vxe-form--item .vxe-default-input[type=search],.vxe-form--item .vxe-default-input[type=text],.vxe-form--item .vxe-default-select,.vxe-form--item .vxe-default-textarea{color:#606266}.vxe-form--item .vxe-default-input[type=search]:focus,.vxe-form--item .vxe-default-input[type=text]:focus,.vxe-form--item .vxe-default-select:focus,.vxe-form--item .vxe-default-textarea:focus{border: 0.0625rem solid #409eff}.vxe-form--item .vxe-default-input[type=search][disabled],.vxe-form--item .vxe-default-input[type=text][disabled],.vxe-form--item .vxe-default-select[disabled],.vxe-form--item .vxe-default-textarea[disabled]{cursor:not-allowed;background-color:#f3f3f3}.vxe-form--item .vxe-default-input[type=reset],.vxe-form--item .vxe-default-input[type=submit]{line-height: 2rem;background-color:#fff;cursor:pointer}.vxe-form--item .vxe-default-input[type=reset]:active,.vxe-form--item .vxe-default-input[type=submit]:active{color:#3699ff;border-color:#3699ff}.vxe-form--item .vxe-default-input[type=date]::-webkit-inner-spin-button{margin-top: 0.375rem}.vxe-form--item .vxe-default-input[type=date]::-webkit-inner-spin-button,.vxe-form--item .vxe-default-input[type=number]::-webkit-inner-spin-button{height: 1.5rem}.vxe-form--item .vxe-default-input::-webkit-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-input::-moz-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-input:-ms-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-input::-ms-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-input::placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-input[type=search],.vxe-form--item .vxe-default-input[type=text],.vxe-form--item .vxe-default-select,.vxe-form--item .vxe-default-textarea{width: 11.25rem}.vxe-form--item .vxe-default-textarea{resize:none;vertical-align:middle}.vxe-form--item .vxe-default-textarea::-webkit-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-textarea::-moz-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-textarea:-ms-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-textarea::-ms-input-placeholder{color:#c0c4cc}.vxe-form--item .vxe-default-textarea::placeholder{color:#c0c4cc}.vxe-form .vxe-form--item-inner{min-height: 2.25rem}.vxe-form .vxe-form--item-inner>.align--center{text-align:center}.vxe-form .vxe-form--item-inner>.align--left{text-align:left}.vxe-form .vxe-form--item-inner>.align--right{text-align:right}.vxe-form.size--medium{font-size: 0.875rem}.vxe-form.size--medium .vxe-form--item-inner{min-height: 2.125rem}.vxe-form.size--medium .vxe-default-input[type=reset],.vxe-form.size--medium .vxe-default-input[type=submit]{line-height: 1.875rem}.vxe-form.size--medium .vxe-default-input,.vxe-form.size--medium .vxe-default-select{height: 2rem}.vxe-form.size--small{font-size: 0.8125rem}.vxe-form.size--small .vxe-form--item-inner{min-height: 2rem}.vxe-form.size--small .vxe-default-input[type=reset],.vxe-form.size--small .vxe-default-input[type=submit]{line-height: 1.75rem}.vxe-form.size--small .vxe-default-input,.vxe-form.size--small .vxe-default-select{height: 1.875rem}.vxe-form.size--mini{font-size: 0.75rem}.vxe-form.size--mini .vxe-form--item-inner{min-height: 1.875rem}.vxe-form.size--mini .vxe-default-input[type=reset],.vxe-form.size--mini .vxe-default-input[type=submit]{line-height: 1.625rem}.vxe-form.size--mini .vxe-default-input,.vxe-form.size--mini .vxe-default-select{height: 1.75rem}.vxe-select{position:relative;display:inline-block;width: 11.25rem;color:#606266;text-align:left}.vxe-select>.vxe-input .vxe-input--inner{cursor:pointer}.vxe-select.is--disabled>.vxe-input .vxe-input--inner{cursor:no-drop}.vxe-select.is--loading>.vxe-input .vxe-input--inner{cursor:progress}.vxe-select>.vxe-input{width:100%}.vxe-select>.vxe-input .vxe-input--suffix-icon{display:inline-block;-webkit-transition:-webkit-transform .2s ease-in-out;transition:-webkit-transform .2s ease-in-out;transition:transform .2s ease-in-out;transition:transform .2s ease-in-out,-webkit-transform .2s ease-in-out}.vxe-select.is--active:not(.is--filter)>.vxe-input .vxe-input--inner{border: 0.0625rem solid #409eff}.vxe-select-slots{display:none}.vxe-select--panel{display:none;position:absolute;left:0;padding: 0.25rem 0;color:#606266;text-align:left}.vxe-select--panel:not(.is--transfer){min-width:100%}.vxe-select--panel.is--transfer{position:fixed}.vxe-select--panel.animat--leave{display:block;opacity:0;-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.vxe-select--panel.animat--leave[placement=top]{-webkit-transform-origin:center bottom;transform-origin:center bottom}.vxe-select--panel.animat--enter{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}.vxe-select-filter--wrapper{display:block}.vxe-select-filter--wrapper .vxe-select-filter--input{width:100%}.vxe-select-option--wrapper{position:relative;overflow-x:hidden;overflow-y:auto;padding: 0.25rem 0;max-height: 12.5rem;border-radius: 0.25rem;border: 0.0625rem solid #dadce0;-webkit-box-shadow:0 0 0.375rem 0.125rem rgba(0,0,0,.1);box-shadow:0 0 0.375rem 0.125rem rgba(0,0,0,.1);background-color:#fff}.vxe-optgroup .vxe-optgroup--title{padding:0 0.375rem;color:#909399;font-size: 0.75rem}.vxe-optgroup--wrapper .vxe-select-option{padding:0 1.25rem}.vxe-select-option{padding:0 .6em;max-width: 37.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.vxe-select-option.is--selected{font-weight:700;color:#409eff}.vxe-select-option:not(.is--disabled){cursor:pointer}.vxe-select-option:not(.is--disabled).is--hover{background-color:#f5f7fa}.vxe-select-option.is--disabled{color:#bfbfbf;cursor:no-drop}.vxe-select--search-icon{margin-right:.5em}.vxe-select--empty-placeholder,.vxe-select--search-loading{padding:0 .6em;text-align:center;color:#c0c4cc}.vxe-select,.vxe-select--panel,.vxe-select--panel.size--medium,.vxe-select.size--medium{font-size: 0.875rem}.vxe-select--panel.size--small,.vxe-select.size--small{font-size: 0.8125rem}.vxe-select--panel.size--mini,.vxe-select.size--mini{font-size: 0.75rem}.vxe-select--panel .vxe-optgroup--title,.vxe-select--panel .vxe-select-option{height: 1.875rem}.vxe-select--panel .vxe-optgroup--title,.vxe-select--panel .vxe-select--empty-placeholder,.vxe-select--panel .vxe-select--search-loading,.vxe-select--panel .vxe-select-option{line-height: 1.875rem}.vxe-select--panel.size--medium .vxe-optgroup--title,.vxe-select--panel.size--medium .vxe-select-option{height: 1.75rem}.vxe-select--panel.size--medium .vxe-optgroup--title,.vxe-select--panel.size--medium .vxe-select--empty-placeholder,.vxe-select--panel.size--medium .vxe-select--search-loading,.vxe-select--panel.size--medium .vxe-select-option{line-height: 1.75rem}.vxe-select--panel.size--small .vxe-optgroup--title,.vxe-select--panel.size--small .vxe-select-option{height: 1.625rem}.vxe-select--panel.size--small .vxe-optgroup--title,.vxe-select--panel.size--small .vxe-select--empty-placeholder,.vxe-select--panel.size--small .vxe-select--search-loading,.vxe-select--panel.size--small .vxe-select-option{line-height: 1.625rem}.vxe-select--panel.size--mini .vxe-optgroup--title,.vxe-select--panel.size--mini .vxe-select-option{height: 1.5rem}.vxe-select--panel.size--mini .vxe-optgroup--title,.vxe-select--panel.size--mini .vxe-select--empty-placeholder,.vxe-select--panel.size--mini .vxe-select--search-loading,.vxe-select--panel.size--mini .vxe-select-option{line-height: 1.5rem}.vxe-switch{display:inline-block;color:#606266;vertical-align:middle;padding:.4em;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center}.vxe-switch.is--animat .vxe-switch--button{-webkit-transition:border-color .3s,background-color .3s;transition:border-color .3s,background-color .3s}.vxe-switch.is--animat .vxe-switch--icon{-webkit-transition:all .3s;transition:all .3s}.vxe-switch.is--on .vxe-switch--button{padding-right:1.7em;background-color:#409eff}.vxe-switch.is--on .vxe-switch--icon{left:100%;-webkit-transform:translateX(-1.4em);transform:translateX(-1.4em)}.vxe-switch.is--off .vxe-switch--button{padding-left:1.7em;background-color:rgba(0,0,0,.35)}.vxe-switch.is--off .vxe-switch--icon{left:.2em;-webkit-transform:translateX(0);transform:translateX(0)}.vxe-switch.is--off .vxe-switch--label-on,.vxe-switch.is--on .vxe-switch--label-off{height:0;visibility:hidden;overflow:hidden}.vxe-switch.is--off .vxe-switch--label,.vxe-switch.is--on .vxe-switch--label{opacity:1}.vxe-switch:not(.is--disabled) .vxe-switch--button{cursor:pointer}.vxe-switch:not(.is--disabled) .vxe-switch--button:focus{-webkit-box-shadow:0 0 .4em 0 #409eff;box-shadow:0 0 .4em 0 #409eff}.vxe-switch.is--disabled .vxe-switch--button{cursor:no-drop}.vxe-switch.is--disabled.is--on .vxe-switch--button{background-color:#a6d2ff}.vxe-switch.is--disabled.is--off .vxe-switch--button{background-color:rgba(0,0,0,.15)}.vxe-switch .vxe-switch--button{display:block;position:relative;height:1.6em;line-height:1;min-width:3.2em;padding:0 .6em;border-radius:1em;border:0;outline:0}.vxe-switch .vxe-switch--label{opacity:0;display:block;color:#fff;font-size:.8em}.vxe-switch .vxe-switch--icon{position:absolute;top:.2em;left:0;width:1.2em;height:1.2em;border-radius:50%;background-color:#fff}.vxe-switch .vxe-switch--label-icon{margin-right:.25em}.vxe-switch,.vxe-switch.size--medium{font-size: 0.875rem}.vxe-switch.size--small{font-size: 0.8125rem}.vxe-switch.size--mini{font-size: 0.75rem}.vxe-list{position:relative;display:block;padding:0;color:#606266;direction:ltr}.vxe-list .vxe-list--virtual-wrapper{position:relative;overflow:auto}.vxe-list .vxe-list--y-space{width:0;float:left}.vxe-list .vxe-list--body,.vxe-list .vxe-list--virtual-wrapper{padding:0;margin:0;border:0;outline:0}.vxe-list--virtual-wrapper{height: 6.25rem}.vxe-pulldown{position:relative;display:inline-block;color:#606266;text-align:left}.vxe-pulldown--panel{display:none;position:absolute;left:0;padding: 0.25rem 0;color:#606266;text-align:left}.vxe-pulldown--panel:not(.is--transfer){min-width:100%}.vxe-pulldown--panel.is--transfer{position:fixed}.vxe-pulldown--panel.animat--leave{display:block;opacity:0;-webkit-transform:scaleY(.5);transform:scaleY(.5);-webkit-transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1);transition:transform .3s cubic-bezier(.23,1,.32,1),opacity .3s cubic-bezier(.23,1,.32,1),-webkit-transform .3s cubic-bezier(.23,1,.32,1);-webkit-transform-origin:center top;transform-origin:center top;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.vxe-pulldown--panel.animat--leave[placement=top]{-webkit-transform-origin:center bottom;transform-origin:center bottom}.vxe-pulldown--panel.animat--enter{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}.vxe-pulldown--wrapper{background-color:#fff}.vxe-pulldown,.vxe-pulldown--panel,.vxe-pulldown--panel.size--medium,.vxe-pulldown.size--medium{font-size: 0.875rem}.vxe-pulldown--panel.size--small,.vxe-pulldown.size--small{font-size: 0.8125rem}.vxe-pulldown--panel.size--mini,.vxe-pulldown.size--mini{font-size: 0.75rem} \ No newline at end of file diff --git a/src/font-icon/demo.css b/src/font-icon/demo.css new file mode 100644 index 0000000..a67054a --- /dev/null +++ b/src/font-icon/demo.css @@ -0,0 +1,539 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown>p, +.markdown>blockquote, +.markdown>.highlight, +.markdown>ol, +.markdown>ul { + width: 80%; +} + +.markdown ul>li { + list-style: circle; +} + +.markdown>ul li, +.markdown blockquote ul>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown>ul li p, +.markdown>ol li p { + margin: 0.6em 0; +} + +.markdown ol>li { + list-style: decimal; +} + +.markdown>ol li, +.markdown blockquote ol>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown>table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown>table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown>table th, +.markdown>table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown>table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown>br, +.markdown>p>br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/src/font-icon/demo_index.html b/src/font-icon/demo_index.html new file mode 100644 index 0000000..66d76bb --- /dev/null +++ b/src/font-icon/demo_index.html @@ -0,0 +1,901 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    绘制
    +
    &#xe635;
    +
  • + +
  • + +
    211铃铛
    +
    &#xe8c0;
    +
  • + +
  • + +
    下拉
    +
    &#xe6b9;
    +
  • + +
  • + +
    用户-圆
    +
    &#xe623;
    +
  • + +
  • + +
    钥匙
    +
    &#xe627;
    +
  • + +
  • + +
    港口
    +
    &#xe6b1;
    +
  • + +
  • + +
    list_码头
    +
    &#xe712;
    +
  • + +
  • + +
    码头
    +
    &#xe629;
    +
  • + +
  • + +
    固定顺岸码头
    +
    &#xe642;
    +
  • + +
  • + +
    浮码头
    +
    &#xe644;
    +
  • + +
  • + +
    港口物流
    +
    &#xe60e;
    +
  • + +
  • + +
    长三角港口群
    +
    &#xe60f;
    +
  • + +
  • + +
    9船舶
    +
    &#xe639;
    +
  • + +
  • + +
    导入
    +
    &#xe61e;
    +
  • + +
  • + +
    导出
    +
    &#xe634;
    +
  • + +
  • + +
    删除
    +
    &#xe74b;
    +
  • + +
  • + +
    提醒
    +
    &#xe626;
    +
  • + +
  • + +
    编辑
    +
    &#xe8ac;
    +
  • + +
  • + +
    眼睛_隐藏_o
    +
    &#xebcd;
    +
  • + +
  • + +
    眼睛-可见
    +
    &#xe685;
    +
  • + +
  • + +
    user
    +
    &#xe7ae;
    +
  • + +
  • + +
    301加-圆框
    +
    &#xe8df;
    +
  • + +
  • + +
    302减-方框
    +
    &#xe8e0;
    +
  • + +
  • + +
    302减-圆框
    +
    &#xe8e1;
    +
  • + +
  • + +
    301加-方框
    +
    &#xe8de;
    +
  • + +
  • + +
    加号
    +
    &#xeaf3;
    +
  • + +
  • + +
    减号
    +
    &#xeaf5;
    +
  • + +
  • + +
    最大化
    +
    &#xe65b;
    +
  • + +
  • + +
    最小化
    +
    &#xe67a;
    +
  • + +
  • + +
    操作-全屏-展开
    +
    &#xe73b;
    +
  • + +
  • + +
    关闭
    +
    &#xeaf2;
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1659951671698') format('woff2'),
+       url('iconfont.woff?t=1659951671698') format('woff'),
+       url('iconfont.ttf?t=1659951671698') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + 绘制 +
    +
    .icon-huizhi +
    +
  • + +
  • + +
    + 211铃铛 +
    +
    .icon-lingdang +
    +
  • + +
  • + +
    + 下拉 +
    +
    .icon-xiala +
    +
  • + +
  • + +
    + 用户-圆 +
    +
    .icon-yonghu-yuan +
    +
  • + +
  • + +
    + 钥匙 +
    +
    .icon-yuechi +
    +
  • + +
  • + +
    + 港口 +
    +
    .icon-gangkou +
    +
  • + +
  • + +
    + list_码头 +
    +
    .icon-listmatou +
    +
  • + +
  • + +
    + 码头 +
    +
    .icon-matou +
    +
  • + +
  • + +
    + 固定顺岸码头 +
    +
    .icon-gudingshunanmatou +
    +
  • + +
  • + +
    + 浮码头 +
    +
    .icon-fumatou +
    +
  • + +
  • + +
    + 港口物流 +
    +
    .icon-gangkouwuliu +
    +
  • + +
  • + +
    + 长三角港口群 +
    +
    .icon-changsanjiaogangkouqun +
    +
  • + +
  • + +
    + 9船舶 +
    +
    .icon-chuanbo +
    +
  • + +
  • + +
    + 导入 +
    +
    .icon-daoru +
    +
  • + +
  • + +
    + 导出 +
    +
    .icon-daochu +
    +
  • + +
  • + +
    + 删除 +
    +
    .icon-shanchu +
    +
  • + +
  • + +
    + 提醒 +
    +
    .icon-tixing +
    +
  • + +
  • + +
    + 编辑 +
    +
    .icon-bianji +
    +
  • + +
  • + +
    + 眼睛_隐藏_o +
    +
    .icon-yanjing_yincang_o +
    +
  • + +
  • + +
    + 眼睛-可见 +
    +
    .icon-yanjing-kejian +
    +
  • + +
  • + +
    + user +
    +
    .icon-user +
    +
  • + +
  • + +
    + 301加-圆框 +
    +
    .icon-jia-yuankuang +
    +
  • + +
  • + +
    + 302减-方框 +
    +
    .icon-jian-fangkuang +
    +
  • + +
  • + +
    + 302减-圆框 +
    +
    .icon-jian-yuankuang +
    +
  • + +
  • + +
    + 301加-方框 +
    +
    .icon-jia-fangkuang +
    +
  • + +
  • + +
    + 加号 +
    +
    .icon-jiahao +
    +
  • + +
  • + +
    + 减号 +
    +
    .icon-jianhao +
    +
  • + +
  • + +
    + 最大化 +
    +
    .icon-zuidahua +
    +
  • + +
  • + +
    + 最小化 +
    +
    .icon-zuixiaohua +
    +
  • + +
  • + +
    + 操作-全屏-展开 +
    +
    .icon-caozuo-quanping-zhankai +
    +
  • + +
  • + +
    + 关闭 +
    +
    .icon-guanbi +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    绘制
    +
    #icon-huizhi
    +
  • + +
  • + +
    211铃铛
    +
    #icon-lingdang
    +
  • + +
  • + +
    下拉
    +
    #icon-xiala
    +
  • + +
  • + +
    用户-圆
    +
    #icon-yonghu-yuan
    +
  • + +
  • + +
    钥匙
    +
    #icon-yuechi
    +
  • + +
  • + +
    港口
    +
    #icon-gangkou
    +
  • + +
  • + +
    list_码头
    +
    #icon-listmatou
    +
  • + +
  • + +
    码头
    +
    #icon-matou
    +
  • + +
  • + +
    固定顺岸码头
    +
    #icon-gudingshunanmatou
    +
  • + +
  • + +
    浮码头
    +
    #icon-fumatou
    +
  • + +
  • + +
    港口物流
    +
    #icon-gangkouwuliu
    +
  • + +
  • + +
    长三角港口群
    +
    #icon-changsanjiaogangkouqun
    +
  • + +
  • + +
    9船舶
    +
    #icon-chuanbo
    +
  • + +
  • + +
    导入
    +
    #icon-daoru
    +
  • + +
  • + +
    导出
    +
    #icon-daochu
    +
  • + +
  • + +
    删除
    +
    #icon-shanchu
    +
  • + +
  • + +
    提醒
    +
    #icon-tixing
    +
  • + +
  • + +
    编辑
    +
    #icon-bianji
    +
  • + +
  • + +
    眼睛_隐藏_o
    +
    #icon-yanjing_yincang_o
    +
  • + +
  • + +
    眼睛-可见
    +
    #icon-yanjing-kejian
    +
  • + +
  • + +
    user
    +
    #icon-user
    +
  • + +
  • + +
    301加-圆框
    +
    #icon-jia-yuankuang
    +
  • + +
  • + +
    302减-方框
    +
    #icon-jian-fangkuang
    +
  • + +
  • + +
    302减-圆框
    +
    #icon-jian-yuankuang
    +
  • + +
  • + +
    301加-方框
    +
    #icon-jia-fangkuang
    +
  • + +
  • + +
    加号
    +
    #icon-jiahao
    +
  • + +
  • + +
    减号
    +
    #icon-jianhao
    +
  • + +
  • + +
    最大化
    +
    #icon-zuidahua
    +
  • + +
  • + +
    最小化
    +
    #icon-zuixiaohua
    +
  • + +
  • + +
    操作-全屏-展开
    +
    #icon-caozuo-quanping-zhankai
    +
  • + +
  • + +
    关闭
    +
    #icon-guanbi
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git a/src/font-icon/iconfont.css b/src/font-icon/iconfont.css new file mode 100644 index 0000000..b9943ea --- /dev/null +++ b/src/font-icon/iconfont.css @@ -0,0 +1,139 @@ +@font-face { + font-family: "iconfont"; /* Project id 3410877 */ + src: url('iconfont.woff2?t=1659951671698') format('woff2'), + url('iconfont.woff?t=1659951671698') format('woff'), + url('iconfont.ttf?t=1659951671698') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-huizhi:before { + content: "\e635"; +} + +.icon-lingdang:before { + content: "\e8c0"; +} + +.icon-xiala:before { + content: "\e6b9"; +} + +.icon-yonghu-yuan:before { + content: "\e623"; +} + +.icon-yuechi:before { + content: "\e627"; +} + +.icon-gangkou:before { + content: "\e6b1"; +} + +.icon-listmatou:before { + content: "\e712"; +} + +.icon-matou:before { + content: "\e629"; +} + +.icon-gudingshunanmatou:before { + content: "\e642"; +} + +.icon-fumatou:before { + content: "\e644"; +} + +.icon-gangkouwuliu:before { + content: "\e60e"; +} + +.icon-changsanjiaogangkouqun:before { + content: "\e60f"; +} + +.icon-chuanbo:before { + content: "\e639"; +} + +.icon-daoru:before { + content: "\e61e"; +} + +.icon-daochu:before { + content: "\e634"; +} + +.icon-shanchu:before { + content: "\e74b"; +} + +.icon-tixing:before { + content: "\e626"; +} + +.icon-bianji:before { + content: "\e8ac"; +} + +.icon-yanjing_yincang_o:before { + content: "\ebcd"; +} + +.icon-yanjing-kejian:before { + content: "\e685"; +} + +.icon-user:before { + content: "\e7ae"; +} + +.icon-jia-yuankuang:before { + content: "\e8df"; +} + +.icon-jian-fangkuang:before { + content: "\e8e0"; +} + +.icon-jian-yuankuang:before { + content: "\e8e1"; +} + +.icon-jia-fangkuang:before { + content: "\e8de"; +} + +.icon-jiahao:before { + content: "\eaf3"; +} + +.icon-jianhao:before { + content: "\eaf5"; +} + +.icon-zuidahua:before { + content: "\e65b"; +} + +.icon-zuixiaohua:before { + content: "\e67a"; +} + +.icon-caozuo-quanping-zhankai:before { + content: "\e73b"; +} + +.icon-guanbi:before { + content: "\eaf2"; +} + diff --git a/src/font-icon/iconfont.js b/src/font-icon/iconfont.js new file mode 100644 index 0000000..9fae443 --- /dev/null +++ b/src/font-icon/iconfont.js @@ -0,0 +1 @@ +!function(a){var l,c,h,o,t,i='',n=(n=document.getElementsByTagName("script"))[n.length-1].getAttribute("data-injectcss"),s=function(a,l){l.parentNode.insertBefore(a,l)};if(n&&!a.__iconfont__svg__cssinject__){a.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(a){console&&console.log(a)}}function e(){t||(t=!0,h())}function v(){try{o.documentElement.doScroll("left")}catch(a){return void setTimeout(v,50)}e()}l=function(){var a,l=document.createElement("div");l.innerHTML=i,i=null,(l=l.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",l=l,(a=document.body).firstChild?s(l,a.firstChild):a.appendChild(l))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(l,0):(c=function(){document.removeEventListener("DOMContentLoaded",c,!1),l()},document.addEventListener("DOMContentLoaded",c,!1)):document.attachEvent&&(h=l,o=a.document,t=!1,v(),o.onreadystatechange=function(){"complete"==o.readyState&&(o.onreadystatechange=null,e())})}(window); \ No newline at end of file diff --git a/src/font-icon/iconfont.json b/src/font-icon/iconfont.json new file mode 100644 index 0000000..30b9596 --- /dev/null +++ b/src/font-icon/iconfont.json @@ -0,0 +1,226 @@ +{ + "id": "3410877", + "name": "lng-icon", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "11741138", + "name": "绘制 ", + "font_class": "huizhi", + "unicode": "e635", + "unicode_decimal": 58933 + }, + { + "icon_id": "1727435", + "name": "211铃铛", + "font_class": "lingdang", + "unicode": "e8c0", + "unicode_decimal": 59584 + }, + { + "icon_id": "672036", + "name": "下拉", + "font_class": "xiala", + "unicode": "e6b9", + "unicode_decimal": 59065 + }, + { + "icon_id": "1304895", + "name": "用户-圆", + "font_class": "yonghu-yuan", + "unicode": "e623", + "unicode_decimal": 58915 + }, + { + "icon_id": "24941125", + "name": "钥匙", + "font_class": "yuechi", + "unicode": "e627", + "unicode_decimal": 58919 + }, + { + "icon_id": "6452180", + "name": "港口", + "font_class": "gangkou", + "unicode": "e6b1", + "unicode_decimal": 59057 + }, + { + "icon_id": "724700", + "name": "list_码头", + "font_class": "listmatou", + "unicode": "e712", + "unicode_decimal": 59154 + }, + { + "icon_id": "19640760", + "name": "码头", + "font_class": "matou", + "unicode": "e629", + "unicode_decimal": 58921 + }, + { + "icon_id": "5566964", + "name": "固定顺岸码头", + "font_class": "gudingshunanmatou", + "unicode": "e642", + "unicode_decimal": 58946 + }, + { + "icon_id": "5567308", + "name": "浮码头", + "font_class": "fumatou", + "unicode": "e644", + "unicode_decimal": 58948 + }, + { + "icon_id": "22580449", + "name": "港口物流", + "font_class": "gangkouwuliu", + "unicode": "e60e", + "unicode_decimal": 58894 + }, + { + "icon_id": "22580460", + "name": "长三角港口群", + "font_class": "changsanjiaogangkouqun", + "unicode": "e60f", + "unicode_decimal": 58895 + }, + { + "icon_id": "1411092", + "name": "9船舶", + "font_class": "chuanbo", + "unicode": "e639", + "unicode_decimal": 58937 + }, + { + "icon_id": "604485", + "name": "导入", + "font_class": "daoru", + "unicode": "e61e", + "unicode_decimal": 58910 + }, + { + "icon_id": "4770726", + "name": "导出", + "font_class": "daochu", + "unicode": "e634", + "unicode_decimal": 58932 + }, + { + "icon_id": "577357", + "name": "删除", + "font_class": "shanchu", + "unicode": "e74b", + "unicode_decimal": 59211 + }, + { + "icon_id": "8765137", + "name": "提醒", + "font_class": "tixing", + "unicode": "e626", + "unicode_decimal": 58918 + }, + { + "icon_id": "11372640", + "name": "编辑", + "font_class": "bianji", + "unicode": "e8ac", + "unicode_decimal": 59564 + }, + { + "icon_id": "5388071", + "name": "眼睛_隐藏_o", + "font_class": "yanjing_yincang_o", + "unicode": "ebcd", + "unicode_decimal": 60365 + }, + { + "icon_id": "6302555", + "name": "眼睛-可见", + "font_class": "yanjing-kejian", + "unicode": "e685", + "unicode_decimal": 59013 + }, + { + "icon_id": "4766293", + "name": "user", + "font_class": "user", + "unicode": "e7ae", + "unicode_decimal": 59310 + }, + { + "icon_id": "1727509", + "name": "301加-圆框", + "font_class": "jia-yuankuang", + "unicode": "e8df", + "unicode_decimal": 59615 + }, + { + "icon_id": "1727510", + "name": "302减-方框", + "font_class": "jian-fangkuang", + "unicode": "e8e0", + "unicode_decimal": 59616 + }, + { + "icon_id": "1727512", + "name": "302减-圆框", + "font_class": "jian-yuankuang", + "unicode": "e8e1", + "unicode_decimal": 59617 + }, + { + "icon_id": "1727506", + "name": "301加-方框", + "font_class": "jia-fangkuang", + "unicode": "e8de", + "unicode_decimal": 59614 + }, + { + "icon_id": "5387527", + "name": "加号", + "font_class": "jiahao", + "unicode": "eaf3", + "unicode_decimal": 60147 + }, + { + "icon_id": "5387532", + "name": "减号", + "font_class": "jianhao", + "unicode": "eaf5", + "unicode_decimal": 60149 + }, + { + "icon_id": "428403", + "name": "最大化", + "font_class": "zuidahua", + "unicode": "e65b", + "unicode_decimal": 58971 + }, + { + "icon_id": "1649166", + "name": "最小化", + "font_class": "zuixiaohua", + "unicode": "e67a", + "unicode_decimal": 59002 + }, + { + "icon_id": "3018839", + "name": "操作-全屏-展开", + "font_class": "caozuo-quanping-zhankai", + "unicode": "e73b", + "unicode_decimal": 59195 + }, + { + "icon_id": "5387522", + "name": "关闭", + "font_class": "guanbi", + "unicode": "eaf2", + "unicode_decimal": 60146 + } + ] +} diff --git a/src/font-icon/iconfont.ttf b/src/font-icon/iconfont.ttf new file mode 100644 index 0000000..a119bcb Binary files /dev/null and b/src/font-icon/iconfont.ttf differ diff --git a/src/font-icon/iconfont.woff b/src/font-icon/iconfont.woff new file mode 100644 index 0000000..ef6944a Binary files /dev/null and b/src/font-icon/iconfont.woff differ diff --git a/src/font-icon/iconfont.woff2 b/src/font-icon/iconfont.woff2 new file mode 100644 index 0000000..c0686f0 Binary files /dev/null and b/src/font-icon/iconfont.woff2 differ diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..c40e1e8 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,60 @@ +import Vue from 'vue' +import App from './App.vue' +import router from './router' +import store from './store' +import 'xe-utils' +import '@/css/index.css' +import VXETable from 'vxe-table' +import "@/css/vxe-table/source-index.css" +import ElementUI from 'element-ui' +import 'element-ui/lib/theme-chalk/index.css' +import '@/font-icon/iconfont.css' +import i18n from '@/util/translate' +import '@/util/init-data' +import '@/util/vue-global/index' + +Vue.prototype.$myFleet = [] +const config = require('../public/config/sys-config.json') +window.localStorage.setItem('pgName', config.projectName) +Vue.use(VXETable) +Vue.use(ElementUI) +Vue.config.productionTip = false + +Object.keys(store.state).forEach((item: string) => { + const data = { + data: null, + type: item + } + store.commit('setDataNull', data) +}) + +function getParam(name: string) { + let result: any = null + let paramStr: string[] = [] + let params: string[] = [] + if (location.hash.indexOf('?') !== -1) { + paramStr = location.hash.split('?') + } + if (paramStr.length) { + params = paramStr[1].split('&') + } + + for (let i = 0; i < params.length; i++) { + const str = params[i] + if (str.indexOf(name) !== -1) { + const p = str.split('=') + result = p[1] + break + } + } + return result +} + +document.title = config.title + +new Vue({ + router, + i18n, + store, + render: h => h(App) +}).$mount('#app') diff --git a/src/module/menu.ts b/src/module/menu.ts new file mode 100644 index 0000000..db67ec3 --- /dev/null +++ b/src/module/menu.ts @@ -0,0 +1,39 @@ +export interface MenuType { + name: string, + title: string, + icon: string, + type: string, + children: MenuType[], + open: boolean, + + [key: string]: any +} + +export enum Language { + zh = 'zh', // 中文 + en = 'en' // 英文 +} + +export interface DialogConfig { + show: boolean + template: string, + width: string, + height: string, + who: string + header: { + title: string, + hasIcon: boolean, + iconSrc: string, + hasMin: boolean, + hasMax: boolean + }, + position: { + top: string, + left: string + } +} + +export interface DialogAllConfig { + dialog: DialogConfig, + info: any +} diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..af31939 --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,25 @@ +import Vue from 'vue' +import VueRouter, {RouteConfig} from 'vue-router' + +const config = require('../../public/config/sys-config.json'); + +Vue.use(VueRouter) + +const routes: Array = [ + { + path: '/', + redirect: '/index' + }, + { + path: '/index', + name: 'Home', + component: () => import('@/views/layout/Layout.vue') + } +] + +const router = new VueRouter({ + base: config.projectName, + routes +}) + +export default router diff --git a/src/shims-tsx.d.ts b/src/shims-tsx.d.ts new file mode 100644 index 0000000..64fc0a8 --- /dev/null +++ b/src/shims-tsx.d.ts @@ -0,0 +1,11 @@ +import Vue, { VNode } from 'vue' + +declare global { + namespace JSX { + interface Element extends VNode {} + interface ElementClass extends Vue {} + interface IntrinsicElements { + [elem: string]: any + } + } +} diff --git a/src/shims-vue.d.ts b/src/shims-vue.d.ts new file mode 100644 index 0000000..d9f24fa --- /dev/null +++ b/src/shims-vue.d.ts @@ -0,0 +1,4 @@ +declare module '*.vue' { + import Vue from 'vue' + export default Vue +} diff --git a/src/store/index.ts b/src/store/index.ts new file mode 100644 index 0000000..5347915 --- /dev/null +++ b/src/store/index.ts @@ -0,0 +1,38 @@ +import {Vue} from 'vue-property-decorator' +import Vuex from 'vuex' + +Vue.use(Vuex) +export default new Vuex.Store({ + state: { + mapFun: null, // 封装了地图的方法 + mapInstance: null, // 地图实例 + dictionary: null, // 字典信息 + ship: null, // 船舶信息, + showPort: false, + shipFleet: null + }, + mutations: { + setData(state, data) { + // @ts-ignore + state[data.type] = data + }, + setMapInstance(state, data) { + state.mapInstance = data + }, + setMapFun(state, data) { + state.mapFun = data + }, + setDataNull(state, data) { + // @ts-ignore + state[data.type] = data.data + }, + setShowPort(state, data) { + state.showPort = data + }, + setShipFleet(state, data) { + state.shipFleet = data + } + }, + actions: {}, + modules: {} +}) diff --git a/src/util/axios/index.ts b/src/util/axios/index.ts new file mode 100644 index 0000000..31718b4 --- /dev/null +++ b/src/util/axios/index.ts @@ -0,0 +1,12 @@ +import axios from 'axios' +const sysConfig = require('../../../public/config/sys-config.json') + +const Http = axios.create() +Http.interceptors.request.use((config: any) => { + config.headers['appKey'] = sysConfig.appKey + return config +}) +Http.interceptors.response.use((config) => { + return config +}) +export default Http diff --git a/src/util/bus/index.ts b/src/util/bus/index.ts new file mode 100644 index 0000000..e1b388d --- /dev/null +++ b/src/util/bus/index.ts @@ -0,0 +1,5 @@ +import Vue from 'vue' + +const bus = new Vue() + +export default bus \ No newline at end of file diff --git a/src/util/date/index.ts b/src/util/date/index.ts new file mode 100644 index 0000000..fdc0b05 --- /dev/null +++ b/src/util/date/index.ts @@ -0,0 +1,113 @@ +import dayjs from 'dayjs' +import i18n from "@/util/translate"; +import {Language} from "@/module/menu"; + +/** + * 获取指定时间到当前的时间的时间间隔 + * @param appointTime 指定时间 + */ +export const dateForNow = function (appointTime: any) { + const nowTime = Date.parse(new Date() + '') / 1000 + const time: number = nowTime - Number(appointTime) + const zn = window.localStorage.getItem('language') + if (time < 60) { + return `1${zn === 'Chinese' ? '分钟前' : 'minutes ago'}` + } else if (time < 3600) { + return parseInt(time / 60 + '') + `${zn === 'Chinese' ? '分钟前' : 'minutes ago'}` + } else if (time < 86400) { + return parseInt(time / 3600 + '') + `${zn === 'Chinese' ? '小时前' : 'hours ago'}` + } else if (time > 86400 && time < 2592000) { + return parseInt(time / (24 * 3600) + '') + `${zn === 'Chinese' ? '天前' : 'days ago'}` + } else { + return `30${zn === 'Chinese' ? '天前' : 'days ago'}` + } +} +/** + * 获取秒级字符串 + * @param time + */ +export const getLongByTime = function (time: any) { + return new Date(time).getTime() / 1000 +} + +/** + * 获取当前的时间 + */ +export const getNowTime = function () { + return dayjs().format('YYYY-MM-DD HH:mm:ss') +} + +/** + * 获取几天前的时间 + * @param time + * @param day + */ +export const getBeforeTime = function (time: any, day: number) { + return dayjs(time).subtract(day, 'day').format('YYYY-MM-DD HH:mm:ss') +} + +/** + * 获取月份的第一天 + */ +export const getFirstDayOfMonth = function (time: string) { + return dayjs(time).startOf('month').format('YYYY-MM-DD HH:mm:ss') +} + +/** + * 获取月份的最后一天 + */ +export const getLastDayOfMonth = function (time: string) { + return dayjs(time).endOf('month').format('YYYY-MM-DD HH:mm:ss') +} + +/** + * 获取上一个月的时间 + */ +export const getBeforeMonth = function (time: string) { + return dayjs(time).subtract(1, 'month').format('YYYY-MM') +} +export const getBeforeMonth2 = function (time: string, m: number) { + return dayjs(time).subtract(m, 'month') +} +/** + * 获取指定时间的月份 + * @param time + */ +export const getMonthOfTime = function (time: string) { + return dayjs(time).get('month') +} + +/** + * 根据时间戳返回时间 + */ +export const getTimeByLong = function (data: number) { + return dayjs(data).format('YYYY-MM-DD HH:mm:ss') +} +/** + * 根据时间戳返回时间 + */ +export const getTimeByLongByFormat = function (data: number, format: string) { + return dayjs(data).format(format) +} + +/** + * 根据时间戳返回时间 + */ +export const getTimeByLong2 = function (data: number) { + return dayjs(data).format('YYYY-MM-DD HH:00:00') +} + +export const getYMD = function (data: any) { + return dayjs(data).format('YYYYMMDD') +} + +export const getFullStrDate = function () { + return dayjs().format('YYYYMMDDHHmmss') +} + +export const formatDate = function (date: string, format: string) { + return dayjs(date).format(format) +} +export const getTimeForLong = function (data: number, format: string) { + return dayjs(data).format(format) +} diff --git a/src/util/drawMixin.js b/src/util/drawMixin.js new file mode 100644 index 0000000..29ae06f --- /dev/null +++ b/src/util/drawMixin.js @@ -0,0 +1,57 @@ +// 屏幕适配 mixin 函数 + +// * 默认缩放值 +const scale = { + width: '1', + height: '1', +} + +// * 设计稿尺寸(px) +const baseWidth = 1920 +const baseHeight = 1080 + +// * 需保持的比例(默认1.77778) +const baseProportion = parseFloat((baseWidth / baseHeight).toFixed(5)) + +export default { + data() { + return { + // * 定时函数 + drawTiming: null + } + }, + mounted() { + this.calcRate() + window.addEventListener('resize', this.resize) + }, + beforeDestroy() { + window.removeEventListener('resize', this.resize) + }, + methods: { + calcRate() { + const appRef = this.$refs["appRef"] + if (!appRef) return + // 当前宽高比 + const currentRate = parseFloat((window.innerWidth / window.innerHeight).toFixed(5)) + if (appRef) { + if (currentRate > baseProportion) { + // 表示更宽 + scale.width = ((window.innerHeight * baseProportion) / baseWidth).toFixed(5) + scale.height = (window.innerHeight / baseHeight).toFixed(5) + appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)` + } else { + // 表示更高 + scale.height = ((window.innerWidth / baseProportion) / baseHeight).toFixed(5) + scale.width = (window.innerWidth / baseWidth).toFixed(5) + appRef.style.transform = `scale(${scale.width}, ${scale.height}) translate(-50%, -50%)` + } + } + }, + resize() { + clearTimeout(this.drawTiming) + this.drawTiming = setTimeout(() => { + this.calcRate() + }, 200) + } + }, +} diff --git a/src/util/excel/exporeExcel.ts b/src/util/excel/exporeExcel.ts new file mode 100644 index 0000000..8527eb4 --- /dev/null +++ b/src/util/excel/exporeExcel.ts @@ -0,0 +1,34 @@ +//导入依赖项 +import FileSaver from 'file-saver'; +import * as XLSX from "xlsx"; + +/** + * elemet-ui el-table数据导出为xlsx表格 + * @param {*} _targetId Element-UI el-table组件的id值 + */ +export const exportTableAsXLSX = function (tableArray: any[], header: any, name: string) { + //根据table生成Book工作簿 + // let wb = XLSX.utils.table_to_book(document.getElementById('_targetId')); + + let wb = XLSX.utils.book_new() + let ws: any = XLSX.utils.json_to_sheet(tableArray, {header: header}) + wb.SheetNames.push('sheet1'); + wb.Sheets['sheet1'] = ws; + //将Book工作簿作为输出 + let wbout = XLSX.write(wb, { + bookType: "xlsx", + bookSST: true, + type: "array" + }); + //尝试将当前table内容保存为excel文件 + try { + FileSaver.saveAs( + //被导出的blob二进制对象 + new Blob([wbout], {type: "application/octet-stream"}), + //导出文件的名称+后缀名 + name + ".xlsx" + ); + } catch (e) { + if (typeof console !== "undefined") console.log(e, wbout); + } +} diff --git a/src/util/filters/filters.js b/src/util/filters/filters.js new file mode 100644 index 0000000..09a8659 --- /dev/null +++ b/src/util/filters/filters.js @@ -0,0 +1,78 @@ +/** + *格式化时间 + *yyyy-MM-dd hh:mm:ss + */ +export function formatDate(time, fmt) { + if (time === undefined || time === '' || time === null || time === 0) { + return + } + if (typeof time === 'string') { + return time + } + time = time * 1000 + const date = new Date(time) + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + const o = { + 'M+': date.getMonth() + 1, + 'd+': date.getDate(), + 'h+': date.getHours(), + 'm+': date.getMinutes(), + 's+': date.getSeconds() + } + for (const k in o) { + if (new RegExp(`(${k})`).test(fmt)) { + const str = o[k] + '' + fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? str : padLeftZero(str)) + } + } + return fmt +} + +function padLeftZero(str) { + return ('00' + str).substr(str.length) +} + +export function timestampFormatDate(timestamp, format) { + let date = timestampFormatDate(timestamp); + let result = formatDate(date, format) + return result +} + +var minute = 60; +var hour = minute * 60; +var day = hour * 24; +var week = day * 7; +var month = day * 30; + +export function getTimer(stringTime,language) { + var time1 = new Date().getTime() / 1000;//当前的时间戳 + var time2 = stringTime; //Date.parse(new Date(stringTime));//指定时间的时间戳 + var time = time1 - time2; + var result = null; + /*if(time < 0){ + + }else if(time/month >= 1){ + result = parseInt(time/month) + "月前"; + }else if(time/week >= 1){ + result = parseInt(time/week) + "周前"; + }else */ + if (time / day >= 30) { + result = language === 2 ? "30天前" : '30 days ago '; + } else if (time / day >= 1) { + result = language === 2 ? parseInt(time / day) + "天前" : parseInt(time / day) + 'days ago'; + } else if (time / hour >= 1) { + result = language === 2 ? parseInt(time / hour) + "小时前" : parseInt(time / hour) + 'hours ago'; + } else if (time / minute >= 1) { + result = language === 2 ? parseInt(time / minute) + "分钟前" : parseInt(time / minute) + 'minutes ago'; + } else { + // result = "刚刚"; + result = language === 2 ? "1分钟前" : '1 minutes age'; + } + return result; +} + + + + diff --git a/src/util/filters/index.js b/src/util/filters/index.js new file mode 100644 index 0000000..4be4c50 --- /dev/null +++ b/src/util/filters/index.js @@ -0,0 +1,6 @@ +import Vue from 'vue' +import * as filter from './filters' + +Object.keys(filter).forEach(k => Vue.filter(k, filter[k])) + +Vue.prototype.$formatDate = Vue.filter('formatDate') diff --git a/src/util/fix/index.ts b/src/util/fix/index.ts new file mode 100644 index 0000000..6e0472e --- /dev/null +++ b/src/util/fix/index.ts @@ -0,0 +1,4 @@ +// 获取设备独立像素 +const screenWidth = window.screen.width +const screenHeight = window.screen.height +// 基于1920 * 1080 diff --git a/src/util/format/index.ts b/src/util/format/index.ts new file mode 100644 index 0000000..0acd0bc --- /dev/null +++ b/src/util/format/index.ts @@ -0,0 +1,30 @@ +/** + * 格式化港口名称 + * @param data + */ +export const portName = function (data: any) { + if (data) { + let name = '' + if (data.nameEn && data.nameChs) { + name += `${data.nameChs}(${data.nameEn})` + } else if (data.nameChs || data.nameEn) { + name += `${data.nameChs || data.nameEn}` + } + return name + } +} +/** + * 格式化国家名称 + * @param data + */ +export const countryName = function (data: any) { + if (data) { + let name = '' + if (data.countryEn && data.countryChs) { + name += `${data.countryChs}(${data.countryEn})` + } else if (data.countryChs || data.countryEn) { + name += `${data.countryChs || data.countryEn}` + } + return name + } +} diff --git a/src/util/fun-switch/index.ts b/src/util/fun-switch/index.ts new file mode 100644 index 0000000..bd2cc6e --- /dev/null +++ b/src/util/fun-switch/index.ts @@ -0,0 +1,36 @@ +/*功能开关*/ + +/*搜索中的功能开关*/ +export const search = { + open: true, // 搜索总开关 + port: true, // 搜索港口功能 + ship: true, // 搜索船舶功能} + urlMMSI: true // url 中传递没mmsi 进行船舶搜索 +} +/* 头部的共能开关 */ +export const header = { + message: true, // 消息开关 + trans: false // 翻译开关 +} +/* 显示全部港口的功能开关 */ +export const allPort = false // 显示全部港口 + +/* 港口信息中的功能开关 */ +export const portQuery = { + dongTai: false, // 港口信息中动态开关 + weather: true // 港口信息中天气开关 +} +/* 船舶信息中的功能开关 */ +export const shipInfo = { + doc: false, // 船舶信息中船舶档案开关 + innerShip: false, // 船舶信息中内河船舶开关 + pos: true, // 船舶信息中定位按钮开关 + track: true, // 船舶信息中轨迹查询开关 + portCalling: true, // 船舶信息中挂靠港记录开关 + hc: false, // 船舶信息中航次开关 + destPortJump: false, // 目的地跳转 + shipEvent: false, // 船舶事件 + routeYc: false // 航线预测 +} +/*页面上消息滚动开关*/ +export const messageRoll = false diff --git a/src/util/init-data/index.ts b/src/util/init-data/index.ts new file mode 100644 index 0000000..4353d72 --- /dev/null +++ b/src/util/init-data/index.ts @@ -0,0 +1,99 @@ +import HttpApi from "@/api"; +import storeUtil from "@/util/store"; +import Vue from "vue"; + +/*----------------------初始化字典信息---------------------*/ +let dictionaryData: any = {}; +HttpApi.searchDictionary('1').then((res: any) => { + if (res) { + dictionaryData.shipCountry = res + } +}); +HttpApi.searchDictionary('2').then((res: any) => { + if (res) { + dictionaryData.shipType = res + } +}); +HttpApi.searchDictionary('3').then((res: any) => { + if (res) { + dictionaryData.shipStatus = res + } +}) + +setTimeout(() => { + storeUtil.setDictionary(dictionaryData) +}, 1000) +/*----------------------初始化字典信息结束---------------------*/ + +/* 获取船队数据*/ +// HttpApi.getShipRanks({}).then((res: any) => { +// const TreeData: any[] = [] +// let shipIds = '' +// const newShipList: any = [] +// for (let i = 0; i < res.length; i++) { +// const fleet = JSON.parse(JSON.stringify(res[i])) +// let tempData: any = {} +// tempData = JSON.parse(JSON.stringify(fleet)) +// tempData.status = true +// tempData.followShipList = [] +// +// if (fleet.followShipList && fleet.followShipList.length > 0) { +// for (let j = 0; j < fleet.followShipList.length; j++) { +// const ship = JSON.parse(JSON.stringify(fleet.followShipList[j])) +// ship.status = true +// ship.color = fleet.color +// ship.name = ship.customName +// tempData.followShipList.push(ship) +// shipIds += ship.shipId + ',' +// } +// } +// +// TreeData.push(tempData) +// } +// Vue.prototype.$fleetList = TreeData +// const data = {shipId: shipIds} +// +// HttpApi.getShipMessage(data).then((res: any) => { +// if (res) { +// const fleetList = Vue.prototype.$fleetList +// for (let i = 0; i < fleetList.length; i++) { +// const followShipList = fleetList[i].followShipList +// if (followShipList) { +// for (let j = 0; j < followShipList.length; j++) { +// for (let m = 0; m < res.length; m++) { +// if (res[m].shipId === followShipList[j].shipId) { +// res[m].color = followShipList[j].color +// const element = res[m] +// element.isFleet = true +// Vue.prototype.$sourceShips.push(element) +// newShipList.push({ +// y: element.shiptype, +// m: element.mmsi, +// h: element.heading, +// g: element.callsign, +// c: element.cog, +// o: element.imo, +// s: element.sog, +// v: element.aisNavStatus, +// l: element.length, +// p: element.destPort, +// b: element.breadth, +// r: element.eta, +// d: element.draught, +// t: element.posTime, +// i: element.shipId, +// n: element.lon, +// a: element.lat, +// e: element.shipnameEn, +// color: element.color, +// isFleet: true +// }) +// } +// } +// } +// } +// } +// Vue.prototype.$originAllShipRankList = JSON.parse(JSON.stringify(newShipList)) +// } +// }) +// }) diff --git a/src/util/map/img/berth.png b/src/util/map/img/berth.png new file mode 100644 index 0000000..f3d1a5f Binary files /dev/null and b/src/util/map/img/berth.png differ diff --git a/src/util/map/img/blue.png b/src/util/map/img/blue.png new file mode 100644 index 0000000..afe426a Binary files /dev/null and b/src/util/map/img/blue.png differ diff --git a/src/util/map/img/duobianxing.png b/src/util/map/img/duobianxing.png new file mode 100644 index 0000000..4b82999 Binary files /dev/null and b/src/util/map/img/duobianxing.png differ diff --git a/src/util/map/img/end.png b/src/util/map/img/end.png new file mode 100644 index 0000000..6453b9b Binary files /dev/null and b/src/util/map/img/end.png differ diff --git a/src/util/map/img/guiji.png b/src/util/map/img/guiji.png new file mode 100644 index 0000000..7c69f0b Binary files /dev/null and b/src/util/map/img/guiji.png differ diff --git a/src/util/map/img/juxing.png b/src/util/map/img/juxing.png new file mode 100644 index 0000000..c6aa3d9 Binary files /dev/null and b/src/util/map/img/juxing.png differ diff --git a/src/util/map/img/kuang.png b/src/util/map/img/kuang.png new file mode 100644 index 0000000..f7a2172 Binary files /dev/null and b/src/util/map/img/kuang.png differ diff --git a/src/util/map/img/laba.png b/src/util/map/img/laba.png new file mode 100644 index 0000000..d69fcbf Binary files /dev/null and b/src/util/map/img/laba.png differ diff --git a/src/util/map/img/line.png b/src/util/map/img/line.png new file mode 100644 index 0000000..a2f5e01 Binary files /dev/null and b/src/util/map/img/line.png differ diff --git a/src/util/map/img/logo.png b/src/util/map/img/logo.png new file mode 100644 index 0000000..651689a Binary files /dev/null and b/src/util/map/img/logo.png differ diff --git a/src/util/map/img/logo1.png b/src/util/map/img/logo1.png new file mode 100644 index 0000000..0147f67 Binary files /dev/null and b/src/util/map/img/logo1.png differ diff --git a/src/util/map/img/marineWeather.png b/src/util/map/img/marineWeather.png new file mode 100644 index 0000000..3471261 Binary files /dev/null and b/src/util/map/img/marineWeather.png differ diff --git a/src/util/map/img/marineWeather.svg b/src/util/map/img/marineWeather.svg new file mode 100644 index 0000000..00c1fea --- /dev/null +++ b/src/util/map/img/marineWeather.svg @@ -0,0 +1 @@ + diff --git a/src/util/map/img/port.png b/src/util/map/img/port.png new file mode 100644 index 0000000..34f7da8 Binary files /dev/null and b/src/util/map/img/port.png differ diff --git a/src/util/map/img/select.png b/src/util/map/img/select.png new file mode 100644 index 0000000..c2574d2 Binary files /dev/null and b/src/util/map/img/select.png differ diff --git a/src/util/map/img/shipAgency.png b/src/util/map/img/shipAgency.png new file mode 100644 index 0000000..111f409 Binary files /dev/null and b/src/util/map/img/shipAgency.png differ diff --git a/src/util/map/img/shipWarningIcon.png b/src/util/map/img/shipWarningIcon.png new file mode 100644 index 0000000..0d91560 Binary files /dev/null and b/src/util/map/img/shipWarningIcon.png differ diff --git a/src/util/map/img/start.png b/src/util/map/img/start.png new file mode 100644 index 0000000..17e1894 Binary files /dev/null and b/src/util/map/img/start.png differ diff --git a/src/util/map/img/time.png b/src/util/map/img/time.png new file mode 100644 index 0000000..94cbe92 Binary files /dev/null and b/src/util/map/img/time.png differ diff --git a/src/util/map/img/tool.png b/src/util/map/img/tool.png new file mode 100644 index 0000000..c103157 Binary files /dev/null and b/src/util/map/img/tool.png differ diff --git a/src/util/map/img/tool.svg b/src/util/map/img/tool.svg new file mode 100644 index 0000000..7be008c --- /dev/null +++ b/src/util/map/img/tool.svg @@ -0,0 +1,35 @@ + + 工具 + Created with Sketch. + + + + + + + + + diff --git a/src/util/map/img/tt_b3.png b/src/util/map/img/tt_b3.png new file mode 100644 index 0000000..7642f9e Binary files /dev/null and b/src/util/map/img/tt_b3.png differ diff --git a/src/util/map/img/yuan.png b/src/util/map/img/yuan.png new file mode 100644 index 0000000..c8688f5 Binary files /dev/null and b/src/util/map/img/yuan.png differ diff --git a/src/util/map/index.ts b/src/util/map/index.ts new file mode 100644 index 0000000..3c966e3 --- /dev/null +++ b/src/util/map/index.ts @@ -0,0 +1,22 @@ +import store from '@/util/store' + +class MapUtil { + /** + * 选择船舶 + */ + public chooseShip (data: any,isArea?: boolean) { + const shipFun: any = store.getMapFun() + let shipmes = data + let lon = shipmes.n / 600000 + let lat = shipmes.a / 600000 + if (isArea) { + shipFun.showShips(shipmes.i) + } else { + shipFun.addShip([data], 2, data.map) + } + shipFun.setCenter([lon, lat]) + shipFun.addSelectByCoor([lon, lat]) + } +} + +export default new MapUtil() diff --git a/src/util/map/map.d.ts b/src/util/map/map.d.ts new file mode 100644 index 0000000..711be40 --- /dev/null +++ b/src/util/map/map.d.ts @@ -0,0 +1,4 @@ +declare module '@/util/map/map.js' { + import shipMap from '@/util/map/map.js' + export default shipMap +} diff --git a/src/util/map/map.js b/src/util/map/map.js new file mode 100644 index 0000000..fe87387 --- /dev/null +++ b/src/util/map/map.js @@ -0,0 +1,3039 @@ +import 'ol/ol.css' //引入样式 +import Map from 'ol/Map' //地图 +import View from 'ol/View' // 地图视图 +import TileLayer from 'ol/layer/Tile' //地图图层 +import {Group} from 'ol/layer' //地图图层 +import OSM from 'ol/source/OSM' +import XYZ from 'ol/source/XYZ' +import TileWMS from 'ol/source/TileWMS' +import {getHeight, getWidth} from 'ol/extent' +import {transform, fromLonLat, get} from 'ol/proj' //坐标系转换 +import TileGrid from 'ol/tilegrid/TileGrid' +import Projection from 'ol/proj/Projection' +import Vector from 'ol/layer/Vector' //图层 +import SourceVector from 'ol/source/Vector' //资源 +import ScaleLine from 'ol/control/ScaleLine' //比例尺 +import FullScreen from 'ol/control/FullScreen' //比例尺 +import Feature from 'ol/Feature' //矢量对象 +import Overlay from 'ol/Overlay' //矢量对象 +import Point from 'ol/geom/Point' //点 +import CircleGeom from 'ol/geom/Circle' +import Icon from 'ol/style/Icon' +import LineString from 'ol/geom/LineString' //线 +import Polygon from 'ol/geom/Polygon' //线 +import intSelect from 'ol/interaction/Select' //地图监听函数 +import MouseWheelZoom from 'ol/interaction/MouseWheelZoom' //滚轮放大缩小地图 +import Draw from 'ol/interaction/Draw' //画线工具 +import Snap from 'ol/interaction/Snap' +import MousePosition from 'ol/control/MousePosition' //实时显示鼠标位置 +import {createBox} from 'ol/interaction/Draw' //画线工具 +import dayjs from "dayjs"; +import {getArea, getLength, getDistance, DEFAULT_RADIUS} from 'ol/sphere' +import shipStyle from './style' +import {formatDate} from '../filters/filters' +import {register} from 'ol/proj/proj4' +import proj4 from 'proj4' +import ImageCanvasSource from 'ol/source/ImageCanvas' +import ImageLayer from 'ol/layer/Image' +import XYZSource from 'ol/source/XYZ' +import GeoJSON from 'ol/format/GeoJSON' +import {OlClient, Factor} from 'weatherv' +import WKT from 'ol/format/WKT' + +// import { GetShipMessage } from '../../api/index' +import {Circle, Fill, Stroke, Style, Text} from 'ol/style.js' +import unByKey from 'ol/Observable.js' + +const shipMap = new Object({ + map: null, //地图 + view: null, //地图的资源 + layer: null, //地图的图层 + shipSource: null, //船舶的资源 + portSource: null,//港口资源 + shipSourceStandby: null, //船舶的备用资源 + shipLayer: null, //船舶的图层 + shipStyle: null, //船舶样式 + shipClick: null, //船舶的点击函数 + pathLineSource: null, //轨迹路径资源层 + pathLineLayer: null, //轨迹路径图层 + portLayer: null,//港口图层 + pathPointSource: null, //轨迹点资源层 + pathPointLayer: null, //轨迹点图层 + selectSource: null, //船舶选择资源 + selectLayer: null, //船舶选择图层 + sourceList: [], //资源数组 + layerList: [], //图层数组 + drawPointSource: null, //标记资源 + drawPointLayer: null, //标记图层 + drawPointDraw: null, //标记画笔 + measureTooltipElement: null, //轨迹显示距离的div + //我的修改 + drawRingDraw: null, + maxpoint: Infinity, + __selectPort: null,//点击港口 + +}) +let mapToolOver = [] +const shipFun = new Object({}) +shipFun.setmap = function (map) { + shipMap.map = map +} + +var __pathData = {}; +var __pathDrawData = {}; +var __pathArray = {}; +const abcLineData = [ + [ + 11822129.922245655, + 2284881.0700673275 + ], + [ + 12022505.005673546, + 2284881.0700673275 + ], + [ + 12170927.282748217, + 2286852.8770299805 + ], + [ + 12356463.478053365, + 2309658.5222366545 + ], + [ + 12419544.522836259, + 2309658.5222366545 + ], + [ + 13503054.233224085, + 2309658.5222366545 + ] +] +//地图 +shipMap.view = new View({ + projection: 'EPSG:3857', //使用这个坐标系 + center: transform([120, 36], 'EPSG:4326', 'EPSG:3857'), //定义中心位置 + zoom: 6, //定义等级 + minZoom: 3, //最小等级 + maxZoom: 18 //最大等级 + // rotation:120 +}) +shipMap.layer = new TileLayer({ + source: new OSM(), //资源 + zIndex: 1 +}) + +var projection_3395 = new Projection({ + code: 'EPSG:3395', + extent: [-20026376.39, -15496570.74, 20026376.39, 18764656.23], + units: 'm', + axisOrientation: 'neu' +}) + +proj4.defs( + 'EPSG:3395', + '+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs' +) +register(proj4) + +var seaMapPath = 'http://cm191.myships.com/ChartMap' + +function getSeaMapSource() { + var projectionExtent = get('EPSG:3857').getExtent() + var height = getHeight(projectionExtent) + var width = getWidth(projectionExtent) + var tileSize = [256, 256] + var maxResolution = Math.max(width / tileSize[0], height / tileSize[1]) + var length = 18 + 1 + var resolutions = new Array(length) + for (var z = 0; z < length; ++z) { + resolutions[z] = maxResolution / Math.pow(2, z) + } + var tilegrid = new TileGrid({ + origin: [projectionExtent[0], projectionExtent[3]], + tileSize: tileSize, + resolutions: resolutions + }) + shipMap.view.on('change:resolution', function (event) { + freshPath(); + }); + + + function freshPath() { + for (var pathId in __pathData) { + var data = __pathData[pathId]; + var re = __makePathData(data, shipMap.map, pathId); + var old_re = __pathDrawData[pathId]; + if (!old_re || re.length != old_re.length) { + __pathDrawData[pathId] = re; + var ids = __pathArray[pathId]; + if (ids && ids.length > 0) { + ids.forEach(function (item, index) { + var f = shipMap.sourceList.pathLineSource.getFeatureById(item); + var f2 = shipMap.sourceList.pathPointSource.getFeatureById(item); + if (f || f2) { + shipMap.sourceList.pathLineSource.removeFeature(f); + shipMap.sourceList.pathPointSource.removeFeature(f2); + } + }) + } + __drawPathData(re, pathId); + } + } + } + + function padLeft(num, val) { + return (new Array(num).join('0') + val).slice(-num) + } + + return new XYZ({ + cacheSize: 256, + projection: projection_3395, + tileGrid: tilegrid, + tileUrlFunction: function (xyz, obj1, obj2) { + if (!xyz) { + return '' + } + var z = xyz[0] - 2 + if (z <= -1) return '' + var x = Math.abs(xyz[1]) + var y = Math.abs(xyz[2]) + x = 'C' + padLeft(8, x.toString(16)) + y = 'R' + padLeft(8, y.toString(16)) + z = 'L' + padLeft(2, z) + return seaMapPath + '/' + z + '/' + y + '/' + x + '.jpg' + } + }) +} + +shipMap.seaView = getSeaMapSource() + +shipMap.seaLayer = new TileLayer({ + preload: Infinity, + source: shipMap.seaView, + zIndex: 1 +}) +//卫星图 +shipMap.sateView = new XYZ({ + url: + 'http://mt{0-1}.google.cn/maps/vt?lyrs=s@198&hl=zh-CN&gl=CN&&x={x}&y={y}&z={z}' +}) +shipMap.sateLayer = new TileLayer({ + preload: Infinity, + source: shipMap.sateView, + zIndex: 1 +}) + + +shipMap.tdtLayer = new Group({ + layers: [ + new TileLayer({ + source: new XYZ({ + crossOrigin: 'anonymous', + url: 'https://t{0-7}.tianditu.gov.cn/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=f68226212bdd3ffed1b0bb884f81ddda' + }) + }), + new TileLayer({ + source: new XYZ({ + crossOrigin: 'anonymous', + url: 'https://t{0-7}.tianditu.gov.cn/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=f68226212bdd3ffed1b0bb884f81ddda' + }) + }) + ] +}) +//分布图 +shipMap.distributeLayer = new TileLayer({ + preload: Infinity, + visible: true, + source: new TileWMS({ + url: 'https://g.myships.com/dist/wms', + params: { + FORMAT: 'image/png', + VERSION: '1.1.0', + tiled: true, + LAYERS: 'myships:pos_latest_3857_1hour', + exceptions: 'application/vnd.ogc.se_inimage', + tilesOrigin: -20037508.342789244 + ',' + -20048966.1040146 + } + }), + zIndex: 20 +}) + + +//船舶 +shipMap.sourceList.shipSource = new SourceVector() +shipMap.layerList.shipLayer = new Vector({ + source: shipMap.sourceList.shipSource, + name: 'shipLayer', + style: (f, r) => shipStyle.newshipStyle(f, r, shipMap.map), + zIndex: 21 +}) +//船舶 +shipMap.sourceList.carSource = new SourceVector() +shipMap.layerList.carLayer = new Vector({ + source: shipMap.sourceList.carSource, + name: 'carLayer', + style: (f, r) => shipStyle.carStyle(f, r, shipMap.map), + zIndex: 22 +}) + + +// 港资源 +shipMap.sourceList.portSource = new SourceVector() +shipMap.layerList.portLayer = new Vector({ + source: shipMap.sourceList.portSource, + zIndex: 15 +}) + +// 泊位图层资源 +shipMap.sourceList.berthSource = new SourceVector() +shipMap.layerList.berthLayer = new Vector({ + source: shipMap.sourceList.berthSource, + zIndex: 17 +}) + +//轨迹 +shipMap.sourceList.pathLineSource = new SourceVector() +shipMap.layerList.pathLineLayer = new Vector({ + source: shipMap.sourceList.pathLineSource, + zIndex: 4 +}) + +// 轨迹上的点 +shipMap.sourceList.pathPointSource = new SourceVector() +shipMap.layerList.pathPointLayer = new Vector({ + source: shipMap.sourceList.pathPointSource, + zIndex: 5 +}) + + +// 地图上显示的点 +shipMap.sourceList.PointSource = new SourceVector() +shipMap.layerList.PointLayer = new Vector({ + source: shipMap.sourceList.PointSource, + zIndex: 5 +}) + +var lineStyle = new Style({ + stroke: new Stroke({ + color: '#FF0000', + width: 1 + }) +}); +shipMap.sourceList.jjxSource = new SourceVector(); +shipMap.layerList.jjxLayer = new Vector({ + source: shipMap.sourceList.jjxSource, + style: lineStyle, + visible: false, + zIndex: 3 +}); + +shipMap.sourceList.taifeng = new SourceVector(); +shipMap.layerList.taifengLayer = new Vector({ + source: shipMap.sourceList.taifeng, + style: function (feature, res) { + var style; + var t = parseInt(feature.get('t')); + if (t == 1 || t == 0)//历史当前点 + style = getTyphoonStyle(feature, res); + else if (t == 2)//预报点 + style = getTyphoonFutureStyle(feature, res); + else if (t == 3) { + style = getTyphoonStyleLine(feature, res); + return style; + } else { + style = getTyphoonFutureStyle(feature, res); + } + return style; + } +}); +shipMap.layerList.taifengLayer.setZIndex(20); + +//定义区间 +var min = [41.5, 10.8, 17.2, 24.5, 32.7, 51]; +var max = [50.9, 17.1, 24.4, 32.6, 41.4, 1000]; + +function getTyphoonStyle(f, r) { + var maxWindSpeed = f.get('maxWindSpeed'); + var level = 0; + for (var i = 0; i <= 5; i++) { + if (min[i] <= maxWindSpeed && maxWindSpeed <= max[i]) { + level = i; + } + } + var color = ''; + switch (level) { + case 0: + color = '#EB4FA0' + break; + case 1: + color = 'blue' + break; + case 2: + color = 'yellow' + break; + case 3: + color = 'orange' + break; + case 4: + color = 'red' + break; + case 5: + color = 'purple' + break; + default: + break; + } + + var s = new Style({ + fill: new Fill({ + color: color + }), + stroke: new Stroke({ + color: color, + width: 2 + }), + image: new Circle({ + radius: 4, + fill: new Fill({ + color: color + }) + }) + }); + if (r < 3000) { + var ntext = new Text({ + textAlign: "left", + font: '10px Microsoft YaHei', + fill: new Fill({ + color: color + }), + stroke: new Stroke({ + color: "#FFF", + width: 3 + }), + textBaseline: "bottom", + offsetX: 8, + offsetY: -8, + text: f.get("forecast") + }); + s.setText(ntext); + } + + const style2 = new Style({ + text: new Text({ + textAlign: "left", + font: '10px Microsoft YaHei', + fill: new Fill({ + color: '#fff' + }), + stroke: new Stroke({ + color: "black", + width: 1 + }), + textBaseline: "bottom", + offsetX: 8, + offsetY: -8, + text: f.get("time") + }) + }) + return [s, style2]; +} + +function getTyphoonFutureStyle(f, r) { + var maxWindSpeed = f.get('maxWindSpeed'); + + var level = 0; + for (var i = 0; i <= 5; i++) { + if (min[i] <= maxWindSpeed && maxWindSpeed <= max[i]) { + level = i; + } + } + var color = ''; + switch (level) { + case 0: + color = '#EB4FA0' + break; + case 1: + color = 'blue' + break; + case 2: + color = 'yellow' + break; + case 3: + color = 'orange' + break; + case 4: + color = 'red' + break; + case 5: + color = 'purple' + break; + default: + break; + } + var s = new Style({ + fill: new Fill({ + color: color + }), + stroke: new Stroke({ + color: color, + lineDash: [10, 10], + width: 2 + }), + image: new Circle({ + radius: 4, + fill: new Fill({ + color: color + }) + }) + }); + if (r < 3000) { + var t = f.get('temp'); + if (t != 1) { + var ntext = new Text({ + textAlign: "left", + font: '10px Microsoft YaHei', + fill: new Fill({ + color: color + }), + stroke: new Stroke({ + color: "#FFF", + width: 3 + }), + textBaseline: "bottom", + offsetX: 8, + offsetY: -8, + text: f.get("forecast") + }) + s.setText(ntext); + } + } + const style2 = new Style({ + text: new Text({ + textAlign: "left", + font: '10px Microsoft YaHei', + fill: new Fill({ + color: '#fff' + }), + stroke: new Stroke({ + color: "black", + width: 1 + }), + textBaseline: "bottom", + offsetX: 8, + offsetY: -8, + text: f.get("time") + }) + }) + + + return [s, style2]; +} + +function getTyphoonStyleLine(f, r) { + var ss = []; + var s = new Style({ + fill: new Fill({ + color: 'rgba(255, 120,120, 0.8)' + }), + stroke: new Stroke({ + color: 'rgba(255, 120,120, 0.8)', + width: 2 + }), + image: new Circle({ + radius: 4, + fill: new Fill({ + color: 'rgba(255,120,120, 0.8)' + }) + }) + }); + if (r < 3000) { + var ntext = new Text({ + textAlign: "left", + font: '10px Microsoft YaHei', + fill: new Fill({ + color: "RGB(255,120,120)" + }), + stroke: new Stroke({ + color: "#FFF", + width: 3 + }), + textBaseline: "bottom", + offsetX: 8, + offsetY: -8, + text: f.get("forecast") + }); + s.setText(ntext); + } + ss.push(s); + var geometry = f.getGeometry(); + geometry.forEachSegment(function (start, end) { + var dx = end[0] - start[0]; + var dy = end[1] - start[1]; + var rotation = Math.atan2(dy, dx); + // arrows + ss.push(new Style({ + geometry: new Point(end), + image: new Icon({ + src: 'images/msmap/arrow100.png', + anchor: [1.5, 0.5], + rotateWithView: true, + rotation: -rotation + }) + })); + }); + return ss; +} + +//船舶选择框 +shipMap.sourceList.selectSource = new SourceVector() +shipMap.layerList.selectLayer = new Vector({ + source: shipMap.sourceList.selectSource, + zIndex: 21 +}) + +//标记画笔的添加 +shipMap.drawPointSource = new SourceVector() +shipMap.drawPointLayer = new Vector({ + source: shipMap.drawPointSource, + zIndex: 7 +}) +shipMap.drawPointDraw = new Draw({ + source: shipMap.drawPointSource, + type: 'Point' //可以根据类型改变 +}) +//测距画笔的添加 +shipMap.drawRingSource = new SourceVector() +shipMap.drawRingLayer = new Vector({ + source: shipMap.drawRingSource, + zIndex: 8, + style: shipStyle.ceJuStyle +}) +//我的修改 +shipMap.drawRingDraw = new Draw({ + maxPoints: shipMap.maxpoint, + style: shipStyle.drawStyle, + source: shipMap.drawRingSource, + type: 'LineString' +}) + +//矩形画笔的添加 +shipMap.drawRectangleSource = new SourceVector() +shipMap.drawRectangleLayer = new Vector({ + source: shipMap.drawRectangleSource, + zIndex: 8 +}) +shipMap.drawRectangleDraw = new Draw({ + source: shipMap.drawRectangleSource, + type: 'Circle', + freehand: false, + geometryFunction: createBox() +}) +//圆型画笔的添加 +shipMap.drawCircleSource = new SourceVector() +shipMap.drawCircleLayer = new Vector({ + source: shipMap.drawCircleSource, + zIndex: 8 +}) +shipMap.drawCircleDraw = new Draw({ + source: shipMap.drawCircleSource, + type: 'Circle' +}) +//多边形的添加 +//我的修改 +shipMap.drawPolygonSource = new SourceVector() +shipMap.drawPolygonLayer = new Vector({ + source: shipMap.drawPolygonSource, + zIndex: 8 +}) +shipMap.drawPolygonDraw = new Draw({ + source: shipMap.drawPolygonSource, + type: 'Polygon' +}) +//我的修改 +//自定义线段的添加 +shipMap.agtSource = new SourceVector() +shipMap.agtLayer = new Vector({ + source: shipMap.agtSource, + zIndex: 16 +}) +//圆的半径 +shipMap.sourceList.circlePath = new SourceVector() +shipMap.layerList.circlePathLayer = new Vector({ + source: shipMap.sourceList.circlePath, + zIndex: 10 +}) +//我的修改 +//eez线 +shipMap.sourceList.eezSource = new XYZ({ + cacheSize: 256, + tileUrlFunction: function (xyz, obj1, obj2) { + if (!xyz) { + return '' + } + let z = xyz[0] + let x = Math.abs(xyz[1]) + let y = xyz[2] + y += Math.pow(2, z) + let tf = Math.pow(2, Math.ceil(z / 2) - 1) + let tt = Math.pow(2, z) + let t = tt / tf + let f1 = parseInt(x / t + '') + let f2 = parseInt(y / t + '') + let lev = shipFun.padLeft(2, z) + let folder = '0_0' + if (z <= 5) { + folder = f1 + '_' + f2 + } else if (z >= 6 && z <= 11) { + folder = shipFun.padLeft(2, f1) + '_' + shipFun.padLeft(2, f2) + } else if (z >= 12 && z <= 17) { + folder = shipFun.padLeft(3, f1) + '_' + shipFun.padLeft(3, f2) + } else { + folder = shipFun.padLeft(4, f1) + '_' + shipFun.padLeft(4, f2) + } + + let xx, yy + if (z <= 5) { + xx = shipFun.padLeft(2, x) + yy = shipFun.padLeft(2, y) + } else if (z >= 6 && z <= 11) { + if (x === 100 || x === 1000) { + xx = shipFun.padLeft(5, x) + } else { + xx = shipFun.padLeft(4, x) + } + + if (y === 100 || y === 1000) { + yy = shipFun.padLeft(5, y) + } else { + yy = shipFun.padLeft(4, y) + } + } else if (z >= 12 && z <= 17) { + if (x === 100 || x === 1000 || x === 10000 || x === 100000) { + xx = shipFun.padLeft(7, x) + } else { + xx = shipFun.padLeft(6, x) + } + + if (y === 100 || y === 1000 || x === 10000 || x === 100000) { + yy = shipFun.padLeft(7, y) + } else { + yy = shipFun.padLeft(6, y) + } + } else { + if ( + x === 100 || + x === 1000 || + x === 10000 || + x === 100000 || + x === 1000000 || + x === 10000000 + ) { + xx = shipFun.padLeft(9, x) + } else { + xx = shipFun.padLeft(8, x) + } + + if ( + y === 100 || + y === 1000 || + x === 10000 || + x === 100000 || + x === 1000000 || + x === 10000000 + ) { + yy = shipFun.padLeft(9, y) + } else { + yy = shipFun.padLeft(8, y) + } + } + return ( + 'http://47.93.90.52:9080' + + '/EPSG_900913_' + + lev + + '/' + + folder + + '/' + + xx + + '_' + + yy + + '.png' + ) + } +}) +shipMap.layerList.eezLayer = new TileLayer({ + preload: Infinity, + visible: true, + source: shipMap.sourceList.eezSource, + zIndex: 20 +}); +//eez线转换函数 +(shipFun.padLeft = function (num, val) { + return (new Array(num).join('0') + val).slice(-num) +}) +//等值线 +// shipMap.layerList.isobarLayer = new Vector({ +// zIndex: 5 +// }) + +// 行政区划图层/api/jfcfdt +// var darkMapPath = 'http://cfdt.ninecosmos.cn'; +var darkMapPath = '' +if (process.env.NODE_ENV === 'production') { + darkMapPath = '/myships/api/jfcfdt' +} else { + darkMapPath = '/myships/jfcfdt' +} +shipMap.layerList.vtLayer = (() => { + const style = new Style({ + stroke: new Stroke({ + color: 'black', + width: 1, + }), + text: new Text({ + font: '12px Calibri,sans-serif', + fill: new Fill({ + color: '#000', + }), + stroke: new Stroke({ + color: '#fff', + width: 3, + }), + }), + }) + return new TileLayer({ + declutter: true, + source: new XYZSource({ + crossOrigin: 'anonymous', + // url: darkMapPath + '/darkmap-retina/{z}/{x}/{y}.png', + url: 'https://api3.myships.com/tiledmap/darkmap-retina/{z}/{x}/{y}.png', + }), + style: function (feature) { + style.getText().setText(feature.get('name')) + return style + }, + }) +})() +shipMap.layerList.vtLayer.setZIndex(4) + +// 九方 初始化可视化sdk +const mapClient = new OlClient() + +// 气象图层数据源 +const sourceImageCanvas = new ImageCanvasSource({ + canvasFunction: (extent3857, resolution, pixelRatio, size) => + mapClient.renderColorMapTileFunction( + extent3857, + resolution, + pixelRatio, + size, + () => sourceImageCanvas.refresh() + ), +}) +// 气象图层 +const config = require('../../../public/config/sys-config.json') +shipMap.layerList.iLayer = new ImageLayer({source: sourceImageCanvas}) +shipMap.layerList.iLayer.setZIndex(3) +if (config.map.weatherLayerOpacity) { + shipMap.layerList.iLayer.setOpacity(config.map.weatherLayerOpacity) +} + + +// 粒子动画图层数据源 +const pImageCanvas = new ImageCanvasSource({ + canvasFunction: (extent3857, resolution, pixelRatio, size) => + mapClient.renderParticleFunction(extent3857, resolution, pixelRatio, size, () => shipMap.map.render()), +}) +// 粒子图层 +shipMap.layerList.pLayer = new ImageLayer({source: pImageCanvas}) +shipMap.layerList.pLayer.setZIndex(6); +//创建地图的函数 +(shipFun.creatMap = () => { + return new Map({ + target: 'map', //定义要显示的dom元素 使用id绑定 + layers: [ + shipMap.seaLayer, + //shipMap.layer, + shipMap.layerList.PointLayer, + shipMap.layerList.shipLayer, + shipMap.layerList.carLayer, + shipMap.layerList.jjxLayer, + shipMap.layerList.taifengLayer, + shipMap.layerList.pathLineLayer, + shipMap.layerList.berthLayer, + shipMap.layerList.pathPointLayer, + shipMap.layerList.selectLayer, + shipMap.layerList.portLayer, + //shipMap.layerList.iLayer,//九方气象图层 + shipMap.layerList.pLayer,// 九方粒子 + //shipMap.layerList.vtLayer,//九方行政区图层 + // shipMap.drawPointLayer, + shipMap.agtLayer, + shipMap.drawRingLayer, + shipMap.drawCircleLayer, + shipMap.drawRectangleLayer, + // ---我的修改--- + shipMap.drawPolygonLayer, + // ---我的修改--- + //我的修改 + shipMap.layerList.circlePathLayer + //我的修改 + ], + view: shipMap.view + }) +}) + +//监听返回zoom +shipFun.getSelectPortFun = function (selectPort) { + shipMap.__selectPort = selectPort +} + +//九方温度 +shipFun.loadTemp = function (url) { + if (!hasLayerInMap(shipMap.layerList.iLayer)) { + shipMap.map.addLayer(shipMap.layerList.iLayer) + } + if (!hasLayerInMap(shipMap.layerList.vtLayer)) { + shipMap.map.addLayer(shipMap.layerList.vtLayer) + } + mapClient.colorMapTileLayer.setOption({ + url: url, + factor: Factor.Temp, + }) + sourceImageCanvas.refresh() + +} +// 加载气压 +shipFun.loadPressure = function (url) { + if (!hasLayerInMap(shipMap.layerList.iLayer)) { + shipMap.map.addLayer(shipMap.layerList.iLayer) + } + if (!hasLayerInMap(shipMap.layerList.vtLayer)) { + shipMap.map.addLayer(shipMap.layerList.vtLayer) + } + // 气压色斑图 + mapClient.colorMapTileLayer.setOption({ + url: url, + factor: Factor.Pressure, + }) + sourceImageCanvas.refresh() +} +// 加载风场 +shipFun.loadWind = function (url) { + if (!hasLayerInMap(shipMap.layerList.iLayer)) { + shipMap.map.addLayer(shipMap.layerList.iLayer) + } + if (!hasLayerInMap(shipMap.layerList.vtLayer)) { + shipMap.map.addLayer(shipMap.layerList.vtLayer) + } + mapClient.colorMapTileLayer.setOption({ + url: url, + factor: Factor.Wind, + }) + sourceImageCanvas.refresh() +} +// 加载洋流 +shipFun.loadSeacurrents = function (url) { + if (!hasLayerInMap(shipMap.layerList.iLayer)) { + shipMap.map.addLayer(shipMap.layerList.iLayer) + } + if (!hasLayerInMap(shipMap.layerList.vtLayer)) { + shipMap.map.addLayer(shipMap.layerList.vtLayer) + } + // 气压色斑图 + mapClient.colorMapTileLayer.setOption({ + url: url, + factor: Factor.SeaCurrents, + }) + sourceImageCanvas.refresh() +} +//加载洋流粒子 +shipFun.loadNineParticleSeacurrents = function (url) { + if (!hasLayerInMap(shipMap.layerList.pLayer)) { + shipMap.map.addLayer(shipMap.layerList.pLayer) + } + // 粒子动画 + mapClient.particleAnimationLayer.setConfig({ + lineWidth: 0.95, + speedFactor: 1.8, + fadeOpacity: 0.85, + particlesNumber: 15000, + dropRate: 0.0005, + dropRateBump: 0.001, + colorRamp: { + 0.0: 'rgba(255,255,255,0.2)', + 1.0: 'rgba(255,255,255,0.5)', + } + }) + mapClient.particleAnimationLayer.setOption({ + url: url, + type: 'image', + factor: Factor.SeaCurrents, + }) +} +//加载风粒子 +shipFun.loadNineParticleWind = function (url) { + if (!hasLayerInMap(shipMap.layerList.pLayer)) { + shipMap.map.addLayer(shipMap.layerList.pLayer) + } + // 粒子动画 + mapClient.particleAnimationLayer.setConfig({ + lineWidth: 0.95, + speedFactor: 0.2, + fadeOpacity: 0.85, + particlesNumber: 15000 + }) + mapClient.particleAnimationLayer.setOption({ + url: url, + type: 'image', + factor: Factor.Wind, + }) +} +// 加载等值线 +shipFun.loadIsobar = function (url) { + if (!hasLayerInMap(shipMap.layerList.isobarLayer)) { + shipMap.layerList.isobarLayer = new Vector({ + source: new SourceVector({ + //'http://cfdt.ninecosmos.cn/meteo-open/s01/2021/09/06/006/pressure-surface-4326-isoline.json', + url: url, + format: new GeoJSON(), + }), + style: function (feature) { + if (shipStyle.isobarStyle && shipStyle.isobarStyle.getText()) { + shipStyle.isobarStyle.getText().setText(feature.get('values_')) + } + return shipStyle.isobarStyle + }, + }) + shipMap.layerList.isobarLayer.setZIndex(5) + shipMap.map.addLayer(shipMap.layerList.isobarLayer) + } +} + +//隐藏台风警戒线 +shipFun.hidejjx = function () { + shipMap.layerList.jjxLayer.setVisible(false) +} + +//显示台风警戒线 +shipFun.showjjx = function () { + shipMap.layerList.jjxLayer.setVisible(true) +} + +//清除九方气象 +shipFun.clearJfWeather = function () { + shipMap.map.removeLayer(shipMap.layerList.iLayer) + shipMap.map.removeLayer(shipMap.layerList.vtLayer) +} +shipFun.clearJfWeatherIsobar = function () { + if (hasLayerInMap(shipMap.layerList.isobarLayer)) { + shipMap.map.removeLayer(shipMap.layerList.isobarLayer) + } +} +shipFun.clearJfParticle = function () { + if (hasLayerInMap(shipMap.layerList.pLayer)) { + shipMap.map.removeLayer(shipMap.layerList.pLayer) + } +} +shipFun.showPort = function (portInfo) { + let coor = transform( + [portInfo.lon, portInfo.lat], + 'EPSG:4326', + 'EPSG:3857' + ) //先定义一个坐标 //速度 航向 经纬度 船舶名 类型 + let geom = new Point(coor) //根据坐标画点 + let f = new Feature({ + geometry: geom, + portId: portInfo.id, + type: 'port', + portNmaeCn: portInfo.nameCn, + portNmaeEn: portInfo.nameEn, + portCode: portInfo.code, + portLatLon: portInfo.latLonStr, + portLon: portInfo.lon, + portLat: portInfo.lat, + name: portInfo.nameEn + }) + f.setStyle(shipStyle.portStyle(f)) + f.set('geom', geom) + shipMap.sourceList.portSource.addFeature(f) +} + +shipFun.showBerth = function (berthInfo) { + let coor = transform( + [berthInfo.decLongitude, berthInfo.decLatitude], + 'EPSG:4326', + 'EPSG:3857' + ) //先定义一个坐标 //速度 航向 经纬度 船舶名 类型 + let geom = new Point(coor) //根据坐标画点 + let f = new Feature({ + geometry: geom, + berthId: berthInfo.berthId, + type: 'berth', + name: berthInfo.berthName, + berthLon: berthInfo.decLongitude, + berthLat: berthInfo.decLatitude, + }) + f.setStyle(shipStyle.berthStyle(f)) + f.set('geom', geom) + f.setId('berth-' + berthInfo.berthId) + shipMap.sourceList.berthSource.addFeature(f) +} +// 清除所有泊位 +shipFun.clearallBerth = (map) => { + shipMap.sourceList.berthSource.clear() + return true +} +//清除所有港口 +shipFun.clearallPort = (map) => { + shipMap.sourceList.portSource.clear() + return true +} +//判定图层是否存在map +//判断当前图层是否存在地图中 +function hasLayerInMap(layer) { + var layers = shipMap.map.getLayers() + for (var i = 0; i < layers.getLength(); i++) { + var item = layers.item(i) + if (item === layer) { + return true + } + } + return false +} + +//清除所有船舶 +shipFun.clearallship = (map) => { + shipMap.sourceList.shipSource.clear() + return true +} +shipFun.clearAllCar = (map) => { + shipMap.sourceList.carSource.clear() + return true +} +shipFun.addCar = (data, map) => { + const source = shipMap.sourceList.carSource + const features = source.getFeatures() + if (features) { + for (let i = 0; i < data.length; i++) { + const item = data[i] + features.forEach((f) => { + if (f.getId() === item.carNum) { + source.removeFeature(f) + } + }) + } + } + const newFeatures = [] + for (let i = 0; i < data.length; i++) { + const item = data[i] + if(item.carNum){ + const f = new Feature({ + geometry: new Point(transform([Number(item.longitude), Number(item.latitude)], 'EPSG:4326', 'EPSG:3857')) + }) + f.setId(item.carNum); + Object.keys(item).forEach((key) => { + f.set(key, item[key]) + }) + f.set('type','car') + newFeatures.push(f) + } + } + source.addFeatures(newFeatures) +} +function identifySouOrNor(lines, point) { + //将线段的点切割为数组,数组的每个元素为一条线段 + const lineData = [] + for(let i = 0; i { + if(point[0]>line[0][0] && point[0] { + latitudeArr.push(item[1]) + }) + const maxLatitude = Math.max(...latitudeArr) + if(point[1]>maxLatitude){ + return false + } else { + return true + } + } + if (projectionLine[0][1] == projectionLine[1][1]) { + if (point[1]0) { + return true + } else { + return false + } +} +//添加 船舶 +shipFun.addShip = (dataList, zoom, map, selectlist) => { + // shipMap.sourceList.shipSource.clear() + for (let i = 0; i < dataList.length; i++) { + const element = dataList[i] + let coor = transform( + [dataList[i].n / 600000, dataList[i].a / 600000], + 'EPSG:4326', + 'EPSG:3857' + ) //先定义一个坐标 //速度 航向 经纬度 船舶名 类型 + // 判断船舶坐标在abc线的南北 + // if(identifySouOrNor(abcLineData, coor)==false){ + // element.color = '#FF0000' + // } + let geom = new Point(coor) //根据坐标画点 + let f = new Feature({ + geometry: geom, //添加点图形 + type: 'ship', + shiptype: element.y, + mmsi: element.m, + heading: element.h, + callsign: element.g, + cog: element.c, + imo: element.o, + sog: element.s, + aisNavStatus: element.v, + length: element.l, + destPort: element.p, + breadth: element.b, + eta: element.r, + draught: element.d, + posTime: element.t, + shipId: element.i, + lon: dataList[i].n, + lat: dataList[i].a, + shipnameEn: dataList[i].e, + color: element.color + }) + f.setId(dataList[i].i) + f.set('geom', geom) + shipMap.sourceList.shipSource.addFeature(f, zoom) + } +} + +shipFun.getShipFeaturesByIds = (shipIds) => { //根据shipId找到对应的feature + const features = [] + shipIds.forEach(id => { + let f = shipMap.sourceList.shipSource.getFeatureById(id) + features.push(f) + }) + return features +} +shipFun.getCarFeaturesByIds = (carIds) => { //根据shipId找到对应的feature + const features = [] + carIds.forEach(id => { + let f = shipMap.sourceList.carSource.getFeatureById(id) + features.push(f) + }) + return features +} + +shipFun.plotting = function (number) { + shipStyle.plotting(number) +} +//添加全屏控件 +shipFun.addFullScreen = (map) => { + let FullScreenControl = new FullScreen({ + // units: 'metric', + // target: 'scalebar', + className: 'ol-full-screen' + }) + map.addControl(FullScreenControl) +} + +//添加比例尺控件 +shipFun.addScaleLine = (map) => { + let scaleLineControl = new ScaleLine({ + units: 'nautical', + target: 'scalebar', + className: 'ol-scale-line' + }) + map.addControl(scaleLineControl) +} +window.wulaFeature = [];//台风显示需要的这个是风圈 +window.wulaTime = [];//台风风圈运动的定时器 +var wulaFeature1 = [];//台风显示需要的 这个是风圈中心点 +var wktformat = new WKT() + + +// 显示台风 +shipFun.showTyphoon = function (data, level, time, name) { + __showTaiFengNew2(data, level, time, name); +} + +//绘制台风图层new +function __showTaiFengNew2(tdata, level, time, name) { + var data = tdata.data; + + var arr = data.filter(function (item, index) { + item.longitude = item.lon; + if (index > 0) { + if ((item.lon - data[index - 1].lon) < -180) + item.lon += 360; + else if ((item.lon - data[index - 1].lon) > 180) + item.lon -= 360; + + } + item.f = item.forcast.filter(function (it, idx) { + if (idx == 0) { + if ((it.lon - item.lon) < -180) + it.lon += 360; + else if ((it.lon - item.lon) > 180) + it.lon -= 360; + } + if (idx > 0) { + if ((it.lon - item.forcast[idx - 1].lon) < -180) + it.lon += 360; + else if ((it.lon - item.forcast[idx - 1].lon) > 180) + it.lon -= 360; + } + return it; + }); + return item; + }); + var his = [], current, fut = [], arrLength; + arrLength = arr.length; + for (var i = 0; i < arrLength - 1; i++) { + arr[i].t = 0; + his.push(arr[i]); + if (arr[i].f.length > 0) { + arr[i].f.unshift(arr[i]); + } + } + current = arr[arrLength - 1]; + current.t = 1; + for (var i = 0; i < current.f.length; i++) { + current.f[i].t = 2; + current.f[i].longitude = current.f[i].lon; + fut.push(current.f[i]); + } + var all = his.concat(current); + all = all.concat(fut); + + /*var startll = ol.proj.fromLonLat([arr[0].lon, arr[0].lat]); + var startf = new ol.Feature({ + geometry: new Point(startll) + }); + startf.set("name",tdata.seq); + startf.setStyle(typhoonStart); + Source.taifeng.addFeature(startf);*/ + + var center = fromLonLat([current.lon, current.lat]); + var ct = new Feature({ + geometry: new Point(center) + }); + ct.set("name", tdata.seq); + ct.setStyle(typhoonCenter2); + ct.set("code", tdata.code); + shipMap.sourceList.taifeng.addFeature(ct); + drawTyphoonNew(all, tdata.seq, tdata.code, name); + var rad_neq34kt = parseInt(current.radius7); + var rad_neq50kt = parseInt(current.radius10);//暴风圈 + var liefeng = new Feature({ + geometry: new CircleGeom(center, rad_neq34kt * 1000) + }); + var baofeng = new Feature({ + geometry: new CircleGeom(center, rad_neq50kt * 1000) + }); + + liefeng.setStyle(liefengStyle); + baofeng.setStyle(baofengStyle); + liefeng.set("code", tdata.code); + baofeng.set("code", tdata.code); + + //绑定定时器的数组 + if (window.wulaTime[name] == undefined) { + window.wulaTime[name] = []; + } + if (window.wulaTime[name].length == 0) { + //尝试改变台风的显示样式开始 + for (var i = 0; i < all.length; i++) { + (function (a) { + var k = setTimeout(function () { + typhoonMove(all[a], level, name); + }, a * time * 1000); //..... + window.wulaTime[name][a] = k; + })(i) + } + //最后一个定时器 显示台风当前的点的位置 + all.filter(function (item, index, arr) { + if (item.t == 1) { + var k = setTimeout(function () { + typhoonMove(all[index], level, name) + }, all.length * time * 1000) + window.wulaTime[name][all.length] = k; + } + }) + } + //尝试改变台风的显示样式结束 +} + +//显示台风运动 +function typhoonMove(data, level, name) { + if (window.wulaFeature[name] != null) { + shipMap.sourceList.taifeng.removeFeature(wulaFeature[name]); + } + // if(wulaFeature1[name] != null){ + // Source.taifeng.removeFeature(wulaFeature1[name]); + // } + + var Configs = { + CIRCLE_CENTER_X: data.lon, + CIRCLE_CENTER_Y: data.lat, + CIRCLE_R: { + "SE": parseFloat(data.radius10.se), + "NE": parseFloat(data.radius10.ne), + "NW": parseFloat(data.radius10.nw), + "SW": parseFloat(data.radius10.sw) + } + }; + var obj = makeTyphoonData(Configs, level); + window.wulaFeature[name] = wktformat.readFeature(obj.wkt); + window.wulaFeature[name].set('lineName', name); + // wulaFeature1[name] = wktformat.readFeature("POINT("+obj.xy[0]+" "+obj.xy[1]+")"); + // wulaFeature1[name].set('lineName',name); + window.wulaFeature[name].setStyle(styleFunc()); + shipMap.sourceList.taifeng.addFeatures([window.wulaFeature[name]]); +} + +//台风圈数据处理函数 +function makeTyphoonData(Configs, level) { + var wkt = "POLYGON(("; + var wkt0 = "", _interval = 6; + for (var i = 0; i < 360 / _interval; i++) { + var _r = 0; + var _ang = i * _interval; + if (_ang > 0 && _ang <= 90) { + _r = Configs.CIRCLE_R.NE * level; + } else if (_ang > 90 && _ang <= 180) { + _r = Configs.CIRCLE_R.NW * level; + } else if (_ang > 180 && _ang <= 270) { + _r = Configs.CIRCLE_R.SW * level; + } else { + _r = Configs.CIRCLE_R.SE * level; + } + + var xy = transform([Configs.CIRCLE_CENTER_X, Configs.CIRCLE_CENTER_Y], 'EPSG:4326', 'EPSG:3857'); + var x = xy[0] + _r * Math.cos(_ang * 3.14 / 180); + var y = xy[1] + _r * Math.sin(_ang * 3.14 / 180); + wkt = wkt + "" + x + " " + y + ", "; + if (i === 0) { + wkt0 = "" + x + " " + y + ""; + } + } + wkt = wkt + wkt0 + "))"; + return { + wkt: wkt, + xy: xy + } +} + +//台风圈样式 +function styleFunc() { + return new Style({ + fill: new Fill({ + color: 'rgba(255, 0, 0, 0.2)' + }), + stroke: new Stroke({ + color: '#ffcc33', + width: 2 + }), + image: new Circle({ + radius: 4, + fill: new Fill({ + color: '#ff0000' + }) + }) + }); +}; + + +//根据台风点绘制 线点 +//isFuture true是预报点,false是当前点 +//istemp是临时要素 +function drawTyphoonNew(typhoonpts, name, code, lineName) { + var typhoonLineFeatures = []; + var count = typhoonpts.length; + var _line1 = []; + var _line2 = []; + var cline = _line1; + for (var i = 0; i < count; i++) { + var _coor = fromLonLat([typhoonpts[i].lon, typhoonpts[i].lat]); + var _geom = new Point(_coor); + var _feature = new Feature(); + //var date = getDate(typhoonpts[i].typhoonTime); + //var secondDate = new Date(date.valueOf() + 8*60*60*1000); + //_feature.set("showTime",secondDate.format("yyyy-MM-dd hh")); + _feature.setProperties(typhoonpts[i]); + _feature.set("type", "typhoon"); + _feature.set("t", typhoonpts[i].t); + _feature.set("time", typhoonpts[i].time); + _feature.set("maxWindSpeed", typhoonpts[i].windSpeed); + _feature.set("airPressure", typhoonpts[i].airPressure); + _feature.set("maxRadius7", typhoonpts[i].maxRadius7); + _feature.set("maxRadius10", typhoonpts[i].maxRadius10); + _feature.set("radius7", typhoonpts[i].radius7); + _feature.set("radius10", typhoonpts[i].radius10); + _feature.set("moveDirection", typhoonpts[i].direction); + _feature.set("moveSpeed", typhoonpts[i].speed); + _feature.set("code", code); + _feature.set("name", name); + _feature.set("lineName", lineName);//这个用于删除时找到属于该台风的点 + _feature.setGeometry(_geom); + if (i == 0) { + _feature.setStyle(typhoonStartPoint); + } + // else { + // _feature.setStyle(typhoonStartPointTime); + // } + typhoonLineFeatures.push(_feature); + cline.push(_coor); + if (typhoonpts[i].t == 1) { + cline = _line2; + cline.push(_coor); + } + if (typhoonpts[i].lon >= 180) { + var l = typhoonpts[i].lon - 360; + var cd = fromLonLat([l, typhoonpts[i].lat]); + var _g = new Point(cd); + var _f = new Feature(); + _f.setProperties(typhoonpts[i]); + _f.set("type", "typhoon"); + _f.set("longitude", l); + _f.set("t", typhoonpts[i].t); + _f.set("time", typhoonpts[i].time); + _f.set("maxWindSpeed", typhoonpts[i].windSpeed); + _f.set("airPressure", typhoonpts[i].airPressure); + _f.set("maxRadius7", typhoonpts[i].maxRadius7); + _f.set("maxRadius10", typhoonpts[i].maxRadius10); + _f.set("radius7", typhoonpts[i].radius7); + _f.set("radius10", typhoonpts[i].radius10); + _f.set("moveDirection", typhoonpts[i].direction); + _f.set("moveSpeed", typhoonpts[i].speed); + _f.set("code", code); + _f.set("name", name); + _f.set("lineName", lineName); + _f.setGeometry(_g); + typhoonLineFeatures.push(_f); + } + if (typhoonpts[i].lon <= -180) { + var l = typhoonpts[i].lon + 360; + var cd = fromLonLat([l, typhoonpts[i].lat]); + var _g = new Point(cd); + var _f = new Feature(); + _f.setProperties(typhoonpts[i]); + _f.set("type", "typhoon"); + _f.set("longitude", l); + _f.set("t", typhoonpts[i].t); + _f.set("time", typhoonpts[i].time); + _f.set("maxWindSpeed", typhoonpts[i].windSpeed); + _f.set("airPressure", typhoonpts[i].airPressure); + _f.set("maxRadius7", typhoonpts[i].maxRadius7); + _f.set("maxRadius10", typhoonpts[i].maxRadius10); + _f.set("radius7", typhoonpts[i].radius7); + _f.set("radius10", typhoonpts[i].radius10); + _f.set("moveDirection", typhoonpts[i].direction); + _f.set("moveSpeed", typhoonpts[i].speed); + _f.set("code", code); + _f.set("name", name); + _f.set("lineName", lineName); + _f.setGeometry(_g); + typhoonLineFeatures.push(_f); + } + } + //台风已经经过的线路 + var taifengLine1 = new Feature({ + geometry: new LineString(_line1) + }); + taifengLine1.set("t", 3); + taifengLine1.set("type", "typhoonLine"); + taifengLine1.set("code", code); + taifengLine1.setId(lineName + '1'); + //台风未来经过的线路 + var taifengLine2 = new Feature({ + geometry: new LineString(_line2) + }); + taifengLine2.set("t", 4); + taifengLine2.set("type", "typhoonLine"); + taifengLine2.set("code", code); + taifengLine2.setId(lineName + '2'); + shipMap.sourceList.taifeng.addFeature(taifengLine1);//台风线 + shipMap.sourceList.taifeng.addFeature(taifengLine2);//台风线 + shipMap.sourceList.taifeng.addFeatures(typhoonLineFeatures);//台风点 +} + +function typhoonStartPoint(f, r) { + var s = new Style({ + fill: new Fill({ + color: 'rgba(255, 0, 0, 0.8)' + }), + stroke: new Stroke({ + color: 'rgba(255, 0, 0, 0.8)', + width: 2 + }), + image: new Circle({ + radius: 4, + fill: new Fill({ + color: 'rgba(255, 0, 0, 0.8)' + }) + }) + }); + var ntext = new Text({ + textAlign: "left", + font: '12px Microsoft YaHei', + fill: new Fill({ + color: "#5F88AA" + }), + stroke: new Stroke({ + color: "#FFF", + width: 3 + }), + textBaseline: "bottom", + offsetX: 8, + offsetY: -8, + text: f.get('name') + }) + s.setText(ntext); + return [s]; +} + +function typhoonStartPointTime(f, r) { + // var s = new Style({ + // fill: new Fill({ + // color: 'rgba(255, 0, 0, 0.8)' + // }), + // stroke: new Stroke({ + // color: 'rgba(255, 0, 0, 0.8)', + // width: 2 + // }), + // image: new Circle({ + // radius: 4, + // fill: new Fill({ + // color: 'rgba(255, 0, 0, 0.8)' + // }) + // }) + // }); + var ntext = new Style({ + text: new Text({ + textAlign: "left", + font: '12px Microsoft YaHei', + fill: new Fill({ + color: "#5F88AA" + }), + stroke: new Stroke({ + color: "#FFF", + width: 3 + }), + textBaseline: "bottom", + offsetX: 8, + offsetY: -8, + text: f.get('name') + }) + }) + // s.setText(ntext); + return [ntext]; +} + +//烈风圈 +var liefengStyle = new Style({ + fill: new Fill({ + color: 'rgba(0,0,255,0.1)' + }), + stroke: new Stroke({ + color: 'rgb(0,0,255)', + width: 2 + }) +}); + +//暴风圈 +var baofengStyle = new Style({ + fill: new Fill({ + color: 'rgba(255,0,0,0.2)' + }), + stroke: new Stroke({ + color: 'rgb(255,0,0)', + width: 2 + }) +}); + + +//添加分布图 +shipFun.addScattergram = (map) => { + map.addLayer(shipMap.distributeLayer) +} +//取消分布图 +shipFun.removeaScattergram = (map) => { + map.removeLayer(shipMap.distributeLayer) +} + +shipMap.languageType = 2 +//语言设置 +shipFun.setLanguage = (languageType) => { + shipMap.languageType = languageType +} +shipFun.getZoom = function () { + return shipMap.map.getView().getZoom() +} +//添加地图层级变化监听函数 +shipFun.addZoomListener = (map, callback) => { + map.on('moveend', function (e) { + var zoom = map.getView().getZoom() //获取当前地图的缩放级别 + callback(zoom) + }) + + // 监听气象点击 , 单击地图显示气象要素值 + shipMap.popupOverlay = new Overlay({ + element: document.getElementById('popup'), //绑定dom对象,纯js必须使用document绑定,不能像Map的dom对象,只写‘popup’ + autoPan: true, //点击地图边缘时,地图自动调节 + autoPanMargin: 20, + positioning: 'center-center' + }) + shipMap.map.addOverlay(shipMap.popupOverlay) + var container = document.getElementById('popup') + var content = document.getElementById('popup-content') + map.on('singleclick', function (evt) { + //包含气象图层 + if (hasLayerInMap(shipMap.layerList.iLayer)) { + let weatherType = mapClient.colorMapTileLayer.source.factor + let weatherTypeStr = '' + const language = window.localStorage.getItem('language') + if (shipMap.languageType == 2) { + switch (weatherType) { + case 'temp': + weatherTypeStr = language === 'zh' ? '温度' : 'temperature' + break + case 'pressure': + weatherTypeStr = language === 'zh' ? '气压' : 'pressure' + break + case 'wind': + weatherTypeStr = language === 'zh' ? '风' : 'wind' + break + case 'seaCurrents': + weatherTypeStr = language === 'zh' ? '洋流' : 'ocean current' + break + } + } else { + weatherTypeStr = weatherType + } + var weatherStr = mapClient.decodeColorMapTileValue(evt.pixel, mapClient.getExtent(map), map.getView().getZoom()) + var coordinate = evt.coordinate // 获取坐标 + shipMap.popupOverlay.setPosition(coordinate) + content.innerHTML = '

' + weatherTypeStr + ':' + weatherStr + '

' //弹窗展示内容为经纬度信息 + container.style.display = 'block' + container.style.color = '#ffffff' + } + + let pixel = map.getEventPixel(evt.originalEvent) + let feature = map.forEachFeatureAtPixel(pixel, function (feature) { + return feature + }) + // 查询方式有很多 + if (feature) { + let type = feature.getProperties()['type'] + } else { + shipFun.delSelect() + } + }) +} +//移除地图层级变化监听函数 +shipFun.removePopupOverlay = function () { + // 把弹窗位置设置为undefined,并清空坐标数据 + shipMap.popupOverlay.setPosition(undefined) + return false +} +//移除地图层级变化监听函数 +shipFun.removeZoomListener = () => { + unByKey(shipMap.Listen) +} + +//添加实时显示鼠标位置的函数 +shipFun.addMousePos = function (map) { + let mapMousePosition = new MousePosition({ + coordinateFormat: function (coor) { + while (coor[0] < -180) coor[0] = coor[0] + 360 + while (coor[0] > 180) coor[0] = coor[0] - 360 + //log(coor); + let lon = shipFun.cacuLonLat(coor[0], 'lon') + let lat = shipFun.cacuLonLat(coor[1], 'lat') + document.getElementById('positionLng').innerText = lon + document.getElementById('positionLat').innerText = lat + return '' + }, + projection: 'EPSG:4326' + }) + map.addControl(mapMousePosition) +} +//隐藏船舶 +shipFun.hideShips = (idList) => { + let type = typeof idList + if (type == 'string') { + let f = shipMap.sourceList.shipSource.getFeatureById(idList) + shipMap.sourceList.shipSource.removeFeature(f) + } else if (type == 'object') { + idList.forEach((x, i) => { + let f = shipMap.sourceList.shipSource.getFeatureById(x) + shipMap.sourceList.shipSource.removeFeature(f) + }) + } else { + } + return '' +} +//显示船舶 +shipFun.showShips = (idList) => { + let type = typeof idList + if (type == 'string') { + shipMap.sourceList.shipSource.addFeature(f) + } else if (type == 'object') { + idList.forEach((x, i) => { + shipMap.sourceList.shipSource.addFeature(f) + }) + } else { + } + return '' +} + +//船舶点击函数 +shipFun.addClick = (callback) => { + shipMap.shipClick = new intSelect({ + style: null, + layers: [shipMap.layerList.berthLayer, shipMap.layerList.shipLayer, shipMap.layerList.portLayer,shipMap.layerList.carLayer] + }) + let shipmes = '' + shipMap.shipClick.on('select', function (evt) { + let f = evt.selected[0] + shipFun.delSelect() + shipmes = f.values_ + if (f.values_.type === 'berth') { + shipFun.addSelectByCoor([f.values_.berthLon, f.values_.berthLat]) + shipmes.isType = 'berth' + } else if (f.values_.type === 'port') { + shipFun.addSelectByCoor([shipmes.portLon, shipmes.portLat]) + shipmes.isType = 'port' + } else if (f.values_.type === 'ship') { + shipFun.addSelectByCoor([shipmes.lon / 600000, shipmes.lat / 600000]) + shipmes.isType = 'ship' + } else if(f.values_.type === 'car') { + shipFun.addSelectByCoor([shipmes.longitude, shipmes.latitude]) + shipmes.isType = 'car' + } + callback(shipmes) + }) + shipMap.map.addInteraction(shipMap.shipClick) +} +//添加港口范围 +shipFun.addarea = (dataList) => { + let Coor = [] + for (let i = 0; i < dataList.length; i++) { + let coor = transform( + [dataList[i].lon, dataList[i].lat], + 'EPSG:4326', + 'EPSG:3857' + ) + Coor.push(coor) + } + let line = new LineString(Coor) //这是已知点画线 + //多边形要素类 + let newFeature = new Feature({ + geometry: line + }) + newFeature.setStyle(shipStyle.areastyle) + shipMap.sourceList.pathLineSource.addFeature(newFeature) +} +// 清除电子围栏 +shipFun.clearArea = () => { + shipMap.sourceList.pathLineSource.clear() +} + +function __makePathData(data, __map, pathId) { + var re = []; + var start = data[0]; + re.push(start); + var it0 = transform([Number(start.lon), Number(start.lat)], 'EPSG:4326', 'EPSG:3857'); + for (var i = 1; i <= data.length - 2; i++) { + var item = data[i]; + var it = transform([Number(item.lon), Number(item.lat)], 'EPSG:4326', 'EPSG:3857'); + var pix = __map.getPixelFromCoordinate(it); + var pix0 = __map.getPixelFromCoordinate(it0); + if (Math.abs(pix[0] - pix0[0]) > 50 || Math.abs(pix[1] - pix0[1]) > 50) { + re.push(item); + it0 = it; + } else { + var s = it0; + var c = it; + var e = transform([Number(data[i + 1].lon), Number(data[i + 1].lat)], 'EPSG:4326', 'EPSG:3857'); + var dx1 = c[0] - s[0]; + var dy1 = c[1] - s[1]; + var r1 = Math.atan2(dy1, dx1); + var dx2 = e[0] - c[0]; + var dy2 = e[1] - c[1]; + var r2 = Math.atan2(dy2, dx2); + var angle = Math.abs(r2 - r1); + var jd = 180 / Math.PI * angle; + if (jd > 30) { + re.push(item); + it0 = it; + } + } + } + re.push(data[data.length - 1]); + return re; +} + +function guid() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { + var r = Math.random() * 16 | 0, + v = c == 'x' ? r : (r & 0x3 | 0x8) + return v.toString(16) + }) +} + +function fitPath(data, map) { + if (data) { + var minx, miny, maxx, maxy + data.forEach(function (item, index) { + var it = transform([Number(item.lon), Number(item.lat)], 'EPSG:4326', 'EPSG:3857') + if (!minx) minx = it[0] + if (!miny) miny = it[1] + if (!maxx) maxx = it[0] + if (!maxy) maxy = it[1] + if (minx > it[0]) minx = it[0] + if (miny > it[1]) miny = it[1] + if (maxx < it[0]) maxx = it[0] + if (maxy < it[1]) maxy = it[1] + + }) + var view = map.getView() + view.fit([minx, miny, maxx, maxy], {padding: [50, 50, 50, 50]}) + } +} + +//添加轨迹 +shipFun.addPath = (dataList, __map) => { + dataList.map(function (item, index, arr) { + if (index > 0) { + if ((item.lon - arr[index - 1].lon) < -180) { + item.lon += 360 + } else if ((item.lon - arr[index - 1].lon) > 180) { + var i = index - 1 + while (i >= 0) { + arr[i--].lon += 360 + } + } + } + }) + + let pathId = guid() + let re = __makePathData(dataList, __map, pathId) + __pathDrawData[pathId] = re; + __pathData[pathId] = dataList; + __drawPathData(re, pathId) + fitPath(dataList, __map); + return pathId +} +var __tsize = []; + +function __drawPathData(dataList, pathId) { + let Coor = [] + let ids = [] + for (let i = 0; i < dataList.length; i++) { + let coor = transform( + [dataList[i].lon, dataList[i].lat], + 'EPSG:4326', + 'EPSG:3857' + ) + Coor.push(coor) + } + let line = new LineString(Coor) //这是已知点画线 + //多边形要素类 + let newFeature = new Feature({ + geometry: line + }) + newFeature.setStyle(shipStyle.pathColor) + newFeature.setId(pathId) + ids.push(pathId) + shipMap.sourceList.pathLineSource.addFeature(newFeature) + + for (let i = 0; i < Coor.length; i++) { + let point = new Point(Coor[i]) //这是已知点画线 + let newFeature = new Feature({ + geometry: point, + heading: dataList[i].direction, + sog: dataList[i].sog, + lon: dataList[i].lon, + lat: dataList[i].lat, + time: dataList[i].time, + type: 'pathPoint' + }) + newFeature.set('geom', point) + newFeature.setId(pathId + '-' + (i + 1)) + ids.push(pathId + '-' + (i + 1)) + newFeature.setStyle( + // shipStyle.pathStyle(formatDate(dataList[i].posTime, 'hh:mm:ss')) + shipStyle.pathStyle(dayjs(dataList[i].posTime * 1000).format('YYYY-MM-DD hh:mm:ss')) + ) + shipMap.sourceList.pathPointSource.addFeature(newFeature) + if (i == 0) { + let pointStart = new Point(Coor[i]) + let startF = new Feature({ + geometry: pointStart + }) + startF.setId(pathId + '-start') + ids.push(pathId + '-start') + startF.setStyle(shipStyle.pathSEStyle('start')) + shipMap.sourceList.pathPointSource.addFeature(startF) + } + if (i == dataList.length - 1) { + let pointEnd = new Point(Coor[i]) + let endF = new Feature({ + geometry: pointEnd + }) + endF.setId(pathId + '-end') + ids.push(pathId + '-end') + endF.setStyle(shipStyle.pathSEStyle('end')) + shipMap.sourceList.pathPointSource.addFeature(endF) + } + } + + // fitPath(dataList, shipMap.map) + __pathArray[pathId] = ids; + return pathId +} + +function _$(d) { + return document.getElementById(d); +} + +function textSize(text) { + if (__tsize[text]) { + return __tsize[text]; + } + var result = {}; + var span = _$("__testStringWide"); + if (!span) { + span = document.createElement("span"); + span.id = "__testStringWide"; + span.style.font = "16px Microsoft YaHei 100"; + span.style.whiteSpace = "nowrap"; + span.style.visibility = "hidden"; + document.body.appendChild(span); + } + if (typeof span.textContent != "undefined") + span.textContent = ""; + else span.innerText = ""; + result.width = span.offsetWidth; + result.height = span.offsetWidth; + if (typeof span.textContent != "undefined") + span.textContent = text; + else span.innerText = text; + result.width = span.offsetWidth - result.width + 3; + //result.height = span.offsetHeight - result.height; + result.height = 22; + __tsize[text] = result; + return result; +} + +var screenText = {}; +var heigthKey = 14; + +function calcLablePos3(center, size, id) { + var result = {}; + var pos = {}; + pos.l = Math.round((center.left + 10) / 30); + pos.length = Math.round(size.width / 30) + 1; + //右上 + pos.t = Math.round(center.top / 30) - 1; + let hasLable = false; + for (var i = pos.l; i < pos.l + pos.length; i++) { + var o = screenText[i + "-" + pos.t]; + if (o) { + if (o != id) { + hasLable = true; + break; + } + } + } + if (!hasLable) { + result.canDraw = true; + result.offsetX = 10; + result.offsetY = -heigthKey - (center.top - (pos.t + 1) * 30); + for (var i = pos.l; i < pos.l + pos.length; i++) { + screenText[i + "-" + pos.t] = id; + } + return result; + } + + //右下 + pos.t = Math.round(center.top / 30) + 1; + hasLable = false; + for (var i = pos.l; i < pos.l + pos.length; i++) { + var o = screenText[i + "-" + pos.t]; + if (o) { + if (o != id) { + hasLable = true; + break; + } + } + } + if (!hasLable) { + result.canDraw = true; + result.offsetX = 10; + result.offsetY = heigthKey - (center.top - (pos.t - 1) * 30); + for (var i = pos.l; i < pos.l + pos.length; i++) { + screenText[i + "-" + pos.t] = id; + } + return result; + } + + pos.length = Math.round(size.width / 30); + pos.l = Math.round((center.left - size.width - 10) / 30) - 1; + //左上 + pos.t = Math.round(center.top / 30) - 1; + hasLable = false; + for (var i = pos.l; i < pos.l + pos.length; i++) { + var o = screenText[i + "-" + pos.t]; + if (o) { + if (o != id) { + hasLable = true; + break; + } + } + } + if (!hasLable) { + result.canDraw = true; + result.offsetX = -size.width - 10; + result.offsetY = -heigthKey - (center.top - (pos.t + 1) * 30); + for (var i = pos.l; i < pos.l + pos.length; i++) { + screenText[i + "-" + pos.t] = id; + } + return result; + } + + + //左下 + pos.t = Math.round(center.top / 30) + 1; + hasLable = false; + for (var i = pos.l; i < pos.l + pos.length; i++) { + var o = screenText[i + "-" + pos.t]; + if (o) { + if (o != id) { + hasLable = true; + break; + } + } + } + if (!hasLable) { + result.canDraw = true; + result.offsetX = -size.width - 10; + result.offsetY = heigthKey - (center.top - (pos.t - 1) * 30); + for (var i = pos.l; i < pos.l + pos.length; i++) { + screenText[i + "-" + pos.t] = id; + } + return result; + } + return result; +} + +var wayPointStyle = function (f, r) { + let style = new Style({ + image: new Circle({ + radius: 3, + fill: new Fill({ + color: '#ffffff' + }), + stroke: new Stroke({ + color: '#3272dd', + width: 3 + }) + }) + }); + var map = shipMap.map; + var pix = map.getPixelFromCoordinate(f.getGeometry().getCoordinates()); + var name = f.get("timeStr"); + var size = textSize(name); + var center = {}; + center.left = Math.round(pix[0]); + center.top = Math.round(pix[1]); + var re = calcLablePos3(center, size, f.getId()); + var styles = []; + styles.push(style); + if (re.canDraw) { + if (Math.abs(re.offsetY) < 10) { + if (re.offsetY <= 0) + re.offsetY = -10; + else + re.offsetY = 10; + } + var ntext = new Text({ + textAlign: "left", + font: '10px Microsoft YaHei', + fill: new Fill({ + color: "#5F88AA" + }), + stroke: new Stroke({ + color: "#FFF", + width: 3 + }), + textBaseline: "bottom", + offsetX: re.offsetX, + offsetY: re.offsetY, + text: name + }); + style.setText(ntext); + var textLine = new Style({ + fill: new Fill({ + color: '#00C000' + }), + stroke: new Stroke({ + color: '#FF0000', + width: 0.5 + }) + }); + var e = []; + e[0] = pix[0]; + e[1] = pix[1]; + if (re.offsetX > 0) { + e[0] += 10; + e[1] += re.offsetY; + } + if (re.offsetX < 0) { + e[0] -= 10; + e[1] += re.offsetY; + } + var end = map.getCoordinateFromPixel(e); + var slGeo = new LineString([f.getGeometry().getCoordinates(), end]); + textLine.setGeometry(slGeo); + styles.push(textLine); + } + return styles; +} + +//删除轨迹 +shipFun.delPath = () => { + shipMap.sourceList.pathLineSource.clear() + shipMap.sourceList.pathPointSource.clear() + __pathData = {} + __pathArray = {} +} +// 删除单条轨迹 +shipFun.delPathOne = (path, points) => { + const pathLineSource = shipMap.sourceList.pathLineSource + const pathPointSource = shipMap.sourceList.pathPointSource + const Feature = pathLineSource.getFeatureById(path) + delete __pathData[path]; + delete __pathArray[path]; + const startFeature = pathPointSource.getFeatureById(path + '-start') + const endFeature = pathPointSource.getFeatureById(path + '-end') + pathLineSource.removeFeature(Feature) + pathPointSource.removeFeature(startFeature) + pathPointSource.removeFeature(endFeature) + for (let i = 0; i < points; i++) { + const Feature = pathPointSource.getFeatureById(path + '-' + (i + 1)) + pathPointSource.removeFeature(Feature) + } +} +//移动显示船舶信息及船舶轨迹信息 +shipFun.showShipPathMessage = (map, Vue) => { + let showMes = new Overlay({ + element: document.getElementById('showShipMessage') + }) + let showPathMes = new Overlay({ + element: document.getElementById('showPathPointMessage') + }) + let showPortMes = new Overlay({ + element: document.getElementById('showPortMessage') + }) + + map.on('pointermove', function (evt) { + if (evt.dragging) { + return + } + let pixel = map.getEventPixel(evt.originalEvent) + let feature = map.forEachFeatureAtPixel(pixel, function (feature) { + return feature + }) //查询方式有很多 + if (feature) { + let type = feature.getProperties()['type'] + if (type === 'ship') { + Vue.shipFloatMes = { + shipnameEn: feature.get('shipnameEn'), + mmsi: feature.get('mmsi'), + chuanboid: feature.get('shipid'), + lon: shipFun.cacuLonLat(feature.get('lon') / 600000, 'lon'), + lat: shipFun.cacuLonLat(feature.get('lat') / 600000, 'lat'), + time: feature.get('posTime') + } + showMes.setPosition(feature.get('geom').getCoordinates()) + map.addOverlay(showMes) + } else if (type === 'pathPoint') { + Vue.shipFloatMes = { + heading: feature.get('heading'), + sog: feature.get('sog'), + lon: shipFun.cacuLonLat(feature.get('lon'), 'lon'), + lat: shipFun.cacuLonLat(feature.get('lat'), 'lat'), + time: feature.get('time') + } + showPathMes.setPosition(feature.get('geom').getCoordinates()) + map.addOverlay(showPathMes) + } else if (type === 'port') { + // 港口鼠标事件 + Vue.shipFloatMes = { + portNameCn: feature.get('portNmaeCn'), + portNameEn: feature.get('portNmaeEn'), + portCode: feature.get('portCode'), + portLatLon: feature.get('portLatLon'), + } + showPortMes.setPosition(feature.get('geom').getCoordinates()) + map.addOverlay(showPortMes) + } + } else { + map.removeOverlay(showMes) + map.removeOverlay(showPathMes) + map.removeOverlay(showPortMes) + } + }) +} + +shipFun.updateSize = (map) => { + map.updateSize() +} +//添加船舶的选择框 +shipFun.addSelect = (id, type) => { + // let f = shipMap.sourceList.shipSource.getFeatureById(id) + let f = shipMap.sourceList.berthSource.getFeatureById(id) + let p = new Point(f.get('geom').getCoordinates()) + let s = new Feature({ + geometry: p + }) + s.setStyle(shipStyle.selectStyle) + shipMap.sourceList.selectSource.addFeature(s) +} +shipFun.addSelectByCoor = (coor) => { + shipFun.delSelect() + let Coor = transform(coor, 'EPSG:4326', 'EPSG:3857') + let p = new Point(Coor) + let s = new Feature({ + geometry: p + }) + // shipFun.setCenter(Coor); + // shipFun.setZoom(12); + s.setStyle(shipStyle.selectStyle) + shipMap.sourceList.selectSource.addFeature(s) +} +//消除船舶选中 +shipFun.delSelect = () => { + shipMap.sourceList.selectSource.clear() +} +//添加标记 +shipFun.addSign = (map) => { + map.addInteraction(shipMap.drawPointDraw) + shipMap.drawPointDraw.on('drawstart', function (e) { + e.feature.setStyle(shipStyle.signStyle) + }) + shipMap.drawPointDraw.on('drawend', function (e) { + map.removeInteraction(shipMap.drawPointDraw) + }) +} +//删除标记 +shipFun.delSign = () => { +} +//设置海图中心 +shipFun.setCenter = (coor) => { + coor = transform(coor, 'EPSG:4326', 'EPSG:3857') + shipMap.view.setCenter(coor) +} +// 绘制警戒线 +shipFun.drawLine = function (id, data, color, width, name, isDotted) { + if (!color) { + color = '#FF0000'; + } + if (!width) { + width = 1; + } + var feature = lineDataTrans(data); + feature.setId(id); + var style11 = null; + if (isDotted) { + style11 = new Style({ + stroke: new Stroke({ + color: color, + width: width, + lineDash: [5, 5] + }) + }); + } else { + style11 = new Style({ + stroke: new Stroke({ + color: color, + width: width + }) + }); + } + if (name) { + var ntext = new Text({ + textAlign: "left", + font: '10px Microsoft YaHei', + fill: new Fill({color: "#5F88AA"}), + stroke: new Stroke({color: "#FFF", width: 3}), + textBaseline: "bottom", + offsetX: 0, + offsetY: -8, + overflow: true + }); + ntext.setText(name); + style11.setText(ntext); + } + feature.setStyle(style11); + shipMap.sourceList.jjxSource.addFeature(feature); +} + + +shipFun.delTyphoon = function (name) { + shipMap.sourceList.taifeng.removeFeature(shipMap.sourceList.taifeng.getFeatureById(name + '1')); + window.wulaFeature[name] = null; + shipMap.sourceList.taifeng.removeFeature(shipMap.sourceList.taifeng.getFeatureById(name + '2')); + shipMap.sourceList.taifeng.forEachFeature(function (f) { + if (f.get("lineName") == name) { + shipMap.sourceList.taifeng.removeFeature(f); + } + }) + //清除台风定时器 + for (var i = 0; i < window.wulaTime[name].length; i++) { + window.clearTimeout(window.wulaTime[name][i]) + } + window.wulaTime[name].length = 0; +} + +shipFun.hideTyphoon = function () { + shipMap.sourceList.taifeng.clear(); + window.wulaFeature = []; + for (let x in window.wulaTime) { + for (var i = 0; i < window.wulaTime[x].length; i++) { + window.clearTimeout(window.wulaTime[x][i]) + } + window.wulaTime[x].length = 0; + } +} +//绘制台风图层new +shipFun.showTaiFengNew2 = function (tdata, level, time, name) { + var data = tdata.data; + + var arr = data.filter(function (item, index) { + item.longitude = item.lon; + if (index > 0) { + if ((item.lon - data[index - 1].lon) < -180) + item.lon += 360; + else if ((item.lon - data[index - 1].lon) > 180) + item.lon -= 360; + + } + item.f = item.forcast.filter(function (it, idx) { + if (idx === 0) { + if ((it.lon - item.lon) < -180) + it.lon += 360; + else if ((it.lon - item.lon) > 180) + it.lon -= 360; + } + if (idx > 0) { + if ((it.lon - item.forcast[idx - 1].lon) < -180) + it.lon += 360; + else if ((it.lon - item.forcast[idx - 1].lon) > 180) + it.lon -= 360; + } + return it; + }); + return item; + }); + var his = [], current, fut = [], arrLength; + arrLength = arr.length; + for (var i = 0; i < arrLength - 1; i++) { + arr[i].t = 0; + his.push(arr[i]); + if (arr[i].f.length > 0) { + arr[i].f.unshift(arr[i]); + } + } + current = arr[arrLength - 1]; + current.t = 1; + for (var i = 0; i < current.f.length; i++) { + current.f[i].t = 2; + current.f[i].longitude = current.f[i].lon; + fut.push(current.f[i]); + } + var all = his.concat(current); + all = all.concat(fut); + + /*var startll = ol.proj.fromLonLat([arr[0].lon, arr[0].lat]); + var startf = new ol.Feature({ + geometry: new Point(startll) + }); + startf.set("name",tdata.seq); + startf.setStyle(typhoonStart); + Source.taifeng.addFeature(startf);*/ + + var center = fromLonLat([current.lon, current.lat]); + var ct = new Feature({ + geometry: new Point(center) + }); + ct.set("name", tdata.seq); + ct.setStyle(typhoonCenter2); + ct.set("code", tdata.code); + Source.taifeng.addFeature(ct); + drawTyphoonNew(all, tdata.seq, tdata.code, name); + var rad_neq34kt = parseInt(current.radius7); + var rad_neq50kt = parseInt(current.radius10);//暴风圈 + var liefeng = new ol.Feature({ + geometry: new CircleGeom(center, rad_neq34kt * 1000) + }); + var baofeng = new ol.Feature({ + geometry: new CircleGeom(center, rad_neq50kt * 1000) + }); + + liefeng.setStyle(liefengStyle); + baofeng.setStyle(baofengStyle); + liefeng.set("code", tdata.code); + baofeng.set("code", tdata.code); + + //绑定定时器的数组 + if (window.wulaTime[name] == undefined) { + window.wulaTime[name] = []; + } + if (window.wulaTime[name].length == 0) { + //尝试改变台风的显示样式开始 + for (var i = 0; i < all.length; i++) { + (function (a) { + var k = setTimeout(function () { + typhoonMove(all[a], level, name); + }, a * time * 1000); //..... + window.wulaTime[name][a] = k; + })(i) + } + //最后一个定时器 显示台风当前的点的位置 + all.filter(function (item, index, arr) { + if (item.t == 1) { + var k = setTimeout(function () { + typhoonMove(all[index], level, name) + }, all.length * time * 1000) + window.wulaTime[name][all.length] = k; + } + }) + } + + + //尝试改变台风的显示样式结束 +} + +function typhoonCenter2(f, r) { + var s = new Style({ + image: new Icon({ + src: 'images/msmap/current.png', + anchor: [0.5, 1.1] + }) + }); + var ntext = new Text({ + textAlign: "left", + font: '12px Microsoft YaHei', + fill: new Fill({ + color: "#5F88AA" + }), + stroke: new Stroke({ + color: "#FFF", + width: 3 + }), + textBaseline: "bottom", + offsetX: 8, + offsetY: -8, + text: f.get('name') + }) + s.setText(ntext); + return [s]; +} + +function lineDataTrans(json) { + var data = []; + for (var i in json) { + data.push({lon: Number(json[i].lon), lat: Number(json[i].lat)}); + } + data.map(function (item, index, arr) { + if (index > 0) { + if ((item.lon - arr[index - 1].lon) < -180) + item.lon += 360; + else if ((item.lon - arr[index - 1].lon) > 180) { + var i = index - 1; + while (i >= 0) { + arr[i--].lon += 360; + } + } + + } + + }); + var ar = []; + data.forEach(function (item, index) { + ar.push(transform([Number(item.lon), Number(item.lat)], 'EPSG:4326', 'EPSG:3857')); + }); + var ls = new LineString(ar); + var lsf = new Feature({ + geometry: ls + }); + lsf.set("type", "line"); + return lsf; +}; + +//设置地图层级 +shipFun.setZoom = (num) => { + shipMap.view.setZoom(num) +} +//添加eez线 +shipFun.addEez = (map, state) => { + if (state) { + map.addLayer(shipMap.layerList.eezLayer) + } else { + map.removeLayer(shipMap.layerList.eezLayer) + } +} + +// ---我的修改--- +//添加测距 +shipFun.addRanging = (map, type) => { + map.removeInteraction(shipMap.drawPolygonDraw) + map.removeInteraction(shipMap.drawRingDraw) + map.removeInteraction(shipMap.drawRectangleDraw) + if (type == 'radius') { + shipMap.drawRingDraw.maxPoints_ = 2 + } else { + shipMap.drawRingDraw.maxPoints_ = Infinity + } + + map.addInteraction(shipMap.drawRingDraw) + let listener = null + let sketch = null + shipMap.drawRingDraw.on( + 'drawstart', + function (e) { + let tooltipCoord = e.coordinate + sketch = e.feature + listener = sketch.getGeometry().on('change', function (evt) { + let geom = evt.target + let output + if (geom instanceof LineString) { + output = shipFun.formatLength(geom) + tooltipCoord = geom.getLastCoordinate() + } + shipMap.measureTooltipElement.innerHTML = + output + + '' + + `` + shipMap.measureTooltipElement.style = + 'background: #0050AC;color:#ffffff;padding:2px;border-radius: 10px;font-size: 10px;min-width: 87px;text-align: center' + shipMap.measureTooltip.setPosition(tooltipCoord) + }) + }, + this + ) + shipMap.drawRingDraw.on('drawend', function (e) { + map.removeInteraction(shipMap.drawRingDraw) + shipMap.measureTooltipElement.style = + 'background: #0050AC;color:#ffffff;padding:2px;border-radius: 10px;font-size: 10px;min-width: 87px;text-align: center' + shipMap.measureTooltipElement.className = `ol-tooltip ol-tooltip-static ` + shipMap.measureTooltipElement.setAttribute('id', sketch.ol_uid) + shipMap.measureTooltip.setOffset([0, -7]) + sketch = null + shipMap.measureTooltipElement = null + shipFun.createMeasureTooltip(map) + unByKey(listener) + shipMap.maxpoint = 'infinity' + }) +} +//我的修改 测距多边形 +shipFun.addPolygon = (map) => { + map.removeInteraction(shipMap.drawPolygonDraw) + map.removeInteraction(shipMap.drawRingDraw) + map.removeInteraction(shipMap.drawCircleDraw) + map.removeInteraction(shipMap.drawRectangleDraw) + map.addInteraction(shipMap.drawPolygonDraw) + let listener = null + let sketch = null + shipMap.drawPolygonDraw.on( + 'drawstart', + function (e) { + let tooltipCoord = e.coordinate + sketch = e.feature + listener = sketch.getGeometry().on('change', function (evt) { + let geom = evt.target + let output + if (geom instanceof Polygon) { + output = shipFun.formatArea(geom) + tooltipCoord = geom.getInteriorPoint().getCoordinates() + } + shipMap.measureTooltipElement.innerHTML = + output + + '' + + `` + shipMap.measureTooltipElement.style = + 'background: #0050AC;color:#ffffff;padding:2px;border-radius: 10px;font-size: 10px;min-width: 87px;text-align: center' + shipMap.measureTooltip.setPosition(tooltipCoord) + }) + }, + this + ) + shipMap.drawPolygonDraw.on('drawend', function (e) { + map.removeInteraction(shipMap.drawPolygonDraw) + shipMap.measureTooltipElement.style = + 'background: #0050AC;color:#ffffff;padding:2px;border-radius: 10px;font-size: 10px;min-width: 87px;text-align: center' + shipMap.measureTooltipElement.className = `ol-tooltip ol-tooltip-static ` + shipMap.measureTooltipElement.setAttribute('id', sketch.ol_uid) + shipMap.measureTooltip.setOffset([0, -7]) + sketch = null + shipMap.measureTooltipElement = null + shipFun.createMeasureTooltip(map) + unByKey(listener) + }) +} +// ---我的修改--- +shipFun.backVector = (type) => { + if (type === 'line') { + return shipMap.drawRingSource + } else if (type === 'circle') { + return shipMap.drawCircleSource + } else if (type === 'polygon') { + return shipMap.drawPolygonSource + } else if (type === 'rectangle') { + return shipMap.drawRectangleSource + } +} + +shipFun.delAllMapTool = () => { + shipMap.drawPolygonLayer.getSource().clear() + shipMap.drawCircleLayer.getSource().clear() + shipMap.drawRectangleLayer.getSource().clear() + shipMap.drawRingLayer.getSource().clear() + shipMap.map.getOverlays() + .getArray().forEach((item) => { + shipMap.map.removeOverlay(item) + }) +} +// ---我的修改--- +//清楚圆 +shipFun.deleCircular = () => { + shipMap.drawCircularSource.clear() +} +//清楚测距 +shipFun.deleRing = () => { + shipMap.drawRingSource.clear() + let list = document.getElementsByName('ceju') + for (let i = 0; i < list.length; i++) { + list[i].style.display = 'none' + // removeNode(true) + } +} + +//设置绑定轨迹数据的div +shipFun.createMeasureTooltip = function (map) { + if (shipMap.measureTooltipElement) { + shipMap.measureTooltipElement.parentNode.removeChild( + shipMap.measureTooltipElement + ) + } + shipMap.measureTooltipElement = document.createElement('div') + shipMap.measureTooltipElement.className = 'ol-tooltip ol-tooltip-measure' + shipMap.measureTooltip = new Overlay({ + element: shipMap.measureTooltipElement, + offset: [1, -15], + positioning: 'bottom-center' + }) + map.addOverlay(shipMap.measureTooltip) + mapToolOver.push(shipMap.measureTooltip) +} + +//获取测距的长度 +var ringLength = 0 +shipFun.formatLength = function (line) { + let length = getLength(line) + ringLength = length + let output + if (length > 100) { + output = (Math.round((length / 1000) * 100) / 100) * +' ' + 'km' + } else { + output = Math.round(length * 100) / 100 + ' ' + 'm' + } + output = Math.round(length * 0.00054 * 100) / 100 + ' ' + 'nm' + return output +} +//我的修改 + +//获取多边形面积和矩形 +shipFun.formatArea = function (polygon) { + var area = getArea(polygon) + var output + if (area > 1000000) { + output = Math.round((area / 1000000) * 100) / 100 + ' ' + 'km2' + } else { + output = Math.round(area * 100) / 100 + ' ' + 'm2' + } + return output +} +//我的修改 + +shipFun.addRectangle = (map) => { + map.removeInteraction(shipMap.drawPolygonDraw) + map.removeInteraction(shipMap.drawRingDraw) + map.removeInteraction(shipMap.drawCircleDraw) + map.removeInteraction(shipMap.drawRectangleDraw) + map.addInteraction(shipMap.drawRectangleDraw) + let listener = null + let sketch = null + shipMap.drawRectangleDraw.on('drawstart', function (e) { + sketch = e.feature + let tooltipCoord = e.coordinate + listener = sketch.getGeometry().on('change', function (evt) { + let geom = evt.target + + let output + if (geom instanceof Polygon) { + output = shipFun.formatArea(geom) + tooltipCoord = geom.getInteriorPoint().getCoordinates() + } + shipMap.measureTooltipElement.innerHTML = + output + + '' + + `` + shipMap.measureTooltipElement.style = + 'background: #0050AC;color:#ffffff;padding:2px;border-radius: 10px;font-size: 10px;min-width: 87px;text-align: center' + shipMap.measureTooltip.setPosition(tooltipCoord) + }) + }) + shipMap.drawRectangleDraw.on('drawend', function (e) { + map.removeInteraction(shipMap.drawRectangleDraw) + shipMap.measureTooltipElement.style = + 'background: #0050AC;color:#ffffff;padding:2px;border-radius: 10px;font-size: 10px;min-width: 87px;text-align: center' + shipMap.measureTooltipElement.className = `ol-tooltip ol-tooltip-static ` + shipMap.measureTooltipElement.setAttribute('id', sketch.ol_uid) + shipMap.measureTooltip.setOffset([0, -7]) + sketch = null + shipMap.measureTooltipElement = null + shipFun.createMeasureTooltip(map) + unByKey(listener) + }) +} +// 我的修改 +//获取圆的半径长度 +shipFun.formatcirclelength = function (a) { + let output + let area = Math.pow(a, 2) * Math.PI // 得到的圆的面积 单位平方米 + if (area > 1000000) { + output = + Math.round(area / 1000000 * 100) / 100 + + ' ' + + 'km²' + } else { + output = Math.round(area * 100) / 100 + ' ' + 'm²' + } + return output +} +//我的修改 + +//添加圆 +shipFun.addCircle = (map) => { + map.removeInteraction(shipMap.drawPolygonDraw) + map.removeInteraction(shipMap.drawCircleDraw) + map.removeInteraction(shipMap.drawRectangleDraw) + map.addInteraction(shipMap.drawCircleDraw) + let listener = null + let sketch = null + shipMap.drawCircleDraw.on('drawstart', function (e) { + sketch = e.feature + let tooltipCoord = e.coordinate + listener = sketch.getGeometry().on('change', function (evt) { + let geom = evt.target + + let a1 = [] + let a2 = [] + a1 = transform(geom.getCenter(), 'EPSG:3857', 'EPSG:4326') + a2 = transform(geom.getLastCoordinate(), 'EPSG:3857', 'EPSG:4326') + shipMap.measureTooltip.setPosition(geom.getCenter()) + }) + }) + + shipMap.drawCircleDraw.on('drawend', function (e) { + map.removeInteraction(shipMap.drawCircleDraw) + shipMap.measureTooltipElement.style = + 'background: #0050AC;color:#ffffff;padding:2px;border-radius: 10px;font-size: 10px;min-width: 87px;text-align: center' + shipMap.measureTooltipElement.className = `ol-tooltip ol-tooltip-static ` + shipMap.measureTooltipElement.setAttribute('id', sketch.ol_uid) + let output = shipFun.formatcirclelength(e.feature.getGeometry().getRadius()) + shipMap.measureTooltipElement.innerHTML = + output + + '' + + `` + + shipMap.measureTooltip.setOffset([0, 0]) + sketch = null + shipMap.measureTooltipElement = null + shipFun.createMeasureTooltip(map) + unByKey(listener) + }) +} +//我的修改 +//转换地图海图卫星图 +shipFun.changeMap = function (map, str) { + switch (str) { + case 'haitu': + map.removeLayer(shipMap.sateLayer) + map.removeLayer(shipMap.layer) + map.removeLayer(shipMap.tdtLayer) + map.addLayer(shipMap.seaLayer) + break + case 'weixingtu': + map.removeLayer(shipMap.seaLayer) + map.removeLayer(shipMap.layer) + map.removeLayer(shipMap.tdtLayer) + map.addLayer(shipMap.sateLayer) + break + case 'ditu': + map.removeLayer(shipMap.sateLayer) + map.removeLayer(shipMap.seaLayer) + map.removeLayer(shipMap.tdtLayer) + map.addLayer(shipMap.layer) + break + case 'tdt': + map.removeLayer(shipMap.sateLayer) + map.removeLayer(shipMap.seaLayer) + map.removeLayer(shipMap.layer) + map.addLayer(shipMap.tdtLayer) + } +} +//添加线段 +shipFun.addArgentina = (data, id) => { + let f1 = lineDataTrans2(data) + f1.setStyle(shipStyle.agtStyle('#FF5454', 2)) + f1.setId(id) + shipMap.agtSource.addFeature(f1) +} +//获取测距的 + +//获得的经纬度转换 +shipFun.aroundLonLat = (value) => { + let lonlat = transform(value, 'EPSG:3857', 'EPSG:4326') + return lonlat +} + +//经纬度转化 +shipFun.cacuLonLat = function (num, dir) { + let degree = parseInt(num) + let direction = null + if (dir == 'lon') { + if (degree >= 0) { + direction = 'E' + } else { + direction = 'W' + } + } else if (dir == 'lat') { + if (degree >= 0) { + direction = 'N' + } else { + direction = 'S' + } + } + let min = parseInt((num - degree) * 60) + let sec = parseInt((num - degree) * 3600 - min * 60) + + degree = Math.abs(degree) + min = Math.abs(min) + sec = Math.abs(sec) + + let array = [direction, degree + '°' + min + '′' + sec + '″'] //这个得到的是方向 度 分 秒 + return array +} + +shipFun.clickGetCoor = function (index, cb) { + shipMap.map.once('singleclick', (e) => { + const coor = e.coordinate + const f = new Feature({ + geometry: new Point(coor) + }) + f.setStyle(pointInnerStyle(index + '')) + shipMap.sourceList.PointSource.addFeature(f) + cb(transform(coor, 'EPSG:3857', 'EPSG:4326')) + }) +} + +shipFun.clearPoint = function () { + shipMap.sourceList.PointSource.clear() +} + +function pointInnerStyle(textVale) { + const textStyle = new Style({ + text: new Text({ + textAlign: 'center', + textBaseline: 'middle', + font: '20px', + fill: new Fill({ + color: 'red' + }), + text: textVale, + stroke: new Stroke({ + color: 'white', + width: 2 + }) + }) + }) + return textStyle +} + +//生成随机数 +function Random() { + return Math.floor(Math.random() * 10) // 可均衡获取 0 到 9 的随机整数。 +} + +//根据数据处理数据函数 +function lineDataTrans2(d) { + let data = [] + let d1 = d.split(',') + for (let i1 in d1) { + let d2 = d1[i1].split(' ') + data.push({ + lon: Number(d2[0]), + lat: Number(d2[1]) + }) + } + data.map(function (item, index, arr) { + if (index > 0) { + if (item.lon - arr[index - 1].lon < -180) { + item.lon += 360 + } else if (item.lon - arr[index - 1].lon > 180) { + let i = index - 1 + while (i >= 0) { + arr[i--].lon += 360 + } + } + } + }) + let ar = [] + data.forEach(function (item, index) { + ar.push(fromLonLat([Number(item.lon), Number(item.lat)])) + }) + let ls = new LineString(ar) + let lsf = new Feature({ + geometry: ls + }) + lsf.set('type', 'line') + return lsf +} + +export default shipFun diff --git a/src/util/map/style.js b/src/util/map/style.js new file mode 100644 index 0000000..4d8089b --- /dev/null +++ b/src/util/map/style.js @@ -0,0 +1,637 @@ +import Style from 'ol/style/Style' //样式总类 +import styleIcon from 'ol/style/Icon' //添加图标 +import styleText from 'ol/style/Text' //添加文字标注 +import styleFill from 'ol/style/Fill' //添加填充样式 +import styleStroke from 'ol/style/Stroke' //添加填充样式 +import styleCircle from 'ol/style/Circle' //添加填充样式 +import Polygon from 'ol/geom/Polygon' //面 +import start from './img/start.png' +import end from './img/end.png' +import kuang from './img/kuang.png' +import sign from './img/blue.png' +import port from './img/port.png' +import berth from './img/berth.png' +import { transform } from 'ol/proj' //坐标系转换 +import { Circle as CircleStyle, Fill, RegularShape } from 'ol/style' + +const shipStyle = new Object({}) + + +shipStyle.carStyle = function (f) { + let flag = new Style({ + image: new styleIcon({ + src: '/zero2/img/car.svg', + scale: 0.2, + }), + text: new styleText({ + font: '16px Microsoft YaHei 100', + textAlign: 'center', + overflow: true, + fill: new styleFill({ + color: '#000' + }), + stroke: new styleStroke({ + color: '#fff', + width: 3 + }), + textBaseline: 'bottom', + text: f.get('carNum') + }) + }) + return [flag] +} +// ---我的修改--- +var shipsize = null +shipStyle.plotting = function (number) { + number = number <= 200 ? number : 200 + shipsize = number +} +// ---我的修改--- + +// ---我的修改 +shipStyle.lineStyle = function () { + return new Style({ + stroke: new styleStroke({ + color: 'rgba(77, 168, 213,0.7)', + width: 4 + }) + }) +} +//---我的修改 + +//普通船舶 +shipStyle.newshipStyle = function (f, r, map) { + let zoom = Math.ceil((Math.log(r) - Math.log(156543.03390625)) / Math.log(0.5)) + let style = null + let gemo = null + let styles = [] + let d = r * 7 + let shipnameEn = f.get('shipnameEn') //船名 + let heading = f.get('heading') + let direction = parseFloat(f.get('cog') / 10) //航向 + let speed = parseFloat(f.get('sog') / 10) //速度 + let o = f.get('geom').getCoordinates() + let lon = parseFloat(f.get('lon') / 60 / 10000) + let lat = parseFloat(f.get('lat') / 60 / 10000) + let shipColor = '' + let color = f.get('color') + if (color) { + shipColor = color + } else { + let shiptype = f.get('shiptype') + shiptype = shiptype ? Number(shiptype) : 90 + switch (true) { + //70-79 货船 + case shiptype >= 70 && shiptype <= 79: + shipColor = '#53cf90' + break + //80-89 油船 + case shiptype >= 80 && shiptype <= 89: + shipColor = '#743675' + break + //60-69 客船 + case shiptype >= 60 && shiptype <= 69 && shiptype === 73: + shipColor = '#ffc24d' + break + //渔船 + case shiptype == 30: + shipColor = '#fc8a2a' + break + //拖船 + case shiptype == 52: + shipColor = '#bd3154' + break + //工程船 + case shiptype == 31 || + shiptype == 32 || + shiptype == 33 || + shiptype == 34 || + shiptype == 53: + shipColor = '#2fb3cc' + break + //公务执法船 + case shiptype == 35 || + shiptype == 50 || + shiptype == 51 || + shiptype == 55 || + shiptype == 58: + // shiptype == 59: + shipColor = '#8d1d55' + break + //其他 + default: + shipColor = '#065880' + break + } + } + style = new Style({ + fill: new styleFill({ + color: shipColor + }), + stroke: new styleStroke({ + color: '#333', + width: 0.5 + }) + }) + styles.push(style) + let nameStyle = null + let textline = null + //判断图层级别 + var rot = heading + if (rot !== 0) { + if (!rot) { + rot = direction + if (!rot) { + rot = 0 + } + } + } + let rot2 = 0 + if (direction === 0) { + rot2 = 0 + } else { + rot2 = direction ? direction : heading + if (!rot2) rot2 = 0 + } + let geom = null + if (speed && speed >= 0.5) {//显示三角形 + let x = [o[0], o[1] + (1.3 + speed * 0.1) * d] + let a = [o[0], o[1] + 1.3 * d] + let b = [o[0] - 0.7 * d, o[1] - d] + let c = [o[0] + 0.7 * d, o[1] - d] + geom = new Polygon([ + [x, a, b, c, a] + ]) + geom.rotate(-Math.PI / 180 * direction, o) + } else { //显示菱形 + let x = [o[0] - 0.5 * d, o[1] - 0.5 * d] + let a = [o[0] + 0.5 * d, o[1] - 0.5 * d] + let b = [o[0] - 0.5 * d, o[1] + 0.5 * d] + let c = [o[0] + 0.5 * d, o[1] + 0.5 * d] + geom = new Polygon([ + [x, a, c, b] + ]) + geom.rotate(Math.PI / 180 * 45, o) + } + f.setGeometry(geom) + + nameStyle = new Style({ + text: new styleText({ + font: '16px Microsoft YaHei 100', + textAlign: 'left', + overflow: true, + fill: new styleFill({ + color: '#000' + }), + stroke: new styleStroke({ + color: '#fff', + width: 3 + }), + textBaseline: 'bottom', + offsetX: 10, + offsetY: 20, + text: shipnameEn + }) + }) + + // let pix = map.getPixelFromCoordinate(o) + // let e = [] + // e[0] = pix[0] + // e[1] = pix[1] + // e[0] += 20 + // e[1] += 10 + // let end = map.getCoordinateFromPixel(e) + // let slGeo = new LineString([o, end]) + // textline = new Style({ + // fill: new styleFill({ + // color: 'black' + // }), + // stroke: new styleStroke({ + // color: 'black', + // width: 0.5 + // }) + // }) + // textline.setGeometry(slGeo) + + if (zoom > 11) { + // if (nameStyle) { + // styles.push(nameStyle) + // } + // if (textline) { + // styles.push(textline) + // } + } + + return styles +} + +// 新的船舶样式 +shipStyle.newShipStyle = function (f, zoom, map) { + return new Style({ + image: new RegularShape({ + stroke: new styleStroke({ + color: '#333333FF', + width: 1 + }), + fill: new styleFill({ + color: 'red' + }), + radius: 8, + points: 4 + }) + }) +} + +//测距最终显示的样式 +shipStyle.ceJuStyle = new Style({ + fill: new styleFill({ + color: 'red' + }), + stroke: new styleStroke({ + color: 'red', + width: 3 + }), + image: new CircleStyle({ + radius: 7, + fill: new styleFill({ + color: 'red' + }) + }) +}) +//测距画笔的样式 +shipStyle.drawStyle = new Style({ + fill: new styleFill({ + color: 'red' + }), + stroke: new styleStroke({ + color: 'red', + width: 3 + }), + image: new CircleStyle({ + radius: 5, + stroke: new styleStroke({ + color: 'red' + }), + fill: new styleFill({ + color: 'red' + }) + }) +}) + +shipStyle.newShip = function () { + return new Style({ + image: new styleIcon({ + // 点的颜色 + fill: new styleFill({ + color: '#000' + }), + // 圆形半径 + radius: 7 + }) + }) +} +//船舶样式 +shipStyle.shipStyle = function (f, r) { + let r1 = 0.0005 //r=0.0005代表着100米 + let style = null + let gemo = null + let speed = parseFloat(f.get('sog')) + let direction = parseFloat(f.get('cog')) + let o = f.get('geom').getCoordinates() + let lon = parseFloat(f.get('lon') / 60 / 10000) + let lat = parseFloat(f.get('lat') / 60 / 10000) + let name = f.get('shipnameEn') + //判断图层级别 + if (r < 13) { + style = new Style({ + stroke: new styleStroke({ + color: 'red', + width: 1 + }) + }) + //判断航向是不是O 是就显示方块 + // if (speed == 0) { + // let a = changeCoor([lon - r1, lat - r1]); + // let s = changeCoor([lon - r1, lat + r1]); + // let v = changeCoor([lon + r1, lat + r1]); + // let g = changeCoor([lon + r1, lat - r1]); + // gemo = new Polygon([[a, s, v, g]]); + // gemo.rotate(Math.PI / 180 * 45, o); + // } else { + let x = changeCoor([lon, lat + (1.8 + speed * 0.2) * r1]) + let a1 = changeCoor([lon, lat + 1.8 * r1]) + let b1 = changeCoor([lon - 0.4 * r1, lat + r1]) + let c1 = changeCoor([lon + 0.4 * r1, lat + r1]) + let d1 = changeCoor([lon - 0.4 * r1, lat - 1.5 * r1]) + let e1 = changeCoor([lon + 0.4 * r1, lat - 1.5 * r1]) + gemo = new Polygon([[x, a1, b1, d1, e1, c1, a1]]) + gemo.rotate((-Math.PI / 180) * direction, o) + // } + } else { + r1 = r / 20000 + style = new Style({ + fill: new styleFill({ color: '#7CFC00' }), + stroke: new styleStroke({ + color: '#333', + width: 0.5 + }) + }) + let x = changeCoor([lon, lat + (1.3 + speed * 0.1) * r1]) + let a = changeCoor([lon, lat + 1.3 * r1]) + let b = changeCoor([lon - 0.7 * r1, lat - r1]) + let c = changeCoor([lon + 0.7 * r1, lat - r1]) + gemo = new Polygon([[x, a, b, c, a]]) + gemo.rotate((-Math.PI / 180) * direction, o) + } + f.setGeometry(gemo) + + let nameStyle = new Style({ + text: new styleText({ + font: '16px Microsoft YaHei 100', + textAlign: 'left', + overflow: true, + fill: new styleFill({ + color: '#000' + }), + stroke: new styleStroke({ + color: '#fff', + width: 3 + }), + textBaseline: 'bottom', + /*backgroundStroke:new Stroke({ + color: '#8D9080', + width: 1 + }),*/ + offsetX: 0, + offsetY: 20, + text: name + }) + }) + let flag = new Style({ + image: new styleIcon({ + src: '../img/end.png', + imgSize: [10, 22], + //scale: 0.5 + offsetX: 0, + offsetY: 11 + }), + text: new styleText({ + font: '16px Microsoft YaHei 100', + textAlign: 'left', + overflow: true, + fill: new styleFill({ + color: '#000' + }), + stroke: new styleStroke({ + color: '#fff', + width: 3 + }), + textBaseline: 'bottom', + /*backgroundStroke:new Stroke({ + color: '#8D9080', + width: 1 + }),*/ + offsetX: 50, + offsetY: 20, + text: 'name' + }) + }) + let styles = [] + styles.push(style) + if (r >= 11) { + styles.push(nameStyle) + } + return styles +} +//船舶选中框样式 +shipStyle.selectStyle = new Style({ + image: new styleIcon({ + anchor: [0.5, 0.5], + src: kuang + }) +}) +//标记的样式 +shipStyle.signStyle = new Style({ + image: new styleIcon({ + anchor: [0.5, 0.5], + src: sign + }), + text: new styleText({ + text: '未命名', //f.get('name') + font: '12px Calibri,sans-serif', + offsetY: 20, //位置 + offsetX: 0, //位置 + fill: new styleFill({ + color: 'black' //填充颜色 + }) + }) +}); + +//轨迹路线颜色 +(shipStyle.pathColor = function () { + return new Style({ + stroke: new styleStroke({ + color: 'red', + width: 3 + }) + }) +}), + //范围线样式 + (shipStyle.areastyle = function () { + return new Style({ + stroke: new styleStroke({ + color: 'rgba(230,162,60,0.8)', + width: 5 + }) + }) + }) +//船舶点击样式 +shipStyle.clickStyle = function () { + return function (f, r) { + let r1 = 0.0005 //r=0.0005代表着100米 + let style = null + let gemo = null + let speed = parseFloat(f.get('sog')) + let direction = parseFloat(f.get('cog')) + let o = f.get('geom').getCoordinates() + let lon = parseFloat(f.get('lon')) + let lat = parseFloat(f.get('lat')) + //判断图层级别 + if (r < 13) { + style = new Style({ + stroke: new styleStroke({ + color: 'black', + width: 1 + }), + fill: new styleFill({ + color: '#7CFC00' + }) + }) + //判断航向是不是O 是就显示方块 + if (speed == 0) { + let a = changeCoor([lon - r1, lat - r1]) + let s = changeCoor([lon - r1, lat + r1]) + let v = changeCoor([lon + r1, lat + r1]) + let g = changeCoor([lon + r1, lat - r1]) + gemo = new Polygon([[a, s, v, g]]) + gemo.rotate((Math.PI / 180) * 45, o) + } else { + let x = changeCoor([lon, lat + (1.8 + speed * 0.2) * r1]) + let a1 = changeCoor([lon, lat + 1.8 * r1]) + let b1 = changeCoor([lon - 0.4 * r1, lat + r1]) + let c1 = changeCoor([lon + 0.4 * r1, lat + r1]) + let d1 = changeCoor([lon - 0.4 * r1, lat - 1.5 * r1]) + let e1 = changeCoor([lon + 0.4 * r1, lat - 1.5 * r1]) + gemo = new Polygon([[x, a1, b1, d1, e1, c1, a1]]) + gemo.rotate((-Math.PI / 180) * direction, o) + } + } else { + r1 = r / 20000 + style = new Style({ + fill: new styleFill({ color: '#7CFC00' }), + stroke: new styleStroke({ + color: '#333', + width: 0.5 + }) + }) + let x = changeCoor([lon, lat + (1.3 + speed * 0.1) * r1]) + let a = changeCoor([lon, lat + 1.3 * r1]) + let b = changeCoor([lon - 0.7 * r1, lat - r1]) + let c = changeCoor([lon + 0.7 * r1, lat - r1]) + gemo = new Polygon([[x, a, b, c, a]]) + gemo.rotate((-Math.PI / 180) * direction, o) + } + f.setGeometry(gemo) + return style + } +} +//历史轨迹样式 +shipStyle.pathStyle = function (time) { + return new Style({ + image: new styleCircle({ + // 点的颜色 + fill: new styleFill({ + color: 'yellow' + }), + // 圆形半径 + radius: 5 + }), + text: new styleText({ + text: time, //f.get('name') + font: '12px Calibri,sans-serif', + offsetY: 20, //位置 + offsetX: 0, //位置 + fill: new styleFill({ + color: '#00a0e9' + }), + stroke: new styleStroke({ + color: 'white', + width: 4 + }) + }) + }) +} +//历史轨迹开始结束点的样式 +shipStyle.pathSEStyle = function (state) { + let style = null + if (state == 'start') { + style = new Style({ + image: new styleIcon({ + src: start, + anchor: [0.5, 1] + }) + }) + } else { + style = new Style({ + image: new styleIcon({ + src: end, + anchor: [0.5, 1] + }) + }) + } + return style +} +//自定义数据添加线段的样式 +shipStyle.agtStyle = (color, type) => { + color = color ? color : '#FF5454' + let style = null + if (type == 1) { + style = new Style({ + stroke: new styleStroke({ + color: color, + width: 2, + lineDash: [10, 10] + }) + }) + } else { + style = new Style({ + stroke: new styleStroke({ + color: color, + width: 2 + }) + }) + } + return style +} + +//等值线样式 +shipStyle.isobarStyle = new Style({ + fill: new Fill({ color: 'transparent' }), + stroke: new styleStroke({ + width: 2, + color: [241, 241, 241, 0.8], + }), + text: new styleText({ + font: '12px Calibri,sans-serif', + placement: 'line', + fill: new styleFill({ + color: '#000', + }), + stroke: new styleStroke({ + color: '#fff', + width: 3, + }), + }), +}) +//港口样式 +shipStyle.portStyle = function (f) { + return new Style({ + image: new styleIcon({ + anchor: [0.5, 0.5], + src: port + }), + text: new styleText({ + text: f.get('name'), + font: '12px Calibri,sans-serif', + offsetY: -10, //位置 + offsetX: 25, //位置 + fill: new styleFill({ + color: 'blue' //填充颜色 + }) + }) + }) +} +shipStyle.berthStyle = function (f) { + return new Style({ + image: new styleIcon({ + anchor: [0.5, 0.5], + src: berth, + size: [20, 20], + scale: 1 + }), + text: new styleText({ + text: f.get('name'), + font: '12px Calibri,sans-serif', + offsetY: -10, //位置 + offsetX: 25, //位置 + fill: new styleFill({ + color: 'blue' //填充颜色 + }) + }) + }) +} + +//定义一个函数用于转换坐标 +let changeCoor = (coor) => transform(coor, 'EPSG:4326', 'EPSG:3857') + +export default shipStyle diff --git a/src/util/message/index.ts b/src/util/message/index.ts new file mode 100644 index 0000000..9278f91 --- /dev/null +++ b/src/util/message/index.ts @@ -0,0 +1,45 @@ +import '../../../node_modules/toastr/toastr.scss' + +const toastr = require('../../../node_modules/toastr/toastr') +toastr.options = { + closeButton: true,//显示关闭按钮 + debug: false, + progressBar: true,//显示进度条 + positionClass: "toast-top-right",//位置 + onclick: null,//点击消息框自定义事件 + showDuration: "300",//显示动作时间 + hideDuration: "1000",//隐藏动作时间 + timeOut: "2000",//显示时间,0为永久显示 + extendedTimeOut: "1000",//鼠标移动过后显示显示时间 + showEasing: "swing", + hideEasing: "linear", + showMethod: "fadeIn",//显示方式 + hideMethod: "fadeOut"//隐藏方式 +} +class MessageUtil { + /** + * 正常消息弹窗 + * @param data + */ + public static info (data: any) { + return toastr.info(data) + } + + /** + * 警告消息弹窗 + * @param data + */ + public static warring (data: any) { + return toastr.warring(data) + } + + /** + * 错误消息弹窗 + * @param data + */ + public static error (data: any) { + return toastr.error(data) + } +} + +export default MessageUtil diff --git a/src/util/mini/index.ts b/src/util/mini/index.ts new file mode 100644 index 0000000..30363f2 --- /dev/null +++ b/src/util/mini/index.ts @@ -0,0 +1,46 @@ +import Vue from 'vue' + +/** + * 最小化列表 + */ +class MiniUtil { + /** + * 添加最小化内容 + * @param data + */ + public static addMini(data: any) { + Vue.prototype.$MiniList.push(data) + } + + /** + * 删除最小化内容 + * @param type + */ + public static delMini(type: string) { + const list = Vue.prototype.$MiniList + if (list) { + list.forEach((item: any, index: any) => { + if (item.type === type) { + Vue.prototype.$MiniList.splice(index, 1) + } + }) + } + } + + /** + * 判断传入的类型是否最小化显示 + * @param type + */ + public static isHasMini(type: string) { + let data = false + const list = Vue.prototype.$MiniList + list.forEach((item: any) => { + if (item.type === type) { + data = true + } + }) + return data + } +} + +export default MiniUtil diff --git a/src/util/new-dialog/index.ts b/src/util/new-dialog/index.ts new file mode 100644 index 0000000..1cb88b7 --- /dev/null +++ b/src/util/new-dialog/index.ts @@ -0,0 +1,128 @@ +import Vue from 'vue' +import MiniUtil from '@/util/mini' +import store from '@/store' +import i18n from '@/util/translate' + +class DialogUtil { + public static showDialog(vueTemplate: any, vueName: string, data: any) { + const flag = MiniUtil.isHasMini(vueName) + if (flag) this.closeMini(vueName) + const showComponents = Vue.prototype.$showComponents + const compent = showComponents.get(vueName) + if (!compent) { + const MountComponent = Vue.extend(vueTemplate) + const vm = new MountComponent({ + propsData: { + tempData: data + }, + store, + i18n + }) + const menug = vm.$data.menuGroup + if (menug) { + const group: Map = Vue.prototype.$menuGroup + if (!group.has(menug)) { + group.set(menug, vueName) + } else { + this.closeCom(group.get(menug)) + group.set(menug, vueName) + } + } + vm.$mount(document.createElement('div')); + (document.getElementById('ship-type-box') as HTMLElement).append(vm.$el) + showComponents.set(vueName, vm) + } else { + compent.$props.tempData = data + compent.$forceUpdate() + } + } + + /** + * 查看组件是否显示 + * @param vueName + */ + public static isShow(vueName: string) { + const showComponents = Vue.prototype.$showComponents + const component = showComponents.get(vueName) + if (component) { + return component.$options.propsData.tempData.show + } else { + return false + } + } + + /** + * 隐藏组件 + * @param vueName 组件名称 + */ + public static hideCom(vueName: string) { + const showComponents = Vue.prototype.$showComponents + const component = showComponents.get(vueName) + if (component) { + component.$props.tempData.show = false + component.$forceUpdate() + } + } + + /** + * 显示组件 + * @param vueName 组件名称 + */ + public static showCom(vueName: string) { + const showComponents = Vue.prototype.$showComponents + const component = showComponents.get(vueName) + if (component) { + component.$props.tempData.show = true + component.$forceUpdate() + } + } + + /** + * 添加最小化显示 + * @param vueName + */ + public static showMini(vueName: string) { + const showComponents = Vue.prototype.$showComponents + const component = showComponents.get(vueName) + MiniUtil.addMini({ + type: vueName, + title: component.dialogConfig.header.title + }) + this.hideCom(vueName) + } + + /** + * 关闭最小化显示 + * @param vueName + */ + public static closeMini(vueName: string) { + MiniUtil.delMini(vueName) + this.closeCom(vueName) + } + + /** + * 关闭销毁组件 + * @param vueName + */ + public static closeCom(vueName: string) { + const showComponents = Vue.prototype.$showComponents + const component = showComponents.get(vueName) + if (component) { + if (MiniUtil.isHasMini(vueName)) { + MiniUtil.delMini(vueName) + } + const el = component.$el + component.$refs[vueName].cancel() + el.parentElement.removeChild(el) + component.$destroy() + showComponents.delete(vueName) + } + } + + public static getCom(vueName: string) { + const showComponents = Vue.prototype.$showComponents + return showComponents.get(vueName) + } +} + +export default DialogUtil diff --git a/src/util/store/index.ts b/src/util/store/index.ts new file mode 100644 index 0000000..3af0c9a --- /dev/null +++ b/src/util/store/index.ts @@ -0,0 +1,107 @@ +import store from '@/store' + +class StoreUtil { + /** + * 设置地图实例 + * @param data + */ + public setMapInstance(data: any) { + store.commit('setMapInstance', data) + } + + /** + * 设置地图封装方法 + * @param data + */ + public setMapFun(data: any) { + store.commit('setMapFun', data) + } + + /** + * 获取地图封装方法 + */ + public getMapFun() { + return store.state.mapFun + } + + /** + * 获取地图实例 + */ + public getMapInstance() { + return store.state.mapInstance + } + + /** + * 设置目录 + * @param data + */ + public setDictionary(data: any) { + store.state.dictionary = data + } + + /** + * 设置船舶信息 + * @param data + */ + public setShipData(data: any) { + store.state.ship = data + } + + /** + * 设置船舶信息 + * @param data + */ + public setShipFleet(data: any) { + store.state.shipFleet = data + } + + /** + * 获取国籍字典 + */ + public getCountry() { + const data: any = store.state.dictionary + if (data) { + return data.shipCountry + } else { + return null + } + } + + /** + * 获取船舶类型字典 + */ + public getShipType() { + const data: any = store.state.dictionary + if (data) { + return data.shipType + } else { + return null + } + } + + /** + * 获取船舶状态字典 + */ + public getShipStatus() { + const data: any = store.state.dictionary + if (data) { + return data.shipStatus + } else { + return null + } + } + + /** + * 获取船舶状态字典 + */ + public getShipFleet() { + const data: any = store.state.shipFleet + if (data) { + return data + } else { + return null + } + } +} + +export default new StoreUtil() diff --git a/src/util/temp-interface/index.ts b/src/util/temp-interface/index.ts new file mode 100644 index 0000000..d4e2518 --- /dev/null +++ b/src/util/temp-interface/index.ts @@ -0,0 +1,31 @@ +/** + * FOLLOW_SHIP_FROM 添加分组组件名称 + * + */ +export enum DialogType { + TRACK_RECORD = 'TrackRecordTemp', // 轨迹查询弹窗 + TRACK_RECORD_LOG = 'TrackRecordLogTemp', // 轨迹记录弹窗 + SEARCH_LIST = 'SearchListTemp', // 搜索记录 + DATA_ANALYSIS = 'DataAnalysisTemp', // 数据分析 + MAP_TOOL = 'MapToolTemp', // 地图工具 + SHIP_RANKS = 'ShipRanksTemp', // 全部船队 + WEATHER = 'WeatherTemp', // 海况天气 + PORT_QUERY = 'PortQueryTemp', // 港口查询 + ROUTE_QUERY = 'RouteQueryTemp', // 航线查询 + SHIP_INFO = 'ShipInfoTemp', // 船舶信息 + CAR_INFO = 'CarInfoTemp', // 车辆信息 + PORT_OF_CALL = 'PortOfCallTemp', // 到离港记录 + CONTAINER_QUERY = 'ContainerQueryTemp', // 集装箱查询 + AREA_LIST = 'AreaListTemp', // 区域列表 + MESSAGE_LIST = 'MessageListTemp', // 消息列表 + ARRIVE_LEAVE_QUERY = 'ArriveLeaveQueryTemp', // 到港查询 + DEPARTURE_INQUIRY = 'DepartureInquiryTemp', // 离港查询 + EXPECTED_ARRIVAL = 'ExpectedArrivalTemp', // 预计到港 + SHIP_EVENT = 'ShipEventTemp', // 船舶事件 + NUMBER_OF_BERTHS = 'NumberOfBerthsTemp', // 在泊统计 + POINT_POINT_RES = 'PointToPointResTemp', // 点到点结果显示 + ROUTE_YC = 'RouteYcTemp', // 航线预测 + SHIP_IN_BERTH = 'ShipInBerthTemp', // 泊位统计中详情显示船舶信息 + NOTAN = 'NotanTemp', // 航行通告 + WEATHER_IMG = 'WeatherImgTemp' // 台风图例 +} diff --git a/src/util/tool/index.ts b/src/util/tool/index.ts new file mode 100644 index 0000000..e134951 --- /dev/null +++ b/src/util/tool/index.ts @@ -0,0 +1,274 @@ +import Vue from 'vue' +import store from '@/util/store' + +class SearchLog { + public addSearchLog(data: any) { + Vue.prototype.$SearchLog.push(data) + } +} + +class shipUtil { + + /** + * 通过船舶类型代码获取船舶类型 + * @param data 船舶类型代码 + */ + public getShipType(data: any, en?: boolean) { + const shipTypes = store.getShipType() + if (shipTypes) { + const shipType = shipTypes.find((val: any) => { + return val.id === data + }) + if (shipType) { + if (en) { + return shipType.valueEn + } else { + return shipType.valueChs + } + } else { + if (en) { + return 'Other' + } else { + return '其他类型' + } + } + } + } + + public newGetShipType(shipTypeId: any, en?: boolean) { + if (shipTypeId === '30') { + return en ? 'Fishing vessel' : '渔船' + } else if (shipTypeId === '52') { + return en ? 'TUG' : '拖轮' + } else if (['31', '32', '33', '34', '53'].indexOf(shipTypeId) !== -1) { + return en ? 'Working ship' : '工程船' + } else if (shipTypeId === '37') { + return en ? 'Passenger' : '客船' + } else if (shipTypeId[0] === '6') { + return en ? 'Passenger' : '客船' + } else if (['35', '50', '51', '55', '58', '59'].indexOf(shipTypeId) !== -1) { + return en ? 'Official law enforcement ship' : '公务执法船' + } else if (shipTypeId[0] === '7') { + return en ? 'Cargo ship' : '货船' + } else if (shipTypeId[0] === '8') { + return en ? 'Tanker' : '油船' + } else { + return en ? 'Other' : '其他' + } + } + + /** + * 通过mmsi的前3位获取船籍国 + * @param data mmsi的前3位 + */ + public getShipCountryImg(data: any) { + const countries = store.getCountry() + if (countries) { + const country = countries.find((val: any) => { + return val.id === data + }) + return country ? require(`../../../public/country-img/${country.valueAbbr}.png`) : require(`../../../public/country-img/undefined.png`) + } + } + + /** + * 通过mmsi的前3位获取国家名称 + * @param data mmsi的前3位 + */ + public getShipCountryImgName(data: any) { + const countries = store.getCountry() + if (countries) { + const country = countries.find((val: any) => { + return val.id === data + }) + return country && country.valueEn ? country.valueEn : '' + } + } + + /** + * 通过mmsi的前3位获取船籍字符 + * @param data mmsi的前3位 + */ + public getShipCountryCode(data: any) { + const countries = store.getCountry() + if (countries) { + const country = countries.find((val: any) => { + return val.id === data + }) + return country ? `${country.valueEn ? country.valueEn + '/' : ''}${country.valueChs ? country.valueChs : ''}` : 'undefined' + } + } + + /** + * 通过mmsi的前3位获取船籍对象 + * @param data mmsi的前3位 + */ + public getShipCountry(data: any) { + const countries = store.getCountry() + if (countries) { + const country = countries.find((val: any) => { + return val.id === data + }) + return country || 'undefined' + } + } + + /** + * 通过状态码获取船舶状态 + * @param data + */ + public getShipStatus(data: any, en?: boolean) { + const status = store.getShipStatus() + if (status) { + const sta = status.find((val: any) => { + return val.id === data + '' + }) + if (sta) { + if (en) { + return sta.valueEn + } else { + return sta.valueChs + } + } else { + if (en) { + return 'undefined' + } else { + return '未知' + } + } + // return sta ? sta.valueChs : '未知' + } + } + + /** + * 纬度格式化 + * @param value + */ + public filterLat(value: any) { + if (value === undefined || value === '' || value === null) { + return + } + let dData = 0 + if (Math.abs(value) < 90) { + dData = Math.abs(value) + } else { + dData = Math.abs(value / 10000 / 60) + } + let isPlus = value > 0 ? 'N' : 'S' + let degree = parseInt(dData + '') + let min = parseInt((dData - degree) * 60 + '') + let sec = (((dData - degree) * 60 - min) * 60).toFixed(2) + return `${degree}°${min}′${sec}″${isPlus}` + } + + /** + * 经度格式化 + * @param value + */ + public filterLon(value: any) { + if (value === undefined || value === '' || value === null) { + return + } + let dDate = 0 + if (Math.abs(value) < 180) { + dDate = Math.abs(value) + } else { + dDate = Math.abs(value / 10000 / 60) + } + let isPlus = value > 0 ? 'E' : 'W' + let degree = parseInt(dDate + '') + let min = parseInt((dDate - degree) * 60 + '') + let sec = (((dDate - degree) * 60 - min) * 60).toFixed(2) + return `${degree}°${min}′${sec}″${isPlus}` + } + + /** + * 时间格式化 + * @param data + */ + public formatDate(time: any, fmt: any) { + if (time === undefined || time === '' || time === null || time === 0) { + return + } + if (typeof time === 'string') { + return time + } + time = time * 1000 + const date = new Date(time) + if (/(y+)/.test(fmt)) { + fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length)) + } + const o = { + 'M+': date.getMonth() + 1, + 'd+': date.getDate(), + 'h+': date.getHours(), + 'm+': date.getMinutes(), + 's+': date.getSeconds() + } + for (const k in o) { + if (new RegExp(`(${k})`).test(fmt)) { + // @ts-ignore + const str = o[k] + '' + fmt = fmt.replace(RegExp.$1, RegExp.$1.length === 1 ? str : this.padLeftZero(str)) + } + } + return fmt + } + + private padLeftZero(str: any) { + return ('00' + str).substr(str.length) + } +} + +/** + * 最小化列表 + */ +class MiniList { + + /** + * 添加最小化内容 + * @param data + */ + public addMini(data: any) { + Vue.prototype.$MiniList.push(data) + } + + /** + * 删除最小化内容 + * @param index + */ + public delMini(type: string) { + const list = Vue.prototype.$MiniList + if (list) { + list.forEach((item: any, index: any) => { + if (item.type === type) { + Vue.prototype.$MiniList.splice(index, 1) + } + }) + } + } + + /** + * 判断传入的类型是否最小化显示 + * @param type + */ + public isHasMini(type: string) { + let data: any = null + const list = Vue.prototype.$MiniList + list.forEach((item: any) => { + if (item.type === type) { + data = item.data + } + }) + return data + } +} + +const SearchLogUtil = new SearchLog() +const ShipUtils = new shipUtil() +const MiniUtils = new MiniList() +export { + SearchLogUtil, + ShipUtils, + MiniUtils +} diff --git a/src/util/translate/index.ts b/src/util/translate/index.ts new file mode 100644 index 0000000..f7d5b30 --- /dev/null +++ b/src/util/translate/index.ts @@ -0,0 +1,40 @@ +import Vue from 'vue' +import VueI18n from 'vue-i18n' +import {Language} from "@/module/menu"; + +// @ts-ignore +import ElLocal from 'element-ui/lib/locale' +// @ts-ignore +import enLocale from 'element-ui/lib/locale/lang/en' +// @ts-ignore +import zhLocale from 'element-ui/lib/locale/lang/zh-CN' + +const langZH = require('./lang/zh.json') +const langEn = require('./lang/en.json') +Vue.use(VueI18n) +const i18n = new VueI18n({ + locale: 'zh', + messages: { + en: { + message: { + ...langEn + }, + ...enLocale + }, + zh: { + message: { + ...langZH + }, + ...zhLocale + } + } +}) +ElLocal.i18n((key: any, value: any) => i18n.t(key, value)) +const nowL = window.localStorage.getItem('language') +if (nowL) { + i18n.locale = nowL +} else { + window.localStorage.setItem('language', Language.zh) +} + +export default i18n diff --git a/src/util/translate/lang/en.json b/src/util/translate/lang/en.json new file mode 100644 index 0000000..25598bb --- /dev/null +++ b/src/util/translate/lang/en.json @@ -0,0 +1,420 @@ +{ + "search": { + "shipName": "Ship name", + "mmsi": "Mmsi", + "imo": "Imo", + "lastUpdated": "Update time", + "port": "Port", + "country": "Country", + "portName": "Port name", + "info": "Enter Ship", + "minutesAgo": "minutes ago", + "hoursAgo": "hours ago", + "daysAgo": "days ago" + }, + "portHoverView": { + "chineseName": "Chinese name", + "englishName": "English name", + "portCode": "Port code", + "portPos": "Port coordinates" + }, + "ShipHoverView": { + "shipName": "Ship name", + "mmsi": "Mmsi", + "lon": "Lon", + "lat": "Lat", + "time": "Time" + }, + "TrackHoverView": { + "course": "Course", + "Speed": "Speed", + "time": "Time'" + }, + "PortQuery": { + "arrive": "Arrived", + "leave": "Departured", + "yj": "Arriving", + "crude": "Crude oil port", + "portTitle": "Port", + "portNameC": "Port name(CN)", + "portNameE": "Port name(En)", + "countryOfPort": "Country of port", + "areaOfPort": "Area of port", + "portTimeZone": "Time zone", + "maximumDraftLimit": "Maximum draft limit", + "maximumDWTLimit": "Maximum dwt limit", + "maximumCaptainLimit": "Maximum captain limit", + "dryBulkFacilities": "Dry bulk facilities", + "breakBulkFacilities": "Break bulk facilities", + "containerFacilities": "Container facilities", + "roRoFacilities": "Roro facilities", + "passengerFacilities": "Passenger facilities", + "liquidFacilities": "Liquid facilities", + "lngFacilities": "LNG facilities", + "lpgFacilities": "LPG facilities", + "dryDockFacilities": "Dry dock facilities", + "freeTradeZone": "Free trade zone", + "berthTitle": "Berth", + "noText": "null", + "allShowBerth": "All berths", + "berthName": "Berth name", + "berthOperator": "Berth operator", + "berthType": "Berth type", + "berthStatus": "Berth status", + "facilityType": "Facility type", + "nightBerthing": "Night berthing", + "nightBerthingNote": "Night berthing note", + "nightUnberthing": "Night unberthing", + "shipLOAMax": "Ship loa max", + "shipLOAMin": "Ship loa min", + "shipLOANote": "Ship loa note", + "shipDwtMax": "Ship dwt max", + "shipDwtMin": "Ship dwt min", + "shipDWTNote": "Ship dwt note", + "shipDispMax": "Ship disp max", + "shipDispMin": "ship disp min", + "shipDispNote": "Ship disp note", + "shipBeamMax": "Ship beam max", + "berthDispMax": "Berth disp max", + "gTMax": "GT max", + "TEU": "Teu", + "totalPBLMin": "Total pbl min", + "manifoldBCMMax": "Manifold bcm max", + "manifoldBCMMin": "Manifold bcm min", + "manifoldSCMMax": "Manifold scm max", + "manifoldSCMMin": "Manifold scm min", + "manifoldHeightMax": "Manifold height max", + "manifoldHeightMin": "Manifold height min", + "derrickSWLMin": "Derrick swl min", + "wLMastheadHeightMax": "Wl masthead height max", + "manifoldPBLMinFwd": "Manifold pbl min fwd", + "manifoldPBLMinAft": "Manifold pbl min aft", + "manifoldUsed": "Manifold used", + "roRo": "Ro ro", + "passengerType": "Passenger", + "rampWidth": "Ramp width(m)", + "rampSWL": "Ramp swl(t)", + "breakBulk": "Break bulk", + "naval": "Naval", + "coastal": "Coastal", + "timberProducts": "Timber products", + "fishing": "Fishing", + "container": "Container", + "transhipment": "Transhipment", + "offshore": "Off shore", + "projectHeavy": "Project heavy", + "steelProducts": "Steel products", + "twinSpan": "Twin span", + "cranesNote": "Cranes note", + "allWeatherBerth": "All weather berth", + "coldIroning": "Cold ironing", + "sideAlongside": "Side alongside", + "bunkersHFO": "Bunkers hfo", + "deliveryHFO": "Delivery hfo", + "gangwayUsed": "Gangway used", + "bunkersDOGO": "Bunkers do go", + "mooringsFwd": "Moorings fwd", + "mooringsAft": "Moorings aft", + "bunkersLNG": "Bunkers lng", + "deliveryLNG": "Delivery lng", + "freshWater": "Fresh water", + "deliveryFW": "Delivery fw", + "cow": "Cow", + "berthAdditionalInfo": "Berth additional info", + "reefer": "Reefer", + "waterLineHeightHWMaxDecimal": "Water line height hw max decimal", + "dryBulkCargo": "Dry bulk cargo", + "weather": "Weather", + "temperature": "Temperature", + "windSpeed": "Wind speed", + "waveHeight": "Wave height", + "rush": "Rush", + "windDirection": "Wind direction", + "surgeHeight": "Surge height", + "visibility": "Visibility", + "dongTai": "DongTai", + "day": "Day", + "week": "Week", + "month": "Month", + "mao": "Mao", + "berth": "Berth", + "port": "Port", + "maoTime": "Mao time", + "doTime": "Do time", + "chooseBerth": "Choose berth" + }, + "arriveLeave": { + "choosePort": "Place choose port", + "port": "Port", + "portCountry": "Country", + "startTime": "Start time", + "endTime": "End time", + "search": "Search", + "chooseShip": "Ship screening", + "etaStartChoose": "ETA start", + "etaEndChoose": "ETA end", + "screen": "Screening", + "choose": "Place choose", + "shipName": "Ship name", + "shipType": "Ship type", + "draught": "Draught", + "sog": "Sog", + "destPort": "Dest port", + "eta": "ETA", + "latestTime": "Update time", + "arrivalTime": "Arrival time", + "berthTime": "Berth time", + "leaveTime": "Leave time", + "shipLength": "LOA", + "flag": "Flag", + "lastPortName": "Last port name", + "nextPortName": "Next port name", + "lastOutTime": "Last port Dep", + "nextInTime": "Next in time", + "export": "Export" + }, + "shipInfo": { + "shipYc": "Route calculate", + "mmsi": "mmsi", + "shipHeading": "Ship heading", + "callsign": "Callsign", + "shipCoursing": "Ship coursing", + "imo": "Imo", + "speed": "Speed", + "vesselType": "Vessel type", + "lat": "Lat", + "status": "Status", + "lon": "Lon", + "shipLength": "Length", + "destination": "Destination", + "breadth": "Breadth", + "draught": "Draught", + "eta": "ETA", + "lastUpdated": "Last updated", + "shipFlag": "Flag", + "onTheWay": "On the way", + "arrival": "Arrival", + "noHc": "null", + "shipDoc": "Ship archives", + "ExName": "Ex name", + "FlagName": "Flag name", + "DateOfBuild": "Date Of build", + "shiptypeLevel3": "Ship type", + "Length": "Length", + "Depth": "Depth", + "GrossTonnage": "Gross tonnage", + "NetTonnage": "Net tonnage", + "Deadweight": "Dead weight", + "speedService": "Speed service", + "mainEngineModel": "Main engine model", + "mainEngineType": "Main engine type", + "fuelType1First": "Fuel type", + "fuelType1Capacity": "Fuel type capacity", + "groupBeneficialOwner": "Group beneficial owner", + "operator": "Operator", + "registeredOwner": "Registered owner", + "docCompany": "Doc company", + "cargoCapacitiesNarrative": "Cargo capacities narrative", + "innerShip": "China ship data", + "sailAreaName": "Sail area name", + "shipNameEn": "Ship name(en)", + "shipGrosston": "Ship grosston", + "shipType": "Ship type", + "shipEnginePower": "Ship engine power", + "shipPassengerNum": "Ship passenger number", + "location": "Location", + "trackHistory": "Track history", + "portCalling": "Port calling", + "ais": "Ais", + "shipName": "Ship name", + "predictionEta": "ETA (prediction by AI)" + }, + "trackRecord": { + "history": "History", + "moreHistory": "More history", + "noData": "null", + "voyageList": "Voyage list", + "startTime": "Start time", + "endTime": "End Time", + "c": "End time", + "delete": "Delete" + }, + "portOfCall": { + "oneMonth": "1 month", + "threeMonth": "3 months", + "sixMonth": "6 months", + "twelveMonth": "12 months", + "port": "Port", + "arriveTime": "Arrive time", + "departureTime": "Departure time", + "stopTime": "Stop time", + "portCalling": "Port calling" + }, + "searchList": { + "shipName": "Ship name", + "imo": "imo", + "mmsi": "mmsi", + "type": "type", + "shipLength": "Length", + "countryFlag": "Flag", + "draught": "Draught", + "speed": "Speed", + "destination": "Destination" + }, + "mapTool": { + "measureTool": "Measure tool", + "measureDistance": "Measure distance", + "measureArea": "Measure area", + "drawingArea": "Drawing area", + "shape": "Shape" + }, + "weather": { + "reset": "Reset", + "marineWeather": "Marine weather", + "temperature": "Temperature", + "airPressure": "Air pressure", + "wind": "Wind", + "current": "Current", + "typhoon": "Typhoon", + "legend": "Legend", + "typhoonList": "Typhoon List", + "view": "View", + "close": "Close" + }, + "routeQuery": { + "pol": "POL", + "pod": "POD", + "search": "Search", + "duration": "Voyage duration", + "mileage": "Mileage", + "averageSpeed": "Average speed", + "full": "Full", + "empty": "empty", + "origin": "origin", + "destination": "destination", + "port": "port", + "portToPort": "Port To Port", + "pointToPoint": "Point to Point", + "inputLon": "Enter longitude", + "inputLat": "Enter latitude", + "inputLonLatLong": "Please enter longitude and latitude, with longitude before latitude and then after latitude, separated by spaces, and multiple latitudes separated by commas", + "query": "Query", + "pointRoute": "Point to Point Route", + "route": "Route", + "voyageDistance": "Voyage Distance[nm]", + "timeInPort": "Time in Port", + "arrivePortTime": "Arrive Port Time", + "amount": "Amount", + "totalTime": "Total Time" + }, + "messageList": { + "status": "Status", + "arrival": "Arrival", + "leave": "Leave", + "shipName": "Ship name", + "port": "Port", + "startTime": "Time", + "messageStatistics": "Message statistics", + "messageDetails": "Message details", + "arrive": "Arrival", + "leave2": "Leave", + "details": "Details" + }, + "menu": { + "TrackRecordLogTemp": "Voyage history", + "AreaListTemp": "Area list", + "PortToPortTemp": "Port to port", + "SearchListTemp": "Search history", + "DataAnalysisTemp": "Data analysis", + "MapToolTemp": "Map selection", + "ShipRanksTemp": "My fleets", + "WeatherTemp": "Marine weather", + "RouteQueryTemp": "Voyage", + "ContainerQueryTemp": "Container module", + "portInfo": "Port Info", + "ArriveLeaveQueryTemp": "Arrived", + "DepartureInquiryTemp": "Departured", + "ExpectedArrivalTemp": "Arriving", + "crudeOilPort": "Crude oil port", + "messageList": "Message list", + "NumberOfBerthsTemp": "Ships at berths" + }, + "fleets": { + "location": "Location", + "vc": "Show/Hide", + "total": "Total" + }, + "containerQuery": { + "containerQuery": "Container code query", + "billOfLading": "Bill of lading", + "containerBoxNumber": "Number", + "tdCode": "Bol number", + "isoCode": "Iso code", + "containerPosName": "Container pos name", + "eventDescription": "Description", + "eventStatus": "Status", + "eventDate": "Date", + "eventActual": "Actual", + "eventType": "Type", + "vesselsName": "Name", + "eventVoyage": "Voyage", + "vesselCompliance": "Vessel compliance", + "eventlocationCompliance": "Location compliance", + "route": "Route" + }, + "areaList": { + "shipStatistics": "Ship statistics", + "shipFlagStatistics": "Ship flag statistics", + "shipList": "Ship list", + "shipType": "Type", + "shipFlag": "Ship flag", + "shipLength": "Length", + "select": "Select", + "type": "Type", + "nationality": "Nationality", + "draft": "Draft", + "sog": "Sog", + "destPort": "Dest port", + "shipName": "Ship name", + "all": "All" + }, + "allPort": "View all port", + "closeAllPort": "Close all port", + "shipEvent": { + "shipEvent": "Latest Event", + "eventName": "Event name", + "time": "Time", + "describe": "Describe", + "seaArea": "Sea area", + "screenPlaceholder": "Screen event name", + "oneMonth": "Last month", + "threeMonth": "Last three months", + "sixMonth": "Last six months", + "sevenDay": "Last seven days" + }, + "NumberOfBerthsTemp": { + "portName": "Port name", + "numberOfBerth": "Number of berths", + "operationDuration": "Operation duration", + "numberOfMao": "Number of mooring", + "mooringDuration": "Mooring duration", + "numberOfLeave": "Number of leave", + "operate": "operate" + }, + "typhoon": { + "name": "Name", + "start": "Start time", + "end": "End time", + "operate": "Operate" + }, + "routeCalculate": { + "destination": "Destination", + "speed": "Speed", + "search": "Search", + "rd": "Remaining Distance(nm)", + "td": "Travelled Distance(nm)", + "remainder": "Remainder(h)", + "tt": "Traveled Time(h)" + } +} + diff --git a/src/util/translate/lang/zh.json b/src/util/translate/lang/zh.json new file mode 100644 index 0000000..f20a3e5 --- /dev/null +++ b/src/util/translate/lang/zh.json @@ -0,0 +1,420 @@ +{ + "search": { + "shipName": "船名", + "mmsi": "MMSI", + "imo": "imo", + "lastUpdated": "更新时间", + "port": "港口", + "country": "国家", + "portName": "港口名称", + "info": "船舶", + "minutesAgo": "分钟前", + "hoursAgo": "小时前", + "daysAgo": "天前" + }, + "portHoverView": { + "chineseName": "中文名称", + "englishName": "英文名称", + "portCode": "港口代码", + "portPos": "港口坐标" + }, + "ShipHoverView": { + "shipName": "船名", + "mmsi": "MMSI", + "lon": "经度", + "lat": "纬度", + "time": "时间" + }, + "TrackHoverView": { + "course": "航向", + "Speed": "航速", + "time": "时间'" + }, + "PortQuery": { + "arrive": "到港查询", + "leave": "离港查询", + "yj": "预计到港", + "yy-": "预计到港", + "portTitle": "港口信息", + "portNameC": "港口名称(CN)", + "portNameE": "港口名称(EN)", + "countryOfPort": "港口所属国家", + "areaOfPort": "港口所属区域", + "portTimeZone": "时区", + "maximumDraftLimit": "最大吃水限制", + "maximumDWTLimit": "最大DWT限制", + "maximumCaptainLimit": "最大船长限制", + "dryBulkFacilities": "是否有干散货装卸设施", + "breakBulkFacilities": "是否有件杂货散货装卸设施", + "containerFacilities": "是否有集装箱装卸设施", + "roRoFacilities": "是否有滚装货物装卸设施", + "passengerFacilities": "是否有旅客登离设施", + "liquidFacilities": "是否有液货装卸设施", + "lngFacilities": "是否有液化天然气装卸设施", + "lpgFacilities": "是否有液化石油气装卸设施", + "dryDockFacilities": "是否有干船坞设施", + "freeTradeZone": "是否有自由贸易试验区", + "berthTitle": "泊位信息", + "noText": "无匹配数据", + "allShowBerth": "全部显示", + "berthName": "泊位名称", + "berthOperator": "泊位操作公司", + "berthType": "泊位类型", + "berthStatus": "泊位状态", + "facilityType": "泊位设施类型", + "nightBerthing": "夜间靠泊限制", + "nightBerthingNote": "夜间靠泊标准", + "nightUnberthing": "夜间离泊限制", + "shipLOAMax": "泊位最大船长", + "shipLOAMin": "泊位最小船长", + "shipLOANote": "允许靠泊船长标准说明", + "shipDwtMax": "泊位最大载重吨", + "shipDwtMin": "泊位最小载重吨", + "shipDWTNote": "允许靠泊船舶载重吨标准", + "shipDispMax": "泊位最大排水量", + "shipDispMin": "泊位最小排水量", + "shipDispNote": "允许靠泊船舶排水量标准", + "shipBeamMax": "泊位最大船宽", + "berthDispMax": "泊位对排水量的标准", + "gTMax": "泊位总吨最大限制", + "TEU": "泊位载箱量最大限制", + "totalPBLMin": "泊位最小平行体长", + "manifoldBCMMax": "最大船艏至集管中心距", + "manifoldBCMMin": "最小船艏至集管中心距", + "manifoldSCMMax": "最大船尾至集管中心距", + "manifoldSCMMin": "最小船尾至集管中心距", + "manifoldHeightMax": "总管距离水线最大高度", + "manifoldHeightMin": "总管距离水线最小高度", + "derrickSWLMin": "泊位起重机安全工作载荷", + "wLMastheadHeightMax": "水线上最大安全高度", + "manifoldPBLMinFwd": "允许的总管至船头最小平行长度", + "manifoldPBLMinAft": "允许的总管至船尾最小平行长度", + "manifoldUsed": "集管装卸使用位置", + "roRo": "泊位装卸滚装货物的类型", + "passengerType": "泊位登离旅客的类型", + "rampWidth": "滚装坡道宽度(米)", + "rampSWL": "滚装坡道安全工作载荷(吨)", + "breakBulk": "泊位是否能接收散货", + "naval": "泊位是否能接收海军舰艇补给", + "coastal": "泊位是否能接收海巡船舶", + "timberProducts": "泊位是否能接收木材货物", + "fishing": "泊位是否能接收渔船停靠", + "container": "泊位是否能接收集装箱货物", + "transhipment": "泊位是否能接收中转运输", + "offshore": "泊位是否能接收海上支援供应船舶", + "projectHeavy": "泊位是否能接收重型、大件货物", + "steelProducts": "泊位是否能接收钢铁及其制品", + "twinSpan": "是否有双千斤吊货锁", + "cranesNote": "泊位起重机类型", + "allWeatherBerth": "是否为全天候泊位", + "coldIroning": "泊位是否有岸电供使用", + "sideAlongside": "船舶停靠舷边限制", + "bunkersHFO": "泊位是否有船用HFO供应", + "deliveryHFO": "HFO加装方式", + "gangwayUsed": "使用舷梯方式", + "bunkersDOGO": "泊位是否有船用DO,GO供应", + "mooringsFwd": "泊位前系泊装置类型", + "mooringsAft": "泊位后系泊装置类型", + "bunkersLNG": "泊位是否有船用LNG供应", + "deliveryLNG": "LNG加装方式", + "freshWater": "泊位是否有船用淡水供应", + "deliveryFW": "淡水加装方式", + "cow": "泊位是否允许在排油期间对油罐进行原油洗舱", + "berthAdditionalInfo": "泊位额外使用说明", + "reefer": "泊位是否能接收冷藏货物", + "waterLineHeightHWMaxDecimal": "水线到舱盖板顶部最大距离", + "dryBulkCargo": "泊位是否能接收杂件货物", + "weather": "天气", + "temperature": "温度", + "windSpeed": "风速", + "waveHeight": "浪高", + "rush": "涌向", + "windDirection": "风向", + "surgeHeight": "涌高", + "visibility": "能见度", + "dongTai": "动态", + "day": "天", + "week": "周", + "month": "月", + "mao": "锚地情况", + "berth": "泊位情况", + "port": "港口情况", + "maoTime": "锚泊时间", + "doTime": "作业时长", + "chooseBerth": "选择泊位", + "crude": "原油港口" + }, + "arriveLeave": { + "choosePort": "请选择港口信息", + "port": "港口", + "portCountry": "国家", + "startTime": "开始时间", + "endTime": "结束时间", + "search": "搜索", + "chooseShip": "船舶查询", + "etaStartChoose": "ETA开始", + "etaEndChoose": "ETA结束", + "screen": "筛选", + "choose": "请选择", + "shipName": "船名", + "shipType": "类型", + "draught": "吃水", + "sog": "船速", + "destPort": "目的地", + "eta": "预到时间", + "latestTime": "最新时间", + "arrivalTime": "到港时间", + "berthTime": "靠泊时间", + "leaveTime": "离港时间", + "shipLength": "船长", + "flag": "船旗", + "lastPortName": "上一港", + "nextPortName": "下一港", + "lastOutTime": "离开上一港时间", + "nextInTime": "到达下一港时间", + "export": "导出" + }, + "shipInfo": { + "shipYc": "航线预测", + "mmsi": "mmsi", + "shipHeading": "船艏向", + "callsign": "呼号", + "shipCoursing": "船航向", + "imo": "imo", + "speed": "船速", + "vesselType": "类型", + "lat": "纬度", + "status": "状态", + "lon": "经度", + "shipLength": "船长", + "destination": "目的地", + "breadth": "船宽", + "draught": "吃水", + "eta": "预计到港", + "lastUpdated": "更新时间", + "shipFlag": "船旗", + "onTheWay": "在途", + "arrival": "到港", + "noHc": "暂无航次", + "shipDoc": "船舶档案", + "ExName": "曾用名", + "FlagName": "船旗国", + "DateOfBuild": "建造年份", + "shiptypeLevel3": "船舶类型", + "Length": "船长", + "Depth": "深度", + "GrossTonnage": "总吨", + "NetTonnage": "净吨", + "Deadweight": "载重吨", + "speedService": "经济航速", + "mainEngineModel": "主机型号", + "mainEngineType": "主机类型", + "fuelType1First": "燃料", + "fuelType1Capacity": "燃料类型1容量", + "groupBeneficialOwner": "船舶受益所有公司", + "operator": "船舶操作公司", + "registeredOwner": "注册所有公司", + "docCompany": "DOC公司", + "cargoCapacitiesNarrative": "货物类型描述", + "innerShip": "内贸船档案", + "sailAreaName": "航区", + "shipNameEn": "英文船名", + "shipGrosston": "船舶总吨位", + "shipType": "船型", + "shipEnginePower": "主机功率", + "shipPassengerNum": "船舶客位(个)", + "location": "定位", + "trackHistory": "轨迹查询", + "portCalling": "挂靠港记录", + "ais": "AIS信息", + "shipName": "船名", + "predictionEta": "计算ETA" + }, + "trackRecord": { + "history": "查询", + "moreHistory": "高级查询", + "noData": "暂无数据", + "voyageList": "轨迹列表", + "startTime": "开始时间", + "endTime": "结束时间", + "delete": "清除" + }, + "portOfCall": { + "oneMonth": "1个月", + "threeMonth": "3个月", + "sixMonth": "6个月", + "twelveMonth": "12个月", + "port": "港口", + "arriveTime": "到港时间", + "departureTime": "离港时间", + "stopTime": "停时", + "portCalling": "挂靠港记录" + }, + "searchList": { + "shipName": "船名", + "imo": "imo", + "mmsi": "mmsi", + "type": "类型", + "shipLength": "船长", + "countryFlag": "国籍", + "draught": "吃水", + "speed": "船速", + "destination": "目的地" + }, + "mapTool": { + "measureTool": "测量工具", + "measureDistance": "测距离", + "measureArea": "测面积", + "drawingArea": "绘制区域", + "shape": "形状" + }, + "weather": { + "reset": "重置", + "marineWeather": "海况天气", + "temperature": "温度", + "airPressure": "气压", + "wind": "风场", + "current": "洋流", + "typhoon": "台风", + "legend": "图例", + "typhoonList": "台风列表", + "view": "查看", + "close": "关闭" + }, + "routeQuery": { + "pol": "起始港", + "pod": "目的港", + "search": "搜索", + "duration": "航时", + "mileage": "航行里程", + "averageSpeed": "平均航速", + "full": "满", + "empty": "空", + "origin": "起始港", + "destination": "目的港", + "port": "港口", + "portToPort": "港到港", + "pointToPoint": "点到点", + "inputLon": "请输入经度", + "inputLat": "请输入纬度", + "inputLonLatLong": "请输入经纬度,经度在前纬度在后,经纬度之间用空格隔开,多个经纬度之间用逗号间隔", + "query": "Query", + "pointRoute": "点到点航线", + "route": "航线", + "voyageDistance": "航程[nm]", + "timeInPort": "在港时间", + "arrivePortTime": "到港时间", + "amount": "合计", + "totalTime": "用时" + }, + "messageList": { + "status": "状态", + "arrival": "到达区域", + "leave": "离开区域", + "shipName": "船名", + "port": "港口名称", + "startTime": "开始时间", + "messageStatistics": "消息统计", + "messageDetails": "消息详情", + "arrive": "到达", + "leave2": "离开", + "details": "详情" + }, + "menu": { + "TrackRecordLogTemp": "轨迹记录", + "AreaListTemp": "区域列表", + "PortToPortTemp": "港间距", + "SearchListTemp": "搜索记录", + "DataAnalysisTemp": "数据分析", + "MapToolTemp": "地图工具", + "ShipRanksTemp": "我的船队", + "WeatherTemp": "海况天气", + "RouteQueryTemp": "航线查询", + "ContainerQueryTemp": "集装箱查询", + "portInfo": "港口信息", + "ArriveLeaveQueryTemp": "到港查询", + "DepartureInquiryTemp": "离港查询", + "ExpectedArrivalTemp": "预计到港", + "crudeOilPort": "原油港口", + "messageList": "消息列表", + "NumberOfBerthsTemp": "在泊统计" + }, + "fleets": { + "location": "定位", + "vc": "显示/隐藏", + "total": "共" + }, + "containerQuery": { + "containerQuery": "集装箱号查询", + "billOfLading": "提单号查询", + "containerBoxNumber": "集装箱编号", + "tdCode": "提单编号", + "isoCode": "集装箱ISO代码", + "containerPosName": "集装箱位置", + "eventDescription": "描述", + "eventStatus": "状态", + "eventDate": "时间", + "eventActual": "actual", + "eventType": "类型", + "vesselsName": "船舶名称", + "eventVoyage": "voyage", + "vesselCompliance": "vesselCompliance", + "eventlocationCompliance": "locationCompliance", + "route": "航线相关" + }, + "areaList": { + "shipStatistics": "船舶统计", + "shipFlagStatistics": "船旗统计", + "shipList": "船舶列表", + "shipType": "船型", + "shipFlag": "船籍", + "shipLength": "船长", + "select": "筛选", + "type": "类型", + "nationality": "国籍", + "draft": "吃水", + "sog": "船速", + "destPort": "目的地", + "shipName": "船名", + "all": "全部" + }, + "shipEvent": { + "shipEvent": "船舶事件", + "eventName": "事件名称", + "time": "时间", + "describe": "事件描述", + "seaArea": "所处海区", + "screenPlaceholder": "事件名称筛选", + "oneMonth": "最近一个月", + "threeMonth": "最近三个月", + "sixMonth": "最近六个月", + "sevenDay": "最近七天" + }, + "allPort": "显示全部港口", + "closeAllPort": "关闭全部港口", + "NumberOfBerthsTemp": { + "portName": "港口名称", + "numberOfBerth": "在泊船舶数量", + "operationDuration": "作业时长", + "numberOfMao": "在锚船舶数量", + "mooringDuration": "锚泊时长", + "numberOfLeave": "离泊数量", + "operate": "操作" + }, + "typhoon": { + "name": "名称", + "start": "开始时间", + "end": "结束时间", + "operate": "操作" + }, + "routeCalculate": { + "destination": "目的地", + "speed": "航速", + "search": "搜索", + "rd": "剩余里程(海里)", + "td": "已行驶里程(海里)", + "remainder": "剩余时间(小时)", + "tt": "已行驶时间(小时)" + } +} + diff --git a/src/util/vue-global/index.ts b/src/util/vue-global/index.ts new file mode 100644 index 0000000..0f2f3d6 --- /dev/null +++ b/src/util/vue-global/index.ts @@ -0,0 +1,47 @@ +import Vue from 'vue' + +Vue.prototype.$SearchLog = [] +Vue.prototype.$fleetList = [] +Vue.prototype.$originAllShipRankList = [] +Vue.prototype.$sourceShips = [] +Vue.prototype.$MessageInfo = [] +Vue.prototype.$showComponents = new Map() // 显示的组件 +Vue.prototype.$MiniList = [] // 最小化列表 +Vue.prototype.$HistoryLog = [] // 轨迹记录 +Vue.prototype.$menuGroup = new Map() // 菜单分组 + +let localStorageMock = (function (win) { + let storage = win.localStorage; + return { + setItem: function (key: any, value: any) { + let setItemEvent: any = new Event("setItemEvent"); + let oldValue = storage[key]; + setItemEvent.key = key; + // 新旧值深度判断,派发监听事件 + if (oldValue !== value) { + setItemEvent.newValue = value; + setItemEvent.oldValue = oldValue; + win.dispatchEvent(setItemEvent); + storage[key] = value; + return true; + } + return false; + }, + getItem: function (key: any) { + return storage[key]; + }, + removeItem: function (key: any) { + storage[key] = null; + return true; + }, + clear: function () { + storage.clear(); + return true; + }, + key: function (index: any) { + return storage.key(index); + } + }; +}(window)); + +Object.defineProperty(window, 'localStorage', {value: localStorageMock, writable: true}); diff --git a/src/views/index-c.html b/src/views/index-c.html new file mode 100644 index 0000000..4ba6026 --- /dev/null +++ b/src/views/index-c.html @@ -0,0 +1,72 @@ + + + + + Title + + + + + + + \ No newline at end of file diff --git a/src/views/layout/Layout.vue b/src/views/layout/Layout.vue new file mode 100644 index 0000000..e7babaa --- /dev/null +++ b/src/views/layout/Layout.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/src/views/main/Main.vue b/src/views/main/Main.vue new file mode 100644 index 0000000..ee977d1 --- /dev/null +++ b/src/views/main/Main.vue @@ -0,0 +1,444 @@ + + + + diff --git a/src/views/new-dialog/AreaListTemp.vue b/src/views/new-dialog/AreaListTemp.vue new file mode 100644 index 0000000..50d69ab --- /dev/null +++ b/src/views/new-dialog/AreaListTemp.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/new-dialog/ArriveLeaveQueryTemp.vue b/src/views/new-dialog/ArriveLeaveQueryTemp.vue new file mode 100644 index 0000000..5f31e16 --- /dev/null +++ b/src/views/new-dialog/ArriveLeaveQueryTemp.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/views/new-dialog/CarInfoTemp.vue b/src/views/new-dialog/CarInfoTemp.vue new file mode 100644 index 0000000..a8218fa --- /dev/null +++ b/src/views/new-dialog/CarInfoTemp.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/views/new-dialog/CarListTemp.vue b/src/views/new-dialog/CarListTemp.vue new file mode 100644 index 0000000..b208263 --- /dev/null +++ b/src/views/new-dialog/CarListTemp.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/new-dialog/CarTrackRecordTemp.vue b/src/views/new-dialog/CarTrackRecordTemp.vue new file mode 100644 index 0000000..59d5394 --- /dev/null +++ b/src/views/new-dialog/CarTrackRecordTemp.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/src/views/new-dialog/ContainerQueryTemp.vue b/src/views/new-dialog/ContainerQueryTemp.vue new file mode 100644 index 0000000..393cf86 --- /dev/null +++ b/src/views/new-dialog/ContainerQueryTemp.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/new-dialog/DataAnalysisTemp.vue b/src/views/new-dialog/DataAnalysisTemp.vue new file mode 100644 index 0000000..0f9098f --- /dev/null +++ b/src/views/new-dialog/DataAnalysisTemp.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/new-dialog/DepartureInquiryTemp.vue b/src/views/new-dialog/DepartureInquiryTemp.vue new file mode 100644 index 0000000..0f8e25a --- /dev/null +++ b/src/views/new-dialog/DepartureInquiryTemp.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/views/new-dialog/ExpectedArrivalTemp.vue b/src/views/new-dialog/ExpectedArrivalTemp.vue new file mode 100644 index 0000000..879d6b8 --- /dev/null +++ b/src/views/new-dialog/ExpectedArrivalTemp.vue @@ -0,0 +1,95 @@ + + + + + diff --git a/src/views/new-dialog/MapToolTemp.vue b/src/views/new-dialog/MapToolTemp.vue new file mode 100644 index 0000000..1d55999 --- /dev/null +++ b/src/views/new-dialog/MapToolTemp.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/views/new-dialog/MessageListTemp.vue b/src/views/new-dialog/MessageListTemp.vue new file mode 100644 index 0000000..2505f09 --- /dev/null +++ b/src/views/new-dialog/MessageListTemp.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/views/new-dialog/NotanTemp.vue b/src/views/new-dialog/NotanTemp.vue new file mode 100644 index 0000000..c15e0fd --- /dev/null +++ b/src/views/new-dialog/NotanTemp.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/new-dialog/NumberOfBerthsTemp.vue b/src/views/new-dialog/NumberOfBerthsTemp.vue new file mode 100644 index 0000000..270a3de --- /dev/null +++ b/src/views/new-dialog/NumberOfBerthsTemp.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/views/new-dialog/PointToPointResTemp.vue b/src/views/new-dialog/PointToPointResTemp.vue new file mode 100644 index 0000000..b2b3ece --- /dev/null +++ b/src/views/new-dialog/PointToPointResTemp.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/new-dialog/PortOfCallTemp.vue b/src/views/new-dialog/PortOfCallTemp.vue new file mode 100644 index 0000000..bcb43a1 --- /dev/null +++ b/src/views/new-dialog/PortOfCallTemp.vue @@ -0,0 +1,74 @@ + + + + diff --git a/src/views/new-dialog/PortQueryTemp.vue b/src/views/new-dialog/PortQueryTemp.vue new file mode 100644 index 0000000..db7b777 --- /dev/null +++ b/src/views/new-dialog/PortQueryTemp.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/views/new-dialog/RouteQueryTemp.vue b/src/views/new-dialog/RouteQueryTemp.vue new file mode 100644 index 0000000..260b284 --- /dev/null +++ b/src/views/new-dialog/RouteQueryTemp.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/new-dialog/RouteYcTemp.vue b/src/views/new-dialog/RouteYcTemp.vue new file mode 100644 index 0000000..13236b0 --- /dev/null +++ b/src/views/new-dialog/RouteYcTemp.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/views/new-dialog/SearchListTemp.vue b/src/views/new-dialog/SearchListTemp.vue new file mode 100644 index 0000000..74dfbb4 --- /dev/null +++ b/src/views/new-dialog/SearchListTemp.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/views/new-dialog/ShipEventTemp.vue b/src/views/new-dialog/ShipEventTemp.vue new file mode 100644 index 0000000..fb4f28d --- /dev/null +++ b/src/views/new-dialog/ShipEventTemp.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/new-dialog/ShipInBerthTemp.vue b/src/views/new-dialog/ShipInBerthTemp.vue new file mode 100644 index 0000000..b1bbb27 --- /dev/null +++ b/src/views/new-dialog/ShipInBerthTemp.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/views/new-dialog/ShipInfoTemp.vue b/src/views/new-dialog/ShipInfoTemp.vue new file mode 100644 index 0000000..f210026 --- /dev/null +++ b/src/views/new-dialog/ShipInfoTemp.vue @@ -0,0 +1,76 @@ + + + + + diff --git a/src/views/new-dialog/ShipRanksTemp.vue b/src/views/new-dialog/ShipRanksTemp.vue new file mode 100644 index 0000000..7a4131c --- /dev/null +++ b/src/views/new-dialog/ShipRanksTemp.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/new-dialog/TrackRecordLogTemp.vue b/src/views/new-dialog/TrackRecordLogTemp.vue new file mode 100644 index 0000000..e0b290d --- /dev/null +++ b/src/views/new-dialog/TrackRecordLogTemp.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/src/views/new-dialog/TrackRecordTemp.vue b/src/views/new-dialog/TrackRecordTemp.vue new file mode 100644 index 0000000..58a7bcd --- /dev/null +++ b/src/views/new-dialog/TrackRecordTemp.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/src/views/new-dialog/WeatherImgTemp.vue b/src/views/new-dialog/WeatherImgTemp.vue new file mode 100644 index 0000000..228f4e5 --- /dev/null +++ b/src/views/new-dialog/WeatherImgTemp.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/views/new-dialog/WeatherTemp.vue b/src/views/new-dialog/WeatherTemp.vue new file mode 100644 index 0000000..8fb706b --- /dev/null +++ b/src/views/new-dialog/WeatherTemp.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/views/on-map-view/AreaList.vue b/src/views/on-map-view/AreaList.vue new file mode 100644 index 0000000..655f852 --- /dev/null +++ b/src/views/on-map-view/AreaList.vue @@ -0,0 +1,889 @@ + + + + + diff --git a/src/views/on-map-view/CarInfo.vue b/src/views/on-map-view/CarInfo.vue new file mode 100644 index 0000000..4107c5a --- /dev/null +++ b/src/views/on-map-view/CarInfo.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/views/on-map-view/CarList.vue b/src/views/on-map-view/CarList.vue new file mode 100644 index 0000000..880c038 --- /dev/null +++ b/src/views/on-map-view/CarList.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/src/views/on-map-view/CarTrackRecord.vue b/src/views/on-map-view/CarTrackRecord.vue new file mode 100644 index 0000000..d93814f --- /dev/null +++ b/src/views/on-map-view/CarTrackRecord.vue @@ -0,0 +1,422 @@ + + + + + \ No newline at end of file diff --git a/src/views/on-map-view/ContainerQuery.vue b/src/views/on-map-view/ContainerQuery.vue new file mode 100644 index 0000000..a1c263a --- /dev/null +++ b/src/views/on-map-view/ContainerQuery.vue @@ -0,0 +1,769 @@ + + + + + diff --git a/src/views/on-map-view/DataAnalysis.vue b/src/views/on-map-view/DataAnalysis.vue new file mode 100644 index 0000000..543af43 --- /dev/null +++ b/src/views/on-map-view/DataAnalysis.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/views/on-map-view/MapTool.vue b/src/views/on-map-view/MapTool.vue new file mode 100644 index 0000000..eaba3c3 --- /dev/null +++ b/src/views/on-map-view/MapTool.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/src/views/on-map-view/MessageList.vue b/src/views/on-map-view/MessageList.vue new file mode 100644 index 0000000..7e4130b --- /dev/null +++ b/src/views/on-map-view/MessageList.vue @@ -0,0 +1,237 @@ + + + + + diff --git a/src/views/on-map-view/Notan.vue b/src/views/on-map-view/Notan.vue new file mode 100644 index 0000000..9e94728 --- /dev/null +++ b/src/views/on-map-view/Notan.vue @@ -0,0 +1,343 @@ + + + + + diff --git a/src/views/on-map-view/NumberOfBerths.vue b/src/views/on-map-view/NumberOfBerths.vue new file mode 100644 index 0000000..aa69a85 --- /dev/null +++ b/src/views/on-map-view/NumberOfBerths.vue @@ -0,0 +1,308 @@ + + + + + diff --git a/src/views/on-map-view/PointToPoint.vue b/src/views/on-map-view/PointToPoint.vue new file mode 100644 index 0000000..2d6a50f --- /dev/null +++ b/src/views/on-map-view/PointToPoint.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/src/views/on-map-view/PointToPointRes.vue b/src/views/on-map-view/PointToPointRes.vue new file mode 100644 index 0000000..3ae4f25 --- /dev/null +++ b/src/views/on-map-view/PointToPointRes.vue @@ -0,0 +1,273 @@ + + + + + diff --git a/src/views/on-map-view/PortOfCall.vue b/src/views/on-map-view/PortOfCall.vue new file mode 100644 index 0000000..27375ac --- /dev/null +++ b/src/views/on-map-view/PortOfCall.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/src/views/on-map-view/PortQuery.vue b/src/views/on-map-view/PortQuery.vue new file mode 100644 index 0000000..2d4b19a --- /dev/null +++ b/src/views/on-map-view/PortQuery.vue @@ -0,0 +1,896 @@ + + + + + diff --git a/src/views/on-map-view/RouteQuery.vue b/src/views/on-map-view/RouteQuery.vue new file mode 100644 index 0000000..fffb967 --- /dev/null +++ b/src/views/on-map-view/RouteQuery.vue @@ -0,0 +1,759 @@ + + + + diff --git a/src/views/on-map-view/RouteYc.vue b/src/views/on-map-view/RouteYc.vue new file mode 100644 index 0000000..086b9d3 --- /dev/null +++ b/src/views/on-map-view/RouteYc.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/src/views/on-map-view/SearchList.vue b/src/views/on-map-view/SearchList.vue new file mode 100644 index 0000000..76d760d --- /dev/null +++ b/src/views/on-map-view/SearchList.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/src/views/on-map-view/ShipEvent.vue b/src/views/on-map-view/ShipEvent.vue new file mode 100644 index 0000000..0d860b6 --- /dev/null +++ b/src/views/on-map-view/ShipEvent.vue @@ -0,0 +1,203 @@ + + + + + diff --git a/src/views/on-map-view/ShipInBerth.vue b/src/views/on-map-view/ShipInBerth.vue new file mode 100644 index 0000000..63f0ab4 --- /dev/null +++ b/src/views/on-map-view/ShipInBerth.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/src/views/on-map-view/ShipInfo.vue b/src/views/on-map-view/ShipInfo.vue new file mode 100644 index 0000000..8d3443b --- /dev/null +++ b/src/views/on-map-view/ShipInfo.vue @@ -0,0 +1,1214 @@ + + + + + diff --git a/src/views/on-map-view/ShipRanks.vue b/src/views/on-map-view/ShipRanks.vue new file mode 100644 index 0000000..eda485c --- /dev/null +++ b/src/views/on-map-view/ShipRanks.vue @@ -0,0 +1,393 @@ + + + + + diff --git a/src/views/on-map-view/TrackRecord.vue b/src/views/on-map-view/TrackRecord.vue new file mode 100644 index 0000000..50a579e --- /dev/null +++ b/src/views/on-map-view/TrackRecord.vue @@ -0,0 +1,432 @@ + + + + + diff --git a/src/views/on-map-view/TrackRecordLog.vue b/src/views/on-map-view/TrackRecordLog.vue new file mode 100644 index 0000000..d1c9723 --- /dev/null +++ b/src/views/on-map-view/TrackRecordLog.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/src/views/on-map-view/Weather.vue b/src/views/on-map-view/Weather.vue new file mode 100644 index 0000000..d7c5d2a --- /dev/null +++ b/src/views/on-map-view/Weather.vue @@ -0,0 +1,456 @@ + + + + + diff --git a/src/views/on-map-view/WeatherImage.vue b/src/views/on-map-view/WeatherImage.vue new file mode 100644 index 0000000..0383376 --- /dev/null +++ b/src/views/on-map-view/WeatherImage.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..72c0cb5 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,42 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "esnext", + "strict": true, + "jsx": "preserve", + "importHelpers": true, + "moduleResolution": "node", + "experimentalDecorators": true, + "skipLibCheck": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "useDefineForClassFields": true, + "sourceMap": true, + "baseUrl": ".", + "types": [ + "webpack-env" + ], + "paths": { + "@/*": [ + "src/*" + ] + }, + "lib": [ + "esnext", + "dom", + "dom.iterable", + "scripthost" + ] + }, + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.vue", + "tests/**/*.ts", + "tests/**/*.tsx" + ], + "exclude": [ + "node_modules" + ], +} diff --git a/vue.config.js b/vue.config.js new file mode 100644 index 0000000..ea88310 --- /dev/null +++ b/vue.config.js @@ -0,0 +1,50 @@ +const path = require('path') +const webpack = require('webpack') +const config = require('./public/config/sys-config.json') +const name = config.projectName ? '^/' + config.projectName + '/myships' : '^/myships' + +function resolve(dir) { + return path.join(__dirname, dir) +} + +module.exports = { + publicPath: `${config.projectName ? '/' + config.projectName : '/'}`, + devServer: { + proxy: { + '/zero2/myships': { + target: 'https://api3.myships.com/', + changOrigin: true, + pathRewrite: { + [name]: '' + } + } , + '/zero2/car': { + target: 'http://36.33.24.30:5005/', + changOrigin: true, + pathRewrite: { + '/zero2/car': '' + } + }, + '/zeroi/free': { + target: 'http://36.101.208.185:15380/', + changOrigin: true, + pathRewrite: { + '/zeroi/free': '' + } + } + } + }, + configureWebpack: { + plugins: [ + new webpack.ProvidePlugin({ + $: 'jquery', + jQuery: 'jquery', + 'windows.jQuery': 'jquery' + }) + ] + }, + chainWebpack: (config) => { + config.resolve.alias.set('@', resolve('./src')) + config.resolve.extensions.add('.js').add('.vue').add('.ts').add('.json') + } +}