Browse Source

first commit

lyking90 2 years ago
commit
8d8dabdc06
100 changed files with 9210 additions and 0 deletions
  1. 2 0
      .dockerignore
  2. 14 0
      .editorconfig
  3. 4 0
      .eslintignore
  4. 200 0
      .eslintrc.js
  5. 20 0
      .gitignore
  6. 3 0
      .npmrc
  7. 5 0
      .travis.yml
  8. 1 0
      DCB6tfZDDK.txt
  9. 22 0
      Dockerfile
  10. 17 0
      Dockerfile-gcp
  11. 81 0
      Jenkinsfile
  12. 21 0
      LICENSE
  13. 156 0
      README.md
  14. 14 0
      debug.log
  15. 48 0
      default.conf
  16. 11 0
      docker-auto-push.prod.sh
  17. 9 0
      docker-auto-push.staging.sh
  18. 36 0
      dove.conf
  19. 22 0
      index.html
  20. 88 0
      package.json
  21. 89 0
      plop-templates/component.hbs
  22. 51 0
      plop-templates/default-page.hbs
  23. 147 0
      plop-templates/table-page.hbs
  24. 152 0
      plopfile.js
  25. BIN
      public/favicon.ico
  26. 2 0
      public/web-designer.js
  27. 11 0
      src/App.vue
  28. 174 0
      src/api/basic/account.js
  29. 77 0
      src/api/basic/area.js
  30. 68 0
      src/api/basic/auditcenter.js
  31. 112 0
      src/api/basic/bank.js
  32. 141 0
      src/api/basic/beginning.js
  33. 83 0
      src/api/basic/bom.js
  34. 52 0
      src/api/basic/brandSet.js
  35. 246 0
      src/api/basic/company.js
  36. 76 0
      src/api/basic/config.js
  37. 54 0
      src/api/basic/currency.js
  38. 52 0
      src/api/basic/customer.js
  39. 51 0
      src/api/basic/customercategory.js
  40. 98 0
      src/api/basic/department.js
  41. 40 0
      src/api/basic/docbindingflow.js
  42. 93 0
      src/api/basic/employee.js
  43. 93 0
      src/api/basic/encoding.js
  44. 36 0
      src/api/basic/expense.js
  45. 74 0
      src/api/basic/fileImportSettings.js
  46. 131 0
      src/api/basic/flowDesign.js
  47. 142 0
      src/api/basic/flowtemplate.js
  48. 122 0
      src/api/basic/printTemplateDesign.js
  49. 88 0
      src/api/basic/printset.js
  50. 135 0
      src/api/basic/product.js
  51. 98 0
      src/api/basic/productcategory.js
  52. 10 0
      src/api/basic/reinitialize.js
  53. 50 0
      src/api/basic/secondaryAttribute.js
  54. 11 0
      src/api/basic/share.js
  55. 40 0
      src/api/basic/sourceOfCashFlow.js
  56. 45 0
      src/api/basic/unit.js
  57. 44 0
      src/api/basic/voucherWord.js
  58. 98 0
      src/api/basic/warehouse.js
  59. 37 0
      src/api/permissions/authpermission.js
  60. 180 0
      src/api/permissions/index.js
  61. 47 0
      src/api/permissions/menutree.js
  62. 79 0
      src/api/permissions/template.js
  63. 213 0
      src/api/user/index.js
  64. 47 0
      src/api/user/superadmin.js
  65. BIN
      src/assets/404_images/404.png
  66. BIN
      src/assets/404_images/404_cloud.png
  67. BIN
      src/assets/alipayAuth/authfailure.png
  68. BIN
      src/assets/alipayAuth/authsuccess.png
  69. BIN
      src/assets/amtxts.png
  70. BIN
      src/assets/bg.png
  71. 539 0
      src/assets/icon/demo.css
  72. 285 0
      src/assets/icon/demo_index.html
  73. 58 0
      src/assets/icon/iconfont.css
  74. BIN
      src/assets/icon/iconfont.eot
  75. 1 0
      src/assets/icon/iconfont.js
  76. 41 0
      src/assets/icon/iconfont.svg
  77. BIN
      src/assets/icon/iconfont.ttf
  78. BIN
      src/assets/icon/iconfont.woff
  79. BIN
      src/assets/icon/iconfont.woff2
  80. BIN
      src/assets/icon/png/add.png
  81. BIN
      src/assets/icon/png/del.png
  82. BIN
      src/assets/icon/png/pdf.png
  83. BIN
      src/assets/logo.png
  84. BIN
      src/assets/main-police.png
  85. 539 0
      src/assets/toolbar/demo.css
  86. 814 0
      src/assets/toolbar/demo_index.html
  87. 146 0
      src/assets/toolbar/iconfont.css
  88. BIN
      src/assets/toolbar/iconfont.eot
  89. 1 0
      src/assets/toolbar/iconfont.js
  90. 205 0
      src/assets/toolbar/iconfont.json
  91. 110 0
      src/assets/toolbar/iconfont.svg
  92. BIN
      src/assets/toolbar/iconfont.ttf
  93. BIN
      src/assets/toolbar/iconfont.woff
  94. BIN
      src/assets/toolbar/iconfont.woff2
  95. 16 0
      src/assets/yunti_icon/iconfont.css
  96. 1391 0
      src/components/AccToolBar/index.vue
  97. 261 0
      src/components/AiUnit/index.vue
  98. 129 0
      src/components/BackToTop/index.vue
  99. 211 0
      src/components/Breadcrumb/index.vue
  100. 0 0
      src/components/ErrorLog/index.vue

+ 2 - 0
.dockerignore

@@ -0,0 +1,2 @@
+.git
+node_modules

+ 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

+ 4 - 0
.eslintignore

@@ -0,0 +1,4 @@
+build/*.js
+config/*.js
+src/assets
+static

+ 200 - 0
.eslintrc.js

@@ -0,0 +1,200 @@
+module.exports = {
+  root: true,
+  parserOptions: {
+    parser: 'babel-eslint',
+    sourceType: 'module'
+  },
+  env: {
+    browser: true,
+    node: true,
+    es6: true,
+  },
+  extends: ['plugin:vue/recommended', 'eslint:recommended'],
+
+  // add your custom rules here
+  //it is base on https://github.com/vuejs/eslint-config-vue
+  rules: {
+    "vue/max-attributes-per-line": [2, {
+      "singleline": 10,
+      "multiline": {
+        "max": 1,
+        "allowFirstLine": false
+      }
+    }],
+    "vue/attributes-order": 'off',
+    "vue/no-use-v-if-with-v-for": 'off',
+    'vue/require-prop-types': 'off',
+    "vue/require-default-prop": 'off',
+    'vue/no-side-effects-in-computed-properties': 'off',
+    "vue/name-property-casing": 'off',
+    'accessor-pairs': 2,
+    'arrow-spacing': [2, {
+      'before': true,
+      'after': true
+    }],
+    'block-spacing': [2, 'always'],
+    'brace-style': [2, '1tbs', {
+      'allowSingleLine': true
+    }],
+    'camelcase': [0, {
+      'properties': 'always'
+    }],
+    'comma-dangle': [2, 'never'],
+    'comma-spacing': [2, {
+      'before': false,
+      'after': true
+    }],
+    'comma-style': [2, 'last'],
+    'constructor-super': 2,
+    'curly': [2, 'multi-line'],
+    'dot-location': [2, 'property'],
+    'eol-last': 2,
+    'eqeqeq': [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': 2,
+    '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'],
+    'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
+    'object-curly-spacing': [2, 'always', {
+      objectsInObjects: false
+    }],
+    'array-bracket-spacing': [2, 'never'],
+    "prefer-const": 0
+  }
+}

+ 20 - 0
.gitignore

@@ -0,0 +1,20 @@
+.DS_Store
+node_modules/
+/dist
+.history/
+test/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+package-lock.json
+build/webpack.test.conf.js
+config/test.env.js
+karma.conf.js
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln

+ 3 - 0
.npmrc

@@ -0,0 +1,3 @@
+sass_binary_site = https://npm.taobao.org/mirrors/node-sass
+phantomjs_cdnurl = https://npm.taobao.org/mirrors/phantomjs
+registry = https://registry.npm.taobao.org

+ 5 - 0
.travis.yml

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

+ 1 - 0
DCB6tfZDDK.txt

@@ -0,0 +1 @@
+69f5a768154fe5cf36564d75633dcdea

+ 22 - 0
Dockerfile

@@ -0,0 +1,22 @@
+FROM node:14-alpine AS js-builder
+WORKDIR /app
+RUN echo "http://mirrors.aliyun.com/alpine/latest-stable/main/" > /etc/apk/repositories
+RUN apk --no-cache add make g++ git python3
+RUN npm config set registry https://registry.npm.taobao.org
+RUN npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/ && \
+    npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/ && \
+    npm config set nodejieba_binary_host_mirror https://npm.taobao.org/mirrors/nodejieba
+COPY package.json ./
+RUN npm install
+COPY . .
+
+FROM js-builder AS dev
+CMD ["npm", "run", "staging"]
+
+FROM js-builder AS prod-builder
+RUN npm run build
+
+FROM nginx:stable-alpine AS prod
+COPY --from=prod-builder /app/dist /usr/share/nginx/html
+EXPOSE 80
+CMD ["nginx", "-g", "daemon off;"]

+ 17 - 0
Dockerfile-gcp

@@ -0,0 +1,17 @@
+FROM node:14-alpine AS js-builder
+WORKDIR /app
+RUN apk --no-cache add make g++ git python3
+COPY package.json ./
+RUN npm install
+COPY . .
+
+FROM js-builder AS dev
+CMD ["npm", "run", "staging"]
+
+FROM js-builder AS prod-builder
+RUN npm run build
+
+FROM nginx:stable-alpine AS prod
+COPY --from=prod-builder /app/dist /usr/share/nginx/html
+EXPOSE 80
+CMD ["nginx", "-g", "daemon off;"]

+ 81 - 0
Jenkinsfile

@@ -0,0 +1,81 @@
+def label = "jenkins-slave-yunti_web"
+
+podTemplate(label: label, cloud: 'kubernetes', imagePullSecrets:['registryharbor'],
+  idleMinutes:'1440',
+  nodeSelector:'kubernetes.io/hostname=gke-yunti-cluster-1-pool-2-7499bd72-b5x7',
+  slaveConnectTimeout:'600',
+  containers: [
+    containerTemplate(name: 'docker', image: 'docker:20.10.3-git', command: 'cat', ttyEnabled: true),
+    containerTemplate(name: 'helm', image: 'registry-platform.linkerplus.com/google/cloud-sdk-helm:378.0.0-alpine', command: 'cat', ttyEnabled: true)], 
+  serviceAccount: 'jenkins', 
+  volumes: [
+    hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock')]
+) {
+    node(label) {
+                container('docker')
+        {
+            stage('Prepare') {
+                echo '1.Prepare Stage'
+                checkout scm
+                docker_host = 'registry-platform.linkerplus.com'
+                script {
+                    build_tag = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()
+                    if (env.BRANCH_NAME != null) {
+                        build_tag = "${env.BRANCH_NAME}-${build_tag}"
+                    }
+                }
+                docker_img_name = "${docker_host}/${env.JOB_NAME}:${build_tag}"
+                echo "********** docker-img-name: ${docker_img_name} **********"
+            }
+            stage('Build') {
+                echo '2.Build Docker Image Stage'
+                sh "docker build -t ${docker_img_name} --target prod -f Dockerfile-gcp ."
+            }
+            stage('Push') {
+                echo '3.Push Docker Image Stage'
+                withCredentials([usernamePassword(credentialsId: 'ba682ee1-c90b-4248-843b-b6f5277104a3', passwordVariable: 'dockerPassword', usernameVariable: 'dockerUser')]) {
+                    sh "docker login -u ${dockerUser} -p ${dockerPassword} ${docker_host}"
+                    sh "docker push ${docker_img_name}"
+                }
+            }
+            stage('clone k8s deploy') {
+                echo '4.clone k8s deploy'
+                branch_name = "v2.0.0-gcp"
+                withCredentials([sshUserPrivateKey(credentialsId: '6984acee-7988-4e00-9768-b4af0c69ff0f', keyFileVariable: 'GITHUB_KEY')]) {
+                    sh 'echo ssh -i $GITHUB_KEY -l git -o StrictHostKeyChecking=no \\"\\$@\\" > run_ssh.sh'
+                    sh 'chmod +x run_ssh.sh'
+                    withEnv(["GIT_SSH=${WORKSPACE}/run_ssh.sh"]) {
+                        sh """
+                        cd ..
+                        rm -rf k8s
+                        git clone git@122.112.209.52:YunTi/k8s.git
+                        cd k8s
+                        git checkout ${branch_name}
+                        sed -i "s/tag:.*\\".*\\"/tag: \\"${build_tag}\\"/g" ./yunti/charts/dove/values.yaml
+                        git add -A
+                        if ! git diff-index --quiet HEAD; then
+                            git config --global user.email "leo@amtxts.com"
+                            git config --global user.name "leo"
+                            git commit -m "docker image [${build_tag}] build"
+                            git push origin ${branch_name}
+                        fi
+                        """
+                    }
+                }
+            }
+        }
+        container('helm'){
+            stage('k8s helm upgrade') {
+                echo '5.k8s helm upgrade'
+                withCredentials([file(credentialsId: 'yunti-20220127', variable: 'GC_KEY')]) {
+                  sh """
+                      gcloud auth activate-service-account --key-file=${GC_KEY}
+                      gcloud container clusters get-credentials yunti-cluster-1 --zone asia-east1-a --project yunti-20220127
+                      cd ${WORKSPACE}/../k8s
+                      helm upgrade -i yunti yunti
+                  """
+               }
+            }
+        }
+    }
+}

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017-present PanJiaChen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 156 - 0
README.md

@@ -0,0 +1,156 @@
+## Build Setup
+
+``` bash
+# Install dependencies
+npm install
+npm install --registry=https://registry.npm.taobao.org
+
+# serve with hot reload at localhost:9528
+npm run dev
+
+# build for production with minification
+npm run build
+
+# build for production and view the bundle analyzer report
+npm run build --report
+```
+
+## vscode eslint settings
+```xml
+"eslint.validate": [
+        "javascript",
+        "javascriptreact",
+        "html",
+        {
+            "language": "vue",
+            "autoFix": true
+        }
+    ],
+    "eslint.options": {
+        "plugins": [
+            "html"
+        ]
+    },
+    "eslint.autoFixOnSave": true
+
+# ignore line
+// eslint-disable-next-line
+# ignore file
+/* eslint-disable */
+```
+
+## 本地开发环境连接websocket
+```bash
+# 安装nginx
+brew install nginx
+# 启动nginx 服务
+nginx
+# 添加配置文件dove.conf
+cp dove.conf /usr/local/etc/nginx/servers/
+# 重启nginx
+nginx -s reload
+# 访问浏览器即可
+http://localhost:9530
+```
+
+## 资源本地化操作
+正则表达式匹配中文字符 [\u4e00-\u9fa5]
+### 本地化资源文件
+
+简体中文 @/lang/cn.js
+
+英文 @/lang/en.js
+
+繁体中文 @/lang/tw.js
+
+表格简体 @/lang/table_cn.js
+
+表格英文 @/lang/table_en.js
+
+表格繁体 @/lang/table_tw.js
+
+### 注意事项
+
+所有文字都要进行国际化处理,要在资源文件对应的Object里事先定义好key:value,命名要规范,见名知意。
+在要使用的地方使用 $t('objectName.key')进行调用。单据,单据列表,报表等需要栏位配置的vxe_table表格都需在@src/config对应的js文件里替换掉originTitle属性的value值。看见未翻译的文字请进行翻译。
+
+### 安装插件
+
+```
+Vscode 安装插件 i18n Ally
+配置如下,方便查看文案和提取文案。
+  "i18n-ally.localesPaths": [
+        "src/lang"
+    ],
+  "i18n-ally.enabledParsers": [
+    "json",
+    "js"
+    ],
+    "i18n-ally.sourceLanguage": "cn",
+    "i18n-ally.displayLanguage": "cn",
+    "i18n-ally.keystyle": "nested",
+    "i18n-ally.annotations": true
+```
+
+### 使用方法
+
+在对应的多语言文件里先定义好简体资源,借助谷歌翻译,将文本信息转换成繁体和英文,加进对应的多语言文件。
+
+谷歌翻译:https://translate.google.cn/?sl=zh-CN&tl=en&op=translate
+
+安装i18n Ally插件后,选中需要国际化的中文文本,点击左侧的小灯泡替换成对应的$t( )形式。
+
+如果要传递变量,可使用{ } 进行占位,如 daysUsed: '已使用{days}天', 详细请参考vuei18n文档。
+
+如果是可配置的表格,先在@lang对应的表格多语言文件里进行定义,再到@src/config对应的js配置文件里替换掉originTitle属性的value值。vxe-table的国际化需要在main.js文件里进行开启。
+
+
+
+```js
+VXETable.setup({
+  // 可选,对参数中的列头、校验提示..等进行自动翻译(只对支持国际化的有效)
+  translate(key, args) {
+    if (key) {
+      return i18n.t(key, args)
+    }
+    return key
+  }
+})
+```
+
+
+
+### 命名规范
+
+目前有以下主要部分,后续可再根据需要进行新增。
+
+依据实际情况,父对象里嵌套子对象将不同模块进行区分。表格的字段命名使用后端的变量名,尽可能的复用,如果同个变量名有多个含义,如cus_name可能代表‘客户’ / '供应商' 则使用对应的英文名进行命名 (客户:customer,供应商:supplier)
+
+| Object                                                | Description                                                  |
+| :---------------------------------------------------- | :----------------------------------------------------------- |
+| route                                                 | 路由                                                         |
+| table{  header{ },body{  },footer{  }  }              | 表格(表头,表身,表尾)                                     |
+| slot                                                  | 页面插槽的文字                                               |
+| toolbar                                               | 功能按钮栏组件                                               |
+| button                                                | 所有按钮                                                     |
+| modal                                                 | 模态框,使用modal名称进行区分                                |
+| desktop                                               | 桌面相关                                                     |
+| company{  sideBar{ },mainBox{  },form{  },table{ }  } | 公司管理相关(侧边栏,主体区域,表单,表格)                 |
+| userInfo                                              | 个人中心相关                                                 |
+| superAdmin                                            | 中台相关                                                     |
+| message                                               | 操作提示信息  success: '成功', error: '失败',warning: '警告',info: '提示' |
+| placeholder                                           | 文本提示信息  search : 搜索 , enter : 输入, select:选择    |
+| basic                                                 | 基础模块相关                                                 |
+| setting                                               | 设置模块相关                                                 |
+
+
+
+
+
+## npm run dev 报错内存溢出javaScript heap out of memory 处理
+```bash
+# 1.全局安装increase-memory-limit
+npm install -g increase-memory-limit
+# 2.进入工程目录,执行 :
+increase-memory-limit
+```

+ 14 - 0
debug.log

@@ -0,0 +1,14 @@
+[0926/174618.333:ERROR:process_info.cc(329)] VirtualQueryEx: 拒绝访问。 (0x5)
+[0926/174618.335:ERROR:process_info.cc(556)] ReadMemoryInfo failed
+[0926/174618.335:ERROR:process_memory_win.cc(39)] Failed to initialize ProcessInfo.
+[0926/174618.335:ERROR:scoped_process_suspend.cc(40)] NtResumeProcess: 已尝试访问正在退出的过程。 (0xc000010a)
+[1012/083952.447:ERROR:settings.cc(430)] Settings version is not 5
+[1012/084952.463:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
+[1012/114635.906:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
+[1013/090921.359:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
+[1014/114510.470:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
+[1015/084425.909:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
+[1015/143208.441:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
+[1016/085402.874:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
+[1016/141544.328:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)
+[1019/085509.816:ERROR:directory_reader_win.cc(43)] FindFirstFile: 系统找不到指定的路径。 (0x3)

+ 48 - 0
default.conf

@@ -0,0 +1,48 @@
+server {
+    listen       80;
+    server_name  localhost;
+
+    #charset koi8-r;
+    #access_log  /var/log/nginx/host.access.log  main;
+
+    location / {
+        root   /usr/share/nginx/html;
+        index  index.html index.htm;
+    }
+
+    location /bapi/ {
+        proxy_pass https://unit-api.baidu.com/;
+    }
+
+    #error_page  404              /404.html;
+
+    # redirect server error pages to the static page /50x.html
+    #
+    error_page   500 502 503 504  /50x.html;
+    location = /50x.html {
+        root   /usr/share/nginx/html;
+    }
+
+    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
+    #
+    #location ~ \.php$ {
+    #    proxy_pass   http://127.0.0.1;
+    #}
+
+    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
+    #
+    #location ~ \.php$ {
+    #    root           html;
+    #    fastcgi_pass   127.0.0.1:9000;
+    #    fastcgi_index  index.php;
+    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
+    #    include        fastcgi_params;
+    #}
+
+    # deny access to .htaccess files, if Apache's document root
+    # concurs with nginx's one
+    #
+    #location ~ /\.ht {
+    #    deny  all;
+    #}
+}

+ 11 - 0
docker-auto-push.prod.sh

@@ -0,0 +1,11 @@
+#!/bin/sh
+git pull
+if ! [[ -z "${RELEASE_VERSION}" ]]; then
+    git checkout ${RELEASE_VERSION};
+    version=${RELEASE_VERSION};
+else
+    git checkout master;
+    version=2.0.0
+fi
+image=registry-platform.linkerplus.com/yunti/dove:$version
+docker build -t $image --target prod . && docker push $image || exit 1

+ 9 - 0
docker-auto-push.staging.sh

@@ -0,0 +1,9 @@
+#!/bin/sh
+git pull
+if [[ -z "${RELEASE_VERSION}" ]]; then
+    git checkout master && echo "master"
+else
+    git checkout ${RELEASE_VERSION} && echo ${RELEASE_VERSION}
+fi
+image=registry-platform.linkerplus.com/yunti/dove-staging:${RELEASE_VERSION:-2.0.0}
+docker build -t $image --target dev . && docker push $image || exit 1

+ 36 - 0
dove.conf

@@ -0,0 +1,36 @@
+server {
+    listen       9530;
+    server_name localhost;
+
+    location / {
+	proxy_set_header Host $http_host;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_pass http://localhost:9538;
+    }
+    location /acc/ {
+	    proxy_set_header Host $http_host;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_pass http://127.0.0.1:8000/;
+    }
+    location /inv/ {
+	    proxy_set_header Host $http_host;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_pass http://127.0.0.1:8000/;
+    }
+    location /manage/ {
+	    proxy_set_header Host $http_host;
+        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        proxy_pass http://127.0.0.1:8000/;
+    }
+    location /im/socket.io/ {
+        proxy_pass http://dove.test.yunterp.com/im/socket.io/;
+        proxy_http_version 1.1;
+        proxy_set_header Upgrade $http_upgrade;
+        proxy_set_header Connection "upgrade";
+    }
+
+    error_page   500 502 503 504  /50x.html;
+    location = /50x.html {
+        root   /usr/share/nginx/html;
+    }
+}

+ 22 - 0
index.html

@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <link rel="icon" href="/favicon.ico" />
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="renderer" content="webkit">
+  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+  <title>云T ERP</title>
+</head>
+
+<body>
+  <script src="/web-designer.js" id="designerjs"></script>
+  <noscript>
+    <strong>We're sorry but web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+  </noscript>
+  <div id="app"></div>
+  <script type="module" src="/src/main.js"></script>
+</body>
+
+</html>

+ 88 - 0
package.json

@@ -0,0 +1,88 @@
+{
+  "name": "vue-admin-template",
+  "version": "3.6.0",
+  "license": "MIT",
+  "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
+  "author": "Pan <panfree23@gmail.com>",
+  "scripts": {
+    "serve": "vite",
+    "serve:dev": "vite --mode development",
+    "serve:prod": "vite --mode production",
+    "build": "vite build",
+    "build:dev": "vite build --mode development",
+    "build:prod": "vite build --mode production",
+    "plop": "plop"
+  },
+  "dependencies": {
+    "@grapecity/ar-designer": "^16.1.1",
+    "@grapecity/ar-viewer": "^16.1.1",
+    "@riophae/vue-treeselect": "^0.1.0",
+    "@vue/babel-helper-vue-jsx-merge-props": "^1.0.0",
+    "async": "^2.6.2",
+    "axios": "0.18.0",
+    "babel-plugin-syntax-dynamic-import": "^6.18.0",
+    "babel-polyfill": "^6.26.0",
+    "babel-preset-es2015": "^6.24.1",
+    "bignumber.js": "^9.0.0",
+    "connect": "^3.6.6",
+    "crypto-js": "^3.3.0",
+    "dom-to-image": "^2.6.0",
+    "echarts": "^4.6.0",
+    "element-china-area-data": "^4.1.2",
+    "element-ui": "^2.15.3",
+    "font-awesome": "^4.7.0",
+    "font-awesome-animation": "^0.2.1",
+    "fuse.js": "3.4.4",
+    "html2canvas": "^1.0.0-rc.5",
+    "js-cookie": "2.2.0",
+    "lodash": "^4.17.11",
+    "moment": "^2.24.0",
+    "normalize.css": "8.0.1",
+    "nprogress": "^0.2.0",
+    "path-to-regexp": "2.4.0",
+    "screenfull": "4.2.0",
+    "socket.io-client": "^2.3.0",
+    "vite": "^2.7.13",
+    "vue": "^2.6.14",
+    "vue-count-to": "^1.0.13",
+    "vue-ctk-date-time-picker-yunti": "^1.0.2",
+    "vue-i18n": "8.10.0",
+    "vue-image-crop-upload": "^3.0.3",
+    "vue-moment": "^4.1.0",
+    "vue-qr": "^2.2.1",
+    "vue-router": "3.0.3",
+    "vuex": "3.1.0",
+    "vuex-persistedstate": "^4.1.0",
+    "vxe-table-plugin-element": "^1.11.4",
+    "vxe-table-plugin-renderer-yunt": "^1.0.1",
+    "vxe-table-yunti-3": "^1.0.7",
+    "xe-clipboard": "^1.10.1",
+    "xe-utils": "^3.5.4",
+    "xlsx": "^0.14.5"
+  },
+  "devDependencies": {
+    "@vitejs/plugin-legacy": "^1.6.4",
+    "@vitejs/plugin-vue-jsx": "^1.3.10",
+    "autoprefixer": "9.5.1",
+    "cross-env": "5.2.0",
+    "eslint": "^5.16.0",
+    "eslint-friendly-formatter": "4.0.1",
+    "eslint-loader": "2.1.2",
+    "eslint-plugin-html": "^5.0.3",
+    "eslint-plugin-vue": "5.2.2",
+    "plop": "^3.0.5",
+    "sass": "~1.32.6",
+    "vite-plugin-compression": "^0.4.0",
+    "vite-plugin-vue2": "^1.9.2",
+    "vue-template-compiler": "^2.6.14"
+  },
+  "engines": {
+    "node": ">= 4.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

+ 89 - 0
plop-templates/component.hbs

@@ -0,0 +1,89 @@
+<template>
+  <div>
+    <vxe-modal
+      v-model="visible"
+      :width="width"
+      :height="height"
+      :title="title"
+      :loading="loading"
+      show-footer
+      remember
+      resize
+      ref="xModal"
+      @close="closeModal"
+    >
+      <div>
+        {{ name }}
+      </div>
+      <template #footer>
+        <el-button type="primary" size="mini" @click="confirm()">
+          确认
+        </el-button>
+        <el-button size="mini" @click="visible = false">
+          取消
+        </el-button>
+      </template>
+    </vxe-modal>
+  </div>
+</template>
+
+<script>
+export default {
+  name: '{{ properCase name }}',
+  i18n: {
+    messages: {
+      cn: {
+      },
+      tw: {
+      },
+      en: {
+      }
+    }
+  },
+  components: {
+  },
+  props: {
+    title: {
+      required: false,
+      type: String,
+      default() {
+        return ''
+      }
+    },
+    width: {
+      required: false,
+      type: String,
+      default: '1100'
+    },
+    height: {
+      required: false,
+      type: String,
+      default: '600'
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      loading: false
+    }
+  },
+  created() {
+
+  },
+  methods: {
+    openModal() {
+      this.visible = true
+    },
+    closeModal() {
+      this.visible = false
+    },
+    confirm() {
+
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 51 - 0
plop-templates/default-page.hbs

@@ -0,0 +1,51 @@
+<template>
+  <div>
+    <div class="app-container account-container" v-loading="viewLoading">
+      <div class="toolbar-container">
+        <AccToolBar
+          ref="toolbar"
+          direction="left"
+          :default-show-buttons="['Refresh']"
+          @refreshEvent="refreshEvent"
+        />
+      </div>
+      <div class="scroll-box-container">
+        <div class="body-container">
+          {{ name }}
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import AccToolBar from '@/components/AccToolBar'
+
+export default {
+  name: '{{ properCase name }}',
+  components: {
+    AccToolBar
+  },
+  data() {
+    return {
+      viewLoading: false
+    }
+  },
+  created() {
+
+  },
+  mounted() {
+
+  },
+  methods: {
+    refreshEvent() {
+
+    }
+  }
+
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 147 - 0
plop-templates/table-page.hbs

@@ -0,0 +1,147 @@
+<template>
+  <div>
+    <div class="app-container account-container" v-loading="viewLoading">
+      <div class="toolbar-container">
+        <AccToolBar
+          ref="toolbar"
+          direction="left"
+          :default-show-buttons="['Refresh']"
+          @refreshEvent="refreshEvent"
+        />
+      </div>
+      <div class="scroll-box-container">
+        <div class="body-container">
+          <vxe-grid
+            border
+            resizable
+            auto-resize
+            show-footer
+            highlight-hover-row
+            highlight-current-row
+            show-overflow="tooltip"
+            ref="xGrid"
+            max-height="800"
+            row-id="id"
+            align="left"
+            size="medium"
+            :loading="tableLoading"
+            :columns="tableColumn"
+            :form-config="tableForm"
+            :pager-config="tablePage"
+            :proxy-config="tableProxy"
+            :cell-class-name="cellClassName"
+          >
+          <!-- template插槽 -->
+          </vxe-grid>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import AccToolBar from '@/components/AccToolBar'
+
+export default {
+  name: '{{ properCase name }}',
+  components: {
+    AccToolBar
+  },
+  data() {
+    return {
+      viewLoading: false,
+      tableLoading: false,
+      tableForm: {
+        data: {
+          name: ''
+        },
+        items: [
+          {
+            visible: true,
+            sapn: 4,
+            field: 'name',
+            title: '',
+            itemRender: {
+              name: '$input'
+            }
+          }
+        ],
+        display: 'outline'
+      },
+      tableColumn: [
+        { type: 'seq', width: 50 },
+        {
+          visible: true,
+          align: 'center',
+          title: this.$t('table.body.status'),
+          field: 'status',
+          slots: {
+            default: 'status_default'
+          }
+        },
+        {
+          visible: true,
+          title: this.$t('basic.table.body.operate'),
+          align: 'center',
+          field: 'operate',
+          slots: {
+            default: 'operate_default'
+          }
+        }
+      ],
+      tableProxy: {
+        autoLoad: true, // 是否自动加载查询数据
+        seq: true, // 启用动态序号代理
+        sort: true, // 启用排序代理
+        filter: true, // 启用筛选代理
+        form: true, // 启用表单代理
+        props: {
+          result: 'results',
+          total: 'count'
+        },
+        ajax: {
+          query: ({ page, sort, filters, form }) => {
+            const pageParams = {
+              page: page.currentPage,
+              page_size: page.pageSize
+            }
+            const data = Object.assign(pageParams, this.tableForm.data)
+            console.log(data)
+          }
+        }
+      },
+      tablePage: {
+        pageSize: 20,
+        pageSizes: [10, 20, 50, 100, 200, 500, 1000]
+      }
+    }
+  },
+  watch: {
+
+  },
+  created() {
+
+  },
+  mounted() {
+
+  },
+  methods: {
+    // 数字为负数的,显示为红色
+    cellClassName({ row, rowIndex, column, columnIndex }) {
+      const field = column.property
+      const cellValue = row[field]
+      if (typeof cellValue === 'number' && cellValue < 0) {
+        return 'col-red'
+      }
+    },
+    refreshEvent() {
+      this.$refs.xGrid.commitProxy('query')
+    }
+  }
+
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>

+ 152 - 0
plopfile.js

@@ -0,0 +1,152 @@
+// plop 的入口文件
+// 需要导出一个函数,函数接收一个plop对象,用于创建生成器任务
+
+const path = require('path')
+const fs = require('fs')
+
+function getFolder(path) {
+  let components = []
+  const files = fs.readdirSync(path)
+  files.forEach(function(item) {
+    let stat = fs.lstatSync(path + '/' + item)
+    if (stat.isDirectory() === true && item !== 'components') {
+      components.push(path + '/' + item)
+      components.push.apply(components, getFolder(path + '/' + item))
+    }
+  })
+  return components
+}
+
+module.exports = plop => {
+  plop.setWelcomeMessage('请选择需要创建的模式:')
+  // setGenerator可以设置一个生成器,每个生成器都可用于生成特定的文件
+  // 接收两个参数,生成器的名称和配置选项
+
+  plop.setGenerator('default-page', {
+    // 生成器的描述
+    description: '创建一个默认页面',
+    // 命令行提示
+    prompts: [
+      {
+        type: 'list',
+        name: 'path',
+        message: '请选择页面创建目录',
+        choices: getFolder('src/views')
+      },
+      {
+        type: 'input',
+        name: 'name', // 接收变量的参数
+        message: '请输入页面文件名称',
+        validate: v => {
+          if (!v || v.trim === '') {
+            return '文件名不能为空'
+          } else {
+            return true
+          }
+        }
+      }
+    ],
+    // 完成命令行后执行的操作,每个对象都是动作对象
+    actions: data => {
+      let relativePath = path.relative('src/views', data.path)
+      const actions = [
+        {
+          type: 'add', // 动作类型
+          path: `${data.path}/{{name}}.vue`, // 生成文件的输出路径
+          templateFile: 'plop-templates/default-page.hbs', // template 模板的文件路径,目录下的文件遵循hbs的语法规则
+          data: {
+            componentName: `${relativePath} ${data.name}`
+          }
+        }
+      ]
+      return actions
+    }
+  })
+
+  plop.setGenerator('table-page', {
+    description: '创建一个表格页面',
+    prompts: [
+      {
+        type: 'list',
+        name: 'path',
+        message: '请选择页面创建目录',
+        choices: getFolder('src/views')
+      },
+      {
+        type: 'input',
+        name: 'name',
+        message: '请输入页面文件名称',
+        validate: v => {
+          if (!v || v.trim === '') {
+            return '文件名不能为空'
+          } else {
+            return true
+          }
+        }
+      }
+    ],
+    actions: data => {
+      let relativePath = path.relative('src/views', data.path)
+      const actions = [
+        {
+          type: 'add',
+          path: `${data.path}/{{name}}.vue`,
+          templateFile: 'plop-templates/table-page.hbs',
+          data: {
+            componentName: `${relativePath} ${data.name}`
+          }
+        }
+      ]
+      return actions
+    }
+  })
+
+  plop.setGenerator('component', {
+    description: '创建组件',
+    prompts: [
+      {
+        type: 'confirm',
+        name: 'isGlobal',
+        message: '是否为全局组件',
+        default: true
+      },
+      {
+        type: 'list',
+        name: 'path',
+        message: '请选择组件创建目录',
+        choices: getFolder('src/views'),
+        when: answers => {
+          return !answers.isGlobal
+        }
+      },
+      {
+        type: 'input',
+        name: 'name',
+        message: '请输入组件名称',
+        validate: v => {
+          if (!v || v.trim === '') {
+            return '组件名称不能为空'
+          } else {
+            return true
+          }
+        }
+      }
+    ],
+    actions: data => {
+      let path = ''
+      if (data.isGlobal) {
+        path = 'src/components/{{properCase name}}/index.vue'
+      } else {
+        path = `${data.path}/components/{{properCase name}}/index.vue`
+      }
+      const actions = [
+        {
+          type: 'add',
+          path: path,
+          templateFile: 'plop-templates/component.hbs'
+        }
+      ]
+      return actions
+    }
+  })
+}

BIN
public/favicon.ico


File diff suppressed because it is too large
+ 2 - 0
public/web-designer.js


+ 11 - 0
src/App.vue

@@ -0,0 +1,11 @@
+<template>
+  <div id="app">
+    <router-view />
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'App'
+}
+</script>

+ 174 - 0
src/api/basic/account.js

@@ -0,0 +1,174 @@
+import request from '@/utils/request'
+
+export function fetchAccountList(params) {
+  return request({
+    url: '/sys/fundaccount_list/',
+    method: 'get',
+    params
+  })
+}
+
+export function createFundAccount(data) {
+  return request({
+    url: '/sys/fundaccount/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateFundAccount(data, id) {
+  return request({
+    url: '/sys/fundaccount/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function deleteFundAccount(id) {
+  return request({
+    url: '/sys/fundaccount/' + id + '/',
+    method: 'delete'
+  })
+}
+
+export function fetchFundAccountDetail(id) {
+  return request({
+    url: '/sys/fundaccount/' + id + '/',
+    method: 'get'
+  })
+}
+
+// 查询支付宝授权状态
+export function getAlipayAuthStatus(params) {
+  return request({
+    url: '/pay/alipay_appauth_query/',
+    method: 'get',
+    params
+  })
+}
+
+// 查询支付宝商户签约状态
+export function getAlipaySignStatus(params) {
+  return request({
+    url: '/pay/alipay_signstatus_query/',
+    method: 'get',
+    params
+  })
+}
+
+// 获取支付宝授权url
+export function getAlipayAuthcodeurl(params) {
+  return request({
+    url: '/pay/alipay_get_authcodeurl/',
+    method: 'get',
+    params
+  })
+}
+
+// 获取支付宝付款url
+export function getSales_AlipayReceiptCode(params) {
+  return request({
+    url: '/sal/alipay_sales_get_receiptcode/',
+    method: 'get',
+    params
+  })
+}
+
+// 查询微信商户入驻申请单列表
+export function getWxpayMicroImportList(params) {
+  return request({
+    url: '/pay/wxpay_applyment_list/',
+    method: 'get',
+    params
+  })
+}
+
+// 创建微信商户入驻申请单
+export function createtWxpayMicroImport(data) {
+  return request({
+    url: '/pay/wxpay_applyment/',
+    method: 'post',
+    data
+  })
+}
+
+// 查询微信商户入驻申请单详情
+export function fetchWxpayMicroImportDetail(id) {
+  return request({
+    url: '/pay/wxpay_applyment/' + id + '/',
+    method: 'get'
+  })
+}
+
+// 更新微信商户入驻申请单
+export function updateWxpayMicroImport(data, id) {
+  return request({
+    url: '/pay/wxpay_applyment/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除微信商户入驻申请单
+export function deleteWxpayMicroImport(id) {
+  return request({
+    url: '/pay/wxpay_applyment/' + id + '/',
+    method: 'delete'
+  })
+}
+
+// 微信商户入驻申请单上传图片
+export function wxpayUploadmedia(data) {
+  return request({
+    url: '/pay/wxpay_upload_image/',
+    method: 'post',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}
+
+// 微信商户入驻申请单上传视频
+export function wxpayUploadVideo(data) {
+  return request({
+    url: '/pay/wxpay_upload_video/',
+    method: 'post',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}
+
+// 提交入驻申请单给微信
+export function wxpayMicroImportSubmit(data) {
+  return request({
+    url: '/pay/wxpay_applyment_submit/',
+    method: 'post',
+    data
+  })
+}
+
+// 查询商户入驻申请单的微信处理状态
+export function wxpayMicroImportGetState(params) {
+  return request({
+    url: '/pay/wxpay_applyment_getstate/',
+    method: 'get',
+    params
+  })
+}
+
+// 获得签约二维码图片
+export function wxpayMicroImportGetSignImage(params) {
+  return request({
+    url: '/pay/wxpay_applyment_getsignimage/',
+    method: 'get',
+    params
+  })
+}
+
+// 获取微信费率结算规则对照表
+export function wxpaySettlementRules(params) {
+  return request({
+    url: '/pay/wxpay_get_settlement/',
+    method: 'get',
+    params
+  })
+}

+ 77 - 0
src/api/basic/area.js

@@ -0,0 +1,77 @@
+import request from '@/utils/request'
+
+// 获取区域列表 - 分页接口
+export function fetchAreaList(params) {
+  return request({
+    url: '/sys/area_list/',
+    method: 'get',
+    params
+  })
+}
+// 单笔查询
+export function oneAreaList(id) {
+  return request({
+    url: '/sys/area/' + id + '/',
+    method: 'get'
+  })
+}
+// 获取树形数据
+export function getAreaTree() {
+  return request({
+    url: '/sys/area_tree/',
+    method: 'get'
+  })
+}
+
+// 新增区域
+export function createArea(data) {
+  return request({
+    url: '/sys/area/',
+    method: 'post',
+    data
+  })
+}
+
+// 修改区域
+export function updateArea(data, id) {
+  return request({
+    url: '/sys/area/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除区域
+export function deleteArea(id) {
+  return request({
+    url: '/sys/area/' + id + '/',
+    method: 'delete'
+  })
+}
+
+// 获取省份资料
+export function getProvinceData(params) {
+  return request({
+    url: '/standard/all_province/',
+    method: 'get',
+    params
+  })
+}
+
+// 获取城市资料
+export function getCityData(params) {
+  return request({
+    url: '/standard/all_city/',
+    method: 'get',
+    params
+  })
+}
+
+// 获取区县资料
+export function getDistrictData(params) {
+  return request({
+    url: '/standard/all_district/',
+    method: 'get',
+    params
+  })
+}

+ 68 - 0
src/api/basic/auditcenter.js

@@ -0,0 +1,68 @@
+import request from '@/utils/request'
+
+// 审核中心 待审核列表
+export function fetchPendingAuditList(params) {
+  return request({
+    url: '/flow/audit_center_pending/',
+    method: 'get',
+    params
+  })
+}
+
+// 审核中心 已审核列表
+export function fetchAuditedList(params) {
+  return request({
+    url: '/flow/audit_center_handled/',
+    method: 'get',
+    params
+  })
+}
+
+// 审核中心 我发起列表
+export function fetchInitiateList(params) {
+  return request({
+    url: '/flow/audit_center_initiate_by_me/',
+    method: 'get',
+    params
+  })
+}
+
+// 审核中心 抄送我列表
+export function fetchCarbonCopyList(params) {
+  return request({
+    url: '/flow/audit_center_cc_to_me/',
+    method: 'get',
+    params
+  })
+}
+
+// export function createAgreeAudit(data) {
+//   return request({
+//     url: '/flow/approve_node/',
+//     method: 'post',
+//     data
+//   })
+// }
+
+// export function createRejectAudit(data) {
+//   return request({
+//     url: '/flow/back_flow/',
+//     method: 'post',
+//     data
+//   })
+// }
+
+// export function updateFundAccount(data, id) {
+//   return request({
+//     url: '/sys/fundaccount/' + id + '/',
+//     method: 'put',
+//     data
+//   })
+// }
+
+// export function deleteFundAccount(id) {
+//   return request({
+//     url: '/sys/fundaccount/' + id + '/',
+//     method: 'delete'
+//   })
+// }

+ 112 - 0
src/api/basic/bank.js

@@ -0,0 +1,112 @@
+import request from '@/utils/request'
+
+export function fetchBankList(params) {
+  return request({
+    url: '/sys/bank_list/',
+    method: 'get',
+    params
+  })
+}
+
+export function createBankInfo(data) {
+  return request({
+    url: '/sys/bank/',
+    method: 'post',
+    data
+  })
+}
+
+export function patchCreateBankInfo(data) {
+  return request({
+    url: '/sys/bank_bulk/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateBankInfo(id, data) {
+  return request({
+    url: '/sys/bank/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function deleteBankInfo(id) {
+  return request({
+    url: '/sys/bank/' + id + '/',
+    method: 'delete'
+  })
+}
+
+export function fetchBankInstList(params) {
+  return request({
+    url: '/standard/all_bankinst/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchProvinceList(params) {
+  return request({
+    url: '/standard/all_province/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchBankBranch(params) {
+  return request({
+    url: '/standard/search_all_bank/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchBankBranchTw(params) {
+  return request({
+    url: '/standard/search_all_bank_tw/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchBankCounty(params) {
+  return request({
+    url: '/standard/all_district/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchBankBranchDetails(name, region, params) {
+  var query = '?query=' + name
+  var tag = '&tag=银行'
+  region = '&region=' + region
+  var output = '&output=json'
+  var ak = '&ak=ZTHHHTWWepzxx1av0wMR67Dn8EjgwrNR'
+  var scope = '&scope=1'
+  var page_size = '&page_size=20'
+  // var page_num = '&page_num=' + (page - 1).toString()
+  console.log('standard/get_banklist' + query + tag + region + output + ak + scope + page_size)
+  return request({
+    url: 'standard/get_banklist' + query + tag + region + output + ak + scope + page_size,
+    method: 'get',
+    params
+  })
+}
+
+// export function fetchBank(type, region, name, params) {
+//   var query = '?query=' + type + name + '支行'
+//   var tag = '&tag=银行'
+//   region = '&region=' + region
+//   var output = '&output=json'
+//   var ak = '&ak=ZTHHHTWWepzxx1av0wMR67Dn8EjgwrNR'
+//   var scope = '&scope=2'
+//   var page_size = '&page_size=20'
+//   return request({
+//     url: 'sys/banklist' + query + tag + region + output + ak + scope + page_size,
+//     method: 'get',
+//     params
+//   })
+// }

+ 141 - 0
src/api/basic/beginning.js

@@ -0,0 +1,141 @@
+import request from '@/utils/request'
+
+export function fetchBeginningPrdtStock(params) {
+  return request({
+    url: '/stk/prdt_stock_begin/',
+    method: 'get',
+    params
+  })
+}
+
+export function createBeginningPrdtStock(data) {
+  return request({
+    url: '/stk/prdt_stock_begin/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateBeginningPrdtStock(data) {
+  return request({
+    url: '/stk/prdt_stock_begin/',
+    method: 'put',
+    data
+  })
+}
+
+export function deleteBeginningPrdtStock(data) {
+  return request({
+    url: '/stk/prdt_stock_begin/',
+    method: 'delete',
+    data
+  })
+}
+
+export function fetchBeginningAccBalance(params) {
+  return request({
+    url: '/mon/acc_balance_begin/',
+    method: 'get',
+    params
+  })
+}
+
+export function createBeginningAccBalance(data) {
+  return request({
+    url: '/mon/acc_balance_begin/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateBeginningAccBalance(data) {
+  return request({
+    url: '/mon/acc_balance_begin/',
+    method: 'put',
+    data
+  })
+}
+
+export function deleteBeginningAccBalance(data) {
+  return request({
+    url: '/mon/acc_balance_begin/',
+    method: 'delete',
+    data
+  })
+}
+
+export function fetchBeginningAccRecvpay(params) {
+  return request({
+    url: '/mon/acc_recvpay_begin/',
+    method: 'get',
+    params
+  })
+}
+
+export function createBeginningAccRecvpay(data) {
+  return request({
+    url: '/mon/acc_recvpay_begin/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateBeginningAccRecvpay(data) {
+  return request({
+    url: '/mon/acc_recvpay_begin/',
+    method: 'put',
+    data
+  })
+}
+
+export function deleteBeginningAccRecvpay(data) {
+  return request({
+    url: '/mon/acc_recvpay_begin/',
+    method: 'delete',
+    data
+  })
+}
+
+// Excel模板下载
+export function fetchImportExcelTemplate(params) {
+  return request({
+    url: '/sys/get_import_excel_template/',
+    responseType: 'blob',
+    method: 'get',
+    params
+  })
+}
+
+// Excel导入
+export function importBeginningAccBalanceExcel(data) {
+  return request({
+    url: '/stk/import_balance_begin/',
+    method: 'post',
+    data
+  })
+}
+
+export function importBeginningPrdtStockExcel(data) {
+  return request({
+    url: '/stk/import_prdt_stock_begin/',
+    method: 'post',
+    data
+  })
+}
+
+export function importBeginningAccRecvpayExcel(data) {
+  return request({
+    url: '/stk/import_accrecvpay_begin/',
+    method: 'post',
+    data
+  })
+}
+
+// 导入结果查询
+export function fetchImportExcelResultList(params) {
+  return request({
+    url: '/sys/import_excel_list/',
+    method: 'get',
+    params
+  })
+}

+ 83 - 0
src/api/basic/bom.js

@@ -0,0 +1,83 @@
+import request from '@/utils/request'
+// 获取bom列表
+export function fetchBomList(params) {
+  return request({
+    url: '/sys/productbom_list/',
+    method: 'get',
+    params
+  })
+}
+// 获取bom列表
+export function createBomList(params, data) {
+  return request({
+    url: '/sys/productbom_list/',
+    method: 'post',
+    params,
+    data
+  })
+}
+
+// bom弹窗查询接口
+export function fetchBomDialog(params) {
+  return request({
+    url: '/sys/product_bom_select/',
+    method: 'get',
+    params
+  })
+}
+// 获取单个bom详细数据
+export function oneBomList(id) {
+  return request({
+    url: '/sys/productbom/' + id + '/',
+    method: 'get'
+  })
+}
+// 获取bom的树形结构
+export function fetchBomTree(params) {
+  return request({
+    url: '/sys/productbom_tree/',
+    method: 'get',
+    params
+  })
+}
+// 删除bom
+export function deleteBom(id) {
+  return request({
+    url: '/sys/productbom/' + id + '/',
+    method: 'delete'
+  })
+}
+// 修改bom
+export function updateBom(data, id) {
+  return request({
+    url: '/sys/productbom/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+// 新增bom
+export function createBom(data) {
+  return request({
+    url: '/sys/productbom/',
+    method: 'post',
+    data
+  })
+}
+// bom图片上传
+export function createBomImg(data) {
+  return request({
+    url: '/sys/productbom_image/',
+    method: 'post',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}
+// bom图片修改
+export function updateBomImg(data) {
+  return request({
+    url: '/sys/productbom_image/',
+    method: 'put',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}

+ 52 - 0
src/api/basic/brandSet.js

@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 品牌设定列表查询接口
+export function fetchBrandList(params) {
+  return request({
+    url: '/sys/product_brand_list/',
+    method: 'get',
+    params
+  })
+}
+// 品牌设定列表查询接口
+export function createBrandList(params, data) {
+  return request({
+    url: '/sys/product_brand_list/',
+    method: 'post',
+    params,
+    data
+  })
+}
+
+// 品牌单个查询接口
+export function fetchOneBrand(id) {
+  return request({
+    url: '/sys/product_brand/' + id + '/',
+    method: 'get'
+  })
+}
+// 品牌新增
+export function fetchAddBrand(data) {
+  return request({
+    url: '/sys/product_brand/',
+    method: 'post',
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+    data
+  })
+}
+// 品牌修改
+export function fetchUpdateBrand(id, data) {
+  return request({
+    url: '/sys/product_brand/' + id + '/',
+    method: 'put',
+    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+    data
+  })
+}
+// 品牌删除
+export function fetchDelBrand(id) {
+  return request({
+    url: '/sys/product_brand/' + id + '/',
+    method: 'delete'
+  })
+}

+ 246 - 0
src/api/basic/company.js

@@ -0,0 +1,246 @@
+import request from '@/utils/request'
+
+/**
+ * @name: 公司管理-公司列表
+ * @description: 本接口只要登陆平台用户即可查询
+ * @param {*} params
+ * @return {*}
+ * @mock: http://api.attnserver.com/project/17/interface/api/3970
+ */
+export function fetchCompanyList(params) {
+  return request({
+    url: '/sys/company_list/',
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * @name:公司管理-创建
+ * @description:创建帐套不受[添加公司: comp_sys_add_company]权限管控,只要登陆平台用户就可以创建公司;
+ * @param {*} data
+ * @return {*}
+ * @mock:http://api.attnserver.com/project/17/interface/api/3962
+ */
+export function createCompany(data) {
+  return request({
+    url: '/sys/company/',
+    method: 'post',
+    data
+  })
+}
+
+/**
+ * @name:公司管理-转让帐套-发送短信验证码
+ * @description:调用该接口的用户需要是转让公司的管理员才可以,接收方必须已经注册了云T的用户,
+两次验证码发送成功后返回的授权序号(authid)的值是一样的,
+在调用公司转让接口(company_transfer)时需要提交该参数和验证码
+ * @param {*} data
+ * @return {*}
+ * @mock:http://api.attnserver.com/project/17/interface/api/4658
+ */
+export function transferCompanySendCode(data, comp_id) {
+  return request({
+    url: '/sys/company_sms_transfer/',
+    method: 'post',
+    data,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+/**
+ * @name:公司管理-转让帐套
+ * @description:请先调用[转让账套-发送短信验证码]获得授权序号和验证码
+帐套转让时,系统会有一个日志表来记录相关的信息
+ * @param {*} data
+ * @return {*}
+ * @mock:http://api.attnserver.com/project/17/interface/api/4674
+ */
+export function transferCompany(data, comp_id) {
+  return request({
+    url: '/sys/company_transfer/',
+    method: 'post',
+    data,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+/**
+ * @name:  公司资料修改
+ * @description:  只有进入公司账套才可以修改公司资料
+ * @param {*} data
+ * @param {*} id
+ * @return {*}
+ * @mock: http://api.attnserver.com/project/17/interface/api/4682
+ */
+export function updateCompany(data, comp_id) {
+  return request({
+    url: '/sys/company/' + comp_id + '/',
+    method: 'put',
+    data,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+/**
+ * @name: 公司管理-删除帐套-发送短信验证码
+ * @description: 接口会根据当前登录用户,检测该用户是不是要删除的帐套的创建人(这个判断先暂定),
+ 如果是,会发送短信验证码到该创建人的手机上 需要传入comp_id
+ * @param {*} data
+ * @return {*}
+ * @mock: http://api.attnserver.com/project/17/interface/api/4034
+ */
+export function deleteCompanySendCode(data, comp_id) {
+  return request({
+    url: '/sys/company_sms_code2session/',
+    method: 'post',
+    data,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+/**
+ * @name:   删除公司账套
+ * @description:只有公司管理员才可以操作 isBoss:true
+ 请先调用[删除帐套-发送短信验证码]获得授权序号
+ 帐套删除时,系统会有一个日志表来记录相关的信息
+ * @param {*} data
+ * @return {*}
+ * @mock:http://api.attnserver.com/project/17/interface/api/4042
+ */
+export function deleteCompany(data, comp_id) {
+  return request({
+    url: '/sys/company_destroy/',
+    method: 'post',
+    data,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+// 公司资料-单笔查询
+// 只有进入公司账套才可以修改公司资料
+export function fetchCompanyDetail(comp_id) {
+  return request({
+    url: '/sys/company/' + comp_id + '/',
+    method: 'get',
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+// 修改公司印章图片
+// 调用时需要传comp_id;
+// 如果没有传file参数,表示清除该公司的公章图片
+export function changeCompanySeal(data, comp_id) {
+  return request({
+    url: '/sys/company_change_seal_image/',
+    method: 'post',
+    data,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+// 公司管理-修改公司logo
+// 调用时需要传comp_id
+// 如果没有传file参数,表示清除该公司的logo图片
+export function changeCompanyLogo(data, comp_id) {
+  return request({
+    url: '/sys/company_change_logo_image/',
+    method: 'post',
+    data,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+// 企业工商注册信息查询
+export function findEnterpriseInformation(params) {
+  return request({
+    url: '/standard/search_all_company/',
+    method: 'get',
+    params
+  })
+}
+
+// 查询公司
+export function searchCompany(params) {
+  return request({
+    url: '/sys/company_search/',
+    method: 'get',
+    params
+  })
+}
+
+// 申请加入公司
+export function joinCompany(data) {
+  return request({
+    url: '/sys/company_join_apply_active/',
+    method: 'post',
+    data
+  })
+}
+
+// 申请加入公司
+export function inviteJoinCompany(data) {
+  return request({
+    url: '/sys/company_join_apply_passive/',
+    method: 'post',
+    data
+  })
+}
+
+// 加入公司申请记录
+export function joinCompanyLog(params) {
+  return request({
+    url: '/sys/company_join_apply_log_list/',
+    method: 'get',
+    params
+  })
+}
+
+// 加入公司审核
+export function joinCompanyAudit(data, comp_id) {
+  return request({
+    url: '/sys/company_auditing_join_apply/',
+    method: 'post',
+    data,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+// 公司管理-邀请码-创建
+export function companyCreateInvite(data, comp_id) {
+  return request({
+    url: '/sys/company_create_invite/',
+    method: 'post',
+    data,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+// 公司管理-邀请码-查询
+export function fetchCompanyInvite(params, comp_id) {
+  return request({
+    url: '/sys/company_create_invite/',
+    method: 'get',
+    params,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+// 公司管理-受邀加入公司-发送短信验证码
+export function createCompanySmsJoinApply(data, comp_id) {
+  return request({
+    url: '/sys/company_sms_join_apply/',
+    method: 'post',
+    data,
+    headers: { 'comp': comp_id || null }
+  })
+}
+
+// 公司资料-变更记录-获取表格内容
+export function fetchChangeRecordDetail(params) {
+  return request({
+    url: '/sys/company_change_log/',
+    method: 'get',
+    params
+  })
+}

+ 76 - 0
src/api/basic/config.js

@@ -0,0 +1,76 @@
+import request from '@/utils/request'
+
+export function fetchReportConfig(params) {
+  return request({
+    url: '/sys/report_layout_config/',
+    method: 'get',
+    params
+  })
+}
+
+export function createReportConfig(data) {
+  return request({
+    url: '/sys/report_layout_config/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateReportConfig(data, id) {
+  return request({
+    url: '/sys/report_layout_config/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function fetchBillConfig(params) {
+  return request({
+    url: '/sys/bill_layout_config/',
+    method: 'get',
+    params
+  })
+}
+
+export function createBillConfig(data) {
+  return request({
+    url: '/sys/bill_layout_config/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateBillConfig(data, id) {
+  return request({
+    url: '/sys/bill_layout_config/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function synchronizationConfig(data) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/managesys/bill_def_config_sync/',
+    method: 'post',
+    data
+  })
+}
+
+export function synchronizationReportConfig(data) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/managesys/report_def_config_sync/',
+    method: 'post',
+    data
+  })
+}
+
+export function synchronizationDesktopConfig(data) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/managesys/desktop_def_config_sync/',
+    method: 'post',
+    data
+  })
+}

+ 54 - 0
src/api/basic/currency.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 获取币别列表 - 分页处理
+export function fetchCurrencyType(params) {
+  return request({
+    url: '/sys/currency/',
+    method: 'get',
+    params
+  })
+}
+
+// 新建币别 -- 批量
+export function patchCreateCurrency(data) {
+  return request({
+    url: '/sys/currency_bulk/',
+    method: 'post',
+    data
+  })
+}
+
+// 中国银行外汇牌价的接口 China Foreign Exchange
+export function getCurrencyListFromCFE(params) {
+  return request({
+    url: '/standard/all_currency/',
+    method: 'get',
+    params
+  })
+}
+
+// 新建币别
+export function createCurrency(data) {
+  return request({
+    url: '/sys/currency/',
+    method: 'post',
+    data
+  })
+}
+
+// 更新币别
+export function updateCurrency(data, id) {
+  return request({
+    url: '/sys/currency/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除币别
+export function deleteCurrency(id) {
+  return request({
+    url: '/sys/currency/' + id + '/',
+    method: 'delete'
+  })
+}

+ 52 - 0
src/api/basic/customer.js

@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 获取往来单位列表
+export function fetchCustomerList(params) {
+  return request({
+    url: '/sys/customer_list/',
+    method: 'get',
+    params
+  })
+}
+// 获取往来单位列表
+export function createCustomerList(params, data) {
+  return request({
+    url: '/sys/customer_list/',
+    method: 'post',
+    params,
+    data
+  })
+}
+
+export function fetchCustomerDetail(id) {
+  return request({
+    url: '/sys/customer/' + id + '/',
+    method: 'get'
+  })
+}
+
+// 创建往来单位
+export function createCustomer(data) {
+  return request({
+    url: '/sys/customer/',
+    method: 'post',
+    data
+  })
+}
+
+// 更新往来单位
+export function updateCustomer(data, id) {
+  return request({
+    url: '/sys/customer/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除往来单位
+export function deleteCustomer(id) {
+  return request({
+    url: '/sys/customer/' + id + '/',
+    method: 'delete'
+  })
+}

+ 51 - 0
src/api/basic/customercategory.js

@@ -0,0 +1,51 @@
+import request from '@/utils/request'
+
+// 获取往来单位分类列表 - 分页接口
+export function fetchCustomerCagList(params) {
+  return request({
+    url: '/sys/customer_category_list/',
+    method: 'get',
+    params
+  })
+}
+
+// 获取单个往来单位分类列表
+export function oneCustomerCagList(id) {
+  return request({
+    url: '/sys/customer_category/' + id + '/',
+    method: 'get'
+  })
+}
+// 获取往来单位分类树
+export function customerTree() {
+  return request({
+    url: '/sys/customer_category_tree/',
+    method: 'get'
+  })
+}
+
+// 创建往来单位分类
+export function createCustomerCag(data) {
+  return request({
+    url: '/sys/customer_category/',
+    method: 'post',
+    data
+  })
+}
+
+// 更新往来单位分类
+export function updateCustomerCag(data, id) {
+  return request({
+    url: '/sys/customer_category/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除往来单位分类
+export function deleteCustomerCag(id) {
+  return request({
+    url: '/sys/customer_category/' + id + '/',
+    method: 'delete'
+  })
+}

+ 98 - 0
src/api/basic/department.js

@@ -0,0 +1,98 @@
+import request from '@/utils/request'
+// 获取所有部门
+export function allDepartment(params) {
+  return request({
+    url: '/sys/department_list/',
+    method: 'get',
+    params
+  })
+}
+// 获取单个部门
+export function oneDepartment(id) {
+  return request({
+    url: '/sys/department/' + id + '/',
+    method: 'get'
+  })
+}
+// 部门树状
+export function departmentTree(params) {
+  return request({
+    url: '/sys/department_tree/',
+    method: 'get',
+    params
+  })
+}
+// 添加部门
+export function createDepartment(data) {
+  return request({
+    url: '/sys/department/',
+    method: 'post',
+    data
+  })
+}
+// 删除部门
+export function delDepartment(id) {
+  return request({
+    url: '/sys/department/' + id + '/',
+    method: 'delete'
+  })
+}
+
+// 批量删除部门
+export function delMultiDepartments(data) {
+  return request({
+    url: '/sys/department/',
+    method: 'delete',
+    data
+  })
+}
+
+// 修改部门
+export function updateDepartment(data, id) {
+  return request({
+    url: '/sys/department/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+// 获取部门中的员工
+export function departmentGetUser(params) {
+  return request({
+    url: '/sys/department_get_user/',
+    method: 'get',
+    params
+  })
+}
+// 部门中添加员工
+export function departmentAddUser(data) {
+  return request({
+    url: '/sys/department_add_user/',
+    method: 'post',
+    data
+  })
+}
+// 部门中移除员工
+export function departmentDelUser(data) {
+  return request({
+    url: '/sys/department_del_user/',
+    method: 'post',
+    data
+  })
+}
+// 部门中查询上级人员
+export function departmentGetSuper(params) {
+  return request({
+    url: '/sys/department_superiors/',
+    method: 'get',
+    params
+  })
+}
+// 部门中修改上级人员
+export function departmentUpdateSuper(data) {
+  return request({
+    url: '/sys/department_superiors/',
+    method: 'post',
+    data
+  })
+}
+// http://127.0.0.1:8000/api/sys/department//

+ 40 - 0
src/api/basic/docbindingflow.js

@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+export function createBillType(data) {
+  return request({
+    url: '/sys/billtype/',
+    method: 'post',
+    data
+  })
+}
+
+export function fetchBillType(params) {
+  return request({
+    url: '/sys/billtype/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchBillTypeEnum(params) {
+  return request({
+    url: '/sys/billtypeenum/',
+    method: 'get',
+    params
+  })
+}
+
+export function updateBillType(data, id) {
+  return request({
+    url: '/sys/billtype/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function deleteBillType(id) {
+  return request({
+    url: '/sys/billtype/' + id + '/',
+    method: 'delete'
+  })
+}

+ 93 - 0
src/api/basic/employee.js

@@ -0,0 +1,93 @@
+import request from '@/utils/request'
+
+export function fetchEmployeeList(params) {
+  return request({
+    url: '/sys/employee_list/',
+    method: 'get',
+    params
+  })
+}
+
+export function createEmployeeList(params, data) {
+  return request({
+    url: '/sys/employee_list/',
+    method: 'post',
+    params,
+    data
+  })
+}
+
+export function fetchNoPageList(params) {
+  return request({
+    url: '/sys/selectemployee/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchtEmployeeDetail(id) {
+  return request({
+    url: '/sys/employee/' + id + '/',
+    method: 'get'
+  })
+}
+
+export function createEmployee(data) {
+  return request({
+    url: '/sys/employee/',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteEmployee(id) {
+  return request({
+    url: '/sys/employee/' + id + '/',
+    method: 'delete'
+  })
+}
+
+export function updateEmployee(data, id) {
+  return request({
+    url: '/sys/employee/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function selectEmployee() {
+  return request({
+    url: '/sys/selectemployee/',
+    method: 'get'
+  })
+}
+
+// 新增/修改/删除 图片
+export function employeeImage(data) {
+  return request({
+    url: '/sys/employee_image/',
+    method: 'post',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}
+
+// 员工头像
+export function employeePortraitImage(data) {
+  return request({
+    url: '/sys/employee_chang_portrait_image/',
+    method: 'post',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}
+
+// 修改电子签名图片
+export function changeEmployeeSign(data) {
+  return request({
+    url: '/sys/employee_chang_sign_image/',
+    method: 'post',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}

+ 93 - 0
src/api/basic/encoding.js

@@ -0,0 +1,93 @@
+import request from '@/utils/request'
+
+export function allEncoding(params) {
+  return request({
+    url: '/sys/code_rule_list/',
+    method: 'get',
+    params
+  })
+}
+
+export function oneEncoding(id) {
+  return request({
+    url: '/sys/code_rule/' + id + '/',
+    method: 'get'
+  })
+}
+
+export function delEncoding(id) {
+  return request({
+    url: '/sys/code_rule/' + id + '/',
+    method: 'delete'
+  })
+}
+
+export function addEncoding(data) {
+  return request({
+    url: '/sys/code_rule/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateEncoding(data, id) {
+  return request({
+    url: '/sys/code_rule/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function createBindEncoding(data) {
+  return request({
+    url: '/sys/coderule_type/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateBindEncoding(data, id) {
+  return request({
+    url: '/sys/coderule_type/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function allDefaultEncoding(params) { // 获取所有预设规则
+  return request({
+    url: '/sys/default_code_rule_list/',
+    method: 'get',
+    params
+  })
+}
+
+export function oneDefaultEncoding(id) { // 查询单个预设编码的详情
+  return request({
+    url: '/sys/default_code_rule/' + id + '/',
+    method: 'get'
+  })
+}
+
+export function delDefaultEncoding(id) { // 删除预设编码
+  return request({
+    url: '/sys/default_code_rule/' + id + '/',
+    method: 'delete'
+  })
+}
+
+export function addDefaultEncoding(data) { // 添加预设编码
+  return request({
+    url: '/sys/default_code_rule/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateDefaultEncoding(data, id) { // 修改预设编码
+  return request({
+    url: '/sys/default_code_rule/' + id + '/',
+    method: 'put',
+    data
+  })
+}

+ 36 - 0
src/api/basic/expense.js

@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+// 获取费用项目列表 - 分页处理
+export function fetchExpenseList(params) {
+  return request({
+    url: '/sys/expense_list/',
+    method: 'get',
+    params
+  })
+}
+
+// 新建费用项目
+export function createExpense(data) {
+  return request({
+    url: '/sys/expense/',
+    method: 'post',
+    data
+  })
+}
+
+// 更新费用项目
+export function updateExpense(data, id) {
+  return request({
+    url: '/sys/expense/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除费用项目
+export function deleteExpense(id) {
+  return request({
+    url: '/sys/expense/' + id + '/',
+    method: 'delete'
+  })
+}

+ 74 - 0
src/api/basic/fileImportSettings.js

@@ -0,0 +1,74 @@
+// 文件导入设置相关接口
+import request from '@/utils/request'
+
+// 导入模板-列表
+export function fetchImportTemplateList(params) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: '/sys/import_tmpl_list/',
+    method: 'get',
+    params
+  })
+}
+
+// 导入模板-单笔增、删、改、查
+
+// 添加套版
+export function createImportTemplate(data) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: '/sys/import_tmpl/',
+    method: 'post',
+    data
+  })
+}
+
+// 删除套版
+export function delImportTemplate(id) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: '/sys/import_tmpl/' + id + '/',
+    method: 'delete'
+  })
+}
+
+// 批量删除套版
+export function delMultiImportTemplates(data) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: '/sys/import_tmpl/',
+    method: 'delete',
+    data
+  })
+}
+
+// 修改套版
+export function updateImportTemplate(id, data) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: '/sys/import_tmpl/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 单笔查询
+export function fetchImportTemplate(id, params) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: '/sys/import_tmpl/' + id + '/',
+    method: 'get',
+    params
+  })
+}
+
+// 导入字段选择列表
+export function fetchFieldList(params) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: '/sys/import_field_list/',
+    method: 'get',
+    params
+  })
+}
+

+ 131 - 0
src/api/basic/flowDesign.js

@@ -0,0 +1,131 @@
+// 流程设计 与 流程模板 相关接口
+import request from '@/utils/request'
+
+// 获取流程模板树状结构
+export function fetchFlowTemplateTree(params) {
+  return request({
+    url: '/flow/flow_template_tree/',
+    method: 'get',
+    params
+  })
+}
+
+/**
+ * 创建类别为单据的流程模版
+ */
+//  {
+//   "type": 0,
+//   "name": "采购入库单001",
+//   "bill_type": "PC",
+//   "rem": "采购入库单分采购经理初审,总经理终审",
+//   "auto_submit":true
+// }
+
+// 增加流程模板
+export function addFlowTemplate(data) {
+  return request({
+    url: '/flow/flow_template/',
+    method: 'post',
+    data
+  })
+}
+
+// 删除流程模板
+export function deleteFlowTemplate(id) {
+  return request({
+    url: '/flow/flow_template/' + id + '/',
+    method: 'delete'
+  })
+}
+
+// 修改流程模板
+export function updateFlowTemplate(id, data) {
+  return request({
+    url: '/flow/flow_template/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 查询流程模板
+
+// 列表查询
+export function fetchFlowTemplateList(type, bill_type) {
+  return request({
+    url: '/flow/flow_template/?type=' + type + '&bill_type=' + bill_type,
+    method: 'get'
+  })
+}
+
+// 单笔查询
+export function fetchFlowTemplate(id) {
+  return request({
+    url: '/flow/flow_template/' + id + '/',
+    method: 'get'
+  })
+}
+
+// 流程模板-修改模板图片
+// 如果没有传file参数,表示清除该流程模版的图片
+export function updateFlowTemplateImage(data) {
+  return request({
+    url: '/flow/flow_template_image',
+    method: 'post',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}
+
+// 流程模板-启用或停用模板
+export function updateFlowTemplateStatus(data) {
+  return request({
+    url: '/flow/flow_template_status/',
+    method: 'post',
+    data
+  })
+}
+
+// 流程节点查询
+export function fetchFlowNode(id) {
+  return request({
+    url: '/flow/flow_node/?template=' + id,
+    method: 'get'
+  })
+}
+
+// 删除流程节点
+export function deleteFlowNode(data) {
+  return request({
+    url: '/flow/flow_node/',
+    method: 'delete'
+  })
+}
+
+// 新增及修改流程节点
+export function updateFlowNode(data) {
+  return request({
+    url: '/flow/flow_node/',
+    method: 'post',
+    data
+  })
+}
+
+// 部门树状结构带出所有人员
+export function fetchDepartmentTree(params, comp_id) {
+  return request({
+    url: '/sys/department_tree/',
+    method: 'get',
+    params,
+    headers: { 'comp': comp_id }
+  })
+}
+
+// 角色树状结构带出所有人员
+export function fetchRoleTree(params, comp_id) {
+  return request({
+    url: '/permissions/comp_group_tree/',
+    method: 'get',
+    params,
+    headers: { 'comp': comp_id }
+  })
+}

+ 142 - 0
src/api/basic/flowtemplate.js

@@ -0,0 +1,142 @@
+import request from '@/utils/request'
+
+export function fetchAllFlowModelFolder(params) {
+  return request({
+    url: '/sys/flowmodelfolder/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchAllFlowModel(params) {
+  return request({
+    url: '/sys/flowmodel/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchFlowModelById(id) {
+  return request({
+    url: '/sys/flowmodel/' + id + '/',
+    method: 'get'
+  })
+}
+
+export function createFlowModel(data) {
+  return request({
+    url: '/sys/flowmodel/',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteFlowModel(id) {
+  return request({
+    url: '/sys/flowmodel/' + id + '/',
+    method: 'delete'
+  })
+}
+
+export function updateFlowModel(data, id) {
+  return request({
+    url: '/sys/flowmodel/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function createFlowModelFolder(data) {
+  return request({
+    url: '/sys/flowmodelfolder/',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteFlowModelFolder(id) {
+  return request({
+    url: '/sys/flowmodelfolder/' + id + '/',
+    method: 'delete'
+  })
+}
+
+export function updateFlowModelFolder(data, id) {
+  return request({
+    url: '/sys/flowmodelfolder/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function fetchAllFlowModelFolderAndDocument(params) {
+  return request({
+    url: '/sys/get_model_folder_tree/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchFlowModelProduct(params) {
+  return request({
+    url: '/sys/bind_product_category/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchFlowModelDocumentType(params) {
+  return request({
+    url: '/sys/bind_documenttype/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchFlowModelBillType(params) {
+  return request({
+    url: '/sys/billtype_list/',
+    method: 'get',
+    params
+  })
+}
+
+export function createFlowModelBindingCategory(data) {
+  return request({
+    url: '/sys/flowmodel_type/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateBindingCategory(data, id) {
+  return request({
+    url: '/sys/flowmodel_type/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function fetchProductCategoryById(params) {
+  return request({
+    url: '/sys/get_product_category/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchTypeModelFolderPath(params) {
+  return request({
+    url: '/sys/get_type_model_folder_path/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchFlowModelHistory(params) {
+  return request({
+    url: '/flow/model/',
+    method: 'get',
+    params
+  })
+}

+ 122 - 0
src/api/basic/printTemplateDesign.js

@@ -0,0 +1,122 @@
+// 套版设计相关接口
+import request from '@/utils/request'
+
+// 自定义套版-功能菜单树状结构图
+export function fetchBillTypeReportTree(params) {
+  return request({
+    url: '/sys/billtype_report_tree/',
+    method: 'get',
+    params
+  })
+}
+
+// 自定义套版-功能菜单列表
+export function fetchBillTypeReportList(params) {
+  return request({
+    url: '/sys/billtype_report_list/',
+    method: 'get',
+    params
+  })
+}
+
+// 自定义套版-列表查询
+export function fetchPrintTemplateList(params) {
+  return request({
+    url: '/sys/report_file_list/',
+    method: 'get',
+    params
+  })
+}
+
+// 自定义套版-增、删、改、查
+
+// 添加套版
+export function createPrintTemplate(data) {
+  return request({
+    url: '/sys/report_file/',
+    method: 'post',
+    data
+  })
+}
+// 删除套版
+export function delPrintTemplate(id) {
+  return request({
+    url: '/sys/report_file/' + id + '/',
+    method: 'delete'
+  })
+}
+
+// 批量删除套版
+export function delMultiPrintTemplates(params) {
+  return request({
+    url: '/sys/report_file/multiple_delete/',
+    method: 'delete',
+    params
+  })
+}
+
+// 修改套版
+export function updatePrintTemplate(id, data) {
+  return request({
+    url: '/sys/report_file/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 单笔查询
+export function fetchPrintTemplate(id, params) {
+  return request({
+    url: '/sys/report_file/' + id + '/',
+    method: 'get',
+    params
+  })
+}
+
+// 获得数据集列表
+export function fetchReportDatasetList(params, language) {
+  return request({
+    url: '/sys/report_dataset_list/',
+    method: 'get',
+    params,
+    language
+  })
+}
+
+// 自定义报表-获得财务报表类别列表
+export function fetchReportAccrptTypes(params) {
+  return request({
+    url: '/sys/report_accrpt_types/',
+    method: 'get',
+    params
+  })
+}
+
+// 自定义套版-模版文件导入
+
+export function importTemplateFile(data) {
+  return request({
+    url: '/sys/report_updownload_file/',
+    method: 'post',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}
+
+// 导出
+export function exportTemplateFile(params) {
+  return request({
+    url: '/sys/report_updownload_file/',
+    method: 'get',
+    params
+  })
+}
+
+// 获取报表file的json数据
+export function fetchTemplateFileData(id) {
+  return request({
+    baseURL: process.env.BASE_ARC_API,
+    url: 'reports/' + id + '/content',
+    method: 'get'
+  })
+}

+ 88 - 0
src/api/basic/printset.js

@@ -0,0 +1,88 @@
+import request from '@/utils/request'
+
+// 获取打印模板类型
+export function gettemplateType() {
+  return request({
+    url: '/printset/templateType/',
+    method: 'get'
+  })
+}
+
+// 获取模板列表
+export function gettemplateList(params) {
+  return request({
+    url: '/printset/templateList/',
+    method: 'get',
+    params
+  })
+}
+
+// 修改模板数据
+export function updatetemplate(params) {
+  return request({
+    url: '/printset/templateList/',
+    method: 'put',
+    params
+  })
+}
+
+// 删除模板
+export function deletetemplate(params) {
+  return request({
+    url: '/printset/templateList/',
+    method: 'delete',
+    params
+  })
+}
+
+// 创建
+export function createtemplateDetail(data) {
+  return request({
+    url: '/printset/templateDetail/',
+    method: 'post',
+    data
+  })
+}
+
+export function templateDetailPut(data) {
+  return request({
+    url: '/printset/templateDetail/',
+    method: 'put',
+    data
+  })
+}
+
+// 获取模板基础数据
+export function gettemplateDetail(params) {
+  return request({
+    url: '/printset/templateDetail/',
+    method: 'get',
+    params
+  })
+}
+
+// 预览
+export function getpreviewTemplate(params) {
+  return request({
+    url: '/printset/previewTemplate/',
+    method: 'get',
+    params
+  })
+}
+
+// 图片保存
+export function templateImagePost(data) {
+  return request({
+    url: '/printset/templateImage/',
+    method: 'post',
+    data
+  })
+}
+// 单据列表打印
+export function putprintlisttemplate(data) {
+  return request({
+    url: '/printset/printlisttemplate/',
+    method: 'put',
+    data
+  })
+}

+ 135 - 0
src/api/basic/product.js

@@ -0,0 +1,135 @@
+import request from '@/utils/request'
+// 获取货品资料列表
+export function fetchProductList(params) {
+  return request({
+    url: '/sys/product_list/',
+    method: 'get',
+    params
+  })
+}
+export function createProductList(params, data) {
+  return request({
+    url: '/sys/product_list/',
+    method: 'post',
+    params,
+    data
+  })
+}
+
+// 添加货品资料
+export function createProduct(data) {
+  return request({
+    url: '/sys/product/',
+    method: 'post',
+    data
+  })
+}
+// 修改货品资料
+export function updateProduct(data, id) {
+  return request({
+    url: '/sys/product/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+// 删除货品资料
+export function deleteProduct(id) {
+  return request({
+    url: '/sys/product/' + id + '/',
+    method: 'delete'
+  })
+}
+// 货品资料的单笔查询
+export function fetchProductDetail(id) {
+  return request({
+    url: '/sys/product/' + id + '/',
+    method: 'get'
+  })
+}
+// 查询某货品的图片
+export function fetchListImage(params) {
+  return request({
+    url: '/sys/product_image/',
+    method: 'get',
+    params
+  })
+}
+
+// 货品图片添加
+export function createUploadImg(data) {
+  return request({
+    url: '/sys/product_image/',
+    method: 'post',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}
+// 货品图片修改
+export function updateUploadImg(data) {
+  return request({
+    url: '/sys/product_image/',
+    method: 'put',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}
+
+export function fetchProductListForQueryWin(params) {
+  return request({
+    url: '/sys/product_select/',
+    method: 'get',
+    params
+  })
+}
+
+// 获取货品分类树状图
+export function getProductTypeTree() {
+  return request({
+    url: '/sys/product_category_tree/',
+    method: 'get'
+  })
+}
+// 查询货品资料关联哪写文档
+export function selectProductConnectDocuments(params) {
+  return request({
+    url: '/document/relation_doc/?object_type=PRD',
+    method: 'get',
+    params
+  })
+}
+// 货品资料关联文档的上传、修改、删除
+export function productConnectDocuments(data) {
+  return request({
+    url: '/document/relation_doc/?object_type=PRD',
+    method: 'post',
+    headers: { 'Content-Type': 'multipart/form-data' },
+    data
+  })
+}
+
+// 货品的单位信息
+export function fetchProductUnitById(params) {
+  return request({
+    url: '/sys/product_unit_list/',
+    method: 'get',
+    params
+  })
+}
+
+// 通过商品国标码,获取商品信息
+export function fetchProductByGbCode(params) {
+  return request({
+    url: '/standard/all_barcord/',
+    method: 'get',
+    params
+  })
+}
+
+// 货品(辅助属性)版本 查询、检测、修改
+export function productVersionSelect(data) {
+  return request({
+    url: '/sys/productversion_select/',
+    method: 'post',
+    data
+  })
+}

+ 98 - 0
src/api/basic/productcategory.js

@@ -0,0 +1,98 @@
+import request from '@/utils/request'
+
+// 获取货品分类列表 - 分页接口
+export function fetchProductCagList(params) {
+  return request({
+    url: '/sys/product_category_list/',
+    method: 'get',
+    params
+  })
+}
+// 获取货品分类列表 - 分页接口
+export function createProductCagList(params, data) {
+  return request({
+    url: '/sys/product_category_list/',
+    method: 'post',
+    params,
+    data
+  })
+}
+
+// 创建货品分类
+export function createProductCag(data) {
+  return request({
+    url: '/sys/product_category/',
+    method: 'post',
+    data
+  })
+}
+
+// 更新货品分类
+export function updateProductCag(data, id) {
+  return request({
+    url: '/sys/product_category/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除货品分类
+export function deleteProductCag(id) {
+  return request({
+    url: '/sys/product_category/' + id + '/',
+    method: 'delete'
+  })
+}
+
+// 获取某条货品分类的详细数据
+export function fetchProductCagDetail(id) {
+  return request({
+    url: '/sys/product_category/' + id + '/',
+    method: 'get'
+  })
+}
+
+// ------------------------------这是一条分割线-------------------------------
+
+// 获取所有货品分类属性列表
+export function fetchAllProductCagPropsList() {
+  return request({
+    url: '/sys/product_category_property/',
+    method: 'get'
+  })
+}
+
+// 创建货品分类属性
+export function createProductCagProp(data) {
+  return request({
+    url: '/sys/product_category_property/',
+    method: 'post',
+    data
+  })
+}
+
+// 更新货品分类属性
+export function updateProductCagProp(data, id) {
+  return request({
+    url: '/sys/product_category_property/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除货品分类属性
+export function deleteProductCagProp(id) {
+  return request({
+    url: '/sys/product_category_property/' + id + '/',
+    method: 'delete'
+  })
+}
+
+// 获取货品分类属性列表 - 分页接口
+export function fetchProductCagPropList(params) {
+  return request({
+    url: '/sys/product_category_property/',
+    method: 'get',
+    params
+  })
+}

+ 10 - 0
src/api/basic/reinitialize.js

@@ -0,0 +1,10 @@
+import request from '@/utils/request'
+
+// 帐套资料-重新初始化
+export function reinitializeData() {
+  return request({
+    url: '/sys/company_reinit_data/',
+    method: 'post',
+    timeout: 0
+  })
+}

+ 50 - 0
src/api/basic/secondaryAttribute.js

@@ -0,0 +1,50 @@
+import request from '@/utils/request'
+
+// 辅助属性列表查询接口
+export function fetchAttributeList(params) {
+  return request({
+    url: '/sys/product_property_list/',
+    method: 'get',
+    params
+  })
+}
+// 辅助属性列表查询接口
+export function createAttributeList(params, data) {
+  return request({
+    url: '/sys/product_property_list/',
+    method: 'post',
+    params,
+    data
+  })
+}
+
+// 辅助属性单个查询接口
+export function fetchOneAttribute(id) {
+  return request({
+    url: '/sys/product_property/' + id + '/',
+    method: 'get'
+  })
+}
+// 辅助属性新增
+export function fetchAddAttribute(data) {
+  return request({
+    url: '/sys/product_property/',
+    method: 'post',
+    data
+  })
+}
+// 辅助属性修改
+export function fetchUpdateAttribute(id, data) {
+  return request({
+    url: '/sys/product_property/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+// 辅助属性删除
+export function fetchDelAttribute(id) {
+  return request({
+    url: '/sys/product_property/' + id + '/',
+    method: 'delete'
+  })
+}

+ 11 - 0
src/api/basic/share.js

@@ -0,0 +1,11 @@
+import request from '@/utils/request'
+
+// 请求分享单据
+export function fetchBillShare(data) {
+  return request({
+    url: '/miniapp/bill_share/',
+    method: 'post',
+    data
+  })
+}
+

+ 40 - 0
src/api/basic/sourceOfCashFlow.js

@@ -0,0 +1,40 @@
+import request from '@/utils/request'
+
+const URL = {
+  cash_flow_source: '/sys/cash_source/' // 现金流源由
+}
+
+// 现金流源由列表
+export function fetchCashFlowSource(params) {
+  return request({
+    url: URL.cash_flow_source,
+    method: 'get',
+    params
+  })
+}
+
+// 现金流源由新增
+export function addCashFlowSource(data) {
+  return request({
+    url: URL.cash_flow_source,
+    method: 'post',
+    data
+  })
+}
+
+// 删除现金流量源由
+export function delCashFlowSource(id) {
+  return request({
+    url: URL.cash_flow_source + id + '/',
+    method: 'delete'
+  })
+}
+
+// 编辑现金流量原由
+export function putCashFlowSource(id, data) {
+  return request({
+    url: URL.cash_flow_source + id + '/',
+    method: 'put',
+    data
+  })
+}

+ 45 - 0
src/api/basic/unit.js

@@ -0,0 +1,45 @@
+import request from '@/utils/request'
+
+// 获取单位列表
+export function fetchUnitList(params) {
+  return request({
+    url: '/sys/product_unit_list/',
+    method: 'get',
+    params
+  })
+}
+// 获取单位列表
+export function createUnitList(params, data) {
+  return request({
+    url: '/sys/product_unit_list/',
+    method: 'post',
+    params,
+    data
+  })
+}
+
+// 新建单位
+export function createUnit(data) {
+  return request({
+    url: '/sys/product_unit/',
+    method: 'post',
+    data
+  })
+}
+
+// 修改单位
+export function updateUnit(data, id) {
+  return request({
+    url: '/sys/product_unit/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除单位
+export function deleteUnit(id) {
+  return request({
+    url: '/sys/product_unit/' + id + '/',
+    method: 'delete'
+  })
+}

+ 44 - 0
src/api/basic/voucherWord.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+const URL = {
+  voucher_word: '/sys/voucher_group/' // 凭证字列表
+}
+
+// 获取凭证字列表
+export function fetchVoucherWord(params) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: URL.voucher_word,
+    method: 'get',
+    params
+  })
+}
+
+// 更新凭证字
+export function putVoucherWord(id, data) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: URL.voucher_word + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 新增凭证字
+export function addVoucherWord(data) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: URL.voucher_word,
+    method: 'post',
+    data
+  })
+}
+
+// 删除凭证字
+export function delVoucherWord(id) {
+  return request({
+    baseURL: process.env.BASE_ACC_API,
+    url: URL.voucher_word + id + '/',
+    method: 'delete'
+  })
+}

+ 98 - 0
src/api/basic/warehouse.js

@@ -0,0 +1,98 @@
+import request from '@/utils/request'
+export function fetchWarehouseList(params) {
+  return request({
+    url: '/sys/warehouse_list/',
+    method: 'get',
+    params
+  })
+}
+export function createWarehouseList(params, data) {
+  return request({
+    url: '/sys/warehouse_list/',
+    method: 'post',
+    params,
+    data
+  })
+}
+
+export function fetchWarehouseDetail(id) {
+  return request({
+    url: '/sys/warehouse/' + id + '/',
+    method: 'get'
+  })
+}
+
+export function updateWarehouse(data, id) {
+  return request({
+    url: '/sys/warehouse/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function deleteWarehouse(id) {
+  return request({
+    url: '/sys/warehouse/' + id + '/',
+    method: 'delete'
+  })
+}
+
+export function createWarehouse(data) {
+  return request({
+    url: '/sys/warehouse/',
+    method: 'post',
+    data
+  })
+}
+
+// 获取仓库属性
+export function fetchWarehousePropertyList(params) {
+  return request({
+    url: '/sys/warehouse_property/',
+    method: 'get',
+    params
+  })
+}
+
+// 创建仓库属性
+export function createWarehouseProperty(data) {
+  return request({
+    url: '/sys/warehouse_property/',
+    method: 'post',
+    data
+  })
+}
+
+// 更新仓库属性
+export function updateWarehouseProperty(data, id) {
+  return request({
+    url: '/sys/warehouse_property/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除仓库属性
+export function deleteWarehouseProperty(id) {
+  return request({
+    url: '/sys/warehouse_property/' + id + '/',
+    method: 'delete'
+  })
+}
+
+// 获取默认仓库
+export function getDefaultWarehouse() {
+  return request({
+    url: '/sys/warehouse_default/',
+    method: 'get'
+  })
+}
+
+export function postWarehouseInSelectDialog(data) {
+  return request({
+    url: '/sys/warehouse_select/',
+    method: 'post',
+    data
+  })
+}
+

+ 37 - 0
src/api/permissions/authpermission.js

@@ -0,0 +1,37 @@
+import request from '@/utils/request'
+
+export function SyncMenuList(data) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/permmgt/menu_sync/',
+    method: 'post',
+    data
+  })
+}
+
+export function fetchAuthPermissionList(params) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/permmgt/permission_search/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchCopmMenuList(params) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/permmgt/menu_permission_all/',
+    method: 'get',
+    params
+  })
+}
+
+export function createPermissionMenu(data) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/permmgt/menu_set_permission/',
+    method: 'post',
+    data
+  })
+}

+ 180 - 0
src/api/permissions/index.js

@@ -0,0 +1,180 @@
+import request from '@/utils/request'
+
+// 获取角色列表
+export function fetchRoleList() {
+  // const params = { 'is_dropdownbox': 1 }
+  return request({
+    url: '/permissions/comp_group_tree/',
+    method: 'get'
+  })
+}
+
+// 获取所有角色
+export function fetchAllRole(params) {
+  return request({
+    url: '/permissions/comp_group/',
+    method: 'get',
+    params
+  })
+}
+
+// 新增角色
+export function createRole(data) {
+  return request({
+    url: '/permissions/comp_group/',
+    method: 'post',
+    data
+  })
+}
+
+// 编辑角色
+export function updateRole(data, id) {
+  return request({
+    url: '/permissions/comp_group/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+// 删除角色
+export function deleteRole(id) {
+  return request({
+    url: '/permissions/comp_group/' + id + '/',
+    method: 'delete'
+  })
+}
+
+// 获取角色中的所有员工
+export function fetchRoleEmplList(params) {
+  return request({
+    url: '/permissions/group_get_user/',
+    method: 'get',
+    params
+  })
+}
+
+// 获取权限菜单
+export function fetchRoleMenuList(params) {
+  return request({
+    url: '/permissions/group_get_menu/',
+    method: 'get',
+    params
+  })
+}
+
+// 修改用户组权限
+export function updateRolePermission(pdata, group_id) {
+  var data = { 'group_no': group_id, 'menus': pdata }
+  return request({
+    url: '/permissions/group_save_menu/',
+    method: 'post',
+    data
+  })
+}
+
+// 修改角色可批量添加员工接口
+// http://127.0.0.1:8000/api/permissions/add_group_uesr/
+// post
+// {
+//     "group_pk": 39,
+//     "users_pk": [88,89,149]
+// }
+// 角色可批量添加员工接口
+export function addRoleGroupUser(data) {
+  return request({
+    url: '/permissions/group_add_user/',
+    method: 'post',
+    data
+  })
+}
+
+// 移除用户组中的角色
+export function deleteRoleGroupUser(data) {
+  return request({
+    url: '/permissions/group_del_user/',
+    method: 'post',
+    data
+  })
+}
+
+// export function updateRole(data, id) {
+//   return request({
+//     url: '/permissions/role/' + id + '/',
+//     method: 'put',
+//     data
+//   })
+// }
+
+// 删除角色组
+export function deleteRolePermissions(id) {
+  return request({
+    url: '/permissions/rolepermission/' + id + '/',
+    method: 'delete'
+  })
+}
+
+export function getPermissions() {
+  return request({
+    url: '/permissions/permission/',
+    method: 'get'
+  })
+}
+
+export function fetchRolePermissionDetail(params) {
+  return request({
+    url: '/permissions/rolepermission/',
+    method: 'get',
+    params
+  })
+}
+
+export function createcustomertyperole(data) {
+  return request({
+    url: '/permissions/rolepermission/',
+    method: 'post',
+    data
+  })
+}
+
+export function fetchUserRouters(params) {
+  return request({
+    url: '/permissions/usermenu/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchUserPermissions(params) {
+  return request({
+    url: '/permissions/userpermission/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchSuperRouters(params) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/permmgt/admin_menu/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchSuperPermissions(params) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/permmgt/admin_permission/',
+    method: 'get',
+    params
+  })
+}
+
+// 修改用户权限
+export function updateUserPermissions(data) {
+  return request({
+    url: '/permissions/userpermission/',
+    method: 'post',
+    data
+  })
+}

+ 47 - 0
src/api/permissions/menutree.js

@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+export function fetchListCompMenu(params) {
+  return request({
+    url: '/permissions/compmenulist/',
+    method: 'get',
+    params
+  })
+}
+
+export function fetchDetailCompMenu(id) {
+  return request({
+    url: '/permissions/compmenulist/' + id + '/',
+    method: 'get'
+  })
+}
+
+export function updateCompMenuPosition(data) {
+  return request({
+    url: '/permissions/updatecompmenuposition/',
+    method: 'post',
+    data
+  })
+}
+
+export function createCompMenu(data) {
+  return request({
+    url: '/permissions/compmenulist/',
+    method: 'post',
+    data
+  })
+}
+
+export function updateCompMenu(data, id) {
+  return request({
+    url: '/permissions/compmenulist/' + id + '/',
+    method: 'put',
+    data
+  })
+}
+
+export function deleteCompMenu(id) {
+  return request({
+    url: '/permissions/compmenulist/' + id + '/',
+    method: 'delete'
+  })
+}

+ 79 - 0
src/api/permissions/template.js

@@ -0,0 +1,79 @@
+// 模板定义
+import request from '@/utils/request'
+
+// 模板列表
+export function getDatawizardTemplateList(params) {
+  return request({
+    baseURL: process.env.BASE_IP_API,
+    url: '/datawizard/template/list/',
+    method: 'get',
+    params
+  })
+}
+
+// 查看模板
+export function getDatawizardTemplate(id) {
+  return request({
+    baseURL: process.env.BASE_IP_API,
+    url: `/datawizard/template/${id}/`,
+    method: 'get'
+  })
+}
+
+// 新增模板
+export function postDatawizardTemplate(data) {
+  return request({
+    baseURL: process.env.BASE_IP_API,
+    url: '/datawizard/template/',
+    method: 'post',
+    data
+  })
+}
+
+// 更新模板
+export function putDatawizardTemplate(id, data) {
+  return request({
+    baseURL: process.env.BASE_IP_API,
+    url: `/datawizard/template/${id}/`,
+    method: 'put',
+    data
+  })
+}
+
+// 删除模板
+export function delDatawizardTemplate(id) {
+  return request({
+    baseURL: process.env.BASE_IP_API,
+    url: `/datawizard/template/${id}/`,
+    method: 'delete'
+  })
+}
+
+// 获取模板字段
+export function getDatawizardFields() {
+  return request({
+    baseURL: process.env.BASE_IP_API,
+    url: '/datawizard/fields/',
+    method: 'get'
+  })
+}
+
+// 批量删除模板
+export function delsDatawizardTemplate(data) {
+  return request({
+    baseURL: process.env.BASE_IP_API,
+    url: '/datawizard/dels/',
+    method: 'delete',
+    data
+  })
+}
+
+// 上传附件模板
+export function postDatawizardAuto(data) {
+  return request({
+    baseURL: process.env.BASE_IP_API,
+    url: URL.datawizardAuto,
+    method: 'post',
+    data
+  })
+}

+ 213 - 0
src/api/user/index.js

@@ -0,0 +1,213 @@
+import request from '@/utils/request'
+// eslint-disable-next-line
+import axios from 'axios'
+
+export function login(userinfo) {
+  return request({
+    url: '/sys/login/',
+    method: 'post',
+    data: {
+      'username': userinfo.username,
+      'password': userinfo.password,
+      'region': userinfo.region
+    }
+  })
+}
+
+export function login_qrcode(message_key) {
+  return request({
+    url: '/sys/login/',
+    method: 'post',
+    data: {
+      'message_key': message_key
+    }
+  })
+}
+
+// 登录超级管理员
+export function login_superuser(username, password, company, login_type) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/managesys/login/',
+    method: 'post',
+    data: {
+      'username': username,
+      'password': password,
+      'region': '86',
+      'comp': company,
+      'login_type': login_type
+    }
+  })
+}
+
+export function wx_get_code_unlimit() {
+  return request({
+    url: '/sys/wx_get_code_unlimit/',
+    method: 'get'
+  })
+}
+
+export function sms_send_code(data) {
+  return request({
+    url: '/sys/sms_code2session/',
+    method: 'post',
+    data
+  })
+}
+
+export function company_sms_verify_code(data) {
+  return request({
+    url: '/sys/company_sms_code2session/',
+    method: 'post',
+    data
+  })
+}
+
+export function sms_verify_code(data) {
+  return request({
+    url: '/sys/auth_login/',
+    method: 'post',
+    data
+  })
+}
+// 短信找回密码
+export function resetPassword(data) {
+  return request({
+    url: 'sys/retrieve_password/',
+    method: 'post',
+    data
+  })
+}
+// 登录后修改密码
+export function updatePassword(data) {
+  return request({
+    url: 'sys/change_password/',
+    method: 'post',
+    data
+  })
+}
+
+export function register(data) {
+  return request({
+    url: '/sys/register/',
+    method: 'post',
+    data
+  })
+}
+
+export function logout() {
+  return request({
+    url: '/sys/logout/',
+    method: 'post'
+  })
+}
+
+export function getInfo(token) {
+  return request({
+    url: '/sys/get_userinfo/',
+    method: 'get'
+  })
+}
+
+export function getInfo_superuser(token) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/managesys/get_userinfo/',
+    method: 'get'
+  })
+}
+
+export function updateUserInfo(data) {
+  return request({
+    url: '/sys/update_userinfo/',
+    method: 'post',
+    data
+  })
+}
+
+export function updatePortraitImage(data) {
+  return request({
+    url: '/sys/change_portrait_image/',
+    method: 'post',
+    data
+  })
+}
+
+export function changeUserSign(data) {
+  return request({
+    url: '/sys/chang_sign_image/',
+    method: 'post',
+    data
+  })
+}
+
+export function changeUserCellphoneSendCode(data) {
+  return request({
+    url: '/sys/sms_chang_cellphone/',
+    method: 'post',
+    data
+  })
+}
+
+export function changeUserCellphone(data) {
+  return request({
+    url: '/sys/chang_cellphone/',
+    method: 'post',
+    data
+  })
+}
+
+// 获取当前登陆账套信息
+export function getDefaultInfo() {
+  return request({
+    url: '/sys/employee_comp_data/',
+    method: 'get'
+  })
+}
+
+// http://127.0.0.1:8000/api/sys/get_company_list/?username=13312345678&password=123456
+export function getUserCompanyList(username, password) {
+  var query = '?username=' + username + '&password=' + password
+  return request({
+    url: '/sys/get_company_list/' + query,
+    method: 'get'
+  })
+}
+
+// http://127.0.0.1:8000/api/sys/change_company/  切换公司
+// {"comp": 26}
+export function switchCompany(data) {
+  return request({
+    url: '/sys/company_login/',
+    method: 'post',
+    data
+  })
+}
+
+// http://127.0.0.1:8000/api/sys/create_company_login/  免密登录--创建公司并登陆
+// {
+//   "name": "海底灯泡",
+//   "boss_name": "阿成",
+//   "boss_email": "123@123.com"
+//    Company表的其它字段
+// }
+export function createCompanyAndLogin(data) {
+  return request({
+    url: '/sys/create_comp_login/',
+    method: 'post',
+    data
+  })
+}
+
+// http://127.0.0.1:8000/api/sys/user_change_login/  免密登录--oauth2多用户同client同时登录时切换登录
+// {
+//   "login_code":  #原封返回,
+//   "username": #手机号
+// }
+export function changeUserLogin(data) {
+  return request({
+    url: '/sys/user_change_login/',
+    method: 'post',
+    data
+  })
+}

+ 47 - 0
src/api/user/superadmin.js

@@ -0,0 +1,47 @@
+import request from '@/utils/request'
+
+// 超级管理员获取用户公司明细接口:(GET)
+// http://127.0.0.1:8000/api/sys/get_admin_company_list/?page=1&page_size=10&boss_name&boss_mobile=138&comp_name=
+export function fetchAdminCompanyList(params) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/compmgt/get_admin_user_list/',
+    method: 'get',
+    params
+  })
+}
+
+// 超级管理员获取公司员工明细接口:(GET)
+// http://127.0.0.1:8000/api/sys/get_admin_user_list/?page=1&page_size=10&username=&cellphone=&comp_name=天心
+export function fetchAdminUserList(params) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/compmgt/get_admin_company_list/',
+    method: 'get',
+    params
+  })
+}
+
+// 全局配置文件查询、修改
+
+// language:用户语言别,用户控制部署的云T,各地区用户的功能差异:
+// "cn"或空: 大陆用户;"tw":台湾用户;"en": 国外用户
+// edition:产品版本别,用于控制部署的云T,展示的功能范围:
+// "acc":智慧财税(总账);"inv":供应链(进销存);"all"或空:所有功能(总账 + 进销存)
+export function fetchGlobalConfig(params) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/managesys/global_config/',
+    method: 'get',
+    params
+  })
+}
+
+export function updateGlobalConfig(data) {
+  return request({
+    baseURL: process.env.BASE_MANAGE_API,
+    url: '/managesys/global_config/',
+    method: 'post',
+    data
+  })
+}

BIN
src/assets/404_images/404.png


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


BIN
src/assets/alipayAuth/authfailure.png


BIN
src/assets/alipayAuth/authsuccess.png


BIN
src/assets/amtxts.png


BIN
src/assets/bg.png


+ 539 - 0
src/assets/icon/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 285 - 0
src/assets/icon/demo_index.html

@@ -0,0 +1,285 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>IconFont Demo</title>
+  <link rel="shortcut icon" href="https://gtms04.alicdn.com/tps/i4/TB1_oz6GVXXXXaFXpXXJDFnIXXX-64-64.ico" type="image/x-icon"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">&#xe86b;</a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=1019827" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe600;</span>
+                <div class="name">选中</div>
+                <div class="code-name">&amp;#xe600;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe610;</span>
+                <div class="name">现金</div>
+                <div class="code-name">&amp;#xe610;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe60f;</span>
+                <div class="name">支付宝</div>
+                <div class="code-name">&amp;#xe60f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe637;</span>
+                <div class="name">微信</div>
+                <div class="code-name">&amp;#xe637;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe622;</span>
+                <div class="name">银行卡</div>
+                <div class="code-name">&amp;#xe622;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>兼容性最好,支持 IE6+,及所有现代浏览器。</li>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.eot');
+  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
+      url('iconfont.woff2') format('woff2'),
+      url('iconfont.woff') format('woff'),
+      url('iconfont.ttf') format('truetype'),
+      url('iconfont.svg#iconfont') format('svg');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont icon-xuanzhong"></span>
+            <div class="name">
+              选中
+            </div>
+            <div class="code-name">.icon-xuanzhong
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-xianjin"></span>
+            <div class="name">
+              现金
+            </div>
+            <div class="code-name">.icon-xianjin
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-zhifubao1"></span>
+            <div class="name">
+              支付宝
+            </div>
+            <div class="code-name">.icon-zhifubao1
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-weixin"></span>
+            <div class="name">
+              微信
+            </div>
+            <div class="code-name">.icon-weixin
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-shuaqiaqiapianyinhangqia"></span>
+            <div class="name">
+              银行卡
+            </div>
+            <div class="code-name">.icon-shuaqiaqiapianyinhangqia
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>兼容性良好,支持 IE8+,及所有现代浏览器。</li>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+          <li>不过因为本质上还是使用的字体,所以多色图标还是不支持的。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont icon--xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-xuanzhong"></use>
+                </svg>
+                <div class="name">选中</div>
+                <div class="code-name">#icon-xuanzhong</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-xianjin"></use>
+                </svg>
+                <div class="name">现金</div>
+                <div class="code-name">#icon-xianjin</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-zhifubao1"></use>
+                </svg>
+                <div class="name">支付宝</div>
+                <div class="code-name">#icon-zhifubao1</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-weixin"></use>
+                </svg>
+                <div class="name">微信</div>
+                <div class="code-name">#icon-weixin</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-shuaqiaqiapianyinhangqia"></use>
+                </svg>
+                <div class="name">银行卡</div>
+                <div class="code-name">#icon-shuaqiaqiapianyinhangqia</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

File diff suppressed because it is too large
+ 58 - 0
src/assets/icon/iconfont.css


BIN
src/assets/icon/iconfont.eot


File diff suppressed because it is too large
+ 1 - 0
src/assets/icon/iconfont.js


File diff suppressed because it is too large
+ 41 - 0
src/assets/icon/iconfont.svg


BIN
src/assets/icon/iconfont.ttf


BIN
src/assets/icon/iconfont.woff


BIN
src/assets/icon/iconfont.woff2


BIN
src/assets/icon/png/add.png


BIN
src/assets/icon/png/del.png


BIN
src/assets/icon/png/pdf.png


BIN
src/assets/logo.png


BIN
src/assets/main-police.png


+ 539 - 0
src/assets/toolbar/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 814 - 0
src/assets/toolbar/demo_index.html

@@ -0,0 +1,814 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>IconFont Demo</title>
+  <link rel="shortcut icon" href="https://gtms04.alicdn.com/tps/i4/TB1_oz6GVXXXXaFXpXXJDFnIXXX-64-64.ico" type="image/x-icon"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">&#xe86b;</a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=1577403" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe601;</span>
+                <div class="name">icon-add</div>
+                <div class="code-name">&amp;#xe601;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe602;</span>
+                <div class="name">icon-attach-file</div>
+                <div class="code-name">&amp;#xe602;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe603;</span>
+                <div class="name">icon-cancel</div>
+                <div class="code-name">&amp;#xe603;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe604;</span>
+                <div class="name">icon-change</div>
+                <div class="code-name">&amp;#xe604;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe605;</span>
+                <div class="name">icon-delete</div>
+                <div class="code-name">&amp;#xe605;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe606;</span>
+                <div class="name">icon-edit</div>
+                <div class="code-name">&amp;#xe606;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe607;</span>
+                <div class="name">icon-export-pdf</div>
+                <div class="code-name">&amp;#xe607;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe608;</span>
+                <div class="name">icon-deliver</div>
+                <div class="code-name">&amp;#xe608;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe609;</span>
+                <div class="name">icon-export-excel</div>
+                <div class="code-name">&amp;#xe609;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe60a;</span>
+                <div class="name">icon-audit</div>
+                <div class="code-name">&amp;#xe60a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe60b;</span>
+                <div class="name">icon-export</div>
+                <div class="code-name">&amp;#xe60b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe60c;</span>
+                <div class="name">icon-more</div>
+                <div class="code-name">&amp;#xe60c;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe60d;</span>
+                <div class="name">icon-pay</div>
+                <div class="code-name">&amp;#xe60d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe60e;</span>
+                <div class="name">icon-order</div>
+                <div class="code-name">&amp;#xe60e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe60f;</span>
+                <div class="name">icon-print-preview</div>
+                <div class="code-name">&amp;#xe60f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe610;</span>
+                <div class="name">icon-purchase</div>
+                <div class="code-name">&amp;#xe610;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe611;</span>
+                <div class="name">icon-query</div>
+                <div class="code-name">&amp;#xe611;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe612;</span>
+                <div class="name">icon-print</div>
+                <div class="code-name">&amp;#xe612;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe613;</span>
+                <div class="name">icon-refresh</div>
+                <div class="code-name">&amp;#xe613;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe614;</span>
+                <div class="name">icon-receipt</div>
+                <div class="code-name">&amp;#xe614;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe615;</span>
+                <div class="name">icon-save-draft</div>
+                <div class="code-name">&amp;#xe615;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe616;</span>
+                <div class="name">icon-return</div>
+                <div class="code-name">&amp;#xe616;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe617;</span>
+                <div class="name">icon-save-print</div>
+                <div class="code-name">&amp;#xe617;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe618;</span>
+                <div class="name">icon-save</div>
+                <div class="code-name">&amp;#xe618;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe619;</span>
+                <div class="name">icon-union-query</div>
+                <div class="code-name">&amp;#xe619;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe61a;</span>
+                <div class="name">icon-share</div>
+                <div class="code-name">&amp;#xe61a;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe61b;</span>
+                <div class="name">icon-sales</div>
+                <div class="code-name">&amp;#xe61b;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon fontFamily">&#xe61c;</span>
+                <div class="name">icon-save-new</div>
+                <div class="code-name">&amp;#xe61c;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>兼容性最好,支持 IE6+,及所有现代浏览器。</li>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>但是因为是字体,所以不支持多色。只能使用平台里单色的图标,就算项目里有多色图标也会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持多色图标,这些多色图标在 Unicode 模式下将不能使用,如果有需求建议使用symbol 的引用方式</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'fontFamily';
+  src: url('iconfont.eot');
+  src: url('iconfont.eot?#iefix') format('embedded-opentype'),
+      url('iconfont.woff2') format('woff2'),
+      url('iconfont.woff') format('woff'),
+      url('iconfont.ttf') format('truetype'),
+      url('iconfont.svg#fontFamily') format('svg');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.fontFamily {
+  font-family: "fontFamily" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="fontFamily"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"fontFamily" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-add"></span>
+            <div class="name">
+              icon-add
+            </div>
+            <div class="code-name">.yunticon-add
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-attach-file"></span>
+            <div class="name">
+              icon-attach-file
+            </div>
+            <div class="code-name">.yunticon-attach-file
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-cancel"></span>
+            <div class="name">
+              icon-cancel
+            </div>
+            <div class="code-name">.yunticon-cancel
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-change"></span>
+            <div class="name">
+              icon-change
+            </div>
+            <div class="code-name">.yunticon-change
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-delete"></span>
+            <div class="name">
+              icon-delete
+            </div>
+            <div class="code-name">.yunticon-delete
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-edit"></span>
+            <div class="name">
+              icon-edit
+            </div>
+            <div class="code-name">.yunticon-edit
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-export-pdf"></span>
+            <div class="name">
+              icon-export-pdf
+            </div>
+            <div class="code-name">.yunticon-export-pdf
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-deliver"></span>
+            <div class="name">
+              icon-deliver
+            </div>
+            <div class="code-name">.yunticon-deliver
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-export-excel"></span>
+            <div class="name">
+              icon-export-excel
+            </div>
+            <div class="code-name">.yunticon-export-excel
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-audit"></span>
+            <div class="name">
+              icon-audit
+            </div>
+            <div class="code-name">.yunticon-audit
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-export"></span>
+            <div class="name">
+              icon-export
+            </div>
+            <div class="code-name">.yunticon-export
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-more"></span>
+            <div class="name">
+              icon-more
+            </div>
+            <div class="code-name">.yunticon-more
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-pay"></span>
+            <div class="name">
+              icon-pay
+            </div>
+            <div class="code-name">.yunticon-pay
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-order"></span>
+            <div class="name">
+              icon-order
+            </div>
+            <div class="code-name">.yunticon-order
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-print-preview"></span>
+            <div class="name">
+              icon-print-preview
+            </div>
+            <div class="code-name">.yunticon-print-preview
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-purchase"></span>
+            <div class="name">
+              icon-purchase
+            </div>
+            <div class="code-name">.yunticon-purchase
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-query"></span>
+            <div class="name">
+              icon-query
+            </div>
+            <div class="code-name">.yunticon-query
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-print"></span>
+            <div class="name">
+              icon-print
+            </div>
+            <div class="code-name">.yunticon-print
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-refresh"></span>
+            <div class="name">
+              icon-refresh
+            </div>
+            <div class="code-name">.yunticon-refresh
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-receipt"></span>
+            <div class="name">
+              icon-receipt
+            </div>
+            <div class="code-name">.yunticon-receipt
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-save-draft"></span>
+            <div class="name">
+              icon-save-draft
+            </div>
+            <div class="code-name">.yunticon-save-draft
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-return"></span>
+            <div class="name">
+              icon-return
+            </div>
+            <div class="code-name">.yunticon-return
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-save-print"></span>
+            <div class="name">
+              icon-save-print
+            </div>
+            <div class="code-name">.yunticon-save-print
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-save"></span>
+            <div class="name">
+              icon-save
+            </div>
+            <div class="code-name">.yunticon-save
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-union-query"></span>
+            <div class="name">
+              icon-union-query
+            </div>
+            <div class="code-name">.yunticon-union-query
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-share"></span>
+            <div class="name">
+              icon-share
+            </div>
+            <div class="code-name">.yunticon-share
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-sales"></span>
+            <div class="name">
+              icon-sales
+            </div>
+            <div class="code-name">.yunticon-sales
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon fontFamily yunticon-save-new"></span>
+            <div class="name">
+              icon-save-new
+            </div>
+            <div class="code-name">.yunticon-save-new
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>兼容性良好,支持 IE8+,及所有现代浏览器。</li>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+          <li>不过因为本质上还是使用的字体,所以多色图标还是不支持的。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="fontFamily yuntxxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            fontFamily" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-add"></use>
+                </svg>
+                <div class="name">icon-add</div>
+                <div class="code-name">#yunticon-add</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-attach-file"></use>
+                </svg>
+                <div class="name">icon-attach-file</div>
+                <div class="code-name">#yunticon-attach-file</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-cancel"></use>
+                </svg>
+                <div class="name">icon-cancel</div>
+                <div class="code-name">#yunticon-cancel</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-change"></use>
+                </svg>
+                <div class="name">icon-change</div>
+                <div class="code-name">#yunticon-change</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-delete"></use>
+                </svg>
+                <div class="name">icon-delete</div>
+                <div class="code-name">#yunticon-delete</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-edit"></use>
+                </svg>
+                <div class="name">icon-edit</div>
+                <div class="code-name">#yunticon-edit</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-export-pdf"></use>
+                </svg>
+                <div class="name">icon-export-pdf</div>
+                <div class="code-name">#yunticon-export-pdf</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-deliver"></use>
+                </svg>
+                <div class="name">icon-deliver</div>
+                <div class="code-name">#yunticon-deliver</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-export-excel"></use>
+                </svg>
+                <div class="name">icon-export-excel</div>
+                <div class="code-name">#yunticon-export-excel</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-audit"></use>
+                </svg>
+                <div class="name">icon-audit</div>
+                <div class="code-name">#yunticon-audit</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-export"></use>
+                </svg>
+                <div class="name">icon-export</div>
+                <div class="code-name">#yunticon-export</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-more"></use>
+                </svg>
+                <div class="name">icon-more</div>
+                <div class="code-name">#yunticon-more</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-pay"></use>
+                </svg>
+                <div class="name">icon-pay</div>
+                <div class="code-name">#yunticon-pay</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-order"></use>
+                </svg>
+                <div class="name">icon-order</div>
+                <div class="code-name">#yunticon-order</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-print-preview"></use>
+                </svg>
+                <div class="name">icon-print-preview</div>
+                <div class="code-name">#yunticon-print-preview</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-purchase"></use>
+                </svg>
+                <div class="name">icon-purchase</div>
+                <div class="code-name">#yunticon-purchase</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-query"></use>
+                </svg>
+                <div class="name">icon-query</div>
+                <div class="code-name">#yunticon-query</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-print"></use>
+                </svg>
+                <div class="name">icon-print</div>
+                <div class="code-name">#yunticon-print</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-refresh"></use>
+                </svg>
+                <div class="name">icon-refresh</div>
+                <div class="code-name">#yunticon-refresh</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-receipt"></use>
+                </svg>
+                <div class="name">icon-receipt</div>
+                <div class="code-name">#yunticon-receipt</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-save-draft"></use>
+                </svg>
+                <div class="name">icon-save-draft</div>
+                <div class="code-name">#yunticon-save-draft</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-return"></use>
+                </svg>
+                <div class="name">icon-return</div>
+                <div class="code-name">#yunticon-return</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-save-print"></use>
+                </svg>
+                <div class="name">icon-save-print</div>
+                <div class="code-name">#yunticon-save-print</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-save"></use>
+                </svg>
+                <div class="name">icon-save</div>
+                <div class="code-name">#yunticon-save</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-union-query"></use>
+                </svg>
+                <div class="name">icon-union-query</div>
+                <div class="code-name">#yunticon-union-query</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-share"></use>
+                </svg>
+                <div class="name">icon-share</div>
+                <div class="code-name">#yunticon-share</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-sales"></use>
+                </svg>
+                <div class="name">icon-sales</div>
+                <div class="code-name">#yunticon-sales</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#yunticon-save-new"></use>
+                </svg>
+                <div class="name">icon-save-new</div>
+                <div class="code-name">#yunticon-save-new</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

File diff suppressed because it is too large
+ 146 - 0
src/assets/toolbar/iconfont.css


BIN
src/assets/toolbar/iconfont.eot


File diff suppressed because it is too large
+ 1 - 0
src/assets/toolbar/iconfont.js


+ 205 - 0
src/assets/toolbar/iconfont.json

@@ -0,0 +1,205 @@
+{
+  "id": "1577403",
+  "name": "yunt-erp",
+  "font_family": "fontFamily",
+  "css_prefix_text": "yunt",
+  "description": "云T ERP图标库",
+  "glyphs": [
+    {
+      "icon_id": "12473642",
+      "name": "icon-add",
+      "font_class": "icon-add",
+      "unicode": "e601",
+      "unicode_decimal": 58881
+    },
+    {
+      "icon_id": "12473643",
+      "name": "icon-attach-file",
+      "font_class": "icon-attach-file",
+      "unicode": "e602",
+      "unicode_decimal": 58882
+    },
+    {
+      "icon_id": "12473644",
+      "name": "icon-cancel",
+      "font_class": "icon-cancel",
+      "unicode": "e603",
+      "unicode_decimal": 58883
+    },
+    {
+      "icon_id": "12473645",
+      "name": "icon-change",
+      "font_class": "icon-change",
+      "unicode": "e604",
+      "unicode_decimal": 58884
+    },
+    {
+      "icon_id": "12473646",
+      "name": "icon-delete",
+      "font_class": "icon-delete",
+      "unicode": "e605",
+      "unicode_decimal": 58885
+    },
+    {
+      "icon_id": "12473647",
+      "name": "icon-edit",
+      "font_class": "icon-edit",
+      "unicode": "e606",
+      "unicode_decimal": 58886
+    },
+    {
+      "icon_id": "12473648",
+      "name": "icon-export-pdf",
+      "font_class": "icon-export-pdf",
+      "unicode": "e607",
+      "unicode_decimal": 58887
+    },
+    {
+      "icon_id": "12473649",
+      "name": "icon-deliver",
+      "font_class": "icon-deliver",
+      "unicode": "e608",
+      "unicode_decimal": 58888
+    },
+    {
+      "icon_id": "12473650",
+      "name": "icon-export-excel",
+      "font_class": "icon-export-excel",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "12473651",
+      "name": "icon-audit",
+      "font_class": "icon-audit",
+      "unicode": "e60a",
+      "unicode_decimal": 58890
+    },
+    {
+      "icon_id": "12473680",
+      "name": "icon-export",
+      "font_class": "icon-export",
+      "unicode": "e60b",
+      "unicode_decimal": 58891
+    },
+    {
+      "icon_id": "12473681",
+      "name": "icon-more",
+      "font_class": "icon-more",
+      "unicode": "e60c",
+      "unicode_decimal": 58892
+    },
+    {
+      "icon_id": "12473682",
+      "name": "icon-pay",
+      "font_class": "icon-pay",
+      "unicode": "e60d",
+      "unicode_decimal": 58893
+    },
+    {
+      "icon_id": "12473683",
+      "name": "icon-order",
+      "font_class": "icon-order",
+      "unicode": "e60e",
+      "unicode_decimal": 58894
+    },
+    {
+      "icon_id": "12473684",
+      "name": "icon-print-preview",
+      "font_class": "icon-print-preview",
+      "unicode": "e60f",
+      "unicode_decimal": 58895
+    },
+    {
+      "icon_id": "12473685",
+      "name": "icon-purchase",
+      "font_class": "icon-purchase",
+      "unicode": "e610",
+      "unicode_decimal": 58896
+    },
+    {
+      "icon_id": "12473686",
+      "name": "icon-query",
+      "font_class": "icon-query",
+      "unicode": "e611",
+      "unicode_decimal": 58897
+    },
+    {
+      "icon_id": "12473687",
+      "name": "icon-print",
+      "font_class": "icon-print",
+      "unicode": "e612",
+      "unicode_decimal": 58898
+    },
+    {
+      "icon_id": "12473688",
+      "name": "icon-refresh",
+      "font_class": "icon-refresh",
+      "unicode": "e613",
+      "unicode_decimal": 58899
+    },
+    {
+      "icon_id": "12473689",
+      "name": "icon-receipt",
+      "font_class": "icon-receipt",
+      "unicode": "e614",
+      "unicode_decimal": 58900
+    },
+    {
+      "icon_id": "12473708",
+      "name": "icon-save-draft",
+      "font_class": "icon-save-draft",
+      "unicode": "e615",
+      "unicode_decimal": 58901
+    },
+    {
+      "icon_id": "12473709",
+      "name": "icon-return",
+      "font_class": "icon-return",
+      "unicode": "e616",
+      "unicode_decimal": 58902
+    },
+    {
+      "icon_id": "12473710",
+      "name": "icon-save-print",
+      "font_class": "icon-save-print",
+      "unicode": "e617",
+      "unicode_decimal": 58903
+    },
+    {
+      "icon_id": "12473711",
+      "name": "icon-save",
+      "font_class": "icon-save",
+      "unicode": "e618",
+      "unicode_decimal": 58904
+    },
+    {
+      "icon_id": "12473712",
+      "name": "icon-union-query",
+      "font_class": "icon-union-query",
+      "unicode": "e619",
+      "unicode_decimal": 58905
+    },
+    {
+      "icon_id": "12473717",
+      "name": "icon-share",
+      "font_class": "icon-share",
+      "unicode": "e61a",
+      "unicode_decimal": 58906
+    },
+    {
+      "icon_id": "12473718",
+      "name": "icon-sales",
+      "font_class": "icon-sales",
+      "unicode": "e61b",
+      "unicode_decimal": 58907
+    },
+    {
+      "icon_id": "12473719",
+      "name": "icon-save-new",
+      "font_class": "icon-save-new",
+      "unicode": "e61c",
+      "unicode_decimal": 58908
+    }
+  ]
+}

File diff suppressed because it is too large
+ 110 - 0
src/assets/toolbar/iconfont.svg


BIN
src/assets/toolbar/iconfont.ttf


BIN
src/assets/toolbar/iconfont.woff


BIN
src/assets/toolbar/iconfont.woff2


+ 16 - 0
src/assets/yunti_icon/iconfont.css

@@ -0,0 +1,16 @@
+/* 云T项目图标库,更新图标后,直接替换该链接即可 */
+@import "//at.alicdn.com/t/font_2785701_fjind6852im.css";
+
+
+/** 使用
+<el-button icon="yunti-paixu" />
+<i class="yunti-paixu" />
+*/
+
+[class^="yunti-"] {
+  font-family: "iconfont" !important;
+  font-size: 14px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}

File diff suppressed because it is too large
+ 1391 - 0
src/components/AccToolBar/index.vue


+ 261 - 0
src/components/AiUnit/index.vue

@@ -0,0 +1,261 @@
+<template>
+  <div>
+    <div class="message-top" @click="drawer = true">
+      <i class="el-icon-message-solid" />
+    </div>
+    <div class="message-box" v-show="drawer">
+      <div class="message-header">
+        <span>{{ $t('title') }}</span>
+        <i class="el-icon-close" @click="drawer = false" />
+      </div>
+      <el-card class="box-card message-content" ref="main" id="main">
+        <div v-for="(item, index) in message" :key="index" ref="content">
+          <el-row v-if="item.message_type === 'replay'" type="flex" class="demo-avatar demo-basic message-replay">
+            <el-col :span="3">
+              <div class="demo-basic--circle">
+                <div class="block">
+                  <el-avatar :size="36" :src="item.src" />
+                </div>
+              </div>
+            </el-col>
+            <el-col class="message-chat">
+              <div>{{ item.name }}</div>
+              <span v-html="item.content" />
+              <div>
+                <el-tag v-for="(it, i) in item.option_list" :key="i" class="message-option" @click="sendChat(it.option)">
+                  {{ it.option }}
+                </el-tag>
+              </div>
+            </el-col>
+          </el-row>
+          <el-row v-else type="flex" class="demo-avatar demo-basic message-ask">
+            <el-col :offset="12" class="message-chat">
+              <div>{{ item.name }}</div>
+              <span>{{ item.content }}</span>
+            </el-col>
+            <el-col :span="3">
+              <div class="demo-basic--circle">
+                <div class="block">
+                  <el-avatar :size="36" :src="item.src" />
+                </div>
+              </div>
+            </el-col>
+          </el-row>
+        </div>
+      </el-card>
+      <div class="message-footer">
+        <el-row type="flex" :gutter="18">
+          <el-col :span="18">
+            <el-input
+              v-model="userMessage"
+              :rows="2"
+              type="textarea"
+              :placeholder="$t('text_enter')"
+              @keyup.enter.native="sendChat"
+            />
+          </el-col>
+          <el-col :span="4">
+            <el-button
+              type="primary"
+              @click="sendChat"
+            >
+              {{ $t('send') }}
+            </el-button>
+          </el-col>
+        </el-row>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { fetchToken, botChat } from '@/api/ai'
+
+export default {
+  name: 'AiUnit',
+  data() {
+    return {
+      userMessage: null,
+      drawer: false,
+      message: [
+        {
+          name: this.$t('name'),
+          content: this.$t('content'),
+          message_type: 'replay'
+        }
+      ],
+      token: null
+    }
+  },
+  i18n: {
+    messages: {
+      cn: {
+        title: '小T助手竭诚为您服务',
+        text_enter: '请输入文字...',
+        send: '发送',
+        name: '小T助手',
+        content: '我能帮到你什么?',
+        me: '我'
+
+      },
+      tw: {
+        title: '小T助手竭誠為您服務',
+        text_enter: '請輸入文字...',
+        send: '發送',
+        name: '小T助手',
+        content: '我能幫到你什麼? ',
+        me: '我'
+      },
+      en: {
+        title: 'Little T Assistant will serve you wholeheartedly',
+        text_enter: 'Please enter text...',
+        send: 'Send',
+        name: 'Little T Assistant',
+        content: 'How can I help you? ',
+        me: 'Me'
+      }
+    }
+  },
+  mounted() {
+    fetchToken().then(res => {
+      this.token = res.token
+    })
+  },
+  methods: {
+    sendChat(msg) {
+      if (this.userMessage || msg) {
+        this.scrollBottom()
+        var message = JSON.parse(JSON.stringify(this.userMessage)) || JSON.parse(JSON.stringify(msg))
+        this.message.push({
+          'name': this.$t('me'),
+          'content': message,
+          'message_type': 'ask'
+        })
+        this.userMessage = null
+        botChat({ access_token: this.token }, {
+          'log_id': new Date().getTime(),
+          'version': '2.0',
+          'request': {
+            'user_id': '8888',
+            'query_info': {
+              'asr_candidates': [],
+              'type': 'TEXT',
+              'source': 'KEYBOARD'
+            },
+            'bernard_level': 1,
+            'updates': '',
+            'query': message,
+            'client_session': '{"client_results":"", "candidate_options":[]}'
+          },
+          'bot_session': '',
+          'bot_id': '1017324'
+        }).then(res => {
+          if (res.result) {
+            var data = {
+              'name': this.$t('name'),
+              'content': res.result.response.action_list[0].say,
+              'option_list': [],
+              'message_type': 'replay'
+            }
+            if (res.result.response.action_list[0].type === 'guide') {
+              data['option_list'] = res.result.response.action_list[0].refine_detail.option_list
+            }
+            this.message.push(data)
+            this.scrollBottom()
+          }
+        })
+      }
+    },
+    scrollBottom() {
+      this.$nextTick(() => {
+        setTimeout(() => {
+          var scrollTop = this.$el.querySelector('#main')
+          scrollTop.scrollTop = scrollTop.scrollHeight
+        }, 20)
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.message-top {
+  line-height: 1.15;
+  box-sizing: inherit;
+  position: fixed;
+  background-color: #fff;
+  width: 40px;
+  height: 40px;
+  border-radius: 50%;
+  color: #1890ff;
+  display: flex;
+  -webkit-box-align: center;
+  align-items: center;
+  -webkit-box-pack: center;
+  justify-content: center;
+  font-size: 20px;
+  box-shadow: 0 0 6px rgba(0,0,0,0.12);
+  cursor: pointer;
+  z-index: 5;
+  right: 40px;
+  bottom: 40px;
+}
+.message-box {
+  width: 400px;
+  height: 400px;
+  box-sizing: inherit;
+  position: fixed;
+  background-color: #fff;
+  z-index: 5;
+  right: 40px;
+  bottom: 40px;
+  padding: 12px;
+  .message-header {
+    margin-bottom: 12px;
+    height: 18px;
+    color: #72767b;
+    font-size: 16px;
+    line-height: 18px;
+    i {
+      float: right;
+      cursor: pointer;
+    }
+  }
+  .message-content {
+    height: 270px;
+    font-size: 12px;
+    overflow-y: auto;
+    .message-replay {
+      margin-bottom: 12px;
+      .message-chat {
+        padding-left: 12px;
+        div {
+          margin-top: 3px;
+          margin-bottom: 6px;
+        }
+        .message-option {
+          cursor:pointer
+        }
+      }
+    }
+    .message-ask {
+      margin-bottom: 12px;
+      .message-chat {
+        text-align: right;
+        padding-right: 12px;
+        div {
+          margin-bottom: 6px;
+        }
+      }
+    }
+  }
+  .message-footer {
+    background-color: #fff;
+    padding: 10px;
+    box-shadow: 0 2px 12px 0 rgba(0,0,0,.1);
+    button {
+      height: 100%;
+    }
+  }
+}
+</style>

+ 129 - 0
src/components/BackToTop/index.vue

@@ -0,0 +1,129 @@
+<template>
+  <transition :name="transitionName">
+    <div v-show="visible" :style="customStyle" class="back-to-ceiling" @click="backToTop">
+      <svg width="16" height="16" viewBox="0 0 17 17" xmlns="http://www.w3.org/2000/svg" class="Icon Icon--backToTopArrow" aria-hidden="true" style="height: 16px; width: 16px; fill: white;">
+        <title>{{ $t('toTop') }}</title>
+        <g>
+          <path d="M12.036 15.59c0 .55-.453.995-.997.995H5.032c-.55 0-.997-.445-.997-.996V8.584H1.03c-1.1 0-1.36-.633-.578-1.416L7.33.29c.39-.39 1.026-.385 1.412 0l6.878 6.88c.782.78.523 1.415-.58 1.415h-3.004v7.004z" fill-rule="evenodd" />
+        </g>
+      </svg>
+    </div>
+  </transition>
+</template>
+
+<script>
+export default {
+  name: 'BackToTop',
+  props: {
+    visibilityHeight: {
+      type: Number,
+      default: 400
+    },
+    backPosition: {
+      type: Number,
+      default: 0
+    },
+    customStyle: {
+      type: Object,
+      default: function() {
+        return {
+          right: '50px',
+          bottom: '50px',
+          width: '40px',
+          height: '40px',
+          'border-radius': '4px',
+          'line-height': '45px',
+          background: '#409eff'
+        }
+      }
+    },
+    transitionName: {
+      type: String,
+      default: 'fade'
+    }
+  },
+  i18n: {
+    messages: {
+      cn: {
+        toTop: '回到顶部'
+      },
+      tw: {
+        toTop: '回到頂部'
+      },
+      en: {
+        toTop: 'Back to top'
+      }
+    }
+  },
+  data() {
+    return {
+      visible: false,
+      interval: null,
+      isMoving: false
+    }
+  },
+  mounted() {
+    window.addEventListener('scroll', this.handleScroll)
+  },
+  beforeDestroy() {
+    window.removeEventListener('scroll', this.handleScroll)
+    if (this.interval) {
+      clearInterval(this.interval)
+    }
+  },
+  methods: {
+    handleScroll() {
+      this.visible = window.pageYOffset > this.visibilityHeight
+    },
+    backToTop() {
+      if (this.isMoving) return
+      const start = window.pageYOffset
+      let i = 0
+      this.isMoving = true
+      this.interval = setInterval(() => {
+        const next = Math.floor(this.easeInOutQuad(10 * i, start, -start, 500))
+        if (next <= this.backPosition) {
+          window.scrollTo(0, this.backPosition)
+          clearInterval(this.interval)
+          this.isMoving = false
+        } else {
+          window.scrollTo(0, next)
+        }
+        i++
+      }, 16.7)
+    },
+    easeInOutQuad(t, b, c, d) {
+      if ((t /= d / 2) < 1) return c / 2 * t * t + b
+      return -c / 2 * (--t * (t - 2) - 1) + b
+    }
+  }
+}
+</script>
+
+<style scoped>
+  .back-to-ceiling {
+    position: fixed;
+    display: inline-block;
+    text-align: center;
+    cursor: pointer;
+  }
+
+  .back-to-ceiling:hover {
+    background: #d5dbe7;
+  }
+
+  .fade-enter-active,
+  .fade-leave-active {
+    transition: opacity .5s;
+  }
+
+  .fade-enter,
+  .fade-leave-to {
+    opacity: 0
+  }
+
+  .back-to-ceiling .Icon {
+    fill: #9aaabf;
+    background: none;
+  }
+</style>

+ 211 - 0
src/components/Breadcrumb/index.vue

@@ -0,0 +1,211 @@
+<template>
+  <div class="app-breadcrumb">
+    <el-dropdown trigger="click">
+      <span class="el-dropdown-link">
+        {{ $store.getters.comp_id ? $store.getters.comp_id.name : this.$t('navbar.yunT') }}
+        <i class="el-icon-arrow-down el-icon--right" />
+      </span>
+      <el-dropdown-menu slot="dropdown">
+        <el-dropdown-item
+          v-for="comp in $store.getters.comp_list"
+          :key="comp.id"
+          @click.native="chooseCompany(comp)"
+        >
+          {{ comp.name }}
+        </el-dropdown-item>
+      </el-dropdown-menu>
+    </el-dropdown>
+  </div>
+</template>
+
+<script>
+import { generateTitle } from '@/utils/i18n'
+import pathToRegexp from 'path-to-regexp'
+import { fetchCompanyList } from '@/api/basic/company'
+import { switchCompany } from '@/api/user/index'
+
+export default {
+  data() {
+    return {
+      levelList: null,
+      compData: [{
+        'id': 'yunT',
+        'name': this.$t('navbar.yunT')
+      }]
+    }
+  },
+  i18n: {
+    messages: {
+      cn: {
+        isComp: '当前登录的已是该公司,无需切换登录',
+        switchComp: '此操作将切换为登录公司 【 {text} 】, 是否继续?',
+        switch_success: '切换{text}成功!'
+      },
+      tw: {
+        isComp: '當前登錄的已是該公司,無需切換登錄',
+        switchComp: '此操作將切換為登錄公司 【 {text} 】, 是否繼續?',
+        switch_success: '切換{text}成功!'
+      },
+      en: {
+        isComp: 'The company currently logged in is already the company, no need to switch login',
+        switchComp: 'This operation will switch to login company 【 {text} 】, do you want to continue?',
+        switch_success: 'Switch {text} successfully! '
+      }
+    }
+  },
+  watch: {
+    $route(route) {
+      // if you go to the redirect page, do not update the breadcrumbs
+      if (route.path.startsWith('/redirect/')) {
+        return
+      }
+      this.getBreadcrumb()
+    }
+  },
+  created() {
+    this.getBreadcrumb()
+    if (!this.$store.getters.is_superuser) {
+      this.getList()
+    }
+  },
+  async mounted() {
+    // 如果不存在当前公司的id则回到云T平台(用于重新初始化)
+    let companyList = await this.getCompanyList()
+    if (companyList && companyList.length > 0 && this.$store.getters.comp_id) {
+      let data = companyList.filter(item => item.id === this.$store.getters.comp_id.id)
+      if (data.length === 0) {
+        this.switchCompany({ comp: null })
+      }
+    }
+  },
+  methods: {
+    generateTitle,
+    getBreadcrumb() {
+      let matched = this.$route.matched.filter((item) => item.name)
+      const first = matched[0]
+      if (first && first.name !== 'dashboard') {
+        const userInfo = this.$store.state.user.info
+        const dashboard_title = userInfo.comp_data
+          ? userInfo.comp_data.name
+            ? userInfo.comp_data.name
+            : this.$t('company.sideBar.home')
+          : this.$t('company.sideBar.home')
+        if (this.$store.getters.is_superuser) {
+          matched = [
+            { path: '/superadmin/desktop', meta: { title: dashboard_title }}
+          ].concat(matched)
+        } else {
+          matched = [{ path: '/', meta: { title: dashboard_title }}].concat(
+            matched
+          )
+        }
+      }
+      this.levelList = matched
+      console.log('levelList:', this.levelList)
+    },
+    isDashboard(route) {
+      const name = route && route.name
+      if (!name) {
+        return false
+      }
+      return name.trim().toLocaleLowerCase() === 'Dashboard'.toLocaleLowerCase()
+    },
+    pathCompile(path) {
+      // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
+      const { params } = this.$route
+      var toPath = pathToRegexp.compile(path)
+      return toPath(params)
+    },
+    handleLink(item) {
+      const { redirect, path } = item
+      if (redirect) {
+        this.$router.push(redirect)
+        return
+      }
+      this.$router.push(this.pathCompile(path))
+
+      const { fullPath } = this.$route
+      if (fullPath === '/desktop' || fullPath === '/superadmin/desktop') {
+        this.$refreshPage(this)
+      }
+    },
+    // 获取账套信息
+    getList() {
+      // 通过actions获取公司列表
+      this.$store.dispatch('GetCompList', this.compData)
+    },
+    // 快捷切换账套
+    chooseCompany(row) {
+      if ((!this.$store.getters.comp_id && row.id === 'yunT') || (row.id && this.$store.getters.comp_id && row.id === this.$store.getters.comp_id.id)) {
+        this.$router.push({
+          name: 'dashboard'
+        })
+      } else { // 登录公司
+        if (row.id && row.id !== 'yunT') {
+          this.switchComp(row.id, row.name)
+        } else if (row.id === 'yunT') {
+          this.switchComp(null, this.$t('navbar.yunT'))
+        }
+      }
+    },
+
+    // 确定切换公司(或平台)操作
+    switchComp(compId, text) {
+      this.$confirm(
+        this.$t('switchComp', { text: text }),
+        this.$t('message.info'),
+        {
+          confirmButtonText: this.$t('button.ok'),
+          cancelButtonText: this.$t('button.cancel'),
+          center: true,
+          type: 'warning'
+        }
+      ).then(() => {
+        const params = { comp: compId }
+        this.switchCompany(params)
+      }).catch(() => {})
+    },
+
+    // 切换公司
+    switchCompany(params) {
+      return new Promise(resolve => {
+        switchCompany(params).then((res) => {
+          // 清除页签缓存
+          this.$store.dispatch('tagsView/delAllViews', this.$router.currentRoute)
+          // 置空角色,以便重新再一次调用GetInfo
+          this.$store.dispatch('SetUserRoles', [])
+          if (!params.compId) {
+            this.$store.dispatch('SetCompId', null)
+          }
+          this.handleLink({ 'meta': {}, 'path': '/' })
+          this.$emit('switchCompany')
+        })
+      })
+    },
+
+    // 获取公司列表
+    getCompanyList() {
+      return new Promise((resolve, reject) => {
+        fetchCompanyList().then(res => {
+          resolve(res)
+        })
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.app-breadcrumb {
+  display: inline-block;
+  font-size: 14px;
+  line-height: 45px;
+  .el-dropdown {
+    font-size: 16px;
+  }
+  .el-dropdown-link {
+    color: #FFFFFF;
+    cursor: pointer;
+  }
+}
+</style>

+ 0 - 0
src/components/ErrorLog/index.vue


Some files were not shown because too many files changed in this diff