哥哥玩剑魂呢 vor 4 Jahren
Commit
a0564b943c
100 geänderte Dateien mit 4626 neuen und 0 gelöschten Zeilen
  1. 17 0
      .babelrc
  2. 14 0
      .editorconfig
  3. 3 0
      .eslintignore
  4. 199 0
      .eslintrc.js
  5. 38 0
      .gitignore
  6. 8 0
      .postcssrc.js
  7. 5 0
      .travis.yml
  8. 172 0
      README.zh-CN.md
  9. 67 0
      build/build.js
  10. 59 0
      build/check-versions.js
  11. BIN
      build/logo.png
  12. 108 0
      build/utils.js
  13. 5 0
      build/vue-loader.conf.js
  14. 107 0
      build/webpack.base.conf.js
  15. 107 0
      build/webpack.dev.conf.js
  16. 205 0
      build/webpack.prod.conf.js
  17. 10 0
      config/dev.env.js
  18. 66 0
      config/index.js
  19. 6 0
      config/prod.env.js
  20. 6 0
      config/sit.env.js
  21. BIN
      favicon.ico
  22. 193 0
      index.html
  23. 151 0
      package.json
  24. 34 0
      src/App.vue
  25. 54 0
      src/api/auth.js
  26. 21 0
      src/api/configget.js
  27. 40 0
      src/api/login.js
  28. 5 0
      src/api/transaction.js
  29. BIN
      src/assets/401_images/401.gif
  30. BIN
      src/assets/404_images/404.png
  31. BIN
      src/assets/404_images/404_cloud.png
  32. BIN
      src/assets/custom-theme/fonts/element-icons.ttf
  33. BIN
      src/assets/custom-theme/fonts/element-icons.woff
  34. 0 0
      src/assets/custom-theme/index.css
  35. 199 0
      src/assets/echarts-macarons.js
  36. 0 0
      src/assets/echarts-macarons.min.js
  37. 1492 0
      src/components/ImageCropper/index.vue
  38. 19 0
      src/components/ImageCropper/utils/data2blob.js
  39. 39 0
      src/components/ImageCropper/utils/effectRipple.js
  40. 232 0
      src/components/ImageCropper/utils/language.js
  41. 7 0
      src/components/ImageCropper/utils/mimes.js
  42. 140 0
      src/components/PanThumb/index.vue
  43. 42 0
      src/components/SvgIcon/index.vue
  44. 50 0
      src/components/noData.vue
  45. 178 0
      src/components/season.vue
  46. 141 0
      src/components/user_image.vue
  47. 19 0
      src/components/wwOpenDatac/ww_open_data.vue
  48. 9 0
      src/errorLog.js
  49. 12 0
      src/icons/index.js
  50. 1 0
      src/icons/svg/404.svg
  51. 1 0
      src/icons/svg/A_points.svg
  52. 1 0
      src/icons/svg/Lottery_ticket_statistics.svg
  53. 1 0
      src/icons/svg/PCtutorial.svg
  54. 1 0
      src/icons/svg/PK.svg
  55. 1 0
      src/icons/svg/Statistical_rankings.svg
  56. 1 0
      src/icons/svg/abf.svg
  57. 1 0
      src/icons/svg/add.svg
  58. 1 0
      src/icons/svg/application.svg
  59. 1 0
      src/icons/svg/attendance.svg
  60. 1 0
      src/icons/svg/attendance_b.svg
  61. 16 0
      src/icons/svg/attendance_classnew_icon.svg
  62. 18 0
      src/icons/svg/attendance_datanew_icon.svg
  63. 1 0
      src/icons/svg/attendance_group.svg
  64. 22 0
      src/icons/svg/attendance_groupnew_icon.svg
  65. 0 0
      src/icons/svg/attendance_hioldaynew_icon.svg
  66. 0 0
      src/icons/svg/attendance_machine.svg
  67. 16 0
      src/icons/svg/attendance_machinenew_icon.svg
  68. 20 0
      src/icons/svg/attendance_overtime_rulenew_icon.svg
  69. 1 0
      src/icons/svg/attendance_rating_icon.svg
  70. 16 0
      src/icons/svg/attendance_reviewnew_icon.svg
  71. 20 0
      src/icons/svg/attendance_statisticnew_icon.svg
  72. 0 0
      src/icons/svg/auth.svg
  73. 123 0
      src/icons/svg/bar-stack.html
  74. 1 0
      src/icons/svg/bug.svg
  75. 1 0
      src/icons/svg/changePwd.svg
  76. 1 0
      src/icons/svg/chart.svg
  77. 1 0
      src/icons/svg/clipboard.svg
  78. 20 0
      src/icons/svg/company_info_icon.svg
  79. 1 0
      src/icons/svg/component.svg
  80. 0 0
      src/icons/svg/dashboard.svg
  81. 1 0
      src/icons/svg/data.svg
  82. 0 0
      src/icons/svg/department.svg
  83. 1 0
      src/icons/svg/department_statistics.svg
  84. 1 0
      src/icons/svg/dept.svg
  85. 1 0
      src/icons/svg/documentation.svg
  86. 1 0
      src/icons/svg/drag.svg
  87. 1 0
      src/icons/svg/droparrows.svg
  88. 1 0
      src/icons/svg/edit.svg
  89. 1 0
      src/icons/svg/email.svg
  90. 1 0
      src/icons/svg/employee.svg
  91. 20 0
      src/icons/svg/employee_table_icon.svg
  92. 1 0
      src/icons/svg/example.svg
  93. 1 0
      src/icons/svg/excel.svg
  94. 1 0
      src/icons/svg/eye.svg
  95. 1 0
      src/icons/svg/eyeOpen.svg
  96. 1 0
      src/icons/svg/first.svg
  97. 22 0
      src/icons/svg/fixed_integral_icon.svg
  98. 0 0
      src/icons/svg/form.svg
  99. 1 0
      src/icons/svg/guide.svg
  100. 1 0
      src/icons/svg/icon.svg

+ 17 - 0
.babelrc

@@ -0,0 +1,17 @@
+{
+  "presets": [
+    ["env", {
+      "modules": false,
+      "targets": {
+        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
+      }
+    }],
+    "stage-2"
+  ],
+  "plugins": ["transform-vue-jsx", "transform-runtime"],
+  "env": {
+    "development":{
+      "plugins": ["dynamic-import-node"]
+    }
+  }
+}

+ 14 - 0
.editorconfig

@@ -0,0 +1,14 @@
+# http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false

+ 3 - 0
.eslintignore

@@ -0,0 +1,3 @@
+build/*.js
+config/*.js
+src

+ 199 - 0
.eslintrc.js

@@ -0,0 +1,199 @@
+module.exports = {
+  root: true,
+  parser: 'babel-eslint',
+  parserOptions: {
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+  },
+  extends: 'eslint:recommended',
+  // required to lint *.vue files
+  plugins: [
+    'html'
+  ],
+  // check if imports actually resolve
+  'settings': {
+    'import/resolver': {
+      'webpack': {
+        'config': 'build/webpack.base.conf.js'
+      }
+    }
+  },
+  // add your custom rules here
+  //it is base on https://github.com/vuejs/eslint-config-vue
+  'rules': {
+    'accessor-pairs': 2,
+    'arrow-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'block-spacing': [2, 'always'],
+    'brace-style': [2, '1tbs', {
+      'allowSingleLine': true
+    }],
+    'camelcase': [0, {
+      'properties': 'always'
+    }],
+    'comma-dangle': [2, 'never'],
+    'comma-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'comma-style': [2, 'last'],
+    'constructor-super': 2,
+    'curly': [2, 'multi-line'],
+    'dot-location': [2, 'property'],
+    'eol-last': 2,
+    'eqeqeq': [2, 'allow-null'],
+    'generator-star-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'handle-callback-err': [2, '^(err|error)$'],
+    'indent': [2, 2, {
+      'SwitchCase': 1
+    }],
+    'jsx-quotes': [2, 'prefer-single'],
+    'key-spacing': [2, {
+      'beforeColon': false,
+      'afterColon': true
+    }],
+    'keyword-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'new-cap': [2, {
+      'newIsCap': true,
+      'capIsNew': false
+    }],
+    'new-parens': 2,
+    'no-array-constructor': 2,
+    'no-caller': 2,
+    'no-console': 'off',
+    'no-class-assign': 2,
+    'no-cond-assign': 2,
+    'no-const-assign': 2,
+    'no-control-regex': 0,
+    'no-delete-var': 2,
+    'no-dupe-args': 2,
+    'no-dupe-class-members': 2,
+    'no-dupe-keys': 2,
+    'no-duplicate-case': 2,
+    'no-empty-character-class': 2,
+    'no-empty-pattern': 2,
+    'no-eval': 2,
+    'no-ex-assign': 2,
+    'no-extend-native': 2,
+    'no-extra-bind': 2,
+    'no-extra-boolean-cast': 2,
+    'no-extra-parens': [2, 'functions'],
+    'no-fallthrough': 2,
+    'no-floating-decimal': 2,
+    'no-func-assign': 2,
+    'no-implied-eval': 2,
+    'no-inner-declarations': [2, 'functions'],
+    'no-invalid-regexp': 2,
+    'no-irregular-whitespace': 2,
+    'no-iterator': 2,
+    'no-label-var': 2,
+    'no-labels': [2, {
+      'allowLoop': false,
+      'allowSwitch': false
+    }],
+    'no-lone-blocks': 2,
+    'no-mixed-spaces-and-tabs': 2,
+    'no-multi-spaces': 2,
+    'no-multi-str': 2,
+    'no-multiple-empty-lines': [2, {
+      'max': 1
+    }],
+    'no-native-reassign': 2,
+    'no-negated-in-lhs': 2,
+    'no-new-object': 2,
+    'no-new-require': 2,
+    'no-new-symbol': 2,
+    'no-new-wrappers': 2,
+    'no-obj-calls': 2,
+    'no-octal': 2,
+    'no-octal-escape': 2,
+    'no-path-concat': 2,
+    'no-proto': 2,
+    'no-redeclare': 2,
+    'no-regex-spaces': 2,
+    'no-return-assign': [2, 'except-parens'],
+    'no-self-assign': 2,
+    'no-self-compare': 2,
+    'no-sequences': 2,
+    'no-shadow-restricted-names': 2,
+    'no-spaced-func': 2,
+    'no-sparse-arrays': 2,
+    'no-this-before-super': 2,
+    'no-throw-literal': 2,
+    'no-trailing-spaces': 2,
+    'no-undef': 2,
+    'no-undef-init': 2,
+    'no-unexpected-multiline': 2,
+    'no-unmodified-loop-condition': 2,
+    'no-unneeded-ternary': [2, {
+      'defaultAssignment': false
+    }],
+    'no-unreachable': 2,
+    'no-unsafe-finally': 2,
+    'no-unused-vars': [2, {
+      'vars': 'all',
+      'args': 'none'
+    }],
+    'no-useless-call': 2,
+    'no-useless-computed-key': 2,
+    'no-useless-constructor': 2,
+    'no-useless-escape': 0,
+    'no-whitespace-before-property': 2,
+    'no-with': 2,
+    'one-var': [2, {
+      'initialized': 'never'
+    }],
+    'operator-linebreak': [2, 'after', {
+      'overrides': {
+        '?': 'before',
+        ':': 'before'
+      }
+    }],
+    'padded-blocks': [2, 'never'],
+    'quotes': [2, 'single', {
+      'avoidEscape': true,
+      'allowTemplateLiterals': true
+    }],
+    'semi': [2, 'never'],
+    'semi-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'space-before-blocks': [2, 'always'],
+    'space-before-function-paren': [2, 'never'],
+    'space-in-parens': [2, 'never'],
+    'space-infix-ops': 2,
+    'space-unary-ops': [2, {
+      'words': true,
+      'nonwords': false
+    }],
+    'spaced-comment': [2, 'always', {
+      'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
+    }],
+    'template-curly-spacing': [2, 'never'],
+    'use-isnan': 2,
+    'valid-typeof': 2,
+    'wrap-iife': [2, 'any'],
+    'yield-star-spacing': [2, 'both'],
+    'yoda': [2, 'never'],
+    'prefer-const': 2,
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+    'object-curly-spacing': [2, 'always', {
+      objectsInObjects: false
+    }],
+    'array-bracket-spacing': [2, 'never']
+  }
+}
+

+ 38 - 0
.gitignore

@@ -0,0 +1,38 @@
+*.class
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.ear
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+
+.DS_Store
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+**/*.log
+
+test/unit/coverage
+test/e2e/reports
+selenium-debug.log
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+
+package-lock.json
+
+src/main.js_bak
+config/sit.env.js_bak

+ 8 - 0
.postcssrc.js

@@ -0,0 +1,8 @@
+
+module.exports = {
+  "plugins": {
+    "postcss-import": {},
+    "postcss-url": {},
+    "autoprefixer": {}
+  }
+}

+ 5 - 0
.travis.yml

@@ -0,0 +1,5 @@
+language: node_js
+node_js: stable
+script: npm run test
+notifications:
+  email: false

+ 172 - 0
README.zh-CN.md

@@ -0,0 +1,172 @@
+
+## 简介
+[vue-element-admin](http://panjiachen.github.io/vue-element-admin) 是一个后台集成解决方案,它基于 [vue](https://github.com/vuejs/vue) 和 [element](https://github.com/ElemeFE/element)。它使用了最新的前端技术栈,内置了 i18 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。
+
+- [在线访问](http://panjiachen.github.io/vue-element-admin)
+
+- [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/)
+
+- [Gitter 讨论组](https://gitter.im/vue-element-admin/discuss)
+
+- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki)
+
+- [Donate](https://panjiachen.github.io/vue-element-admin-site/zh/donate/)
+
+- [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 国内用户可访问该地址在线预览
+
+**本项目的定位是后台集成方案,不适合当基础模板来开发。**
+
+- 模板建议使用: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template)
+- 桌面端: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
+
+群主 **[圈子](https://jianshiapp.com/circles/1209)** 楼主会经常分享一些技术相关的东西,或者加入[qq 群](https://github.com/PanJiaChen/vue-element-admin/issues/602)
+
+**注意:该项目使用 element-ui@2.3.0+ 版本,所以最低兼容 vue@2.5.0+**
+
+**从`v3.8.0`开始使用`webpack4`。所以若还想使用`webpack3`开发,请使用该分支[webpack3](https://github.com/PanJiaChen/vue-element-admin/tree/webpack3)**
+
+**该项目不支持低版本浏览器(如 ie),有需求请自行添加 polyfill [详情](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)**
+
+## 前序准备
+
+你需要在本地安装 [node](http://nodejs.org/) 和 [git](https://git-scm.com/)。本项目技术栈基于 [ES2015+](http://es6.ruanyifeng.com/)、[vue](https://cn.vuejs.org/index.html)、[vuex](https://vuex.vuejs.org/zh-cn/)、[vue-router](https://router.vuejs.org/zh-cn/) 、[axios](https://github.com/axios/axios) 和 [element-ui](https://github.com/ElemeFE/element),所有的请求数据都使用[Mock.js](https://github.com/nuysoft/Mock)模拟,提前了解和学习这些知识会对使用本项目有很大的帮助。
+
+同时配套一个系列的教程文章,如何从零构建后一个完整的后台项目,建议大家先看完这些文章再来实践本项目
+
+- [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2)
+- [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac)
+- [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35)
+- [手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板)](https://juejin.im/post/595b4d776fb9a06bbe7dba56)
+- [手摸手,带你封装一个 vue component](https://segmentfault.com/a/1190000009090836)
+- [手摸手,带你优雅的使用 icon](https://juejin.im/post/59bb864b5188257e7a427c09)
+- [手摸手,带你用合理的姿势使用 webpack4(上)](https://juejin.im/post/5b56909a518825195f499806)
+- [手摸手,带你用合理的姿势使用 webpack4(下)](https://juejin.im/post/5b5d6d6f6fb9a04fea58aabc)
+
+**如有问题请先看上述使用文档和文章,若不能满足,欢迎 issue 和 pr**
+
+ <p align="center">
+  <img width="900" src="https://wpimg.wallstcn.com/a5894c1b-f6af-456e-82df-1151da0839bf.png">
+</p>
+
+## 功能
+
+```
+- 登录 / 注销
+
+- 权限验证
+  - 页面权限
+  - 指令权限
+  - 二步登录
+
+- 多环境发布
+  - dev sit stage prod
+
+- 全局功能
+  - 国际化多语言
+  - 多种动态换肤
+  - 动态侧边栏(支持多级路由嵌套)
+  - 动态面包屑
+  - 快捷导航(标签页)
+  - Svg Sprite 图标
+  - 本地mock数据
+  - Screenfull全屏
+  - 自适应收缩侧边栏
+
+- 编辑器
+  - 富文本
+  - Markdown
+  - JSON 等多格式
+
+- Excel
+  - 导出excel
+  - 导出zip
+  - 导入excel
+  - 前端可视化excel
+
+- 表格
+  - 动态表格
+  - 拖拽表格
+  - 树形表格
+  - 内联编辑
+
+- 错误页面
+  - 401
+  - 404
+
+- 組件
+  - 头像上传
+  - 返回顶部
+  - 拖拽Dialog
+  - 拖拽看板
+  - 列表拖拽
+  - SplitPane
+  - Dropzone
+  - Sticky
+  - CountTo
+
+- 综合实例
+- 错误日志
+- Dashboard
+- 引导页
+- Echarts 图表
+- Clipboard(剪贴复制)
+- Markdown2html
+```
+
+## 开发
+
+```bash
+# 克隆项目
+git clone https://github.com/PanJiaChen/vue-element-admin.git
+
+# 安装依赖
+npm install
+
+# 建议不要用cnpm安装 会有各种诡异的bug 可以通过如下操作解决 npm 下载速度慢的问题
+npm install --registry=https://registry.npm.taobao.org
+
+# 启动服务
+npm run dev
+```
+
+浏览器访问 http://localhost:9527
+
+## 发布
+
+```bash
+# 构建测试环境
+npm run build:sit
+
+# 构建生产环境
+npm run build:prod
+```
+
+## 其它
+
+```bash
+# --report to build with bundle size analytics
+npm run build:prod
+
+# --generate a bundle size analytics. default: bundle-report.html
+npm run build:prod --generate_report
+
+# --preview to start a server in local to preview
+npm run build:prod --preview
+
+# lint code
+npm run lint
+
+# auto fix
+npm run lint -- --fix
+```
+
+更多信息请参考 [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/)
+
+## Changelog
+
+Detailed changes for each release are documented in the [release notes](https://github.com/PanJiaChen/vue-element-admin/releases).
+
+## Online Demo
+
+[在线 Demo](http://panjiachen.github.io/vue-element-admin)
+

+ 67 - 0
build/build.js

@@ -0,0 +1,67 @@
+'use strict'
+require('./check-versions')()
+
+const ora = require('ora')
+const rm = require('rimraf')
+const path = require('path')
+const chalk = require('chalk')
+const webpack = require('webpack')
+const config = require('../config')
+const webpackConfig = require('./webpack.prod.conf')
+var connect = require('connect')
+var serveStatic = require('serve-static')
+
+const spinner = ora(
+  'building for ' + process.env.env_config + ' environment...'
+)
+spinner.start()
+
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
+  if (err) throw err
+  webpack(webpackConfig, (err, stats) => {
+    spinner.stop()
+    if (err) throw err
+    process.stdout.write(
+      stats.toString({
+        colors: true,
+        modules: false,
+        children: false,
+        chunks: false,
+        chunkModules: false
+      }) + '\n\n'
+    )
+
+    if (stats.hasErrors()) {
+      console.log(chalk.red(' Build failed with errors.\n'))
+      process.exit(1)
+    }
+
+    console.log(chalk.cyan(' Build complete.\n'))
+    console.log(
+      chalk.yellow(
+        ' Tip: built files are meant to be served over an HTTP server.\n' +
+          " Opening index.html over file:// won't work.\n"
+      )
+    )
+
+    if (process.env.npm_config_preview) {
+      const port = 9526
+      const host = 'http://localhost:' + port
+      const basePath = config.build.assetsPublicPath
+      const app = connect()
+
+      app.use(
+        basePath,
+        serveStatic('./dist', {
+          index: ['index.html', '/']
+        })
+      )
+
+      app.listen(port, function() {
+        console.log(
+          chalk.green(`> Listening at  http://localhost:${port}${basePath}`)
+        )
+      })
+    }
+  })
+})

+ 59 - 0
build/check-versions.js

@@ -0,0 +1,59 @@
+'use strict'
+const chalk = require('chalk')
+const semver = require('semver')
+const packageConfig = require('../package.json')
+const shell = require('shelljs')
+
+function exec(cmd) {
+  return require('child_process')
+    .execSync(cmd)
+    .toString()
+    .trim()
+}
+
+const versionRequirements = [
+  {
+    name: 'node',
+    currentVersion: semver.clean(process.version),
+    versionRequirement: packageConfig.engines.node
+  }
+]
+
+if (shell.which('npm')) {
+  versionRequirements.push({
+    name: 'npm',
+    currentVersion: exec('npm --version'),
+    versionRequirement: packageConfig.engines.npm
+  })
+}
+
+module.exports = function() {
+  const warnings = []
+
+  for (let i = 0; i < versionRequirements.length; i++) {
+    const mod = versionRequirements[i]
+
+    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+      warnings.push(
+        mod.name +
+          ': ' +
+          chalk.red(mod.currentVersion) +
+          ' should be ' +
+          chalk.green(mod.versionRequirement)
+      )
+    }
+  }
+
+  if (warnings.length) {
+    console.log(
+      chalk.yellow(
+        'To use this template, you must update following to modules:'
+      )
+    )
+    for (let i = 0; i < warnings.length; i++) {
+      const warning = warnings[i]
+      console.log('  ' + warning)
+    }
+    process.exit(1)
+  }
+}

BIN
build/logo.png


+ 108 - 0
build/utils.js

@@ -0,0 +1,108 @@
+'use strict'
+const path = require('path')
+const config = require('../config')
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
+const packageConfig = require('../package.json')
+
+exports.assetsPath = function(_path) {
+  const assetsSubDirectory =
+    process.env.NODE_ENV === 'production'
+      ? config.build.assetsSubDirectory
+      : config.dev.assetsSubDirectory
+
+  return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function(options) {
+  options = options || {}
+
+  const cssLoader = {
+    loader: 'css-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  const postcssLoader = {
+    loader: 'postcss-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  // generate loader string to be used with extract text plugin
+  function generateLoaders(loader, loaderOptions) {
+    const loaders = []
+
+    // Extract CSS when that option is specified
+    // (which is the case during production build)
+    if (options.extract) {
+      loaders.push(MiniCssExtractPlugin.loader)
+    } else {
+      loaders.push('vue-style-loader')
+    }
+
+    loaders.push(cssLoader)
+
+    if (options.usePostCSS) {
+      loaders.push(postcssLoader)
+    }
+
+    if (loader) {
+      loaders.push({
+        loader: loader + '-loader',
+        options: Object.assign({}, loaderOptions, {
+          sourceMap: options.sourceMap
+        })
+      })
+    }
+
+    return loaders
+  }
+  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+  return {
+    css: generateLoaders(),
+    postcss: generateLoaders(),
+    less: generateLoaders('less'),
+    sass: generateLoaders('sass', {
+      indentedSyntax: true
+    }),
+    scss: generateLoaders('sass'),
+    stylus: generateLoaders('stylus'),
+    styl: generateLoaders('stylus')
+  }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function(options) {
+  const output = []
+  const loaders = exports.cssLoaders(options)
+
+  for (const extension in loaders) {
+    const loader = loaders[extension]
+    output.push({
+      test: new RegExp('\\.' + extension + '$'),
+      use: loader
+    })
+  }
+
+  return output
+}
+
+exports.createNotifierCallback = () => {
+  const notifier = require('node-notifier')
+
+  return (severity, errors) => {
+    if (severity !== 'error') return
+
+    const error = errors[0]
+    const filename = error.file && error.file.split('!').pop()
+
+    notifier.notify({
+      title: packageConfig.name,
+      message: severity + ': ' + error.name,
+      subtitle: filename || '',
+      icon: path.join(__dirname, 'logo.png')
+    })
+  }
+}

+ 5 - 0
build/vue-loader.conf.js

@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports = {
+  //You can set the vue-loader configuration by yourself.
+}

+ 107 - 0
build/webpack.base.conf.js

@@ -0,0 +1,107 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const config = require('../config')
+const { VueLoaderPlugin } = require('vue-loader')
+const vueLoaderConfig = require('./vue-loader.conf')
+
+function resolve(dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+const createLintingRule = () => ({
+  test: /\.(js|vue)$/,
+  loader: 'eslint-loader',
+  enforce: 'pre',
+  include: [resolve('src'), resolve('test')],
+  options: {
+    formatter: require('eslint-friendly-formatter'),
+    emitWarning: !config.dev.showEslintErrorsInOverlay
+  }
+})
+
+module.exports = {
+  context: path.resolve(__dirname, '../'),
+  entry: {
+    app: './src/main.js'
+  },
+  output: {
+    path: config.build.assetsRoot,
+    filename: '[name].js',
+    publicPath:
+      process.env.NODE_ENV === 'production'
+        ? config.build.assetsPublicPath
+        : config.dev.assetsPublicPath
+  },
+  resolve: {
+    extensions: ['.js', '.vue', '.json'],
+    alias: {
+      '@': resolve('src')
+    }
+  },
+  module: {
+    rules: [
+      ...(config.dev.useEslint ? [] : []),
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader',
+        options: vueLoaderConfig
+      },
+      {
+        test: /\.js$/,
+        loader: 'babel-loader?cacheDirectory',
+        include: [
+          resolve('src'),
+          resolve('test'),
+          resolve('node_modules/webpack-dev-server/client')
+        ]
+      },
+      {
+        test: /\.svg$/,
+        loader: 'svg-sprite-loader',
+        include: [resolve('src/icons')],
+        options: {
+          symbolId: 'icon-[name]'
+        }
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        loader: 'url-loader',
+        exclude: [resolve('src/icons')],
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('img/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('media/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+        }
+      }
+    ]
+  },
+  plugins: [new VueLoaderPlugin()],
+  node: {
+    // prevent webpack from injecting useless setImmediate polyfill because Vue
+    // source contains it (although only uses it if it's native).
+    setImmediate: false,
+    // prevent webpack from injecting mocks to Node native modules
+    // that does not make sense for the client
+    dgram: 'empty',
+    fs: 'empty',
+    net: 'empty',
+    tls: 'empty',
+    child_process: 'empty'
+  }
+}

+ 107 - 0
build/webpack.dev.conf.js

@@ -0,0 +1,107 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+const portfinder = require('portfinder')
+function resolve(dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+const HOST = process.env.HOST
+const PORT = process.env.PORT && Number(process.env.PORT)
+
+
+
+
+
+
+const devWebpackConfig = merge(baseWebpackConfig, {
+  mode: 'development',
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.dev.cssSourceMap,
+      usePostCSS: true
+    })
+  },
+  // cheap-module-eval-source-map is faster for development
+  devtool: config.dev.devtool,
+
+  // these devServer options should be customized in /config/index.js
+  devServer: {
+    clientLogLevel: 'warning',
+    historyApiFallback: true,
+    hot: true,
+    compress: true,
+    host: HOST || config.dev.host,
+    port: PORT || config.dev.port,
+    open: config.dev.autoOpenBrowser,
+    overlay: config.dev.errorOverlay
+      ? { warnings: false, errors: true }
+      : false,
+    publicPath: config.dev.assetsPublicPath,
+    proxy: config.dev.proxyTable,
+    quiet: true, // necessary for FriendlyErrorsPlugin
+    disableHostCheck: true,
+    watchOptions: {
+      poll: config.dev.poll
+    }
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      'process.env': require('../config/dev.env'),
+    }),
+
+    new webpack.ProvidePlugin({
+      introJs: ['intro.js', 'introJs']
+    }),
+
+
+    new webpack.HotModuleReplacementPlugin(),
+    // https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: 'index.html',
+      template: 'index.html',
+      inject: true,
+      favicon: resolve('favicon.ico'),
+      title: '积分系统',
+      path: config.dev.assetsPublicPath + config.dev.assetsSubDirectory
+    })
+  ]
+})
+
+module.exports = new Promise((resolve, reject) => {
+  portfinder.basePort = process.env.PORT || config.dev.port
+  portfinder.getPort((err, port) => {
+    if (err) {
+      reject(err)
+    } else {
+      // publish the new Port, necessary for e2e tests
+      process.env.PORT = port
+      // add port to devServer config
+      devWebpackConfig.devServer.port = port
+
+      // Add FriendlyErrorsPlugin
+      devWebpackConfig.plugins.push(
+        new FriendlyErrorsPlugin({
+          compilationSuccessInfo: {
+            messages: [
+              `Your application is running here: http://${
+                devWebpackConfig.devServer.host
+              }:${port}`
+            ]
+          },
+          onErrors: config.dev.notifyOnErrors
+            ? utils.createNotifierCallback()
+            : undefined
+        })
+      )
+
+      resolve(devWebpackConfig)
+    }
+  })
+})

+ 205 - 0
build/webpack.prod.conf.js

@@ -0,0 +1,205 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin')
+const MiniCssExtractPlugin = require('mini-css-extract-plugin')
+const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+function resolve(dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+const env = require('../config/' + process.env.env_config + '.env')
+
+// For NamedChunksPlugin
+const seen = new Set()
+const nameLength = 4
+
+const webpackConfig = merge(baseWebpackConfig, {
+  mode: 'production',
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.build.productionSourceMap,
+      extract: true,
+      usePostCSS: true
+    })
+  },
+  devtool: config.build.productionSourceMap ? config.build.devtool : false,
+  output: {
+    path: config.build.assetsRoot,
+    filename: utils.assetsPath('js/[name].[chunkhash:12].js'),
+    chunkFilename: utils.assetsPath('js/[name].[chunkhash:12].js')
+  },
+  plugins: [
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
+    new webpack.DefinePlugin({
+      'process.env': env
+    }),
+    new webpack.ProvidePlugin({
+      introJs: ['intro.js', 'introJs']
+    })
+    ,
+    // extract css into its own file
+    new MiniCssExtractPlugin({
+      filename: utils.assetsPath('css/[name].[contenthash:12].css'),
+      chunkFilename: utils.assetsPath('css/[name].[contenthash:12].css')
+    }),
+    // generate dist index.html with correct asset hash for caching.
+    // you can customize output by editing /index.html
+    // see https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: config.build.index,
+      template: 'index.html',
+      inject: true,
+      favicon: resolve('favicon.ico'),
+      title: '积分系统',
+      path: config.build.assetsPublicPath + config.build.assetsSubDirectory,
+      minify: {
+        removeComments: true,
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+        // more options:
+        // https://github.com/kangax/html-minifier#options-quick-reference
+      }
+      // default sort mode uses toposort which cannot handle cyclic deps
+      // in certain cases, and in webpack 4, chunk order in HTML doesn't
+      // matter anyway
+    }),
+    new ScriptExtHtmlWebpackPlugin({
+      //`runtime` must same as runtimeChunk name. default is `runtime`
+      inline: /runtime\..*\.js$/
+    }),
+    // keep chunk.id stable when chunk has no name
+    new webpack.NamedChunksPlugin(chunk => {
+      if (chunk.name) {
+        return chunk.name
+      }
+      const modules = Array.from(chunk.modulesIterable)
+      if (modules.length > 1) {
+        const hash = require('hash-sum')
+        const joinedHash = hash(modules.map(m => m.id).join('_'))
+        let len = nameLength
+        while (seen.has(joinedHash.substr(0, len))) len++
+        seen.add(joinedHash.substr(0, len))
+        return `chunk-${joinedHash.substr(0, len)}`
+      } else {
+        return modules[0].id
+      }
+    }),
+    // keep module.id stable when vender modules does not change
+    new webpack.HashedModuleIdsPlugin(),
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.build.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ],
+  optimization: {
+    splitChunks: {
+      chunks: 'all',
+      cacheGroups: {
+        libs: {
+          name: 'chunk-libs',
+          test: /[\\/]node_modules[\\/]/,
+          priority: 10,
+          chunks: 'initial' // 只打包初始时依赖的第三方
+        },
+        elementUI: {
+          name: 'chunk-elementUI', // 单独将 elementUI 拆包
+          priority: 20, // 权重要大于 libs 和 app 不然会被打包进 libs 或者 app
+          test: /[\\/]node_modules[\\/]element-ui[\\/]/
+        },
+        commons: {
+          name: 'chunk-comomns',
+          test: resolve('src/components'), // 可自定义拓展你的规则
+          minChunks: 3, // 最小公用次数
+          priority: 5,
+          reuseExistingChunk: true
+        }
+      }
+    },
+    runtimeChunk: 'single',
+    minimizer: [
+      new UglifyJsPlugin({
+        uglifyOptions: {
+          mangle: {
+            safari10: true
+          }
+        },
+        sourceMap: config.build.productionSourceMap,
+        cache: true,
+        parallel: true
+      }),
+      // Compress extracted CSS. We are using this plugin so that possible
+      // duplicated CSS from different components can be deduped.
+      new OptimizeCSSAssetsPlugin()
+    ]
+  }
+})
+
+if (config.build.productionGzip) {
+  const CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+  // webpackConfig.plugins.push(
+  //   new CompressionWebpackPlugin({
+  //     asset: '[path].gz[query]',
+  //     algorithm: 'gzip',
+  //     test: new RegExp(
+  //       '\\.(' + config.build.productionGzipExtensions.join('|') + ')$'
+  //     ),
+  //     threshold: 10240,
+  //     minRatio: 0.8
+  //   })
+  // )
+  webpackConfig.plugins.push(
+    new CompressionWebpackPlugin({
+      // asset: '[path].gz[query]',
+      filename: '[path].gz[query]',
+      algorithm: 'gzip',
+      test: new RegExp(
+        '\\.(' +
+        config.build.productionGzipExtensions.join('|') +
+        ')$'
+      ),
+      threshold: 10240,
+      // deleteOriginalAssets:true, //删除源文件,不建议
+      minRatio: 0.8
+    })
+  )
+}
+
+if (config.build.generateAnalyzerReport || config.build.bundleAnalyzerReport) {
+  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
+    .BundleAnalyzerPlugin
+
+  if (config.build.bundleAnalyzerReport) {
+    webpackConfig.plugins.push(
+      new BundleAnalyzerPlugin({
+        analyzerPort: 8080,
+        generateStatsFile: false
+      })
+    )
+  }
+
+  if (config.build.generateAnalyzerReport) {
+    webpackConfig.plugins.push(
+      new BundleAnalyzerPlugin({
+        analyzerMode: 'static',
+        reportFilename: 'bundle-report.html',
+        openAnalyzer: false
+      })
+    )
+  }
+}
+
+module.exports = webpackConfig

+ 10 - 0
config/dev.env.js

@@ -0,0 +1,10 @@
+module.exports = {
+  NODE_ENV: '"development"',
+  ENV_CONFIG: '"dev"',
+  // BASE_API: '"https://new.gdy.g107.com"',
+  // SERVE_AD: '"https://nkaoqin.g107.net"'
+  BASE_API: '"http://192.168.0.88:8888/"',
+  SERVE_AD: '"https://nkaoqin.g107.net"'
+  // BASE_API: '"https://oa.g107.com"',
+  // SERVE_AD:'"https://ad.g107.com"'
+}

+ 66 - 0
config/index.js

@@ -0,0 +1,66 @@
+'use strict'
+const path = require('path')
+
+module.exports = {
+  dev: {
+    // Paths
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '',
+    proxyTable: {},
+	
+    host: 'localhost',
+    port: 9527, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+    autoOpenBrowser: false,
+    errorOverlay: true,
+    notifyOnErrors: false,
+    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+
+
+    useEslint: true,
+    showEslintErrorsInOverlay: false,
+
+    devtool: 'cheap-source-map',
+    cssSourceMap: false
+  },
+
+  build: {
+    // Template for index.html
+    index: path.resolve(__dirname, '../dist/index.html'),
+
+    // Paths
+    assetsRoot: path.resolve(__dirname, '../dist'),
+    assetsSubDirectory: 'static',
+
+    /**
+     * You can set by youself according to actual condition
+     * You will need to set this if you plan to deploy your site under a sub path,
+     * for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/,
+     * then assetsPublicPath should be set to "/bar/".
+     * In most cases please use '/' !!!
+     */
+    assetsPublicPath: '', // If you are deployed on the root path, please use '/'
+
+    /**
+     * Source Maps
+     */
+    productionSourceMap: false,
+    // https://webpack.js.org/configuration/devtool/#production
+    devtool: 'source-map',
+
+    // Gzip off by default as many popular static hosts such as
+    // Surge or Netlify already gzip all static assets for you.
+    // Before setting to `true`, make sure to:
+    // npm install --save-dev compression-webpack-plugin
+    productionGzip: true,
+    productionGzipExtensions: ['js', 'css'],
+
+    // Run the build command with an extra argument to
+    // View the bundle analyzer report after build finishes:
+    // `npm run build:prod --report`
+    // Set to `true` or `false` to always turn it on or off
+    bundleAnalyzerReport: process.env.npm_config_report || false,
+
+    // `npm run build:prod --generate_report`
+    generateAnalyzerReport: process.env.npm_config_generate_report || false
+  }
+}

+ 6 - 0
config/prod.env.js

@@ -0,0 +1,6 @@
+module.exports = {
+  NODE_ENV: '"production"',
+  ENV_CONFIG: '"prod"',
+  BASE_API: '"https://oa.g107.com"',
+  SERVE_AD:'"https://ad.g107.com"'
+}

+ 6 - 0
config/sit.env.js

@@ -0,0 +1,6 @@
+module.exports = {
+  NODE_ENV: '"production"',
+  ENV_CONFIG: '"sit"',
+  BASE_API: '"https://new.gdy.g107.com"',
+  SERVE_AD: '"https://nkaoqin.g107.net"'
+}

BIN
favicon.ico


+ 193 - 0
index.html

@@ -0,0 +1,193 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <meta name="force-rendering" content="webkit"/>
+  <meta name="renderer" content="webkit" />
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no,minimum-scale=1.0">
+  <title>功道云-积分系统用户登录</title>
+  
+<script type="text/javascript" src="//res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
+<script type="text/javascript" src="//open.work.weixin.qq.com/wwopen/js/jwxwork-1.0.0.js"></script>
+
+  <script src="static/js/polyfill.min.js"></script>
+  
+  <!-- <script>
+    /**
+     * wx.config 参数
+     *
+     * @see https://open.work.weixin.qq.com/api/doc/90001/90144/90547
+     */
+    window.configParams = { /* ... */ }
+    /**
+     * wx.agentConfig 参数
+     *
+     * @see https://open.work.weixin.qq.com/api/doc/90001/90144/90548
+     */
+    window.agentConfigParams = { /* ... */ }
+</script> -->
+  <style>
+    .chromLink {
+      width: 163px;
+      height: 66px;
+      position: absolute;
+      left: 50%;
+      top: 450px;
+      margin-left: -170px;
+      cursor: pointer;
+      background-color: blue;
+      -khtml-opacity: 0;
+      -moz-opacity: 0;
+      filter: alpha(opacity=0);
+      filter: "alpha(opacity=0)";
+      opacity: 0;
+      filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);
+    }
+
+    .firefoxLink {
+      width: 163px;
+      height: 66px;
+      position: absolute;
+      left: 50%;
+      top: 450px;
+      cursor: pointer;
+      margin-left: 9px;
+      background-color: pink;
+      filter: progid:DXImageTransform.Microsoft.Gradient(startColorstr=#0f000000, endColorstr=#0f000000);
+      -khtml-opacity: 0;
+      -moz-opacity: 0;
+      filter: alpha(opacity=0);
+      filter: "alpha(opacity=0)";
+      opacity: 0;
+      filter: progid:DXImageTransform.Microsoft.Alpha(opacity=0);
+    }
+  </style>
+</head>
+
+<body>
+<div style="position: absolute; top:-100000px; left:-100000px;">
+  <input type="text">
+  <input type="password">
+</div>
+  <div id="app"></div>
+  <div id='ie_tip' style='display:none'><img style='position:absolute;left:50%;margin-left:-366px;' src='/static/images/ltIE9.png'><a
+      href='https://www.baidu.com/s?ie=UTF-8&wd=%E8%B0%B7%E6%AD%8C%E6%B5%8F%E8%A7%88%E5%99%A8' target='_blank' class='chromLink'></a><a
+      href='https://www.baidu.com/s?ie=UTF-8&wd=%E7%81%AB%E7%8B%90%E6%B5%8F%E8%A7%88%E5%99%A8' target='_blank' class='firefoxLink'></a></div>
+  <!-- built files will be auto injected -->
+</body>
+<script>
+  (function (window) { // ie9以下浏览器
+    var theUA = window.navigator.userAgent.toLowerCase();
+    if ((theUA.match(/msie\s\d+/) && theUA.match(/msie\s\d+/)[0]) || (theUA.match(/trident\s?\d+/) && theUA.match(/trident\s?\d+/)[0])) {
+      var ieVersion = theUA.match(/msie\s\d+/)[0].match(/\d+/)[0] || theUA.match(/trident\s?\d+/)[0];
+      if (ieVersion < 9) {
+        // document.writeln("<img style='position:absolute;left:50%;margin-left:-366px;' src='./static/images/ltIE9.png'><a href='https://www.baidu.com/s?ie=UTF-8&wd=%E8%B0%B7%E6%AD%8C%E6%B5%8F%E8%A7%88%E5%99%A8' target='_blank' class='chromLink'></a><a href='https://www.baidu.com/s?ie=UTF-8&wd=%E7%81%AB%E7%8B%90%E6%B5%8F%E8%A7%88%E5%99%A8' target='_blank' class='firefoxLink'></a>");
+        // document.execCommand("Stop");
+        var app = document.getElementById("app")
+        var ie_tip = document.getElementById("ie_tip")
+        ie_tip.style.display = 'block';
+        app.appendChild(ie_tip)
+      };
+    }
+
+  })(window);
+  
+
+  // (async () => {
+  //           try {
+  //               console.info('WWOpenData demo start')
+  //               if (/MicroMessenger/i.test(navigator.userAgent)) {
+  //                   await config(window.configParams)
+  //               }
+  //               await agentConfig(window.agentConfigParams)
+  //               // 若一切正常,此时可以在 window 上看到 WWOpenData 对象
+  //               console.log('=========================')
+  //               console.log('window.WWOpenData', window.WWOpenData)
+  //               console.log('=========================')
+  //               if (WWOpenData.checkSession) {
+  //                   WWOpenData.checkSession({
+  //                       success() {
+  //                           console.info('open-data 登录态校验成功')
+  //                       },
+  //                       fail() {
+  //                           console.error('open-data 登录态过期')
+  //                       },
+  //                   })
+  //               }
+  //               if (WWOpenData.on) {
+  //                   /**
+  //                    * ww-open-data 元素数据发生变更时触发
+  //                    */
+  //                   WWOpenData.on('update', event => {
+  //                       const openid = event.detail.element.getAttribute('openid')
+  //                       console.info('渲染数据发生变更', openid, event.detail.hasData)
+  //                   })
+  //                   /**
+  //                    * ww-open-data 获取数据失败时触发
+  //                    */
+  //                   WWOpenData.on('error', () => {
+  //                       console.error('获取数据失败')
+  //                   })
+  //               }
+  //               /**
+  //                * 创建 ww-open-data 元素
+  //                */
+  //               const container = document.getElementById('container')
+  //               // 这里的 window.openidList 是该 demo 页面自行组织的数据,不具备普遍性
+  //               // 开发者进行开发时,需要自己拿到授权企业相对应的 openid
+  //               // 关于 openid 的定义与获得方式,可以关注文档注意事项的第 5 点
+  //               for (const openid of window.openidList) {
+  //                   const element = document.createElement('ww-open-data')
+  //                   element.setAttribute('type', 'userName')
+  //                   element.setAttribute('openid', openid)
+  //                   container.appendChild(element)
+  //               }
+  //               /**
+  //                * 绑定 document 上全部的 ww-open-data 元素
+  //                */
+  //               WWOpenData.bindAll(document.querySelectorAll('ww-open-data'))
+  //               console.info('WWOpenData demo end')
+  //           } catch (error) {
+  //               console.error('WWOpenData demo error', error)
+  //           }
+  //           /**
+  //            * 调用 wx.config
+  //            *
+  //            * @see https://open.work.weixin.qq.com/api/doc/90001/90144/90547
+  //            */
+  //           async function config(config) {
+  //               return new Promise((resolve, reject) => {
+  //                   console.info('wx.config', config)
+  //                   wx.config(config)
+  //                   wx.ready(resolve)
+  //                   wx.error(reject)
+  //               }).then(() => {
+  //                   console.info('wx.ready')
+  //               }, error => {
+  //                   console.error('wx.error', error)
+  //                   throw error
+  //               })
+  //           }
+  //           /**
+  //            * 调用 wx.agentConfig
+  //            *
+  //            * @see https://open.work.weixin.qq.com/api/doc/90001/90144/90548
+  //            */
+  //           async function agentConfig(config) {
+  //               return new Promise((success, fail) => {
+  //                   console.info('wx.agentConfig', config)
+  //                   wx.agentConfig({ ...config, success, fail })
+  //               }).then(res => {
+  //                   console.info('wx.agentConfig success', res)
+  //                   return res
+  //               }, error => {
+  //                   console.error('wx.agentConfig fail', error)
+  //                   throw error
+  //               })
+  //           }
+  //       })()
+</script>
+
+</html>

+ 151 - 0
package.json

@@ -0,0 +1,151 @@
+{
+  "name": "vue-element-admin",
+  "version": "3.8.3",
+  "description": "A magical vue admin. Typical templates for enterprise applications. Newest development stack of vue. Lots of awesome features",
+  "author": "Pan <panfree23@gmail.com>",
+  "license": "MIT",
+  "scripts": {
+    "dev": "cross-env BABEL_ENV=development webpack-dev-server --host 0.0.0.0 --inline --progress --config build/webpack.dev.conf.js",
+    "build:prod": "cross-env NODE_ENV=production env_config=prod node build/build.js",
+    "build:sit": "cross-env NODE_ENV=production env_config=sit node build/build.js",
+    "lint": "eslint --ext .js,.vue src",
+    "test": "npm run lint",
+    "precommit": "lint-staged"
+  },
+  "lint-staged": {
+    "src/**/*.{js,vue}": [
+      "eslint --fix",
+      "git add"
+    ]
+  },
+  "keywords": [
+    "vue",
+    "element-ui",
+    "admin",
+    "management-system",
+    "admin-template"
+  ],
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/PanJiaChen/vue-element-admin.git"
+  },
+  "bugs": {
+    "url": "https://github.com/PanJiaChen/vue-element-admin/issues"
+  },
+  "dependencies": {
+    "axios": "0.18.0",
+    "babel-runtime": "^6.26.0",
+    "clipboard": "1.7.1",
+    "codemirror": "5.39.2",
+    "connect": "3.6.6",
+    "driver.js": "0.5.2",
+    "dropzone": "5.2.0",
+    "echarts": "4.1.0",
+    "element-ui": "^2.13.1",
+    "file-saver": "1.3.8",
+    "font-awesome": "4.7.0",
+    "highcharts": "^6.1.1",
+    "intro.js": "^2.9.3",
+    "js-cookie": "2.2.0",
+    "jsonlint": "1.6.3",
+    "jszip": "3.1.5",
+    "moment": "^2.22.2",
+    "node-sass": "^4.14.1",
+    "normalize.css": "7.0.0",
+    "nprogress": "0.2.0",
+    "photoswipe": "^4.1.3",
+    "qrcodejs2": "^0.0.2",
+    "qs": "^6.5.2",
+    "screenfull": "3.3.2",
+    "scrollbars": "^0.7.1",
+    "showdown": "1.8.6",
+    "simplemde": "1.11.2",
+    "sortablejs": "1.7.0",
+    "swiper": "^6.2.0",
+    "v-charts": "^1.17.10",
+    "vconsole": "^3.4.0",
+    "vue": "2.5.17",
+    "vue-awesome-swiper": "^4.1.1",
+    "vue-baidu-map": "^0.21.20",
+    "vue-calendar-component": "^2.8.2",
+    "vue-count-to": "1.0.13",
+    "vue-i18n": "7.3.2",
+    "vue-introjs": "^1.3.2",
+    "vue-multiselect": "2.1.0",
+    "vue-orgchart": "^1.1.7",
+    "vue-photo-preview": "^1.0.9",
+    "vue-router": "3.0.1",
+    "vue-router-storage": "^1.0.9",
+    "vue-splitpane": "1.0.2",
+    "vue-video-player": "^5.0.2",
+    "vue2-highcharts": "^1.2.5",
+    "vuedraggable": "^2.16.0",
+    "vuex": "3.0.1",
+    "weixin-js-sdk": "^1.6.0",
+    "xlsx": "^0.11.16"
+  },
+  "devDependencies": {
+    "autoprefixer": "8.5.0",
+    "babel-core": "6.26.3",
+    "babel-eslint": "8.2.6",
+    "babel-helper-vue-jsx-merge-props": "2.0.3",
+    "babel-loader": "7.1.5",
+    "babel-plugin-dynamic-import-node": "2.0.0",
+    "babel-plugin-syntax-jsx": "6.18.0",
+    "babel-plugin-transform-runtime": "6.23.0",
+    "babel-plugin-transform-vue-jsx": "3.7.0",
+    "babel-polyfill": "^6.26.0",
+    "babel-preset-env": "1.7.0",
+    "babel-preset-stage-2": "6.24.1",
+    "chalk": "2.4.1",
+    "compression-webpack-plugin": "^1.1.11",
+    "copy-webpack-plugin": "4.5.2",
+    "cross-env": "5.2.0",
+    "css-loader": "1.0.0",
+    "eslint": "4.19.1",
+    "eslint-friendly-formatter": "4.0.1",
+    "eslint-loader": "2.0.0",
+    "eslint-plugin-html": "4.0.5",
+    "file-loader": "1.1.11",
+    "friendly-errors-webpack-plugin": "1.7.0",
+    "hash-sum": "^1.0.2",
+    "html-webpack-plugin": "4.0.0-alpha",
+    "husky": "0.14.3",
+    "lint-staged": "7.2.2",
+    "mini-css-extract-plugin": "0.4.1",
+    "node-notifier": "5.2.1",
+    "optimize-css-assets-webpack-plugin": "5.0.0",
+    "ora": "3.0.0",
+    "portfinder": "1.0.13",
+    "postcss-import": "11.1.0",
+    "postcss-loader": "2.1.6",
+    "postcss-url": "7.3.2",
+    "rimraf": "2.6.2",
+    "sass-loader": "^7.0.3",
+    "script-ext-html-webpack-plugin": "2.0.1",
+    "script-loader": "0.7.2",
+    "semver": "5.5.0",
+    "serve-static": "1.13.2",
+    "shelljs": "0.8.2",
+    "svg-sprite-loader": "3.8.0",
+    "uglifyjs-webpack-plugin": "1.2.7",
+    "url-loader": "1.0.1",
+    "vue-loader": "15.3.0",
+    "vue-style-loader": "4.1.2",
+    "vue-template-compiler": "2.5.17",
+    "webpack": "4.16.5",
+    "webpack-bundle-analyzer": "2.13.1",
+    "webpack-cli": "3.1.0",
+    "webpack-dev-server": "3.1.5",
+    "webpack-merge": "4.1.4"
+  },
+  "engines": {
+    "node": ">= 6.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

+ 34 - 0
src/App.vue

@@ -0,0 +1,34 @@
+<template>
+  <div id="app">
+    <router-view></router-view>
+  </div>
+</template>
+
+<script>
+  import axios from 'axios'
+  import {getToken, setToken, getUser, getPasw, setUser, setPasw,} from '@/utils/auth' // getToken from cookie
+  import {wxConfig} from '@/utils/wx-auth'
+  import {allocation} from '@/api/configget'
+  export default{
+    name: 'App',
+    created () {
+      // if(JSON.parse(localStorage.getItem('wxConfigData'))){
+      //   wxConfig(JSON.parse(localStorage.getItem('wxConfigData')))//拿到数据执行wx.config
+      // }else{
+      //   console.log('JSON.parse(localStorage.getItem())')
+      //   if(getToken()){
+      //     console.log(getToken())
+      //     allocation().then((res)=>{
+      //         console.log('请求成功')
+      //         if(res.data.code == 1){
+      //         localStorage.setItem('wxConfigData',JSON.stringify(res.data.data))
+      //         wxConfig(res.data.data)
+      //         }
+      //     })
+      //   }
+      // }
+    },
+    methods: {
+    },
+  }
+</script>

+ 54 - 0
src/api/auth.js

@@ -0,0 +1,54 @@
+import store from '@/store'
+
+export function getUserData() {
+    return store.getters.user_info.employee_detail.role_list;
+  }
+export function getIsCreator (key) {
+	 let is=false;
+	 let getUserdatas = getUserData()
+	 for(let i in getUserdatas){
+		//  console.log(getUserdatas[i])
+		 if(key == getUserdatas[i].name){
+			is=true;
+		 }
+	 }
+	//  getUserData().forEach(item=>{ 
+	// 	 if(key==item.name){
+	// 		 is=true;
+	// 	 }
+	//  })
+	 return is
+}
+export function supremeAuthority () {
+	if(getIsCreator('creator')){
+		return 'creator'
+	}else if(getIsCreator('admin')){
+		return 'admin'
+	}else if(getIsCreator('point_manager')){
+		return 'point_manager'
+	}else if(getIsCreator('dept_manager')){
+		return 'dept_manager'
+	}else if(getIsCreator('employee')){
+		return 'employee'
+	}
+}
+export function authoritys (key) {//判断是否为某项权限:this.$authoritys('dept_manager')
+	return supremeAuthority() == key
+}
+
+
+
+// 防抖
+//用法
+// _debounce(this.XXX(),1000)
+export function _debounce (fn, delay) {
+    let timer = null
+    return function () {
+        let arg = arguments
+        clearTimeout(timer)
+        timer = setTimeout(() => {
+          console.log(this,arg)
+            fn.apply(this, arg)
+        }, delay)
+    }
+}

+ 21 - 0
src/api/configget.js

@@ -0,0 +1,21 @@
+
+import {wxConfig} from '@/utils/wx-auth'
+import request from '@/utils/request'
+import {getToken} from '@/utils/auth' // getToken from cookie
+export function allocation(){
+    let urls = window.location.href
+    console.log(urls.split('#')[0])
+    let params = {url : urls.split('#')[0]}
+    // let params = {url : 'http%3A%2F%2Fwechatdings.vaiwan.com%2F'}
+    return request('get','/api/wechat/config', params)
+}
+// import request from '@/utils/request'
+export async function allocations(body){
+    console.log("执行者")
+    console.log(body)
+    if(getToken()){
+        let params = {url : body}
+        // let params = {url : 'http%3A%2F%2Fwechatdings.vaiwan.com%2F'}
+        return request('get','/api/wechat/config', params)
+    }
+}

+ 40 - 0
src/api/login.js

@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+import axios from 'axios/index'
+export function loginByUsername(username, password) {
+  const data = {
+    tel: username,
+    password: password
+  }
+  return request('post','/api/login', data)
+}
+
+export function get_point_types() {
+  return request('get','/api/integral/types',)
+}
+export function loginByDemo() {
+  return request('post','/api/system/try-out',)
+}
+export function get_employee_map() {
+  return request('get','/api/employee/list',)
+}
+
+export function get_site_info() {
+  return request('get','/api/site/info',)
+}
+
+export function get_dept_tree() {
+  return request('get','/api/department/tree',)
+}
+
+export function getUserInfo(token) {
+  var instance = axios.create({
+    baseURL: process.env.BASE_API,
+    timeout: 10000 // request timeout
+  })
+  instance.defaults.headers.common['A-TOKEN'] = token
+  return instance({
+    url: '/api/employee/detail',
+    method: 'get'
+  })
+}
+

+ 5 - 0
src/api/transaction.js

@@ -0,0 +1,5 @@
+import request from '@/utils/request'
+
+export function fetchList(query) {
+  return request('get','/transaction/list',query)
+}

BIN
src/assets/401_images/401.gif


BIN
src/assets/404_images/404.png


BIN
src/assets/404_images/404_cloud.png


BIN
src/assets/custom-theme/fonts/element-icons.ttf


BIN
src/assets/custom-theme/fonts/element-icons.woff


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
src/assets/custom-theme/index.css


+ 199 - 0
src/assets/echarts-macarons.js

@@ -0,0 +1,199 @@
+/* eslint-disable */
+(function (root, factory) {
+    if (typeof define === 'function' && define.amd) {
+        // AMD. Register as an anonymous module.
+        define(['exports', 'echarts'], factory);
+    } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
+        // CommonJS
+        factory(exports, require('echarts'));
+    } else {
+        // Browser globals
+        factory({}, root.echarts);
+    }
+}(this, function (exports, echarts) {
+    var log = function (msg) {
+        if (typeof console !== 'undefined') {
+            console && console.error && console.error(msg);
+        }
+    };
+    if (!echarts) {
+        log('ECharts is not Loaded');
+        return;
+    }
+
+    var colorPalette = [
+        '#2ec7c9','#b6a2de','#5ab1ef','#ffb980','#d87a80',
+        '#8d98b3','#e5cf0d','#97b552','#95706d','#dc69aa',
+        '#07a2a4','#9a7fd1','#588dd5','#f5994e','#c05050',
+        '#59678c','#c9ab00','#7eb00a','#6f5553','#c14089'
+    ];
+
+
+    var theme = {
+        color: colorPalette,
+
+        title: {
+            textStyle: {
+                fontWeight: 'normal',
+                color: '#008acd'
+            }
+        },
+
+        visualMap: {
+            itemWidth: 15,
+            color: ['#5ab1ef','#e0ffff']
+        },
+
+        toolbox: {
+            iconStyle: {
+                normal: {
+                    borderColor: colorPalette[0]
+                }
+            }
+        },
+
+        tooltip: {
+            backgroundColor: 'rgba(50,50,50,0.5)',
+            axisPointer : {
+                type : 'line',
+                lineStyle : {
+                    color: '#008acd'
+                },
+                crossStyle: {
+                    color: '#008acd'
+                },
+                shadowStyle : {
+                    color: 'rgba(200,200,200,0.2)'
+                }
+            }
+        },
+
+        dataZoom: {
+            dataBackgroundColor: '#efefff',
+            fillerColor: 'rgba(182,162,222,0.2)',
+            handleColor: '#008acd'
+        },
+
+        grid: {
+            borderColor: '#eee'
+        },
+
+        categoryAxis: {
+            axisLine: {
+                lineStyle: {
+                    color: '#008acd'
+                }
+            },
+            splitLine: {
+                lineStyle: {
+                    color: ['#eee']
+                }
+            }
+        },
+
+        valueAxis: {
+            axisLine: {
+                lineStyle: {
+                    color: '#008acd'
+                }
+            },
+            splitArea : {
+                show : true,
+                areaStyle : {
+                    color: ['rgba(250,250,250,0.1)','rgba(200,200,200,0.1)']
+                }
+            },
+            splitLine: {
+                lineStyle: {
+                    color: ['#eee']
+                }
+            }
+        },
+
+        timeline : {
+            lineStyle : {
+                color : '#008acd'
+            },
+            controlStyle : {
+                normal : { color : '#008acd'},
+                emphasis : { color : '#008acd'}
+            },
+            symbol : 'emptyCircle',
+            symbolSize : 3
+        },
+
+        line: {
+            smooth : true,
+            symbol: 'emptyCircle',
+            symbolSize: 3
+        },
+
+        candlestick: {
+            itemStyle: {
+                normal: {
+                    color: '#d87a80',
+                    color0: '#2ec7c9',
+                    lineStyle: {
+                        color: '#d87a80',
+                        color0: '#2ec7c9'
+                    }
+                }
+            }
+        },
+
+        scatter: {
+            symbol: 'circle',
+            symbolSize: 4
+        },
+
+        map: {
+            label: {
+                normal: {
+                    textStyle: {
+                        color: '#d87a80'
+                    }
+                }
+            },
+            itemStyle: {
+                normal: {
+                    borderColor: '#eee',
+                    areaColor: '#ddd'
+                },
+                emphasis: {
+                    areaColor: '#fe994e'
+                }
+            }
+        },
+
+        graph: {
+            color: colorPalette
+        },
+
+        gauge : {
+            axisLine: {
+                lineStyle: {
+                    color: [[0.2, '#2ec7c9'],[0.8, '#5ab1ef'],[1, '#d87a80']],
+                    width: 10
+                }
+            },
+            axisTick: {
+                splitNumber: 10,
+                length :15,
+                lineStyle: {
+                    color: 'auto'
+                }
+            },
+            splitLine: {
+                length :22,
+                lineStyle: {
+                    color: 'auto'
+                }
+            },
+            pointer : {
+                width : 5
+            }
+        }
+    };
+
+    echarts.registerTheme('macarons', theme);
+}));

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
src/assets/echarts-macarons.min.js


+ 1492 - 0
src/components/ImageCropper/index.vue

@@ -0,0 +1,1492 @@
+<template>
+<div class="vue-image-crop-upload" v-show="value">
+  <div class="vicp-wrap" v-loading="loading1">
+    <div class="vicp-close" @click="off">
+      <i class="vicp-icon4"></i>
+    </div>
+
+    <div class="vicp-step1" v-show="step == 1">
+      <div class="vicp-drop-area" @dragleave="preventDefault" @dragover="preventDefault" @dragenter="preventDefault" @click="handleClick" @drop="handleChange">
+        <i class="vicp-icon1" v-show="loading != 1">
+        <i class="vicp-icon1-arrow"></i>
+        <i class="vicp-icon1-body"></i>
+        <i class="vicp-icon1-bottom"></i>
+        </i>
+        <span class="vicp-hint" v-show="loading !== 1">{{ lang.hint }}</span>
+        <span class="vicp-no-supported-hint" v-show="!isSupported">{{ lang.noSupported }}</span>
+        <input type="file" v-show="false" v-if="step == 1" @change="handleChange" ref="fileinput">
+      </div>
+      <div class="vicp-error" v-show="hasError">
+        <i class="vicp-icon2"></i> {{ errorMsg }}
+      </div>
+      <div class="vicp-operate">
+        <a @click="off" @mousedown="ripple">{{ lang.btn.off }}</a>
+      </div>
+    </div>
+
+    <div class="vicp-step2" v-if="step == 2">
+      <div class="vicp-crop">
+        <div class="vicp-crop-left" v-show="true">
+          <div class="vicp-img-container">
+            <img :src="sourceImgUrl" :style="sourceImgStyle" class="vicp-img" draggable="false"
+              @drag="preventDefault"
+              @dragstart="preventDefault"
+              @dragend="preventDefault"
+              @dragleave="preventDefault"
+              @dragover="preventDefault"
+              @dragenter="preventDefault"
+              @drop="preventDefault"
+              @touchstart="imgStartMove"
+              @touchmove="imgMove"
+              @touchend="createImg"
+              @touchcancel="createImg"
+              @mousedown="imgStartMove"
+              @mousemove="imgMove"
+              @mouseup="createImg"
+              @mouseout="createImg"
+              ref="img">
+            <div class="vicp-img-shade vicp-img-shade-1" :style="sourceImgShadeStyle"></div>
+            <div class="vicp-img-shade vicp-img-shade-2" :style="sourceImgShadeStyle"></div>
+          </div>
+
+          <div class="vicp-range">
+            <input type="range" :value="scale.range" step="1" min="0" max="100" @input="zoomChange">
+            <i @mousedown="startZoomSub" @mouseout="endZoomSub" @mouseup="endZoomSub" class="vicp-icon5"></i>
+            <i @mousedown="startZoomAdd" @mouseout="endZoomAdd" @mouseup="endZoomAdd" class="vicp-icon6"></i>
+          </div>
+
+          <div class="vicp-rotate" v-if="!noRotate">
+                        <i @mousedown="startRotateLeft" @mouseout="endRotate" @mouseup="endRotate">↺</i>
+                        <i @mousedown="startRotateRight" @mouseout="endRotate" @mouseup="endRotate">↻</i>
+                    </div>
+        </div>
+        <div class="vicp-crop-right" v-show="true">
+          <div class="vicp-preview">
+            <div class="vicp-preview-item" v-if="!noSquare">
+              <img :src="createImgUrl" :style="previewStyle">
+              <span>{{ lang.preview }}</span>
+            </div>
+            <div class="vicp-preview-item vicp-preview-item-circle" v-if="!noCircle">
+              <img :src="createImgUrl" :style="previewStyle">
+              <span>{{ lang.preview }}</span>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="vicp-operate">
+        <a @click="setStep(1)" @mousedown="ripple">{{ lang.btn.back }}</a>
+        <!-- 保存按钮 -->
+        <a class="vicp-operate-btn" @click="prepareUpload" @mousedown="ripple">{{ lang.btn.save }}</a>
+      </div>
+    </div>
+
+    <div class="vicp-step3" v-if="step == 3">
+      <div class="vicp-upload">
+        <span class="vicp-loading" v-show="loading === 1">{{ lang.loading }}</span>
+        <div class="vicp-progress-wrap">
+          <span class="vicp-progress" v-show="loading === 1" :style="progressStyle"></span>
+        </div>
+        <div class="vicp-error" v-show="hasError">
+          <i class="vicp-icon2"></i> {{ errorMsg }}
+        </div>
+        <div class="vicp-success" v-show="loading === 2">
+          <i class="vicp-icon3"></i> {{ lang.success }}
+        </div>
+      </div>
+      <div class="vicp-operate">
+        <a @click="setStep(2)" @mousedown="ripple">{{ lang.btn.back }}</a>
+        <a @click="off" @mousedown="ripple">{{ lang.btn.close }}</a>
+      </div>
+    </div>
+    <canvas v-show="false" :width="width" :height="height" ref="canvas"></canvas>
+  </div>
+</div>
+</template>
+
+<script>
+function kong(){}
+ /* eslint-disable */
+'use strict'
+import request from '@/utils/request'
+import language from './utils/language.js'
+import mimes from './utils/mimes.js'
+import data2blob from './utils/data2blob.js'
+import effectRipple from './utils/effectRipple.js'
+import moment from 'moment'
+import axios from "axios"
+export default {
+  props: {
+    // 域,上传文件name,触发事件会带上(如果一个页面多个图片上传控件,可以做区分
+    field: {
+      type: String,
+      'default': 'avatar'
+    },
+    // 原名key,类似于id,触发事件会带上(如果一个页面多个图片上传控件,可以做区分
+    ki: {
+      'default': 0
+    },
+    // 显示该控件与否
+    value: {
+      'default': true
+    },
+    // 上传地址
+    url: {
+      type: String,
+      'default': ''
+    },
+    // 其他要上传文件附带的数据,对象格式
+    params: {
+      type: Object,
+      'default': null
+    },
+    // Add custom headers
+    headers: {
+      type: Object,
+      'default': null
+    },
+    // 剪裁图片的宽
+    width: {
+      type: Number,
+      default: 200
+    },
+    // 剪裁图片的高
+    height: {
+      type: Number,
+      default: 200
+    },
+    // 不显示旋转功能
+    noRotate: {
+      type: Boolean,
+      default: true
+    },
+    // 不预览圆形图片
+    noCircle: {
+      type: Boolean,
+      default: false
+    },
+    // 不预览方形图片
+    noSquare: {
+      type: Boolean,
+      default: false
+    },
+    // 单文件大小限制
+    maxSize: {
+      type: Number,
+      'default': 10240
+    },
+    // 语言类型
+    langType: {
+      type: String,
+      'default': 'zh'
+    },
+    // 语言包
+    langExt: {
+      type: Object,
+      'default': null
+    },
+    // 图片上传格式
+    imgFormat: {
+      type: String,
+      'default': 'png'
+    },
+    // 是否支持跨域
+    withCredentials: {
+      type: Boolean,
+      'default': false
+    }
+  },
+  data() {
+    const that = this
+    const {
+      imgFormat,
+      langType,
+      langExt,
+      width,
+      height
+    } = that
+    let isSupported = true
+    const allowImgFormat = [
+      'jpg',
+      'png'
+    ]
+    const tempImgFormat = allowImgFormat.indexOf(imgFormat) === -1 ? 'jpg' : imgFormat
+    const lang = language[langType] ? language[langType] : language['en']
+    const mime = mimes[tempImgFormat]
+    // 规范图片格式
+    that.imgFormat = tempImgFormat
+    if (langExt) {
+      Object.assign(lang, langExt)
+    }
+    if (typeof FormData !== 'function') {
+      isSupported = false
+    }
+    return {
+      loading1: false,
+      // 图片的mime
+      mime,
+      // 语言包
+      lang,
+      // 浏览器是否支持该控件
+      isSupported,
+      // 浏览器是否支持触屏事件
+      isSupportTouch: document.hasOwnProperty('ontouchstart'),
+      // 步骤
+      step: 1, // 1选择文件 2剪裁 3上传
+      // 上传状态及进度
+      loading: 0, // 0未开始 1正在 2成功 3错误
+      progress: 0,
+      // 是否有错误及错误信息
+      hasError: false,
+      errorMsg: '',
+      // 需求图宽高比
+      ratio: width / height,
+      // 原图地址、生成图片地址
+      sourceImg: null,
+      sourceImgUrl: '',
+      createImgUrl: '',
+      // 原图片拖动事件初始值
+      sourceImgMouseDown: {
+        on: false,
+        mX: 0, // 鼠标按下的坐标
+        mY: 0,
+        x: 0, // scale原图坐标
+        y: 0
+      },
+      // 生成图片预览的容器大小
+      previewContainer: {
+        width: 100,
+        height: 100
+      },
+      // 原图容器宽高
+      sourceImgContainer: { // sic
+        width: 240,
+        height: 184 // 如果生成图比例与此一致会出现bug,先改成特殊的格式吧,哈哈哈
+      },
+      // 原图展示属性
+      scale: {
+        zoomAddOn: false, // 按钮缩放事件开启
+        zoomSubOn: false, // 按钮缩放事件开启
+        range: 1, // 最大100
+        rotateLeft: false, // 按钮向左旋转事件开启
+        rotateRight: false, // 按钮向右旋转事件开启
+        degree: 0, // 旋转度数
+        x: 0,
+        y: 0,
+        width: 0,
+        height: 0,
+        maxWidth: 0,
+        maxHeight: 0,
+        minWidth: 0, // 最宽
+        minHeight: 0,
+        naturalWidth: 0, // 原宽
+        naturalHeight: 0
+      },
+      config: null,
+      getFiles:{}
+    }
+  },
+  computed: {
+    // 进度条样式
+    progressStyle() {
+      const {
+        progress
+      } = this
+      return {
+        width: progress + '%'
+      }
+    },
+    // 原图样式
+    sourceImgStyle() {
+      const {
+        scale,
+        sourceImgMasking
+      } = this
+      const top = scale.y + sourceImgMasking.y + 'px'
+      const left = scale.x + sourceImgMasking.x + 'px'
+      return {
+        top,
+        left,
+        width: scale.width + 'px',
+        height: scale.height + 'px',
+        transform: 'rotate(' + scale.degree + 'deg)', // 旋转时 左侧原始图旋转样式
+        '-ms-transform': 'rotate(' + scale.degree + 'deg)', // 兼容IE9
+        '-moz-transform': 'rotate(' + scale.degree + 'deg)', // 兼容FireFox
+        '-webkit-transform': 'rotate(' + scale.degree + 'deg)', // 兼容Safari 和 chrome
+        '-o-transform': 'rotate(' + scale.degree + 'deg)' // 兼容 Opera
+      }
+    },
+    // 原图蒙版属性
+    sourceImgMasking() {
+      const {
+        width,
+        height,
+        ratio,
+        sourceImgContainer
+      } = this
+      const sic = sourceImgContainer
+      const sicRatio = sic.width / sic.height // 原图容器宽高比
+      let x = 0
+      let y = 0
+      let w = sic.width
+      let h = sic.height
+      let scale = 1
+      if (ratio < sicRatio) {
+        scale = sic.height / height
+        w = sic.height * ratio
+        x = (sic.width - w) / 2
+      }
+      if (ratio > sicRatio) {
+        scale = sic.width / width
+        h = sic.width / ratio
+        y = (sic.height - h) / 2
+      }
+      return {
+        scale, // 蒙版相对需求宽高的缩放
+        x,
+        y,
+        width: w,
+        height: h
+      }
+    },
+    // 原图遮罩样式
+    sourceImgShadeStyle() {
+      const {
+        sourceImgMasking,
+        sourceImgContainer
+      } = this
+      const sic = sourceImgContainer
+      const sim = sourceImgMasking
+      const w = sim.width == sic.width ? sim.width : (sic.width - sim.width) / 2
+      const h = sim.height == sic.height ? sim.height : (sic.height - sim.height) / 2
+      return {
+        width: w + 'px',
+        height: h + 'px'
+      }
+    },
+    previewStyle() {
+      const {
+        width,
+        height,
+        ratio,
+        previewContainer
+      } = this
+      const pc = previewContainer
+      let w = pc.width
+      let h = pc.height
+      const pcRatio = w / h
+      if (ratio < pcRatio) {
+        w = pc.height * ratio
+      }
+      if (ratio > pcRatio) {
+        h = pc.width / ratio
+      }
+      return {
+        width: w + 'px',
+        height: h + 'px'
+      }
+    }
+  },
+  watch: {
+    value(newValue) {
+      if (newValue && this.loading != 1) {
+        this.reset()
+      }
+    }
+  },
+  methods: {
+
+    // 19.12.13  获取oss数据
+    get_sign(callback) {
+      axios('https://intesys.cms.g107.com/integral.php/Api/get_signature').then(res => {
+        this.config = res.data.data
+        callback()
+      })
+    },
+    random_string(len) {
+      len = len || 32
+      var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
+      var maxPos = chars.length
+      var pwd = ''
+      for (let i = 0; i < len; i++) {
+        pwd += chars.charAt(Math.floor(Math.random() * maxPos))
+      }
+      return pwd
+    },
+    upload_oss(item) {
+      let self = this
+      const photo = item // 获取图片对象
+      const photoName = item.name // 原图片的名称
+      const url = 'https://integralsys.oss-cn-shenzhen.aliyuncs.com'
+      const user_info = this.$store.getters.user_info || JSON.parse(localStorage.getItem('user_info'))
+      let date = moment().format('YYYY/MM/DD')
+      let param = new FormData()
+      let randomStr = this.random_string(32)
+      let key = 'intesys/gdy/'+user_info.site_id+'/'+date + '/' + randomStr + photoName
+      param.append('Filename', photoName)
+      param.append('key', key)
+      param.append('policy', this.config.policy)
+      param.append('OSSAccessKeyId', this.config.accessid)
+      param.append('success_action_status', '200') // 不要问为什么,照做
+      param.append('callback', this.config.callback)
+      param.append('signature', this.config.signature)
+      param.append('file', photo) // 这个**切记**一定要放到最后去 append ,不然阿里云会一直报 key 的错误
+      axios.post(url, param, {
+          headers: {
+            'Content-Type': 'multipart/form-data'
+          }
+        }).then(response => {
+        self.loading1 = false
+          if(response.data.Status == 'Ok'){
+          let dataUrl = {status: 1,url: url + '/' + key}
+          self.$emit('crop-upload-success', dataUrl)
+          }
+        }).catch(err => {
+          console.log('err == ', err)
+        })
+    },
+    
+    base64toFile(dataurl, filename) {
+        var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
+            bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
+        while(n--){
+            u8arr[n] = bstr.charCodeAt(n);
+        }
+        return new File([u8arr], filename, {type:mime});
+    },
+    go_oss_upload(getFiles){
+      let self = this
+      self.loading1 = true
+      this.get_sign(function () {
+        self.upload_oss(getFiles[0])
+      })
+    },
+
+
+
+    // 点击波纹效果
+    ripple(e) {
+      effectRipple(e)
+    },
+    // 关闭控件
+    off() {
+      setTimeout(() => {
+        this.$emit('input', false)
+        this.$emit('close')
+        if (this.step == 3 && this.loading == 2) {
+          this.setStep(1)
+        }
+      }, 200)
+    },
+    // 设置步骤
+    setStep(no) {
+      // 延时是为了显示动画效果呢,哈哈哈
+      setTimeout(() => {
+        this.step = no
+      }, 200)
+    },
+    /* 图片选择区域函数绑定
+     ---------------------------------------------------------------*/
+    preventDefault(e) {
+      e.preventDefault()
+      return false
+    },
+    handleClick(e) {
+      if (this.loading !== 1) {
+        if (e.target !== this.$refs.fileinput) {
+          e.preventDefault()
+          if (document.activeElement !== this.$refs) {
+            this.$refs.fileinput.click()
+          }
+        }
+      }
+    },
+    handleChange(e) {
+      e.preventDefault()
+      if (this.loading !== 1) {
+        const files = e.target.files || e.dataTransfer.files
+        this.getFiles= e.target.files || e.dataTransfer.files
+        this.reset()
+        if (this.checkFile(files[0])) {
+          this.setSourceImg(files[0])
+        }
+      }
+    },
+    /* ---------------------------------------------------------------*/
+    // 检测选择的文件是否合适
+    checkFile(file) {
+      let that = this,
+        {
+          lang,
+          maxSize
+        } = that
+      // 仅限图片
+      if (file.type.indexOf('image') === -1) {
+        that.hasError = true
+        that.errorMsg = lang.error.onlyImg
+        return false
+      }
+      // 超出大小
+      if (file.size / 1024 > maxSize) {
+        that.hasError = true
+        that.errorMsg = lang.error.outOfSize + maxSize + 'kb'
+        return false
+      }
+      return true
+    },
+    // 重置控件
+    reset() {
+      const that = this
+      that.loading = 0
+      that.hasError = false
+      that.errorMsg = ''
+      that.progress = 0
+    },
+    // 设置图片源
+    setSourceImg(file) {
+      let that = this,
+        fr = new FileReader()
+      fr.onload = function(e) {
+        that.sourceImgUrl = fr.result
+        that.startCrop()
+      }
+      fr.readAsDataURL(file)
+    },
+    // 剪裁前准备工作
+    startCrop() {
+      let that = this,
+        {
+          width,
+          height,
+          ratio,
+          scale,
+          sourceImgUrl,
+          sourceImgMasking,
+          lang
+        } = that,
+        sim = sourceImgMasking,
+        img = new Image()
+      img.src = sourceImgUrl
+      img.onload = function() {
+        let nWidth = img.naturalWidth,
+          nHeight = img.naturalHeight,
+          nRatio = nWidth / nHeight,
+          w = sim.width,
+          h = sim.height,
+          x = 0,
+          y = 0
+        // 图片像素不达标
+        if (nWidth < width || nHeight < height) {
+          that.hasError = true
+          that.errorMsg = lang.error.lowestPx + width + '*' + height
+          return false
+        }
+        if (ratio > nRatio) {
+          h = w / nRatio
+          y = (sim.height - h) / 2
+        }
+        if (ratio < nRatio) {
+          w = h * nRatio
+          x = (sim.width - w) / 2
+        }
+        scale.range = 0
+        scale.x = x
+        scale.y = y
+        scale.width = w
+        scale.height = h
+        scale.degree = 0
+        scale.minWidth = w
+        scale.minHeight = h
+        scale.maxWidth = nWidth * sim.scale
+        scale.maxHeight = nHeight * sim.scale
+        scale.naturalWidth = nWidth
+        scale.naturalHeight = nHeight
+        that.sourceImg = img
+        that.createImg()
+        that.setStep(2)
+      }
+    },
+    // 鼠标按下图片准备移动
+    imgStartMove(e) {
+      e.preventDefault()
+      // 支持触摸事件,则鼠标事件无效
+      if (this.isSupportTouch && !e.targetTouches) {
+        return false
+      }
+      let et = e.targetTouches ? e.targetTouches[0] : e,
+        {
+          sourceImgMouseDown,
+          scale
+        } = this,
+        simd = sourceImgMouseDown
+      simd.mX = et.screenX
+      simd.mY = et.screenY
+      simd.x = scale.x
+      simd.y = scale.y
+      simd.on = true
+    },
+    // 鼠标按下状态下移动,图片移动
+    imgMove(e) {
+      e.preventDefault()
+      // 支持触摸事件,则鼠标事件无效
+      if (this.isSupportTouch && !e.targetTouches) {
+        return false
+      }
+      let et = e.targetTouches ? e.targetTouches[0] : e,
+        {
+          sourceImgMouseDown: {
+            on,
+            mX,
+            mY,
+            x,
+            y
+          },
+          scale,
+          sourceImgMasking
+        } = this,
+        sim = sourceImgMasking,
+        nX = et.screenX,
+        nY = et.screenY,
+        dX = nX - mX,
+        dY = nY - mY,
+        rX = x + dX,
+        rY = y + dY
+      if (!on) return
+      if (rX > 0) {
+        rX = 0
+      }
+      if (rY > 0) {
+        rY = 0
+      }
+      if (rX < sim.width - scale.width) {
+        rX = sim.width - scale.width
+      }
+      if (rY < sim.height - scale.height) {
+        rY = sim.height - scale.height
+      }
+      scale.x = rX
+      scale.y = rY
+    },
+     // 按钮按下开始向右旋转
+    startRotateRight(e) {
+      let that = this,
+        {
+          scale
+        } = that
+      scale.rotateRight = true
+      function rotate() {
+        if (scale.rotateRight) {
+          const degree = ++scale.degree
+          that.createImg(degree)
+          setTimeout(function() {
+            rotate()
+          }, 60)
+        }
+      }
+      rotate()
+    },
+    // 按钮按下开始向右旋转
+    startRotateLeft(e) {
+      let that = this,
+        {
+          scale
+        } = that
+      scale.rotateLeft = true
+      function rotate() {
+        if (scale.rotateLeft) {
+          const degree = --scale.degree
+          that.createImg(degree)
+          setTimeout(function() {
+            rotate()
+          }, 60)
+        }
+      }
+      rotate()
+    },
+    // 停止旋转
+    endRotate() {
+      const {
+        scale
+      } = this
+      scale.rotateLeft = false
+      scale.rotateRight = false
+    },
+    // 按钮按下开始放大
+    startZoomAdd(e) {
+      let that = this,
+        {
+          scale
+        } = that
+      scale.zoomAddOn = true
+      function zoom() {
+        if (scale.zoomAddOn) {
+          const range = scale.range >= 100 ? 100 : ++scale.range
+          that.zoomImg(range)
+          setTimeout(function() {
+            zoom()
+          }, 60)
+        }
+      }
+      zoom()
+    },
+    // 按钮松开或移开取消放大
+    endZoomAdd(e) {
+      this.scale.zoomAddOn = false
+    },
+    // 按钮按下开始缩小
+    startZoomSub(e) {
+      let that = this,
+        {
+          scale
+        } = that
+      scale.zoomSubOn = true
+      function zoom() {
+        if (scale.zoomSubOn) {
+          const range = scale.range <= 0 ? 0 : --scale.range
+          that.zoomImg(range)
+          setTimeout(function() {
+            zoom()
+          }, 60)
+        }
+      }
+      zoom()
+    },
+    // 按钮松开或移开取消缩小
+    endZoomSub(e) {
+      const {
+        scale
+      } = this
+      scale.zoomSubOn = false
+    },
+    zoomChange(e) {
+      this.zoomImg(e.target.value)
+    },
+    // 缩放原图
+    zoomImg(newRange) {
+      const that = this
+      const {
+        sourceImgMasking,
+        sourceImgMouseDown,
+        scale
+      } = this
+      const {
+        maxWidth,
+        maxHeight,
+        minWidth,
+        minHeight,
+        width,
+        height,
+        x,
+        y,
+        range
+      } = scale
+      const sim = sourceImgMasking
+      // 蒙版宽高
+      const sWidth = sim.width
+      const sHeight = sim.height
+      // 新宽高
+      const nWidth = minWidth + (maxWidth - minWidth) * newRange / 100
+      const nHeight = minHeight + (maxHeight - minHeight) * newRange / 100
+      // 新坐标(根据蒙版中心点缩放)
+      let nX = sWidth / 2 - (nWidth / width) * (sWidth / 2 - x)
+      let nY = sHeight / 2 - (nHeight / height) * (sHeight / 2 - y)
+      // 判断新坐标是否超过蒙版限制
+      if (nX > 0) {
+        nX = 0
+      }
+      if (nY > 0) {
+        nY = 0
+      }
+      if (nX < sWidth - nWidth) {
+        nX = sWidth - nWidth
+      }
+      if (nY < sHeight - nHeight) {
+        nY = sHeight - nHeight
+      }
+      // 赋值处理
+      scale.x = nX
+      scale.y = nY
+      scale.width = nWidth
+      scale.height = nHeight
+      scale.range = newRange
+      setTimeout(function() {
+        if (scale.range == newRange) {
+          that.createImg()
+        }
+      }, 300)
+    },
+     // 生成需求图片
+    createImg(e) {
+      let that = this,
+        {
+          mime,
+          sourceImg,
+          scale: {
+            x,
+            y,
+            width,
+            height,
+            degree
+          },
+          sourceImgMasking: {
+            scale
+          }
+        } = that,
+        canvas = that.$refs.canvas,
+        ctx = canvas.getContext('2d')
+      if (e) {
+        // 取消鼠标按下移动状态
+        that.sourceImgMouseDown.on = false
+      }
+      canvas.width = that.width
+      canvas.height = that.height
+      ctx.clearRect(0, 0, that.width, that.height)
+      // 将透明区域设置为白色底边
+      ctx.fillStyle = '#fff'
+      ctx.fillRect(0, 0, that.width, that.height)
+      ctx.translate(that.width * 0.5, that.height * 0.5)
+      ctx.rotate(Math.PI * degree / 180)
+      ctx.translate(-that.width * 0.5, -that.height * 0.5)
+      ctx.drawImage(sourceImg, x / scale, y / scale, width / scale, height / scale)
+      that.createImgUrl = canvas.toDataURL(mime)
+      
+      // this.getFiles= this.base64toFile(this.createImgUrl,'flif')
+    },
+    prepareUpload() {
+      const {
+        url,
+        createImgUrl,
+        field,
+        ki
+      } = this
+      this.$emit('crop-success', createImgUrl, field, ki)
+      if (typeof url === 'string' && url) {
+        this.getFiles = {0:this.base64toFile(this.createImgUrl,moment().format('YYYY/MM/DD')+'.png')}
+        this.go_oss_upload(this.getFiles)
+      } else {
+        this.off()
+      }
+    },
+    // 上传图片
+    upload() {
+      let that = this,
+        {
+          lang,
+          imgFormat,
+          mime,
+          url,
+          params,
+          headers,
+          field,
+          ki,
+          createImgUrl,
+          withCredentials
+        } = this,
+        fmData = new FormData()
+      fmData.append(field, data2blob(createImgUrl, mime), field + '.' + imgFormat)
+      // 添加其他参数
+      if (typeof params === 'object' && params) {
+        Object.keys(params).forEach((k) => {
+          fmData.append(k, params[k])
+        })
+      }
+      // 监听进度回调
+      const uploadProgress = function(event) {
+        if (event.lengthComputable) {
+          that.progress = 100 * Math.round(event.loaded) / event.total
+        }
+      }
+      // 上传文件
+      that.reset()
+      that.loading = 1
+      that.setStep(3)
+      request('post',url,fmData).then(resData => {
+        that.loading = 2
+        that.$emit('crop-upload-success', resData.data)
+      }).catch(err => {
+        if (that.value) {
+          that.loading = 3
+          that.hasError = true
+          that.errorMsg = lang.fail
+          that.$emit('crop-upload-fail', err, field, ki)
+        }
+      })
+    }
+  },
+  created() {
+    // 绑定按键esc隐藏此插件事件
+    document.addEventListener('keyup', (e) => {
+      if (this.value && (e.key == 'Escape' || e.keyCode == 27)) {
+        this.off()
+      }
+    })
+  }
+}
+</script>
+
+<!--
+<style lang='sass' src="./scss/upload.scss">
+</style> -->
+
+<style>
+@charset "UTF-8";
+@-webkit-keyframes vicp_progress {
+  0% {
+    background-position-y: 0; }
+  100% {
+    background-position-y: 40px; } }
+@keyframes vicp_progress {
+  0% {
+    background-position-y: 0; }
+  100% {
+    background-position-y: 40px; } }
+@-webkit-keyframes vicp {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale(0) translatey(-60px);
+            transform: scale(0) translatey(-60px); }
+  100% {
+    opacity: 1;
+    -webkit-transform: scale(1) translatey(0);
+            transform: scale(1) translatey(0); } }
+@keyframes vicp {
+  0% {
+    opacity: 0;
+    -webkit-transform: scale(0) translatey(-60px);
+            transform: scale(0) translatey(-60px); }
+  100% {
+    opacity: 1;
+    -webkit-transform: scale(1) translatey(0);
+            transform: scale(1) translatey(0); } }
+.vue-image-crop-upload {
+  position: fixed;
+  display: block;
+  -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+  z-index: 10000;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  width: 100%;
+  height: 100%;
+  background-color: rgba(0, 0, 0, 0.65);
+  -webkit-tap-highlight-color: transparent;
+  -moz-tap-highlight-color: transparent; }
+  .vue-image-crop-upload .vicp-wrap {
+    -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
+            box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
+    position: fixed;
+    display: block;
+    -webkit-box-sizing: border-box;
+            box-sizing: border-box;
+    z-index: 10000;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+    margin: auto;
+    width: 600px;
+    height: 330px;
+    padding: 25px;
+    background-color: #fff;
+    border-radius: 2px;
+    -webkit-animation: vicp 0.12s ease-in;
+            animation: vicp 0.12s ease-in; }
+    .vue-image-crop-upload .vicp-wrap .vicp-close {
+      position: absolute;
+      right: -30px;
+      top: -30px; }
+      .vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4 {
+        position: relative;
+        display: block;
+        width: 30px;
+        height: 30px;
+        cursor: pointer;
+        -webkit-transition: -webkit-transform 0.18s;
+        transition: -webkit-transform 0.18s;
+        transition: transform 0.18s;
+        transition: transform 0.18s, -webkit-transform 0.18s;
+        -webkit-transform: rotate(0);
+            -ms-transform: rotate(0);
+                transform: rotate(0); }
+        .vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::after, .vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::before {
+          -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
+                  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
+          content: '';
+          position: absolute;
+          top: 12px;
+          left: 4px;
+          width: 20px;
+          height: 3px;
+          -webkit-transform: rotate(45deg);
+              -ms-transform: rotate(45deg);
+                  transform: rotate(45deg);
+          background-color: #fff; }
+        .vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4::after {
+          -webkit-transform: rotate(-45deg);
+              -ms-transform: rotate(-45deg);
+                  transform: rotate(-45deg); }
+        .vue-image-crop-upload .vicp-wrap .vicp-close .vicp-icon4:hover {
+          -webkit-transform: rotate(90deg);
+              -ms-transform: rotate(90deg);
+                  transform: rotate(90deg); }
+    .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area {
+      position: relative;
+      -webkit-box-sizing: border-box;
+              box-sizing: border-box;
+      padding: 35px;
+      height: 170px;
+      background-color: rgba(0, 0, 0, 0.03);
+      text-align: center;
+      border: 1px dashed rgba(0, 0, 0, 0.08);
+      overflow: hidden; }
+      .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-icon1 {
+        display: block;
+        margin: 0 auto 6px;
+        width: 42px;
+        height: 42px;
+        overflow: hidden; }
+        .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-icon1 .vicp-icon1-arrow {
+          display: block;
+          margin: 0 auto;
+          width: 0;
+          height: 0;
+          border-bottom: 14.7px solid rgba(0, 0, 0, 0.3);
+          border-left: 14.7px solid transparent;
+          border-right: 14.7px solid transparent; }
+        .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-icon1 .vicp-icon1-body {
+          display: block;
+          width: 12.6px;
+          height: 14.7px;
+          margin: 0 auto;
+          background-color: rgba(0, 0, 0, 0.3); }
+        .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-icon1 .vicp-icon1-bottom {
+          -webkit-box-sizing: border-box;
+                  box-sizing: border-box;
+          display: block;
+          height: 12.6px;
+          border: 6px solid rgba(0, 0, 0, 0.3);
+          border-top: none; }
+      .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-hint {
+        display: block;
+        padding: 15px;
+        font-size: 14px;
+        color: #666;
+        line-height: 30px; }
+      .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area .vicp-no-supported-hint {
+        display: block;
+        position: absolute;
+        top: 0;
+        left: 0;
+        padding: 30px;
+        width: 100%;
+        height: 60px;
+        line-height: 30px;
+        background-color: #eee;
+        text-align: center;
+        color: #666;
+        font-size: 14px; }
+      .vue-image-crop-upload .vicp-wrap .vicp-step1 .vicp-drop-area:hover {
+        cursor: pointer;
+        border-color: rgba(0, 0, 0, 0.1);
+        background-color: rgba(0, 0, 0, 0.05); }
+    .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop {
+      overflow: hidden; }
+      .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left {
+        float: left; }
+        .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-img-container {
+          position: relative;
+          display: block;
+          width: 240px;
+          height: 180px;
+          background-color: #e5e5e0;
+          overflow: hidden; }
+          .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-img-container .vicp-img {
+            position: absolute;
+            display: block;
+            cursor: move;
+            -webkit-user-select: none;
+               -moz-user-select: none;
+                -ms-user-select: none;
+                    user-select: none; }
+          .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-img-container .vicp-img-shade {
+            -webkit-box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
+                    box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
+            position: absolute;
+            background-color: rgba(241, 242, 243, 0.8); }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-img-container .vicp-img-shade.vicp-img-shade-1 {
+              top: 0;
+              left: 0; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-img-container .vicp-img-shade.vicp-img-shade-2 {
+              bottom: 0;
+              right: 0; }
+        .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-rotate {
+          position: relative;
+          width: 240px;
+          height: 18px; }
+          .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-rotate i {
+            display: block;
+            width: 18px;
+            height: 18px;
+            border-radius: 100%;
+            line-height: 18px;
+            text-align: center;
+            font-size: 12px;
+            font-weight: bold;
+            background-color: rgba(0, 0, 0, 0.08);
+            color: #fff;
+            overflow: hidden; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-rotate i:hover {
+              -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
+                      box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
+              cursor: pointer;
+              background-color: rgba(0, 0, 0, 0.14); }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-rotate i:first-child {
+              float: left; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-rotate i:last-child {
+              float: right; }
+        .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range {
+          position: relative;
+          margin: 30px 0 10px 0;
+          width: 240px;
+          height: 18px; }
+          .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range .vicp-icon5,
+          .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range .vicp-icon6 {
+            position: absolute;
+            top: 0;
+            width: 18px;
+            height: 18px;
+            border-radius: 100%;
+            background-color: rgba(0, 0, 0, 0.08); }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range .vicp-icon5:hover,
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range .vicp-icon6:hover {
+              -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
+                      box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
+              cursor: pointer;
+              background-color: rgba(0, 0, 0, 0.14); }
+          .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range .vicp-icon5 {
+            left: 0; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range .vicp-icon5::before {
+              position: absolute;
+              content: '';
+              display: block;
+              left: 3px;
+              top: 8px;
+              width: 12px;
+              height: 2px;
+              background-color: #fff; }
+          .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range .vicp-icon6 {
+            right: 0; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range .vicp-icon6::before {
+              position: absolute;
+              content: '';
+              display: block;
+              left: 3px;
+              top: 8px;
+              width: 12px;
+              height: 2px;
+              background-color: #fff; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range .vicp-icon6::after {
+              position: absolute;
+              content: '';
+              display: block;
+              top: 3px;
+              left: 8px;
+              width: 2px;
+              height: 12px;
+              background-color: #fff; }
+          .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range] {
+            display: block;
+            padding-top: 5px;
+            margin: 0 auto;
+            width: 180px;
+            height: 8px;
+            vertical-align: top;
+            background: transparent;
+            -webkit-appearance: none;
+               -moz-appearance: none;
+                    appearance: none;
+            cursor: pointer;
+            /* 滑块
+               ---------------------------------------------------------------*/
+            /* 轨道
+               ---------------------------------------------------------------*/ }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]:focus {
+              outline: none; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]::-webkit-slider-thumb {
+              -webkit-box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
+                      box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
+              -webkit-appearance: none;
+                      appearance: none;
+              margin-top: -3px;
+              width: 12px;
+              height: 12px;
+              background-color: #61c091;
+              border-radius: 100%;
+              border: none;
+              -webkit-transition: 0.2s;
+              transition: 0.2s; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]::-moz-range-thumb {
+              box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
+              -moz-appearance: none;
+                   appearance: none;
+              width: 12px;
+              height: 12px;
+              background-color: #61c091;
+              border-radius: 100%;
+              border: none;
+              -webkit-transition: 0.2s;
+              transition: 0.2s; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]::-ms-thumb {
+              box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.18);
+              appearance: none;
+              width: 12px;
+              height: 12px;
+              background-color: #61c091;
+              border: none;
+              border-radius: 100%;
+              -webkit-transition: 0.2s;
+              transition: 0.2s; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]:active::-moz-range-thumb {
+              box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
+              width: 14px;
+              height: 14px; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]:active::-ms-thumb {
+              box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
+              width: 14px;
+              height: 14px; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]:active::-webkit-slider-thumb {
+              -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
+                      box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.23);
+              margin-top: -4px;
+              width: 14px;
+              height: 14px; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]::-webkit-slider-runnable-track {
+              -webkit-box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
+                      box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
+              width: 100%;
+              height: 6px;
+              cursor: pointer;
+              border-radius: 2px;
+              border: none;
+              background-color: rgba(68, 170, 119, 0.3); }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]::-moz-range-track {
+              box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
+              width: 100%;
+              height: 6px;
+              cursor: pointer;
+              border-radius: 2px;
+              border: none;
+              background-color: rgba(68, 170, 119, 0.3); }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]::-ms-track {
+              box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12);
+              width: 100%;
+              cursor: pointer;
+              background: transparent;
+              border-color: transparent;
+              color: transparent;
+              height: 6px;
+              border-radius: 2px;
+              border: none; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]::-ms-fill-lower {
+              background-color: rgba(68, 170, 119, 0.3); }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]::-ms-fill-upper {
+              background-color: rgba(68, 170, 119, 0.15); }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]:focus::-webkit-slider-runnable-track {
+              background-color: rgba(68, 170, 119, 0.5); }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]:focus::-moz-range-track {
+              background-color: rgba(68, 170, 119, 0.5); }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]:focus::-ms-fill-lower {
+              background-color: rgba(68, 170, 119, 0.45); }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-left .vicp-range input[type=range]:focus::-ms-fill-upper {
+              background-color: rgba(68, 170, 119, 0.25); }
+      .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-right {
+        float: right; }
+        .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-right .vicp-preview {
+          height: 150px;
+          overflow: hidden; }
+          .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-right .vicp-preview .vicp-preview-item {
+            position: relative;
+            padding: 5px;
+            width: 100px;
+            height: 100px;
+            float: left;
+            margin-right: 16px; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-right .vicp-preview .vicp-preview-item span {
+              position: absolute;
+              bottom: -30px;
+              width: 100%;
+              font-size: 14px;
+              color: #bbb;
+              display: block;
+              text-align: center; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-right .vicp-preview .vicp-preview-item img {
+              position: absolute;
+              display: block;
+              top: 0;
+              bottom: 0;
+              left: 0;
+              right: 0;
+              margin: auto;
+              padding: 3px;
+              background-color: #fff;
+              border: 1px solid rgba(0, 0, 0, 0.15);
+              overflow: hidden;
+              -webkit-user-select: none;
+                 -moz-user-select: none;
+                  -ms-user-select: none;
+                      user-select: none; }
+            .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-right .vicp-preview .vicp-preview-item.vicp-preview-item-circle {
+              margin-right: 0; }
+              .vue-image-crop-upload .vicp-wrap .vicp-step2 .vicp-crop .vicp-crop-right .vicp-preview .vicp-preview-item.vicp-preview-item-circle img {
+                border-radius: 100%; }
+    .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload {
+      position: relative;
+      -webkit-box-sizing: border-box;
+              box-sizing: border-box;
+      padding: 35px;
+      height: 170px;
+      background-color: rgba(0, 0, 0, 0.03);
+      text-align: center;
+      border: 1px dashed #ddd; }
+      .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-loading {
+        display: block;
+        padding: 15px;
+        font-size: 16px;
+        color: #999;
+        line-height: 30px; }
+      .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-progress-wrap {
+        margin-top: 12px;
+        background-color: rgba(0, 0, 0, 0.08);
+        border-radius: 3px; }
+        .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-progress-wrap .vicp-progress {
+          position: relative;
+          display: block;
+          height: 5px;
+          border-radius: 3px;
+          background-color: #4a7;
+          -webkit-box-shadow: 0 2px 6px 0 rgba(68, 170, 119, 0.3);
+                  box-shadow: 0 2px 6px 0 rgba(68, 170, 119, 0.3);
+          -webkit-transition: width 0.15s linear;
+          transition: width 0.15s linear;
+          background-image: -webkit-linear-gradient(135deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent);
+          background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0.2) 75%, transparent 75%, transparent);
+          background-size: 40px 40px;
+          -webkit-animation: vicp_progress 0.5s linear infinite;
+                  animation: vicp_progress 0.5s linear infinite; }
+          .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-progress-wrap .vicp-progress::after {
+            content: '';
+            position: absolute;
+            display: block;
+            top: -3px;
+            right: -3px;
+            width: 9px;
+            height: 9px;
+            border: 1px solid rgba(245, 246, 247, 0.7);
+            -webkit-box-shadow: 0 1px 4px 0 rgba(68, 170, 119, 0.7);
+                    box-shadow: 0 1px 4px 0 rgba(68, 170, 119, 0.7);
+            border-radius: 100%;
+            background-color: #4a7; }
+      .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-error,
+      .vue-image-crop-upload .vicp-wrap .vicp-step3 .vicp-upload .vicp-success {
+        height: 100px;
+        line-height: 100px; }
+    .vue-image-crop-upload .vicp-wrap .vicp-operate {
+      position: absolute;
+      right: 20px;
+      bottom: 20px; }
+      .vue-image-crop-upload .vicp-wrap .vicp-operate a {
+        position: relative;
+        float: left;
+        display: block;
+        margin-left: 10px;
+        width: 100px;
+        height: 36px;
+        line-height: 36px;
+        text-align: center;
+        cursor: pointer;
+        font-size: 14px;
+        color: #4a7;
+        border-radius: 2px;
+        overflow: hidden;
+        -webkit-user-select: none;
+           -moz-user-select: none;
+            -ms-user-select: none;
+                user-select: none; }
+        .vue-image-crop-upload .vicp-wrap .vicp-operate a:hover {
+          background-color: rgba(0, 0, 0, 0.03); }
+    .vue-image-crop-upload .vicp-wrap .vicp-error,
+    .vue-image-crop-upload .vicp-wrap .vicp-success {
+      display: block;
+      font-size: 14px;
+      line-height: 24px;
+      height: 24px;
+      color: #d10;
+      text-align: center;
+      vertical-align: top; }
+    .vue-image-crop-upload .vicp-wrap .vicp-success {
+      color: #4a7; }
+    .vue-image-crop-upload .vicp-wrap .vicp-icon3 {
+      position: relative;
+      display: inline-block;
+      width: 20px;
+      height: 20px;
+      top: 4px; }
+      .vue-image-crop-upload .vicp-wrap .vicp-icon3::after {
+        position: absolute;
+        top: 3px;
+        left: 6px;
+        width: 6px;
+        height: 10px;
+        border-width: 0 2px 2px 0;
+        border-color: #4a7;
+        border-style: solid;
+        -webkit-transform: rotate(45deg);
+            -ms-transform: rotate(45deg);
+                transform: rotate(45deg);
+        content: ''; }
+    .vue-image-crop-upload .vicp-wrap .vicp-icon2 {
+      position: relative;
+      display: inline-block;
+      width: 20px;
+      height: 20px;
+      top: 4px; }
+      .vue-image-crop-upload .vicp-wrap .vicp-icon2::after, .vue-image-crop-upload .vicp-wrap .vicp-icon2::before {
+        content: '';
+        position: absolute;
+        top: 9px;
+        left: 4px;
+        width: 13px;
+        height: 2px;
+        background-color: #d10;
+        -webkit-transform: rotate(45deg);
+            -ms-transform: rotate(45deg);
+                transform: rotate(45deg); }
+      .vue-image-crop-upload .vicp-wrap .vicp-icon2::after {
+        -webkit-transform: rotate(-45deg);
+            -ms-transform: rotate(-45deg);
+                transform: rotate(-45deg); }
+.e-ripple {
+  position: absolute;
+  border-radius: 100%;
+  background-color: rgba(0, 0, 0, 0.15);
+  background-clip: padding-box;
+  pointer-events: none;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-transform: scale(0);
+      -ms-transform: scale(0);
+          transform: scale(0);
+  opacity: 1; }
+  .e-ripple.z-active {
+    opacity: 0;
+    -webkit-transform: scale(2);
+        -ms-transform: scale(2);
+            transform: scale(2);
+    -webkit-transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
+    transition: opacity 1.2s ease-out, -webkit-transform 0.6s ease-out;
+    transition: opacity 1.2s ease-out, transform 0.6s ease-out;
+    transition: opacity 1.2s ease-out, transform 0.6s ease-out, -webkit-transform 0.6s ease-out; }
+</style>

+ 19 - 0
src/components/ImageCropper/utils/data2blob.js

@@ -0,0 +1,19 @@
+/**
+ * database64文件格式转换为2进制
+ *
+ * @param  {[String]} data dataURL 的格式为 “data:image/png;base64,****”,逗号之前都是一些说明性的文字,我们只需要逗号之后的就行了
+ * @param  {[String]} mime [description]
+ * @return {[blob]}      [description]
+ */
+export default function(data, mime) {
+  data = data.split(',')[1]
+  data = window.atob(data)
+  var ia = new Uint8Array(data.length)
+  for (var i = 0; i < data.length; i++) {
+    ia[i] = data.charCodeAt(i)
+  }
+  // canvas.toDataURL 返回的默认格式就是 image/png
+  return new Blob([ia], {
+    type: mime
+  })
+}

+ 39 - 0
src/components/ImageCropper/utils/effectRipple.js

@@ -0,0 +1,39 @@
+/**
+ * 点击波纹效果
+ *
+ * @param  {[event]} e        [description]
+ * @param  {[Object]} arg_opts [description]
+ * @return {[bollean]}          [description]
+ */
+export default function(e, arg_opts) {
+  var opts = Object.assign({
+    ele: e.target, // 波纹作用元素
+    type: 'hit', // hit点击位置扩散center中心点扩展
+    bgc: 'rgba(0, 0, 0, 0.15)' // 波纹颜色
+  }, arg_opts)
+  var target = opts.ele
+  if (target) {
+    var rect = target.getBoundingClientRect()
+    var ripple = target.querySelector('.e-ripple')
+    if (!ripple) {
+      ripple = document.createElement('span')
+      ripple.className = 'e-ripple'
+      ripple.style.height = ripple.style.width = Math.max(rect.width, rect.height) + 'px'
+      target.appendChild(ripple)
+    } else {
+      ripple.className = 'e-ripple'
+    }
+    switch (opts.type) {
+      case 'center':
+        ripple.style.top = (rect.height / 2 - ripple.offsetHeight / 2) + 'px'
+        ripple.style.left = (rect.width / 2 - ripple.offsetWidth / 2) + 'px'
+        break
+      default:
+        ripple.style.top = (e.pageY - rect.top - ripple.offsetHeight / 2 - document.body.scrollTop) + 'px'
+        ripple.style.left = (e.pageX - rect.left - ripple.offsetWidth / 2 - document.body.scrollLeft) + 'px'
+    }
+    ripple.style.backgroundColor = opts.bgc
+    ripple.className = 'e-ripple z-active'
+    return false
+  }
+}

+ 232 - 0
src/components/ImageCropper/utils/language.js

@@ -0,0 +1,232 @@
+export default {
+  zh: {
+    hint: '点击,或拖动图片至此处',
+    loading: '正在上传……',
+    noSupported: '浏览器不支持该功能,请使用IE10以上或其他现在浏览器!',
+    success: '上传成功',
+    fail: '图片上传失败',
+    preview: '图片预览',
+    btn: {
+      off: '取消',
+      close: '关闭',
+      back: '上一步',
+      save: '保存'
+    },
+    error: {
+      onlyImg: '仅限图片格式',
+      outOfSize: '单文件大小不能超过 ',
+      lowestPx: '图片最低像素为(宽*高):'
+    }
+  },
+  'zh-tw': {
+    hint: '點擊,或拖動圖片至此處',
+    loading: '正在上傳……',
+    noSupported: '瀏覽器不支持該功能,請使用IE10以上或其他現代瀏覽器!',
+    success: '上傳成功',
+    fail: '圖片上傳失敗',
+    preview: '頭像預覽',
+    btn: {
+      off: '取消',
+      close: '關閉',
+      back: '上一步',
+      save: '保存'
+    },
+    error: {
+      onlyImg: '僅限圖片格式',
+      outOfSize: '單文件大小不能超過 ',
+      lowestPx: '圖片最低像素為(寬*高):'
+    }
+  },
+  en: {
+    hint: 'Click or drag the file here to upload',
+    loading: 'Uploading…',
+    noSupported: 'Browser is not supported, please use IE10+ or other browsers',
+    success: 'Upload success',
+    fail: 'Upload failed',
+    preview: 'Preview',
+    btn: {
+      off: 'Cancel',
+      close: 'Close',
+      back: 'Back',
+      save: 'Save'
+    },
+    error: {
+      onlyImg: 'Image only',
+      outOfSize: 'Image exceeds size limit: ',
+      lowestPx: 'Image\'s size is too low. Expected at least: '
+    }
+  },
+  ro: {
+    hint: 'Atinge sau trage fișierul aici',
+    loading: 'Se încarcă',
+    noSupported: 'Browser-ul tău nu suportă acest feature. Te rugăm încearcă cu alt browser.',
+    success: 'S-a încărcat cu succes',
+    fail: 'A apărut o problemă la încărcare',
+    preview: 'Previzualizează',
+
+    btn: {
+      off: 'Anulează',
+      close: 'Închide',
+      back: 'Înapoi',
+      save: 'Salvează'
+    },
+
+    error: {
+      onlyImg: 'Doar imagini',
+      outOfSize: 'Imaginea depășește limita de: ',
+      loewstPx: 'Imaginea este prea mică; Minim: '
+    }
+  },
+  ru: {
+    hint: 'Нажмите, или перетащите файл в это окно',
+    loading: 'Загружаю……',
+    noSupported: 'Ваш браузер не поддерживается, пожалуйста, используйте IE10 + или другие браузеры',
+    success: 'Загрузка выполнена успешно',
+    fail: 'Ошибка загрузки',
+    preview: 'Предпросмотр',
+    btn: {
+      off: 'Отменить',
+      close: 'Закрыть',
+      back: 'Назад',
+      save: 'Сохранить'
+    },
+    error: {
+      onlyImg: 'Только изображения',
+      outOfSize: 'Изображение превышает предельный размер: ',
+      lowestPx: 'Минимальный размер изображения: '
+    }
+  },
+  'pt-br': {
+    hint: 'Clique ou arraste o arquivo aqui para carregar',
+    loading: 'Carregando…',
+    noSupported: 'Browser não suportado, use o IE10+ ou outro browser',
+    success: 'Sucesso ao carregar imagem',
+    fail: 'Falha ao carregar imagem',
+    preview: 'Pré-visualizar',
+    btn: {
+      off: 'Cancelar',
+      close: 'Fechar',
+      back: 'Voltar',
+      save: 'Salvar'
+    },
+    error: {
+      onlyImg: 'Apenas imagens',
+      outOfSize: 'A imagem excede o limite de tamanho: ',
+      lowestPx: 'O tamanho da imagem é muito pequeno. Tamanho mínimo: '
+    }
+  },
+  fr: {
+    hint: 'Cliquez ou glissez le fichier ici.',
+    loading: 'Téléchargement…',
+    noSupported: 'Votre navigateur n\'est pas supporté. Utilisez IE10 + ou un autre navigateur s\'il vous plaît.',
+    success: 'Téléchargement réussit',
+    fail: 'Téléchargement echoué',
+    preview: 'Aperçu',
+    btn: {
+      off: 'Annuler',
+      close: 'Fermer',
+      back: 'Retour',
+      save: 'Enregistrer'
+    },
+    error: {
+      onlyImg: 'Image uniquement',
+      outOfSize: 'L\'image sélectionnée dépasse la taille maximum: ',
+      lowestPx: 'L\'image sélectionnée est trop petite. Dimensions attendues: '
+    }
+  },
+  nl: {
+    hint: 'Klik hier of sleep een afbeelding in dit vlak',
+    loading: 'Uploaden…',
+    noSupported: 'Je browser wordt helaas niet ondersteund. Gebruik IE10+ of een andere browser.',
+    success: 'Upload succesvol',
+    fail: 'Upload mislukt',
+    preview: 'Voorbeeld',
+    btn: {
+      off: 'Annuleren',
+      close: 'Sluiten',
+      back: 'Terug',
+      save: 'Opslaan'
+    },
+    error: {
+      onlyImg: 'Alleen afbeeldingen',
+      outOfSize: 'De afbeelding is groter dan: ',
+      lowestPx: 'De afbeelding is te klein! Minimale afmetingen: '
+    }
+  },
+  tr: {
+    hint: 'Tıkla veya yüklemek istediğini buraya sürükle',
+    loading: 'Yükleniyor…',
+    noSupported: 'Tarayıcı desteklenmiyor, lütfen IE10+ veya farklı tarayıcı kullanın',
+    success: 'Yükleme başarılı',
+    fail: 'Yüklemede hata oluştu',
+    preview: 'Önizle',
+    btn: {
+      off: 'İptal',
+      close: 'Kapat',
+      back: 'Geri',
+      save: 'Kaydet'
+    },
+    error: {
+      onlyImg: 'Sadece resim',
+      outOfSize: 'Resim yükleme limitini aşıyor: ',
+      lowestPx: 'Resmin boyutu çok küçük. En az olması gereken: '
+    }
+  },
+  'es-MX': {
+    hint: 'Selecciona o arrastra una imagen',
+    loading: 'Subiendo...',
+    noSupported: 'Tu navegador no es soportado, porfavor usa IE10+ u otros navegadores mas recientes',
+    success: 'Subido exitosamente',
+    fail: 'Sucedió un error',
+    preview: 'Vista previa',
+    btn: {
+      off: 'Cancelar',
+      close: 'Cerrar',
+      back: 'Atras',
+      save: 'Guardar'
+    },
+    error: {
+      onlyImg: 'Unicamente imagenes',
+      outOfSize: 'La imagen excede el tamaño maximo:',
+      lowestPx: 'La imagen es demasiado pequeño. Se espera por lo menos:'
+    }
+  },
+  de: {
+    hint: 'Klick hier oder zieh eine Datei hier rein zum Hochladen',
+    loading: 'Hochladen…',
+    noSupported: 'Browser wird nicht unterstützt, bitte verwende IE10+ oder andere Browser',
+    success: 'Upload erfolgreich',
+    fail: 'Upload fehlgeschlagen',
+    preview: 'Vorschau',
+    btn: {
+      off: 'Abbrechen',
+      close: 'Schließen',
+      back: 'Zurück',
+      save: 'Speichern'
+    },
+    error: {
+      onlyImg: 'Nur Bilder',
+      outOfSize: 'Das Bild ist zu groß: ',
+      lowestPx: 'Das Bild ist zu klein. Mindestens: '
+    }
+  },
+  ja: {
+    hint: 'クリック・ドラッグしてファイルをアップロード',
+    loading: 'アップロード中...',
+    noSupported: 'このブラウザは対応されていません。IE10+かその他の主要ブラウザをお使いください。',
+    success: 'アップロード成功',
+    fail: 'アップロード失敗',
+    preview: 'プレビュー',
+    btn: {
+      off: 'キャンセル',
+      close: '閉じる',
+      back: '戻る',
+      save: '保存'
+    },
+    error: {
+      onlyImg: '画像のみ',
+      outOfSize: '画像サイズが上限を超えています。上限: ',
+      lowestPx: '画像が小さすぎます。最小サイズ: '
+    }
+  }
+}

+ 7 - 0
src/components/ImageCropper/utils/mimes.js

@@ -0,0 +1,7 @@
+export default {
+  'jpg': 'image/jpeg',
+  'png': 'image/png',
+  'gif': 'image/gif',
+  'svg': 'image/svg+xml',
+  'psd': 'image/photoshop'
+}

+ 140 - 0
src/components/PanThumb/index.vue

@@ -0,0 +1,140 @@
+<template>
+  <div class="pan-item" :style="{zIndex:zIndex,height:height,width:width}">
+    <div class="pan-info">
+      <div class="pan-info-roles-container">
+        <slot></slot>
+      </div>
+    </div>
+    <img class="pan-thumb" :src="image">
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'PanThumb',
+  props: {
+    image: {
+      type: String,
+      required: true
+    },
+    zIndex: {
+      type: Number,
+      default: 1
+    },
+    width: {
+      type: String,
+      default: '150px'
+    },
+    height: {
+      type: String,
+      default: '150px'
+    }
+  }
+}
+</script>
+
+<style scoped>
+.pan-item {
+  width: 200px;
+  height: 200px;
+  border-radius: 50%;
+  display: inline-block;
+  position: relative;
+  cursor: default;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
+}
+
+.pan-info-roles-container {
+  padding: 20px;
+  text-align: center;
+}
+
+.pan-thumb {
+  width: 100%;
+  height: 100%;
+  background-size: 100%;
+  border-radius: 50%;
+  overflow: hidden;
+  position: absolute;
+  transform-origin: 95% 40%;
+  transition: all 0.3s ease-in-out;
+}
+
+.pan-thumb:after {
+  content: '';
+  width: 8px;
+  height: 8px;
+  position: absolute;
+  border-radius: 50%;
+  top: 40%;
+  left: 95%;
+  margin: -4px 0 0 -4px;
+  background: radial-gradient(ellipse at center, rgba(14, 14, 14, 1) 0%, rgba(125, 126, 125, 1) 100%);
+  box-shadow: 0 0 1px rgba(255, 255, 255, 0.9);
+}
+
+.pan-info {
+  position: absolute;
+  width: inherit;
+  height: inherit;
+  border-radius: 50%;
+  overflow: hidden;
+  box-shadow: inset 0 0 0 5px rgba(0, 0, 0, 0.05);
+}
+
+.pan-info h3 {
+  color: #fff;
+  text-transform: uppercase;
+  position: relative;
+  letter-spacing: 2px;
+  font-size: 18px;
+  margin: 0 60px;
+  padding: 22px 0 0 0;
+  height: 85px;
+  font-family: 'Open Sans', Arial, sans-serif;
+  text-shadow: 0 0 1px #fff, 0 1px 2px rgba(0, 0, 0, 0.3);
+}
+
+.pan-info p {
+  color: #fff;
+  padding: 10px 5px;
+  font-style: italic;
+  margin: 0 30px;
+  font-size: 12px;
+  border-top: 1px solid rgba(255, 255, 255, 0.5);
+}
+
+.pan-info p a {
+  display: block;
+  color: #333;
+  width: 80px;
+  height: 80px;
+  background: rgba(255, 255, 255, 0.3);
+  border-radius: 50%;
+  color: #fff;
+  font-style: normal;
+  font-weight: 700;
+  text-transform: uppercase;
+  font-size: 9px;
+  letter-spacing: 1px;
+  padding-top: 24px;
+  margin: 7px auto 0;
+  font-family: 'Open Sans', Arial, sans-serif;
+  opacity: 0;
+  transition: transform 0.3s ease-in-out 0.2s, opacity 0.3s ease-in-out 0.2s, background 0.2s linear 0s;
+  transform: translateX(60px) rotate(90deg);
+}
+
+.pan-info p a:hover {
+  background: rgba(255, 255, 255, 0.5);
+}
+
+.pan-item:hover .pan-thumb {
+
+}
+
+.pan-item:hover .pan-info p a {
+  opacity: 1;
+  transform: translateX(0px) rotate(0deg);
+}
+</style>

+ 42 - 0
src/components/SvgIcon/index.vue

@@ -0,0 +1,42 @@
+<template>
+  <svg :class="svgClass" aria-hidden="true">
+    <use :xlink:href="iconName"></use>
+  </svg>
+</template>
+
+<script>
+export default {
+  name: 'svg-icon',
+  props: {
+    iconClass: {
+      type: String,
+      required: true
+    },
+    className: {
+      type: String
+    }
+  },
+  computed: {
+    iconName() {
+      return `#icon-${this.iconClass}`
+    },
+    svgClass() {
+      if (this.className) {
+        return 'svg-icon ' + this.className
+      } else {
+        return 'svg-icon'
+      }
+    }
+  }
+}
+</script>
+
+<style scoped>
+.svg-icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>

+ 50 - 0
src/components/noData.vue

@@ -0,0 +1,50 @@
+<template>
+    <div class="flex-box-v flex-v-zhu">
+      <img :src="imgUrl" style="width: 266px;height: 182px;margin: 30px auto;">
+      <div class="fontColorF" v-if="!isSolt">{{content}}</div>
+      <slot></slot>
+    </div>
+</template>
+<!-- content:为提示内容  -->
+<!-- imgUrl:为空值显示图片  -->
+<!-- isSolt:是否显示自定义内容  -->
+<script>
+  export default {
+    name:'noData',
+    props:{
+      content:{
+        type:String,
+        default:'暂无数据'
+      },
+      imgUrl:{
+         type:String,
+         default:'static/images/nodata.png'
+      },
+      isSolt:{
+        type:Boolean,
+        default:false
+      }
+    },
+    data(){
+      return{
+
+      }
+    },
+    methods:{
+
+    }
+  }
+</script>
+
+<style scoped="scoped">
+  .green{
+     color: #67c23a;
+  }
+  .blue{
+    color:#26a2ff;
+    cursor: pointer;
+  }
+  .fontColorF{
+    color:#909399;
+  }
+</style>

+ 178 - 0
src/components/season.vue

@@ -0,0 +1,178 @@
+<template>
+  <div>
+    <span @click="showDoubleMonth">
+      <el-input v-model="choseQuarter" prefix-icon="el-icon-date" :placeholder="defaultHint?yearFullMonth+'年 '+defaultQuarter:'请选择'" />
+    </span>
+    <div v-show="showTime1a" class="show1">
+      <p>
+        <button type="button" aria-label="前一年" class="el-picker-panel__icon-btn el-date-picker__prev-btn el-icon-d-arrow-left"
+          @click="prev" />
+        <span role="button" class="span-year">{{ year }}年</span>
+        <button type="button" aria-label="后一年" class="el-picker-panel__icon-btn el-date-picker__next-btn el-icon-d-arrow-right"
+          @click="next" />
+      </p>
+      <div>
+        <span v-for="(item,index) in fullMonth" :key="index" class="selectMonth" @click="selectQuarter(item)">
+               {{ item }}
+        </span>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import moment from "moment";
+  export default {
+    name: 'season',
+    data() {
+      return {
+        defaultQuarter:'',
+        quarterFullMonth:moment().format("Q"),//默认
+        yearFullMonth:moment().format("YYYY"),//默认
+        value: '',
+        showTime2: false,
+        showTime1a: false,
+        year: new Date().getFullYear(),
+        fullMonth: ['第一季度', '第二季度', '第三季度', '第四季度'],
+        choseQuarter: '',
+        choseQuarter1: ''
+      }
+    },
+    props:{
+      isActive:{
+        type:Boolean,
+        default:false
+      },
+      defaultHint:{
+        type:Boolean,
+        default:false
+      }
+    },
+    mounted() {
+      if(this.defaultHint){
+        this.defaultQuarter =this.quarterFullMonth == '1'?
+        '第一季度':this.quarterFullMonth == '2'?
+        '第二季度':this.quarterFullMonth == '3'?
+        '第三季度':this.quarterFullMonth == '4'?
+        '第四季度':''
+      }
+      
+      if(!this.isActive){
+        var date=new Date().getMonth()+1;
+        var arrs=this.fullMonth;
+        var str=""
+        if(date<=3){
+          str=arrs[0]
+        }else if(date<=6){
+          str=arrs[1]
+        }else if(date<=9){
+          str=arrs[2]
+        }else{
+          str=arrs[3]
+        }
+        this.selectQuarter(str);
+      }
+     },
+    methods: {
+      // 点击季度按钮
+      quarterTime() {
+        this.showTime2 = true
+        this.choseQuarter = ''
+        this.fullMonth = ['第一季度', '第二季度', '第三季度', '第四季度']
+      },
+      // 点击input框
+      showDoubleMonth() {
+        this.showTime1a = true
+      },
+      // 上一年
+      prev() {
+        this.year = this.year * 1 - 1
+      },
+      // 下一年
+      next() {
+        this.year = this.year * 1 + 1
+      },
+      // 点击选项事件
+      selectQuarter(item) {
+        switch (item) {
+          case '第一季度':
+            this.choseQuarter1 = this.year + '1'
+            this.choseQuarter = this.year + '年 第一季度'
+            break
+          case '第二季度':
+            this.choseQuarter1 = this.year + '2'
+            this.choseQuarter = this.year + '年 第二季度'
+            break
+          case '第三季度':
+            this.choseQuarter1 = this.year + '3'
+            this.choseQuarter = this.year + '年 第三季度'
+            break
+          case '第四季度':
+            this.choseQuarter1 = this.year + '4'
+            this.choseQuarter = this.year + '年 第四季度'
+            break
+        }
+        this.$emit('confirm', this.choseQuarter1)
+        this.showTime1a = false
+      }
+    }
+  }
+</script>
+<style scoped>
+  * {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+  }
+
+  .show1 {
+    width: 320px;
+    margin-top: 5px;
+    position: absolute;
+    z-index: 2;
+    height: auto;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
+    background: #fff;
+    padding: 5px;
+  }
+
+  .show1 p:nth-child(1) {
+    width: 100%;
+    height: 40px;
+    border-bottom: 1px solid #f5f5f5;
+    display: flex;
+    align-items: center;
+    justify-content: end;
+    padding: 0 10px;
+  }
+
+  .show1>div {
+    width: 100%;
+    height: auto;
+  }
+
+  .show1>div span {
+    width: 50%;
+  }
+
+  .selectMonth {
+    display: inline-block;
+    float: left;
+    width: 78px;
+    height: 40px;
+    line-height: 40px;
+    text-align: center;
+  }
+
+  .selectMonth:hover {
+    background: rgba(19, 131, 255, 0.052);
+  }
+
+  .span-year {
+    width: 90%;
+    margin: 0 auto;
+    display: inline-block;
+    text-align: center;
+    line-height: 40px;
+  }
+</style>

+ 141 - 0
src/components/user_image.vue

@@ -0,0 +1,141 @@
+<template>
+  <div>
+    <el-image 
+      v-if="info.img_url"
+      :src="info.img_url"
+      :style="{width: width, height: height}"
+      style="border-radius: 50%"
+      fit="fill"
+    >
+      <div slot="error" class="image-slot">
+        <i class="el-icon-picture"></i>
+      </div>
+    </el-image>
+    <!-- <ww-open-data v-if="info.img_url" type="userAvatarUrl" :openid="info.img_url"></ww-open-data> -->
+    <span class="img_round" v-else>
+      <div class="user_name_div" :style="{width: width, height: height,lineHeight: height, fontSize: fontSize + 'px'}">{{name}}</div>
+      <div class="user_img_bg" :style="{width: width, height: height}" ></div>
+    </span>
+  </div>
+</template>
+<script>
+  export default {
+    name: 'userImage',
+    props: {
+      width: {
+        type: String,
+        default: '0.8rem'
+      },
+      height: {
+        type: String,
+        default: '0.8rem'
+      },
+      id:{
+        type: Number,
+        default: 0
+      },
+      img_url: {
+        type: String,
+        default: ''
+      },
+      user_name: {
+        type: String,
+        default: ''
+      },
+      fontSize:{
+        type: String,
+        default: '16'
+      }
+    },
+    watch:{
+      id: function (val) {
+        this.set_info()
+        this.name_no()
+      },
+      img_url: function (val) {
+        this.set_info()
+        this.name_no()
+      },
+      user_name: function (val) {
+        this.set_info()
+        this.name_no()
+      }
+    },
+    // 数据
+    data(){
+      let info = this.$store.getters.employee_map[this.id] || {name:'',img_url: '',id:0}
+      if(this.img_url != ''){
+        info.img_url = this.img_url
+      }
+      if(this.user_name != ''){
+        info.name = this.user_name
+      }
+      return {
+        info: info,
+        name: '',
+      }
+    },
+    computed:{
+    },
+    // 方法
+    methods:{
+      set_info(){
+        let info = this.$store.getters.employee_map[this.id] || {name:'',img_url: '',id:0}
+
+        if(this.img_url != ''){
+          info.img_url = this.img_url
+        }
+        if(this.user_name != ''){
+          info.name = this.user_name
+        }
+        this.info = info
+      },
+      // 加载
+      name_no(){
+        if(!this.info.img_url){
+          let pattern = new RegExp("^[\u4E00-\u9FA5]+");
+          if(this.info.name.length > 2){
+            if(pattern.test(this.info.name)){
+              this.name = this.info.name.substring(this.info.name.length-2,this.info.name.length)
+            }else{
+              this.name = this.info.name.substring(0,2)
+            }
+          }else{
+            this.name = this.info.name
+          }
+        }
+      }
+    },
+    // 组件挂载完成
+    mounted() {
+      this.name_no()
+    },
+  }
+</script>
+<style scoped>
+  .img_round{
+    position: relative;
+    display: inline-block;
+    vertical-align: top;
+  }
+  .img_round .user_img_bg{
+    border-radius: 50%;
+    background: #238dfa;
+  }
+  .user_name_div{
+    position: absolute;
+    z-index: 1;
+    text-align: center;
+    color: #fff;
+  }
+  .logo_img{
+    border-radius: 50%;
+  }
+  /deep/ .image-slot{
+    font-size: 30px;
+    line-height: 50px;
+    text-align: center;
+    background: #f1f1f1;
+  }	
+  /deep/ .van-image{vertical-align: top;}
+</style>

+ 19 - 0
src/components/wwOpenDatac/ww_open_data.vue

@@ -0,0 +1,19 @@
+<template>
+  <ww-open-data :type="type" :openid="openid" />
+</template>
+<script>
+export default {
+  name: "ww_open_data",
+  props: ["type", "openid"],
+  watch: {
+    openid(item) {
+      this.$nextTick(() => {
+        WWOpenData.bind(this.$el);
+      });
+    }
+  },
+  mounted() {
+    WWOpenData.bind(this.$el);
+  },
+};
+</script>

+ 9 - 0
src/errorLog.js

@@ -0,0 +1,9 @@
+import Vue from 'vue'
+import store from './store'
+
+Vue.config.errorHandler = function(err, vm, info, a) {
+  Vue.nextTick(() => {
+    store.dispatch('addErrorLog', { err, vm,info, url: window.location.href})
+    console.error(err, info)
+  })
+}

+ 12 - 0
src/icons/index.js

@@ -0,0 +1,12 @@
+import Vue from 'vue'
+import SvgIcon from '@/components/SvgIcon'// svg组件
+import generateIconsView from '@/views/svg-icons/generateIconsView.js'// just for @/views/icons , you can delete it
+
+// register globally
+Vue.component('svg-icon', SvgIcon)
+
+const requireAll = requireContext => requireContext.keys().map(requireContext)
+const req = require.context('./svg', false, /\.svg$/)
+const iconMap = requireAll(req)
+
+generateIconsView.generate(iconMap) // just for @/views/icons , you can delete it

+ 1 - 0
src/icons/svg/404.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1503994850540" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10206" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M931.6 585.6l0 79c28.6-60.2 44.8-127.4 44.8-198.4C976.4 211 769.4 4 514.2 4S52 211 52 466.2c0 3.2 0.2 6.4 0.2 9.6l166-206 96.4 0L171.8 485.6l46.4 0 0-54.8 99.2-154.6 0 209.4 0 100 0 82.4-99.2 0 0-82.4L67.6 585.6c43 161 170.6 287.4 332.4 328.6-10.4 26.2-40.6 89.4-90.8 100.6-62.2 14 168.8 3.4 333.6-104.6 126.6-36.6 230.8-125.8 287.4-242.2l-97.6 0 0-82.4-166.2 0 0-87.2 0-12.8L666.4 476l166.2-206.2 94 0-140.4 215.8 46.4 0 0-59 99.2-154 0 213.2L931.8 585.6zM366.2 608c-4.8-11.2-7.2-23.2-7.2-36L359 357.6c0-12.8 2.4-24.8 7.2-36 4.8-11.2 11.4-21 19.6-29.2 8.2-8.2 18-14.8 29.2-19.6 11.2-4.8 23.2-7.2 36-7.2l81.6 0c12.8 0 24.8 2.4 36 7.2 11 4.8 20.6 11.2 28.8 19.2l-88.6 129.4 0-23c0-4.8-1.6-8.8-4.8-12-3.2-3.2-7.2-4.8-12-4.8-4.8 0-8.8 1.6-12 4.8-3.2 3.2-4.8 7.2-4.8 12l0 72L372.6 620C370.2 616.2 368 612.2 366.2 608zM624.4 572c0 12.8-2.4 24.8-7.2 36-4.8 11.2-11.4 21-19.6 29.2-8.2 8.2-18 14.8-29.2 19.6-11.2 4.8-23.2 7.2-36 7.2l-81.6 0c-12.8 0-24.8-2.4-36-7.2-11.2-4.8-21-11.4-29.2-19.6-3.6-3.6-7-7.8-10-12l99.2-144.6 0 50.6c0 4.8 1.6 8.8 4.8 12 3.2 3.2 7.2 4.8 12 4.8 4.8 0 8.8-1.6 12-4.8 3.2-3.2 4.8-7.2 4.8-12l0-99.6 92.6-135.2c6.6 7.4 12 15.8 16 25.2 4.8 11.2 7.2 23.2 7.2 36L624.2 572z" p-id="10207"></path></svg>

+ 1 - 0
src/icons/svg/A_points.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1607565279879" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="46192" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M833.8 896.3H190.4c-57.9 0-104.9-53.2-104.9-118.6V246.9c0-65.4 47.1-118.6 104.9-118.6h643.4c57.9 0 104.9 53.2 104.9 118.6 0 58.5-31.2 110.9-77.5 130.4-49.6 20.9-83 75.1-83 135 0 59.9 33.4 114.2 83 135 46.4 19.5 77.6 71.9 77.6 130.4 0 65.4-47.1 118.6-105 118.6z m-643.4-693c-21.3 0-38.7 19.6-38.7 43.7v530.8c0 24.1 17.4 43.7 38.7 43.7h643.4c21.3 0 38.7-19.6 38.7-43.7 0-27.3-13.8-51.6-34.4-60.1C762.7 685.9 712 603.5 712 512.4s50.7-173.6 126.1-205.2c20.6-8.7 34.4-32.9 34.4-60.1 0-24.1-17.4-43.7-38.7-43.7H190.4v-0.1z" p-id="46193" data-spm-anchor-id="a313x.7781069.0.i82" class="" fill="#707070"></path><path d="M397.6 370.2H282.4c-18.1 0-33.1-14.8-33.1-33.1 0-18.1 14.8-33.1 33.1-33.1h115.2c18.1 0 33.1 14.8 33.1 33.1s-14.9 33.1-33.1 33.1z" p-id="46194" data-spm-anchor-id="a313x.7781069.0.i83" class="" fill="#707070"></path></svg>

+ 1 - 0
src/icons/svg/Lottery_ticket_statistics.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1607566538399" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="48242" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M543.1 211h18.8c24.4 0 44.3-19.9 44.3-44.3s-19.9-44.3-44.3-44.3h-18.8c-24.3 0-44.3 19.9-44.3 44.3s20 44.3 44.3 44.3" p-id="48243" fill="#707070"></path><path d="M767.8 841.9l80.8-430.5L926 841.9H767.8z m254.5 36.5L892.8 159v-2.2c0-1.1-1.1-2.2-1.1-4.4s-1.1-3.3-2.2-5.5c0-1.1-1.1-2.2-2.2-3.3-1.1-2.2-2.2-3.3-3.3-4.4 0-1.1-1.1-1.1-1.1-2.2l-1.1-1.1-4.4-4.4c-1.1-1.1-2.2-1.1-2.2-2.2-1.1-1.1-3.3-2.2-5.5-3.3-1.1 0-2.2-1.1-2.2-1.1-2.2-1.1-5.5-2.2-8.9-3.3-3.3-1.1-5.5-1.1-8.8-1.1h-68.6c-24.3 0-44.3 19.9-44.3 44.3s19.9 44.3 44.3 44.3h15.5l-133 709.1H104.8l205.9-709.5h5.5c24.3 0 44.3-19.9 44.3-44.3 0-24.3-19.9-44.3-44.3-44.3h-38.7c-19.9 0-36.5 13.3-42.1 32.1L3 951.4c-4.4 13.3-1.1 27.7 6.6 38.7 8.9 11.1 21 17.7 35.4 17.7h655.2c21 0 39.8-15.5 43.2-36.5l7.7-42.1H978c13.3 0 25.5-5.5 34.3-15.5 8.9-8.8 12.2-22 10-35.3z" p-id="48244" fill="#707070"></path><path d="M400.3 298.4c3.3 1.1 6.6 1.1 10 1.1 19.9 0 38.7-13.3 43.2-34.3l45.4-194.8c5.5-24.3-8.9-47.6-33.2-53.1s-47.6 8.9-53.1 33.2l-45.4 194.8c-5.6 24.4 8.8 47.6 33.1 53.1M642.7 298.4c3.3 1.1 6.6 1.1 10 1.1 19.9 0 38.7-13.3 43.2-34.3l45.4-194.8c5.5-24.3-8.9-47.6-33.2-53.1-23.2-5.5-47.6 8.9-53.1 33.2l-45.4 194.8c-5.6 24.4 8.8 47.6 33.1 53.1" p-id="48245" fill="#707070"></path></svg>

+ 1 - 0
src/icons/svg/PCtutorial.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1605667702115" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10711" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M896.2 12H178.7C117.3 12 67.6 61.7 67.6 123.1v777.8c0 14.9 2.9 29.6 8.6 43.3 5.7 13.1 13.8 25.1 23.9 35.3 5.1 5 10.6 9.5 16.4 13.6 12.1 8 25.6 13.6 39.7 16.7 7.4 1.5 14.9 2.2 22.5 2.2h717.5c16 0 31.4-6.4 42.7-17.8a60.8 60.8 0 0 0 17.6-42.8V72c-0.2-33.2-27.2-60-60.3-60z m-412 83.3v226.4l-55.6-49.4c-15.8-14.1-39.7-14.1-55.6 0l-55.6 49.4V95.3h166.8z m388.9 822c0 6.3-5.1 11.4-11.4 11.4h-683c-15.3 0-27.8-12.4-27.8-27.8 0-15.3 12.4-27.8 27.8-27.8h683.1c6.3 0 11.4 5.1 11.4 11.4v32.8z m0-127.5c-3.8-0.3-7.6-0.3-11.4 0h-683c-9.4 0.1-18.7 1.4-27.8 3.9V123.1c0-15.3 12.4-27.8 27.8-27.8h55.6v319.2c0 16.4 9.6 31.4 24.6 38.1 15 6.7 32.6 4 44.8-7l97.2-86.4 97.2 86.7c7.6 6.8 17.5 10.6 27.8 10.6 5.8 0.1 11.6-1.2 16.9-3.6 15-6.7 24.7-21.6 24.7-38.1V95.3h305.6v694.5z" p-id="10712"></path></svg>

+ 1 - 0
src/icons/svg/PK.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1536573277731" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2611" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M515.794644 1024c-1.46516-0.293032-2.930319-0.73258-4.322221-0.879096a31.77931 31.77931 0 0 0-3.574989 0.879096h7.89721zM513.333176 0h-2.930319L50.709052 125.27114v377.425097c0 328.488768 248.066161 478.814137 460.807326 520.424667 223.114494-53.038775 461.525254-211.129489 461.525254-520.424667V125.27114z m372.795192 502.696237c0 262.410073-201.95759 381.527543-376.384833 431.049936-172.683703-42.343111-372.150522-156.918586-372.150522-431.049936V192.668479l374.289655-103.440263 374.275003 103.440263v310.027758z m-643.600629 91.132923l51.192674-322.188582h162.163857a347.638403 347.638403 0 0 1 35.031965 2.197739 98.561282 98.561282 0 0 1 37.918329 12.453856 60.174102 60.174102 0 0 1 26.856374 34.724281 114.150579 114.150579 0 0 1 3.926627 51.720132 151.790528 151.790528 0 0 1-14.768808 49.668908 102.912806 102.912806 0 0 1-33.347031 39.412792 111.557247 111.557247 0 0 1-38.255315 16.556303 260.344198 260.344198 0 0 1-49.229361 3.809414h-86.51767l-17.992159 112.084705z m197.195822-182.85191a43.192903 43.192903 0 0 0 20.688052-3.955931 32.673058 32.673058 0 0 0 12.234082-14.065531 67.573158 67.573158 0 0 0 7.149979-19.340106 34.094262 34.094262 0 0 0-2.080527-18.900558 17.860295 17.860295 0 0 0-7.999771-9.816569 31.969781 31.969781 0 0 0-12.102218-2.930319H360.37052l-11.281728 69.009014h90.634769z m246.454485 299.478609l-61.316926-102.707683-50.914294 44.833882-11.281729 58.313349h-76.715753l54.503935-279.552439h76.715753l-21.66971 106.663614 115.864817-106.81013 98.561282 0.146516-131.864359 126.150236 93.623695 152.523107z" fill="#ffffff" p-id="2612"></path></svg>

+ 1 - 0
src/icons/svg/Statistical_rankings.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1607565384028" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="46379" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M444.2 824.3c-33.9 0-61.9-26.1-64.9-59.2l-0.3-5.9V133.6c0-33.9 26.1-61.9 59.2-64.9l5.9-0.3h134.7c33.9 0 61.9 26.1 64.9 59.2l0.3 5.9v625.6c0 26.3-15.6 49.5-39.9 60l-5.7 2.2 1.1-0.7-3 1.4c-2.7 1-5.5 1.7-8.4 2l-4.3 0.3H444.2zM571.4 141H451.7v610.6h119.7V141zM268.8 222.4c33.9 0 61.9 26.1 64.9 59.2l0.3 5.9v471.6c0.1 34-25.9 62-59.2 65l-5.9 0.3H134.1c-33.9 0-61.9-26.1-64.9-59.2l-0.3-5.9V287.5c0-33.9 26.1-61.9 59.2-64.9l5.9-0.3h134.8z m620.3 125.1c33.9 0 61.9 26.1 64.9 59.2l0.3 5.9v346.5c0 34-26 61.9-59.2 64.9l-5.9 0.3H754.4c-33.9 0-61.9-26.1-64.9-59.2l-0.3-5.9V412.6c0-33.9 26.1-61.9 59.2-64.9l5.9-0.3h134.8zM261.3 295H141.6v456.7h119.7V295z m620.2 125.1H761.8v331.6h119.7V420.1zM915.9 879H107.2c-20.8 0-38.4 15.9-38.4 36.3s17.6 36.3 38.4 36.3H916c20.8 0 38.2-15.9 38.2-36.3S936.6 879 915.9 879z" p-id="46380" fill="#707070"></path></svg>

+ 1 - 0
src/icons/svg/abf.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1599025627375" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9267" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><defs><style type="text/css"></style></defs><path d="M512 85.3c235.6 0 426.7 191 426.7 426.7S747.6 938.7 512 938.7 85.3 747.6 85.3 512 276.4 85.3 512 85.3z m0 76.8c-193.2 0-349.9 156.6-349.9 349.9S318.8 861.9 512 861.9 861.9 705.2 861.9 512 705.2 162.1 512 162.1z" p-id="9268"></path><path d="M753.4 512L512 753.4 270.6 512 512 270.6 753.4 512z m-108.7 0L512 379.3 379.3 512 512 644.7 644.7 512z" p-id="9269"></path></svg>

+ 1 - 0
src/icons/svg/add.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1607649427768" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9971" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M461.5 12h103v447.5H1012v103H564.5V1012h-103V562.5H12v-103h449.5z" p-id="9972" data-spm-anchor-id="a313x.7781069.0.i0" class="selected" fill="#e6e6e6"></path></svg>

+ 1 - 0
src/icons/svg/application.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1536116219112" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1398" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M873.411765 219.858824h-153.6c-15.058824-120.470588-102.4-180.705882-207.811765-180.705883s-192.752941 60.235294-207.811765 180.705883H150.588235l-60.235294 783.058823h843.294118l-60.235294-783.058823z m-361.411765-120.470589c72.282353 0 132.517647 30.117647 147.576471 120.470589h-295.152942c15.058824-90.352941 75.294118-120.470588 147.576471-120.470589z m-355.388235 843.294118l51.2-662.588235h608.37647l51.2 662.588235H156.611765z" fill="#ffffff" p-id="1399"></path></svg>

+ 1 - 0
src/icons/svg/attendance.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1538191928080" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2045" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M425.946 813.571c71.18 69.952 100.864 69.942 172.047 0 85.852-84.355 160.579-192.667 210.614-301.94 28.632-62.526 43.148-116.528 43.148-160.504 0-89.922-35.951-176.676-99.523-240.25-63.577-63.575-150.339-99.524-240.265-99.524-90.756 0-176.074 35.345-240.235 99.525-63.56 63.578-99.484 150.334-99.484 240.248 0 43.976 14.513 97.977 43.136 160.503C265.4 620.899 340.109 729.215 425.946 813.571L425.946 813.571zM231.139 351.124c0-151.612 125.982-280.877 280.827-280.877 151.758 0 280.896 125.907 280.896 280.88 0 66.07-46.265 171.218-123.758 281.268-43.057 61.138-96.648 130.752-157.137 176.143-60.48-45.374-114.065-115.01-157.102-176.139C277.392 522.352 231.139 417.202 231.139 351.124z" p-id="2046" fill="#ffffff"></path><path d="M511.972 530.346c98.835 0 179.244-80.396 179.244-179.217 0-98.828-80.409-179.231-179.244-179.231-98.803 0-179.187 80.402-179.187 179.231C332.785 449.95 413.167 530.346 511.972 530.346zM387.675 351.13c0-33.209 12.931-64.432 36.409-87.92 23.477-23.486 54.688-36.421 87.887-36.421 33.217 0 64.447 12.935 87.934 36.424 23.485 23.485 36.419 54.708 36.419 87.915 0 33.211-12.933 64.433-36.416 87.913-23.486 23.481-54.716 36.413-87.938 36.413-33.202 0-64.416-12.931-87.89-36.408C400.603 415.567 387.675 384.344 387.675 351.13L387.675 351.13z" p-id="2047" fill="#ffffff"></path><path d="M914.45 653.666 780.483 653.666c-10.665 19.845-22.082 39.522-34.164 58.894l125.454 0 70.931 241.196-859.019 0 76.004-241.196 117.961 0c-12.079-19.371-23.492-39.049-34.153-58.892L118.223 653.668 0 1012.647l1024 0L914.45 653.666 914.45 653.666z" p-id="2048" fill="#ffffff"></path></svg>

+ 1 - 0
src/icons/svg/attendance_b.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1556007086016" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3388" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><defs><style type="text/css"></style></defs><path d="M832 64h-64V32a32 32 0 0 0-64 0v32H320V32a32 32 0 0 0-64 0v32h-64A128 128 0 0 0 64 192v640a128 128 0 0 0 128 128h640a128 128 0 0 0 128-128V192A128 128 0 0 0 832 64z m64 768a64 64 0 0 1-64 64H192a64 64 0 0 1-64-64V192a64 64 0 0 1 64-64h64v32a32 32 0 0 0 64 0v-32h384v32a32 32 0 0 0 64 0v-32h64a64 64 0 0 1 64 64v640z" p-id="3389"></path><path d="M388.224 329.536l-103.36 103.488-39.808-39.872a31.104 31.104 0 0 0-43.904 43.904l65.792 65.856a31.168 31.168 0 0 0 34.048 6.528 33.856 33.856 0 0 0 13.632-8.064l122.688-122.752a34.816 34.816 0 0 0 0-49.088 34.816 34.816 0 0 0-49.088 0zM544 416h-64a32 32 0 0 0 0 64h64a32 32 0 0 0 0-64z m224 0h-64a32 32 0 0 0 0 64h64a32 32 0 0 0 0-64zM544 608h-64a32 32 0 0 0 0 64h64a32 32 0 0 0 0-64z m224 0h-64a32 32 0 0 0 0 64h64a32 32 0 0 0 0-64z m-448 0h-64a32 32 0 0 0 0 64h64a32 32 0 0 0 0-64z" p-id="3390"></path></svg>

+ 16 - 0
src/icons/svg/attendance_classnew_icon.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#979797;}
+</style>
+<title>编组</title>
+<desc>Created with Sketch.</desc>
+<path class="st0" d="M768,170.7h-42.7V128c0-23.6-19.1-42.7-42.7-42.7c-23.6,0-42.7,19.1-42.7,42.7v42.7H384V128
+	c0-23.6-19.1-42.7-42.7-42.7c-23.6,0-42.7,19.1-42.7,42.7v42.7H256c-70.6,0-128,57.4-128,128v512c0,70.6,57.4,128,128,128h512
+	c70.6,0,128-57.4,128-128v-512C896,228.1,838.6,170.7,768,170.7z M213.3,298.7c0-23.5,19.1-42.7,42.7-42.7h42.7v42.7
+	c0,23.6,19.1,42.7,42.7,42.7c23.6,0,42.7-19.1,42.7-42.7V256h256v42.7c0,23.6,19.1,42.7,42.7,42.7c23.6,0,42.7-19.1,42.7-42.7V256
+	H768c23.5,0,42.7,19.1,42.7,42.7v128H213.3V298.7z M768,853.3H256c-23.5,0-42.7-19.1-42.7-42.7V512h597.3v298.7
+	C810.7,834.2,791.5,853.3,768,853.3z"/>
+</svg>

+ 18 - 0
src/icons/svg/attendance_datanew_icon.svg

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#909399;}
+</style>
+<title>编组</title>
+<desc>Created with Sketch.</desc>
+<g id="编组" transform="translate(12.000000, 12.000000) rotate(-270.000000) translate(-12.000000, -12.000000) translate(3.000000, 3.000000)">
+	<path id="矩形" class="st0" d="M167.7-789.7L167.7-789.7c23.6,0,42.7,19.1,42.7,42.7v597.3c0,23.6-19.1,42.7-42.7,42.7l0,0
+		c-23.6,0-42.7-19.1-42.7-42.7V-747C125-770.6,144.1-789.7,167.7-789.7z"/>
+	<path id="矩形备份-4" class="st0" d="M509-619L509-619c23.6,0,42.7,19.1,42.7,42.7v426.7c0,23.6-19.1,42.7-42.7,42.7l0,0
+		c-23.6,0-42.7-19.1-42.7-42.7v-426.7C466.3-599.9,485.4-619,509-619z"/>
+	<path id="矩形备份-5" class="st0" d="M850.3-875L850.3-875c23.6,0,42.7,19.1,42.7,42.7v682.7c0,23.6-19.1,42.7-42.7,42.7l0,0
+		c-23.6,0-42.7-19.1-42.7-42.7v-682.7C807.7-855.9,826.8-875,850.3-875z"/>
+</g>
+</svg>

+ 1 - 0
src/icons/svg/attendance_group.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1556007047358" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2591" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><defs><style type="text/css"></style></defs><path d="M512 64c-192 0-339.2 153.6-345.6 345.6 0 140.8 192 403.2 288 524.8 25.6 32 76.8 32 102.4 6.4l6.4-6.4c96-128 288-384 288-524.8C851.2 217.6 704 64 512 64z m0 569.6c-121.6 0-224-102.4-224-224s102.4-224 224-224 224 102.4 224 224-102.4 224-224 224zM544 288h-64v192h192v-64H544V288z" p-id="2592"></path></svg>

+ 22 - 0
src/icons/svg/attendance_groupnew_icon.svg

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill-rule:evenodd;clip-rule:evenodd;fill:#909399;}
+</style>
+<title>编组</title>
+<desc>Created with Sketch.</desc>
+<g>
+	<g>
+		<path class="st0" d="M871,67.7c-16.1-16.1-37.5-25-60.4-25H213.3c-22.8,0-44.3,8.9-60.3,25c-16.1,16.1-25,37.5-25,60.7l5.3,740.7
+			l5.1,9.4c10.9,20,29,34.5,50.8,41c7.9,2.3,16.1,3.5,24.1,3.5c14.1,0,28.1-3.5,40.8-10.5L518.7,768l250,141.4
+			c32.7,18.4,76,12.4,102.3-14c16.1-16.1,25-37.5,25-60.3V128C896,105.2,887.1,83.8,871,67.7z M810.7,835.1L519.4,670.4l-301,164.4
+			L213.3,128h597.3V835.1z"/>
+		<path class="st0" d="M298.7,341.3H512c23.6,0,42.7-19.1,42.7-42.7c0-23.6-19.1-42.7-42.7-42.7H298.7c-23.6,0-42.7,19.1-42.7,42.7
+			C256,322.2,275.1,341.3,298.7,341.3z"/>
+		<path class="st0" d="M298.7,512H512c23.6,0,42.7-19.1,42.7-42.7s-19.1-42.7-42.7-42.7H298.7c-23.6,0-42.7,19.1-42.7,42.7
+			S275.1,512,298.7,512z"/>
+	</g>
+</g>
+</svg>

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
src/icons/svg/attendance_hioldaynew_icon.svg


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
src/icons/svg/attendance_machine.svg


+ 16 - 0
src/icons/svg/attendance_machinenew_icon.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#979797;}
+</style>
+<title>编组</title>
+<desc>Created with Sketch.</desc>
+<path class="st0" d="M810.7,334.4H542.9c17.5-55.2,15.6-99.4-6-134.1c-26.3-42.5-78.7-64-155.7-64l-37.1,0.1
+	c-43,0.1-80.5,0.2-92.8-2.7c-1.8-3.8-4.5-10.8-6.7-16.6c-5-13.1-11.2-29.6-21.3-50.4c-10.3-21.2-35.9-30-57-19.7
+	c-21.2,10.3-30,35.8-19.7,57c8.6,17.8,14,32,18.2,43.2c28.3,75,54.4,74.6,179.5,74.5l36.9-0.1c43.6,0,73.9,8.6,83.2,23.6
+	c4.8,7.8,12,31.3-12.5,89.1H213.3c-70.6,0-128,57.4-128,128v341.3c0,70.6,57.4,128,128,128h597.3c70.6,0,128-57.4,128-128V462.4
+	C938.7,391.8,881.2,334.4,810.7,334.4z M853.3,803.7c0,23.5-19.1,42.7-42.7,42.7H213.3c-23.5,0-42.7-19.1-42.7-42.7V462.4
+	c0-23.5,19.1-42.7,42.7-42.7h597.3c23.5,0,42.7,19.1,42.7,42.7V803.7z"/>
+</svg>

+ 20 - 0
src/icons/svg/attendance_overtime_rulenew_icon.svg

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#909399;}
+</style>
+<title>编组</title>
+<desc>Created with Sketch.</desc>
+<g>
+	<path class="st0" d="M369.2,268.7c-29,15.3-36.2,53.6-16,85.4c14.5,22.9,39.4,36.3,62.9,36.3c9.1,0,18.1-2,26.2-6.3
+		c29-15.3,36.2-53.6,16-85.4C438.2,266.9,398.3,253.4,369.2,268.7z"/>
+	<path class="st0" d="M558.9,804c-2.1,5.1-3,10.3-3,15.5H422c-67.2,0-121.6,50.9-121.6,113.8H896c0-62.8-54.4-113.8-121.6-113.8
+		H650.2L812.1,430L656.3,214.8l28.6-40.1c14-19.6,8.3-46.1-12.6-59.2c-20.9-13.1-49.2-7.8-63.2,11.8l-38,53.4
+		c-84-92.1-217.9-123.4-320.8-67.8c-117.9,63.7-150.8,217.8-73.3,343.4c54.7,88.7,150.1,139.9,242.9,139.9
+		c38.7,0,76.9-8.8,111.5-27.6c79.6-43,120.3-127.2,114.6-216l63.8,88.2L558.9,804z M563.4,413.3c-10.6,39.5-35.5,71.5-70.1,90.2
+		c-81.5,44-193.4,5.8-249.6-85.3c-29.1-47.2-38.4-101.9-25.5-150c10.6-39.5,35.4-71.5,70-90.2c22.3-12,47.1-18.1,73.8-18.1
+		c68.1,0,137.1,40.6,175.9,103.4C567,310.5,576.3,365.2,563.4,413.3z"/>
+</g>
+</svg>

+ 1 - 0
src/icons/svg/attendance_rating_icon.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1611364216268" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="19463" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M534.7 148.3h-45.5c-25.1 0-45.5 20.3-45.5 45.5v636.3c0 25.1 20.3 45.5 45.5 45.5h45.5c25.1 0 45.5-20.3 45.5-45.5V193.8c0-25.1-20.4-45.5-45.5-45.5zM762 512h-45.5c-25.1 0-45.5 20.3-45.5 45.5v272.7c0 25.1 20.3 45.5 45.5 45.5H762c25.1 0 45.5-20.3 45.5-45.5V557.5c0-25.2-20.4-45.5-45.5-45.5zM307.5 352.9H262c-25.1 0-45.5 20.3-45.5 45.5v431.8c0 25.1 20.3 45.5 45.5 45.5h45.5c25.1 0 45.5-20.3 45.5-45.5V398.3c-0.1-25.1-20.5-45.4-45.5-45.4z" p-id="19464" fill="#8a8a8a"></path></svg>

+ 16 - 0
src/icons/svg/attendance_reviewnew_icon.svg

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#909399;}
+</style>
+<title>编组</title>
+<desc>Created with Sketch.</desc>
+<path class="st0" d="M810.7,682.7h-59.7L565.2,417.3c68-22.5,117.5-85.9,117.5-161.3c0-94.1-76.5-170.7-170.7-170.7
+	c-94.1,0-170.7,76.6-170.7,170.7c0,75.4,49.5,138.8,117.5,161.3L273.1,682.7h-59.8c-70.6,0-128,57.4-128,128s57.4,128,128,128h597.3
+	c70.6,0,128-57.4,128-128S881.2,682.7,810.7,682.7z M426.7,256c0-47.1,38.3-85.3,85.3-85.3c47,0,85.3,38.3,85.3,85.3
+	S559,341.3,512,341.3C464.9,341.3,426.7,303.1,426.7,256z M512,490.1l134.8,192.5H377.2L512,490.1z M810.7,853.3H213.3
+	c-23.5,0-42.7-19.1-42.7-42.7c0-23.5,19.1-42.7,42.7-42.7h0h597.3c23.5,0,42.7,19.1,42.7,42.7C853.3,834.2,834.2,853.3,810.7,853.3z
+	"/>
+</svg>

+ 20 - 0
src/icons/svg/attendance_statisticnew_icon.svg

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#909399;}
+</style>
+<title>编组</title>
+<desc>Created with Sketch.</desc>
+<g>
+	<path class="st0" d="M768,85.3H256c-70.6,0-128,57.4-128,128v597.3c0,70.6,57.4,128,128,128h512c70.6,0,128-57.4,128-128V213.3
+		C896,142.8,838.6,85.3,768,85.3z M810.7,810.7c0,23.5-19.1,42.7-42.7,42.7H256c-23.5,0-42.7-19.1-42.7-42.7V213.3
+		c0-23.5,19.1-42.7,42.7-42.7h512c23.5,0,42.7,19.1,42.7,42.7V810.7z"/>
+	<path class="st0" d="M640,640H384c-23.6,0-42.7,19.1-42.7,42.7c0,23.6,19.1,42.7,42.7,42.7h256c23.6,0,42.7-19.1,42.7-42.7
+		C682.7,659.1,663.6,640,640,640z"/>
+	<path class="st0" d="M695.3,276.6L557.5,413.2l-115.3-45c-15-5.9-32.2-2.7-44.2,8.2L277.1,486.5c-17.4,15.9-18.7,42.9-2.8,60.3
+		c8.4,9.2,20,13.9,31.6,13.9c10.2,0,20.5-3.7,28.7-11.1l101.3-92.3l116.5,45.5c15.7,6.1,33.6,2.5,45.5-9.5l157.5-156.2
+		c16.8-16.6,16.8-43.6,0.2-60.3C739.1,260.1,712.1,260,695.3,276.6z"/>
+</g>
+</svg>

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
src/icons/svg/auth.svg


+ 123 - 0
src/icons/svg/bar-stack.html

@@ -0,0 +1,123 @@
+<!DOCTYPE html>
+<html style="height: 100%">
+   <head>
+       <meta charset="utf-8">
+   </head>
+   <body style="height: 100%; margin: 0">
+       <div id="container" style="height: 100%"></div>
+       <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script>
+       <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-gl/echarts-gl.min.js"></script>
+       <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts-stat/ecStat.min.js"></script>
+       <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/dataTool.min.js"></script>
+       <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js"></script>
+       <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/map/js/world.js"></script>
+       <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=ZUONbpqGBsYGXNIYHicvbAbM"></script>
+       <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/extension/bmap.min.js"></script>
+       <script type="text/javascript" src="http://echarts.baidu.com/gallery/vendors/simplex.js"></script>
+       <script type="text/javascript">
+var dom = document.getElementById("container");
+var myChart = echarts.init(dom);
+var app = {};
+option = null;
+app.title = '堆叠柱状图';
+
+option = {
+    tooltip : {
+        trigger: 'axis',
+        axisPointer : {
+            type : 'shadow'
+        }
+    },
+    legend: {
+        data:['直接访问','邮件营销','联盟广告','视频广告','搜索引擎','百度','谷歌','必应','其他']
+    },
+    grid: {
+        left: '3%',
+        right: '4%',
+        bottom: '3%',
+        containLabel: true
+    },
+    xAxis : [
+        {
+            type : 'category',
+            data : ['周一','周二','周三','周四','周五','周六','周日']
+        }
+    ],
+    yAxis : [
+        {
+            type : 'value'
+        }
+    ],
+    series : [
+        {
+            name:'直接访问',
+            type:'bar',
+            data:[320, 332, 301, 334, 390, 330, 320]
+        },
+        {
+            name:'邮件营销',
+            type:'bar',
+            stack: '广告',
+            data:[120, 132, 101, 134, 90, 230, 210]
+        },
+        {
+            name:'联盟广告',
+            type:'bar',
+            stack: '广告',
+            data:[220, 182, 191, 234, 290, 330, 310]
+        },
+        {
+            name:'视频广告',
+            type:'bar',
+            stack: '广告',
+            data:[150, 232, 201, 154, 190, 330, 410]
+        },
+        {
+            name:'搜索引擎',
+            type:'bar',
+            data:[862, 1018, 964, 1026, 1679, 1600, 1570],
+            markLine : {
+                lineStyle: {
+                    normal: {
+                        type: 'dashed'
+                    }
+                },
+                data : [
+                    [{type : 'min'}, {type : 'max'}]
+                ]
+            }
+        },
+        {
+            name:'百度',
+            type:'bar',
+            barWidth : 5,
+            stack: '搜索引擎',
+            data:[620, 732, 701, 734, 1090, 1130, 1120]
+        },
+        {
+            name:'谷歌',
+            type:'bar',
+            stack: '搜索引擎',
+            data:[120, 132, 101, 134, 290, 230, 220]
+        },
+        {
+            name:'必应',
+            type:'bar',
+            stack: '搜索引擎',
+            data:[60, 72, 71, 74, 190, 130, 110]
+        },
+        {
+            name:'其他',
+            type:'bar',
+            stack: '搜索引擎',
+            data:[62, 82, 91, 84, 109, 110, 120]
+        }
+    ]
+};
+;
+if (option && typeof option === "object") {
+    myChart.setOption(option, true);
+}
+       </script>
+   </body>
+</html>

+ 1 - 0
src/icons/svg/bug.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1503994864347" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10314" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M969.142857 548.571429q0 14.848-10.861714 25.709714t-25.709714 10.861714l-128 0q0 97.718857-38.290286 165.705143l118.857143 119.442286q10.861714 10.861714 10.861714 25.709714t-10.861714 25.709714q-10.276571 10.861714-25.709714 10.861714t-25.709714-10.861714l-113.152-112.566857q-2.852571 2.852571-8.557714 7.424t-23.990857 16.274286-37.156571 20.845714-46.848 16.566857-55.442286 7.424l0-512-73.142857 0 0 512q-29.147429 0-58.002286-7.716571t-49.700571-18.870857-37.705143-22.272-24.868571-18.578286l-8.557714-8.009143-104.557714 118.272q-11.446857 11.995429-27.428571 11.995429-13.714286 0-24.576-9.142857-10.861714-10.276571-11.702857-25.417143t8.850286-26.587429l115.419429-129.718857q-33.133714-65.133714-33.133714-156.562286l-128 0q-14.848 0-25.709714-10.861714t-10.861714-25.709714 10.861714-25.709714 25.709714-10.861714l128 0 0-168.009143-98.852571-98.852571q-10.861714-10.861714-10.861714-25.709714t10.861714-25.709714 25.709714-10.861714 25.709714 10.861714l98.852571 98.852571 482.304 0 98.852571-98.852571q10.861714-10.861714 25.709714-10.861714t25.709714 10.861714 10.861714 25.709714-10.861714 25.709714l-98.852571 98.852571 0 168.009143 128 0q14.848 0 25.709714 10.861714t10.861714 25.709714zM694.857143 219.428571l-365.714286 0q0-75.995429 53.430857-129.426286t129.426286-53.430857 129.426286 53.430857 53.430857 129.426286z" p-id="10315"></path></svg>

+ 1 - 0
src/icons/svg/changePwd.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M808.116706 436.705882H342.211765l0.105411-178.567529c0-94.960941 67.087059-170.556235 158.08753-170.556235 91.979294 0 157.153882 72.342588 157.153882 169.878588v88.018823c0 23.657412 20.193882 43.640471 44.468706 43.640471 16.986353 0 37.225412-12.167529 46.757647-33.400471 0 0 3.538824-8.583529 3.538824-11.821176l0.015059-86.934588C752.353882 113.091765 643.644235 0 504.726588 0c-138.420706 0-248.410353 112.745412-250.413176 253.590588-0.316235 6.159059-0.572235 122.88-0.692706 183.115294h-60.626824c-44.815059 0-77.552941 31.488-77.552941 76.303059v427.956706c0 44.815059 32.737882 83.019294 77.552941 83.019294h615.107765c44.815059 0 90.398118-38.204235 90.398118-83.019294V513.008941C898.514824 468.193882 852.931765 436.705882 808.116706 436.705882zM567.356235 757.729882c-4.894118 3.011765-0.135529 8.854588-0.135529 8.854589v26.729411c0 18.928941-20.916706 34.906353-40.026353 34.906353h-26.699294c-18.853647 0-23.627294-15.36-23.627294-34.906353v-29.108706s-2.710588-4.894118-6.475294-8.493176c-19.049412-16.579765-30.343529-35.749647-30.34353-55.853176 0-40.086588 34.936471-73.953882 77.040941-73.953883 40.357647 0 75.158588 33.174588 75.158589 73.953883-0.015059 21.594353-0.301176 43.655529-24.892236 57.871058z" /></svg>

+ 1 - 0
src/icons/svg/chart.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1503994873331" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10422" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M64 448 320 448 320 960 64 960 64 448 64 448ZM704 256 960 256 960 960 704 960 704 256 704 256ZM384 64 640 64 640 960 384 960 384 64 384 64Z" p-id="10423"></path></svg>

+ 1 - 0
src/icons/svg/clipboard.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1506419860538" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4662" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M438.857143 950.857143l512 0 0-365.714286-237.714286 0q-22.820571 0-38.838857-16.018286t-16.018286-38.838857l0-237.714286-219.428571 0 0 658.285714zM585.142857 128l0-36.571429q0-7.460571-5.412571-12.873143t-12.873143-5.412571l-402.285714 0q-7.460571 0-12.873143 5.412571t-5.412571 12.873143l0 36.571429q0 7.460571 5.412571 12.873143t12.873143 5.412571l402.285714 0q7.460571 0 12.873143-5.412571t5.412571-12.873143zM731.428571 512l170.861714 0-170.861714-170.861714 0 170.861714zM1024 585.142857l0 384q0 22.820571-16.018286 38.838857t-38.838857 16.018286l-548.571429 0q-22.820571 0-38.838857-16.018286t-16.018286-38.838857l0-91.428571-310.857143 0q-22.820571 0-38.838857-16.018286t-16.018286-38.838857l0-768q0-22.820571 16.018286-38.838857t38.838857-16.018286l621.714286 0q22.820571 0 38.838857 16.018286t16.018286 38.838857l0 187.465143q11.995429 7.460571 20.553143 16.018286l233.179429 233.179429q16.018286 16.018286 27.428571 43.446857t11.410286 50.322286z" p-id="4663"></path></svg>

+ 20 - 0
src/icons/svg/company_info_icon.svg

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#909399;}
+</style>
+<title>编组</title>
+<desc>Created with Sketch.</desc>
+<g>
+	<g id="企业信息" transform="translate(1.000000, 2.000000)">
+		<path id="形状结合" class="st0" d="M84.3,936.7c-23.6,0-42.7-19.1-42.7-42.7s19.1-42.7,42.7-42.7H127l0,0V168.7
+			c0-47.1,38.2-85.3,85.3-85.3h341.3c47.1,0,85.3,38.2,85.3,85.3v128l0,0h170.7c47.1,0,85.3,38.2,85.3,85.3v469.3h42.7
+			c23.6,0,42.7,19.1,42.7,42.7s-19.1,42.7-42.7,42.7H84.3z M553.7,168.7H212.3v682.7h341.3l0,0V168.7z M809.7,382H639v469.3h170.7
+			V382z M468.3,552.7c23.6,0,42.7,19.1,42.7,42.7c0,23.6-19.1,42.7-42.7,42.7H297.7c-23.6,0-42.7-19.1-42.7-42.7
+			c0-23.6,19.1-42.7,42.7-42.7H468.3z M468.3,339.3c23.6,0,42.7,19.1,42.7,42.7s-19.1,42.7-42.7,42.7H297.7
+			c-23.6,0-42.7-19.1-42.7-42.7s19.1-42.7,42.7-42.7H468.3z"/>
+	</g>
+</g>
+</svg>

+ 1 - 0
src/icons/svg/component.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1506329916765" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1661" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M64 64 448 64 448 448 64 448 64 64ZM64 576 448 576 448 960 64 960 64 576ZM576 576 960 576 960 960 576 960 576 576ZM768 448C874.038669 448 960 362.038672 960 256 960 149.961328 874.038669 64 768 64 661.961328 64 576 149.961328 576 256 576 362.038672 661.961328 448 768 448Z" p-id="1662"></path></svg>

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
src/icons/svg/dashboard.svg


+ 1 - 0
src/icons/svg/data.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M651.324 798.725c0-10.753-7.756-19.458-17.308-19.458H391.775c-9.55 0-17.303 8.705-17.303 19.458v77.824H201.436v58.363h622.906v-58.363H651.324v-77.824zM902.027 89.647H123.769c-32.243 0-58.366 26.104-58.366 58.348V692.77c0 32.221 26.123 58.368 58.366 58.368h778.259c32.243 0 58.368-26.146 58.368-58.368V147.995c0-32.245-26.125-58.348-58.369-58.348z m0 583.63c0 10.734-8.723 19.452-19.457 19.452H143.227c-10.753 0-19.453-8.718-19.453-19.452V167.433c0-10.757 8.7-19.457 19.453-19.457h739.344c10.733 0 19.457 8.7 19.457 19.457v505.844h-0.001z m-199.315-37.223h105.26V329.596h-105.26v306.458z m-168.417 0h105.26V235.301h-105.26v400.753z m-315.782 0h105.26V518.187h-105.26v117.867z m147.364 0h105.261V423.87H365.877v212.185z m0 0"  /></svg>

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
src/icons/svg/department.svg


+ 1 - 0
src/icons/svg/department_statistics.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1607566321200" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="47309" data-spm-anchor-id="a313x.7781069.0.i92" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M798.1 854.7c-43.2 0-76-33.5-76-76 0-43.2 33.5-76 76-76 40.2 0 76 35.8 76 76 0 42.5-32.8 76-76 76m-155-76c0 14.2 2.2 28.3 4.5 40.2-40.2 21.6-87.9 35.8-138.6 35.8-49.9 0-97.6-11.9-138.6-35.8 2.2-14.2 4.5-26.1 4.5-40.2 0-83.5-64.1-150.5-145.3-152.7-2.2-19.4-4.5-38-4.5-57.4 0-114.4 68.8-213.9 165.9-259.6 23.8 53.8 77.6 91.2 140.3 91.2 55.6 0 104.1-29.4 131.1-73.4C744.2 377.1 798 467 792.9 567.9c0 19.4 0 38-4.5 57.4-81.2 5.2-145.3 72.2-145.3 153.4m-417.2 76c-43.2 0-76-33.5-76-76 0-40.2 33.5-76 76-76 43.2 0 76 33.5 76 76s-32.8 76-76 76m305.5-683.2c41.7 0 76 34.3 76 76s-34.3 76-76 76c-42.5 0-76-34.3-76-76s34.2-76 76-76m333.8 470.9c4.5-23.8 7.4-47.7 7.4-73.8 0-136.8-75-255.1-187.9-317.8 0-1.4 0.1-2.7 0.1-4.1 0-84.9-69.3-153.5-153.5-153.5C447.7 93.3 380 159.8 378 243c0-1.2-0.1-2.5-0.1-3.7v-6.7c-133.4 52.9-228.7 183.3-228.7 336 0 26.1 2.2 49.9 7.5 73.8-49.9 26.1-83.5 76-83.5 135.6 0 83.5 69.3 152.7 152.7 152.7 43.2 0 81.2-16.4 109.5-45.5 52.2 28.3 111.8 45.5 176.6 45.5s123.7-16.4 176.6-45.5c28.3 28.3 67.1 45.5 109.5 45.5 83.5 0 152.7-69.3 152.7-152.7 0.1-58.9-35.7-108.8-85.6-135.6" p-id="47310" data-spm-anchor-id="a313x.7781069.0.i94" class="" fill="#707070"></path></svg>

+ 1 - 0
src/icons/svg/dept.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M955.712 277.312 955.712 0 68.288 0 68.288 277.312 0 277.312 0 1024 204.8 1024 204.8 277.312 136.512 277.312 136.512 68.288 477.888 68.288 477.888 277.312 409.6 277.312 409.6 1024 614.4 1024 614.4 277.312 546.112 277.312 546.112 68.288 887.488 68.288 887.488 277.312 819.2 277.312 819.2 1024 1024 1024 1024 277.312Z" /></svg>

+ 1 - 0
src/icons/svg/documentation.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1517304186474" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5672" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M554.666667 384h234.666666L554.666667 149.333333V384M256 85.333333h341.333333l256 256v512a85.333333 85.333333 0 0 1-85.333333 85.333334H256a85.333333 85.333333 0 0 1-85.333333-85.333334V170.666667c0-47.36 37.973333-85.333333 85.333333-85.333334m384 682.666667v-85.333333H256v85.333333h384m128-170.666667v-85.333333H256v85.333333h512z" fill="" p-id="5673"></path></svg>

+ 1 - 0
src/icons/svg/drag.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1503994190757" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9007" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M574.957891 267.016403 511.503696 267.016403l204.64896 0L511.212054 63.654762l-203.361641 203.361641L449.041086 267.016403l0 189.662641L258.687714 456.679044l0 125.916804L449.041086 582.595848l0 190.354396 125.916804 0L574.957891 582.595848l188.874695 0L763.832586 456.679044 574.957891 456.679044 574.957891 267.016403zM511.25401 960.345238l189.620685-187.394994L323.125305 772.950244 511.25401 960.345238zM71.291696 518.891967l187.394994 189.620685L258.68669 330.762239 71.291696 518.891967zM763.832586 330.762239l0 377.74939 188.874695-189.620685L763.832586 330.762239z" p-id="9008"></path></svg>

+ 1 - 0
src/icons/svg/droparrows.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1605949605572" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9653" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M134.5 722.8L457.29999999 993.3c30.09999999 25 79.2 25 109.30000001 0L889.4 722.79999999c48.1-40.90000001 14-110.8-54.1-110.79999999L712 612l0-500.1c0-54.9-45.1-99.8-100.3-99.8l-200.5 0c-55.1 0-100.3 44.9-100.3 99.8L310.9 612l-122.3-1e-8c-68.1 0-102.2 69.8-54.1 110.80000001z" p-id="9654" fill="#FF9600"></path></svg>

+ 1 - 0
src/icons/svg/edit.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1525760397212" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2919" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M860 504c-19.9 0-36 16.1-36 36 0 1.4 0.1 2.7 0.2 4h-0.2v344H136V200h376c19.9 0 36-16.1 36-36s-16.1-36-36-36H136c-39.8 0-72 32.2-72 72v688c0 39.8 32.2 72 72 72h688c39.8 0 72-32.2 72-72V544h-0.2c0.1-1.3 0.2-2.6 0.2-4 0-19.9-16.1-36-36-36z" p-id="2920"></path><path d="M1002.7 100.3L923.4 21c-28.1-28.1-73.9-27.9-102 0.2L424.2 418.4c-2.9 2.9-5.2 6.4-6.8 10.2L317.6 664c-5.6 13.2-1.7 26.5 6.8 35.1 8.5 8.6 21.9 12.5 35.2 6.9l235.5-99.7c3.8-1.6 7.2-3.9 10.2-6.8l397.2-397.2c28.1-28.1 28.3-73.9 0.2-102zM559.8 543l-137.4 58.2 58.2-137.4L759.4 185l79.2 79.2L559.8 543z m391.7-391.7l-62 62-79.2-79.2 62-62 0.2-0.2 79.2 79.2-0.2 0.2z" p-id="2921"></path></svg>

+ 1 - 0
src/icons/svg/email.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1503994210967" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9120" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M513 583.8l448.5-448.5c-11.6-4.7-24.3-7.3-37.5-7.3L100 128c-12.7 0-24.9 2.4-36.1 6.7L513 583.8z" p-id="9121"></path><path d="M513 674.3 14.6 175.9C5.3 191.1 0 208.9 0 228l0 568c0 55.2 44.8 100 100 100l824 0c55.2 0 100-44.8 100-100l0-568c0-18.5-5.1-35.9-13.9-50.8L513 674.3z" p-id="9122"></path></svg>

+ 1 - 0
src/icons/svg/employee.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M1024 366.08l0 572.544C1024 985.792 986.112 1024 939.648 1024L84.352 1024C37.76 1024 0 985.792 0 938.624L0 366.08c0-47.168 37.76-85.376 84.352-85.376l185.344 0 0 54.656L136.512 335.36c-40.896 0-73.984 32.576-73.984 72.832l0 488.256c0 40.128 33.088 72.768 73.984 72.768l750.848 0c40.96 0 73.984-32.64 73.984-72.768L961.344 408.192c0-40.192-33.088-72.832-73.984-72.832l-133.12 0L754.24 280.704l185.344 0C986.112 280.704 1024 318.912 1024 366.08z"  /><path d="M543.808 541.888l338.496 0 0 33.28-338.496 0 0-33.28Z"  /><path d="M743.104 730.88l138.304 0 0 33.28-138.304 0 0-33.28Z"  /><path d="M741.504 824.768l138.304 0 0 33.216-138.304 0 0-33.216Z"  /><path d="M539.776 635.776l338.496 0 0 33.216-338.496 0 0-33.216Z"  /><path d="M314.944 261.504l394.048 0 0 126.592-394.048 0 0-126.592Z"  /><path d="M314.944 215.296l394.048 0 0 30.144-394.048 0 0-30.144Z"  /><path d="M708.992 118.848l0 80.32L314.944 199.168 314.944 118.848l115.264 0L430.208 82.688C430.272 37.056 466.816 0 512 0c45.12 0 81.664 37.056 81.664 82.688l0 36.16L708.992 118.848zM543.808 67.52c0-17.792-14.272-32.128-31.808-32.128-17.536 0-31.808 14.4-31.808 32.128S494.464 99.648 512 99.648C529.472 99.648 543.808 85.312 543.808 67.52z"  /><path d="M445.504 700.096c0 95.616 0 118.144 0 118.144L348.352 818.24 281.472 818.24 184.384 818.24c0 0 0-22.528 0-118.144 0-54.72 43.008-79.168 79.68-90.112l50.944 144.448 50.88-144.448C402.496 620.928 445.504 645.376 445.504 700.096z"  /><path d="M313.28 486.464c37.952 0 47.872 28.224 47.872 63.04S334.08 612.48 313.28 612.48c-20.736 0-47.872-28.16-47.872-62.976S275.264 486.464 313.28 486.464z"  /><path d="M319.168 624 334.336 673.92 315.008 723.776 296.448 673.92 310.912 624Z"  /></svg>

+ 20 - 0
src/icons/svg/employee_table_icon.svg

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#909399;}
+</style>
+<title>编组</title>
+<desc>Created with Sketch.</desc>
+<g>
+	<g id="组织架构" transform="translate(2.000000, 2.000000)">
+		<path id="形状结合" class="st0" d="M626.4,83.3c42.8,0,77.6,34.7,77.6,77.6v155.2c0,42.8-34.7,77.6-77.6,77.6l-77.6,0v77.6
+			l196.5,0c18.6,0,33.9,15,36,34.3l0.2,4.5l0,116.4l77.6,0c42.8,0,77.6,34.7,77.6,77.6v155.2c0,42.8-34.7,77.6-77.6,77.6H626.4
+			c-42.8,0-77.6-34.7-77.6-77.6V703.9c0-42.8,34.7-77.6,77.6-77.6l82.7,0l0-77.6H310.9l0,77.6l82.8,0c42.8,0,77.6,34.7,77.6,77.6
+			v155.2c0,42.8-34.7,77.6-77.6,77.6H160.9c-42.8,0-77.6-34.7-77.6-77.6V703.9c0-42.8,34.7-77.6,77.6-77.6l77.6,0l0-116.4
+			c0-19.9,14-36.3,32-38.5l4.2-0.3l196.5,0v-77.6l-77.5,0c-42.8,0-77.6-34.7-77.6-77.6V160.9c0-42.8,34.7-77.6,77.6-77.6H626.4z
+			 M393.6,703.9H160.9v155.2h232.7V703.9z M859.1,703.9H626.4v155.2h232.7V703.9z M626.4,160.9H393.6v155.2h232.7V160.9z"/>
+	</g>
+</g>
+</svg>

+ 1 - 0
src/icons/svg/example.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1503994811583" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9878" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M770.56 460.8l250.88 0C998.4 220.16 803.84 25.6 563.2 2.56l0 250.88C668.16 273.92 750.08 355.84 770.56 460.8L770.56 460.8zM770.56 460.8" p-id="9879"></path><path d="M460.8 253.44 460.8 2.56C220.16 25.6 25.6 220.16 2.56 460.8l250.88 0C273.92 355.84 355.84 273.92 460.8 253.44L460.8 253.44zM460.8 253.44" p-id="9880"></path><path d="M563.2 770.56l0 250.88c243.2-23.04 435.2-217.6 460.8-460.8l-250.88 0C750.08 668.16 668.16 750.08 563.2 770.56L563.2 770.56zM563.2 770.56" p-id="9881"></path><path d="M253.44 563.2 2.56 563.2c23.04 243.2 217.6 435.2 460.8 460.8l0-250.88C355.84 750.08 273.92 668.16 253.44 563.2L253.44 563.2zM253.44 563.2" p-id="9882"></path></svg>

+ 1 - 0
src/icons/svg/excel.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1503994842272" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10097" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M625.664 132.608V199.68h309.76v43.008h-309.76V312.32h309.76v43.008h-309.76v68.608h309.76v43.008h-309.76v68.608h309.76v43.008h-309.76v68.608h309.76v43.008h-309.76v68.096h309.76v43.008h-309.76v89.088H1024v-757.76h-398.336zM0 914.944L577.024 1024V0L0 109.056" p-id="10098"></path><path d="M229.376 660.48H139.776l118.272-187.904-112.64-180.736h92.16l65.536 119.808L370.688 291.84h89.088l-112.64 177.664L466.944 660.48H373.248l-70.144-125.44L229.376 660.48z" p-id="10099"></path></svg>

+ 1 - 0
src/icons/svg/eye.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1503993826520" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7878" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M941.677063 391.710356c9.337669-14.005992 6.224772-32.68133-6.224772-43.575447-14.005992-10.894118-32.68133-7.78122-43.575447 6.224771-1.556449 1.556449-174.300768 205.426673-379.727441 205.426673-199.200878 0-379.727441-205.426673-381.28389-206.982098-10.894118-12.450567-31.124881-14.005992-43.575448-3.112898-12.450567 10.894118-14.005992 31.124881-3.112897 43.575448 3.112897 4.668323 40.46255 46.687322 99.600439 93.375667l-79.369676 82.48155c-12.450567 12.450567-10.894118 32.68133 1.556449 43.575448 3.112897 6.224772 10.894118 9.337669 18.675338 9.337669 7.78122 0 15.562441-3.112897 21.787213-9.337669l85.594447-88.706321c40.46255 28.013007 88.706321 54.469566 141.619438 73.14388L340.959485 707.631586c-4.668323 17.118889 4.669346 34.237779 21.787213 38.906101h9.337669c14.005992 0 26.456558-9.337669 29.568432-23.343661l32.68133-110.494556c24.90011 4.668323 51.356668 7.78122 77.813227 7.78122s52.913117-3.112897 77.813227-7.78122l32.68133 108.938108c3.112897 14.005992 17.118889 23.343661 29.569456 23.343661 3.112897 0 6.224772 0 7.78122-1.556449 17.118889-4.669346 26.456558-21.787212 21.788236-38.906102l-32.68133-108.938108c52.913117-18.675338 101.156888-45.131897 141.619438-73.14388l84.037998 87.150896c6.224772 6.224772 14.005992 9.337669 21.787212 9.337669 7.78122 0 15.562441-3.112897 21.787212-9.337669 12.450567-12.450567 12.450567-31.124881 1.556449-43.575448l-79.369675-82.48155c63.808258-46.688345 101.158934-91.820242 101.158934-91.820242z" p-id="7879"></path></svg>

+ 1 - 0
src/icons/svg/eyeOpen.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1554685345057" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6444" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M512 240C178.704 240 12.304 483.872 5.376 494.256c-7.168 10.752-7.168 24.752 0 35.504C12.304 540.128 178.704 784 512 784s499.696-243.872 506.624-254.256c7.168-10.752 7.168-24.752 0-35.504C1011.696 483.872 845.296 240 512 240zM512 720C263.888 720 115.744 565.152 72.192 511.936 115.6 458.608 262.976 304 512 304c248.112 0 396.256 154.848 439.808 208.064C908.4 565.392 761.024 720 512 720zM512 368c-79.408 0-144 64.608-144 144s64.592 144 144 144 144-64.608 144-144S591.408 368 512 368zM512 592c-44.112 0-80-35.888-80-80s35.888-80 80-80 80 35.888 80 80S556.112 592 512 592z" p-id="6445"></path></svg>

+ 1 - 0
src/icons/svg/first.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1605772055738" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9871" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M512 476.1C293 476.1 103.9 398 12 329l61.3 310.5h877.4L1012 329c-91.9 69.7-281.5 147.1-500 147.1z" fill="#FCA83A" p-id="9872"></path><path d="M793.5 494.1C576.1 494.1 512 72.6 512 72.6S447.3 494 230.5 494C61.6 494.1 12 329 12 329l109.3 541.2c257 60.7 524.5 60.7 781.5 0L1012 329s-49.6 165.1-218.5 165.1z" fill="#F0EA3F" p-id="9873"></path><path d="M793.5 525.8C576.1 525.8 512 100.5 512 100.5s-64.1 425.3-281.5 425.3C61.6 525.8 12 329 12 329l109.3 576.4c257 61.3 524.5 61.3 781.5 0L1012 329s-49.6 196.8-218.5 196.8z" fill="#FDCF47" p-id="9874"></path><path d="M494.4 868.5V603.3l-67.1 58.8v-64.7l67.1-58.8H555v330.8h-60.6z" fill="#FF5400" p-id="9875"></path></svg>

+ 22 - 0
src/icons/svg/fixed_integral_icon.svg

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve">
+<style type="text/css">
+	.st0{fill:#909399;}
+</style>
+<title>编组</title>
+<desc>Created with Sketch.</desc>
+<g id="自动积分" transform="translate(1.000000, 2.000000)">
+	<path id="路径备份" class="st0" d="M379.9,160.2C437.6,60,581.3,57.5,639.4,154.1l4.2,7.4l0.4,0.8l0,0l51.7,103.3
+		c6.2,13.5,20.9,24.4,39.4,28.7l6.3,1.2L855,311.9c117.1,15.8,165.1,153,86.6,239l-5.4,5.7l-82.8,76.7
+		c-12.6,12.2-19.3,28.6-18.8,43.7l0.6,5.6L854,793c19,114.6-98.4,199.8-204.1,153.6l-6.9-3.2l-101.7-50.7c-16.8-8.1-34.8-9-51.4-3
+		l-6.1,2.6l-104.2,52.8c-105,51.8-225-29.8-211.8-143.2l1-7.4l19-111.7c3.2-15.3-1.3-30.5-13.3-43L85.9,556
+		c-85-82.1-40.7-219.3,73.7-242.6l7.7-1.4l114-16.4c18.5-2.7,33.9-12.2,43.1-25.8l3.1-5.3L379.9,160.2z M568.2,201.5
+		c-22.3-42.1-82.9-43.9-109.8-6l-3.3,5.2l-51.3,102.5c-20.3,39.2-57.4,66.4-101.3,75.4l-8.9,1.5L180,396.4
+		c-49,7.6-68.6,59.8-38.9,93.9l3.8,4l81.5,77.2c35.5,29.7,52.9,74.7,46.7,118.8L253,808.6c-7.5,45.5,39.1,80.1,83.3,62.5l5.1-2.3
+		l104.6-53c39.5-19.1,83.7-20.4,124.3-3.6l8.6,3.9l102,50.9c44.4,21.9,92.9-10.2,89.5-54.7l-0.6-5.2L751,696.7
+		c-6.9-42.1,7.1-85.8,37.1-118.5l6.7-6.8l82.3-76.3c33.6-33.4,17.3-87.5-28.3-97.6l-5.6-1L729.1,380c-45.7-6.6-86-32.5-106.5-69.8
+		L568.2,201.5z"/>
+</g>
+</svg>

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
src/icons/svg/form.svg


+ 1 - 0
src/icons/svg/guide.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1526033837694" class="icon" style="" viewBox="0 0 1117 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10274" xmlns:xlink="http://www.w3.org/1999/xlink" width="218.1640625" height="200"><defs><style type="text/css"></style></defs><path d="M53.865 558.08l289.92 121.6 560-492.16-491.52 530.56 371.84 140.8c8.96 3.2 19.2-1.28 22.4-10.24V848l260.48-816.64-1014.4 494.72c-8.96 4.48-12.16 14.72-8.32 23.68 2.56 3.84 5.76 7.04 9.6 8.32z m357.76 434.56l144.64-155.52-144.64-58.88v214.4z" p-id="10275"></path></svg>

+ 1 - 0
src/icons/svg/icon.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1504000178424" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="14764" xmlns:xlink="http://www.w3.org/1999/xlink" width="64" height="64"><defs><style type="text/css"></style></defs><path d="M871.424 61.44q18.432 0 34.816 6.656t28.672 18.944 19.456 28.672 7.168 35.84l0 720.896q0 38.912-25.088 64.512t-62.976 25.6l-721.92 0q-40.96 0-66.048-26.624t-25.088-66.56l0-718.848q0-35.84 24.576-62.464t65.536-26.624l720.896 0zM633.856 829.44q18.432 0 26.624-8.704t8.192-23.04q0-13.312-8.192-22.528t-26.624-9.216l-62.464 0q1.024-2.048 1.024-6.144l0-507.904 63.488 0q18.432 0 25.6-9.216t7.168-22.528-7.168-22.528-25.6-9.216l-249.856 0q-18.432 0-25.6 9.216t-7.168 22.528 7.168 22.528 25.6 9.216l57.344 0 0 507.904q0 2.048 0.512 3.072t0.512 3.072l-56.32 0q-18.432 0-26.624 9.216t-8.192 22.528q0 14.336 8.192 23.04t26.624 8.704l245.76 0z" p-id="14765"></path></svg>

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.