''
liukangdong
2024-05-22 6cfaee4a1edbe47f7c9da41905e8d877ed590dc4
''
已添加3个文件
已修改7个文件
已重命名1个文件
1116 ■■■■ 文件已修改
admin/package-lock.json 182 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/index.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/RichEditor.vue 234 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/operation.vue 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/operationCity.vue 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/subscribe.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/LogisticsRecord/waybill.vue 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/set/application.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/statistics/platformRecord.vue 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/statistics/platformStatic.vue 补丁 | 查看 | 原始文档 | blame | 历史
admin/package-lock.json
@@ -1876,63 +1876,6 @@
          "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
          "dev": true
        },
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "ssri": {
          "version": "8.0.1",
          "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1940,28 +1883,6 @@
          "dev": true,
          "requires": {
            "minipass": "^3.1.1"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
@@ -2058,7 +1979,7 @@
    },
    "@wangeditor/basic-modules": {
      "version": "1.1.7",
      "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
      "resolved": "https://registry.npmjs.org/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
      "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
      "requires": {
        "is-url": "^1.2.4"
@@ -2066,7 +1987,7 @@
    },
    "@wangeditor/code-highlight": {
      "version": "1.0.3",
      "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
      "resolved": "https://registry.npmjs.org/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
      "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
      "requires": {
        "prismjs": "^1.23.0"
@@ -2074,7 +1995,7 @@
    },
    "@wangeditor/core": {
      "version": "1.1.19",
      "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
      "resolved": "https://registry.npmjs.org/@wangeditor/core/-/core-1.1.19.tgz",
      "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
      "requires": {
        "@types/event-emitter": "^0.3.3",
@@ -2087,7 +2008,7 @@
    },
    "@wangeditor/editor": {
      "version": "5.1.23",
      "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
      "resolved": "https://registry.npmjs.org/@wangeditor/editor/-/editor-5.1.23.tgz",
      "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
      "requires": {
        "@uppy/core": "^2.1.1",
@@ -2114,28 +2035,28 @@
      }
    },
    "@wangeditor/editor-for-vue": {
      "version": "5.1.12",
      "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz",
      "integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ=="
      "version": "1.0.2",
      "resolved": "https://registry.npmjs.org/@wangeditor/editor-for-vue/-/editor-for-vue-1.0.2.tgz",
      "integrity": "sha512-BOENvAXJVtVXlE2X50AAvjV82YlCUeu5cbeR0cvEQHQjYtiVnJtq7HSoj85r2kTgGouI5OrpJG9BBEjSjUSPyA=="
    },
    "@wangeditor/list-module": {
      "version": "1.0.5",
      "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
      "resolved": "https://registry.npmjs.org/@wangeditor/list-module/-/list-module-1.0.5.tgz",
      "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ=="
    },
    "@wangeditor/table-module": {
      "version": "1.1.4",
      "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
      "resolved": "https://registry.npmjs.org/@wangeditor/table-module/-/table-module-1.1.4.tgz",
      "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w=="
    },
    "@wangeditor/upload-image-module": {
      "version": "1.0.2",
      "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
      "resolved": "https://registry.npmjs.org/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
      "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA=="
    },
    "@wangeditor/video-module": {
      "version": "1.1.4",
      "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
      "resolved": "https://registry.npmjs.org/@wangeditor/video-module/-/video-module-1.1.4.tgz",
      "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg=="
    },
    "@webassemblyjs/ast": {
@@ -13950,6 +13871,87 @@
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
    "vue-property-decorator": {
      "version": "8.5.1",
      "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-8.5.1.tgz",
admin/package.json
@@ -13,7 +13,7 @@
  "dependencies": {
    "@riophae/vue-treeselect": "^0.4.0",
    "@wangeditor/editor": "^5.1.23",
    "@wangeditor/editor-for-vue": "^5.1.12",
    "@wangeditor/editor-for-vue": "^1.0.2",
    "axios": "^0.21.1",
    "core-js": "^3.6.5",
    "echarts": "^5.4.3",
admin/src/api/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
export const uploadFile = '/admin_interface/visitsAdmin/cloudService/public/upload'
admin/src/components/common/RichEditor.vue
@@ -1,158 +1,162 @@
<template>
  <div style="border: 1px solid #ccc;">
  <div class="wang_editor">
    <Toolbar
      style="border-bottom: 1px solid #ccc"
      :editor="editor"
      :defaultConfig="toolbarConfig"
      :default-config="toolbarConfig"
      :mode="mode"
    />
    <Editor
      style="height: 300px; overflow-y: hidden;"
      :value="content.content"
      v-model="html"
      style="min-height: 200px"
      :default-config="editorConfig"
      :mode="mode"
      :defaultConfig="editorConfig"
      @onCreated="onCreated"
      @onChange="onChange"
      @input="html=$event"
    />
  </div>
</template>
<script>
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
import '@wangeditor/editor/dist/css/style.css'
import axios from 'axios'
import { uploadFile } from '@/api'
const uploadConfig = {
  action: uploadFile, // å¿…填参数 å›¾ç‰‡ä¸Šä¼ åœ°å€
  methods: 'POST', // å¿…填参数 å›¾ç‰‡ä¸Šä¼ æ–¹å¼
  token: '', // å¯é€‰å‚æ•° å¦‚果需要token验证,假设你的token有存放在sessionStorage
  name: 'file', // å¿…填参数 æ–‡ä»¶çš„参数名
  size: 500, // å¯é€‰å‚æ•°   å›¾ç‰‡å¤§å°ï¼Œå•位为Kb, 1M = 1024Kb
  accept: 'image/png, image/gif, image/jpeg, image/bmp, image/x-icon' // å¯é€‰ å¯ä¸Šä¼ çš„图片格式
}
export default {
  name: 'RichEditor',
  components: { Editor, Toolbar },
  components: {
    Editor,
    Toolbar
  },
  props: {
    content: {
      type: Object,
      default: () => {}
    info: {
      type: String,
      default: ''
    },
    default: {
      type: String,
      default: ''
    },
    placeholder: {
      type: String,
      default: '请输入内容...'
    }
  },
  data() {
  data () {
    return {
      editor: null,
      html: '<p><br></p>',
      toolbarConfig: {
        toolbarKeys: [
          "headerSelect",
          "blockquote",
          "|",
          "bold",
          "underline",
          "italic",
          {
              "key": "group-more-style",
              "title": "更多",
              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M204.8 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path><path d=\"M505.6 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path><path d=\"M806.4 505.6m-76.8 0a76.8 76.8 0 1 0 153.6 0 76.8 76.8 0 1 0-153.6 0Z\"></path></svg>",
              "menuKeys": [
                  "through",
                  "code",
                  "sup",
                  "sub",
                  "clearStyle"
              ]
          },
          "color",
          "bgColor",
          "|",
          "fontSize",
          "fontFamily",
          "lineHeight",
          "|",
          "bulletedList",
          "numberedList",
          "todo",
          {
              "key": "group-justify",
              "title": "对齐",
              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 793.6v102.4H51.2v-102.4h716.8z m204.8-230.4v102.4H51.2v-102.4h921.6z m-204.8-230.4v102.4H51.2v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>",
              "menuKeys": [
                  "justifyLeft",
                  "justifyRight",
                  "justifyCenter",
                  "justifyJustify"
              ]
          },
          {
              "key": "group-indent",
              "title": "缩进",
              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64h1024v128H0z m384 192h640v128H384z m0 192h640v128H384z m0 192h640v128H384zM0 832h1024v128H0z m0-128V320l256 192z\"></path></svg>",
              "menuKeys": [
                  "indent",
                  "delIndent"
              ]
          },
          // "|",
          "emotion",
          "insertLink",
          {
              "key": "group-image",
              "title": "图片",
              "iconSvg": "<svg viewBox=\"0 0 1024 1024\"><path d=\"M959.877 128l0.123 0.123v767.775l-0.123 0.122H64.102l-0.122-0.122V128.123l0.122-0.123h895.775zM960 64H64C28.795 64 0 92.795 0 128v768c0 35.205 28.795 64 64 64h896c35.205 0 64-28.795 64-64V128c0-35.205-28.795-64-64-64zM832 288.01c0 53.023-42.988 96.01-96.01 96.01s-96.01-42.987-96.01-96.01S682.967 192 735.99 192 832 234.988 832 288.01zM896 832H128V704l224.01-384 256 320h64l224.01-192z\"></path></svg>",
              "menuKeys": [
                  "insertImage",
                  "uploadImage"
              ]
          },
          "insertTable",
          "codeBlock",
          "divider",
          "|",
          "undo",
          "redo",
          "|",
          "fullScreen"
        ]
      },
      toolbarConfig: {},
      editorConfig: {
        placeholder: '请输入内容...',
        placeholder: this.placeholder,
        MENU_CONF: {
          uploadImage: {
            // server: '/api/upload',
            name: 'file',
            server: process.env.VUE_APP_API_PREFIX + '/visitsAdmin/cloudService/public/uploadLocal',
            html: this.info,
            server: uploadFile,
            // å•个文件的最大体积限制,默认为 2M
            maxFileSize: 5 * 1024 * 1024, // 1M
            // é€‰æ‹©æ–‡ä»¶æ—¶çš„类型限制,默认为 ['image/*'] ã€‚如不想限制,则设置为 []
            allowedFileTypes: ['image/*'],
            // è‡ªå®šä¹‰ä¸Šä¼ å‚数,例如传递验证的 token ç­‰ã€‚参数会被添加到 formData ä¸­ï¼Œä¸€èµ·ä¸Šä¼ åˆ°æœåŠ¡ç«¯
            meta: {
              folder: 'shop'
              token: '',
              otherKey: '',
              folder: 'COURSE_IMG'
            },
            onBeforeUpload(file) {    // JS è¯­æ³•
              // file é€‰ä¸­çš„æ–‡ä»¶ï¼Œæ ¼å¼å¦‚ { key: file }
              // debugger
              return file
            // è‡ªå®šä¹‰å¢žåŠ  http  header
            headers: {
              token: localStorage.getItem('token') || ''
              // Accept: 'text/x-json',
              // otherKey: 'xxx'
            },
            onSuccess(file, res) {
                console.log(`${file.name} ä¸Šä¼ æˆåŠŸ`, res)
            // è·¨åŸŸæ˜¯å¦ä¼ é€’ cookie ï¼Œé»˜è®¤ä¸º false
            withCredentials: true,
            // è¶…时时间,默认为 10 ç§’
            timeout: 5 * 1000, // 5 ç§’
            onSuccess (file, res) { // TS è¯­æ³•
              // onSuccess(file, res) {          // JS è¯­æ³•
              console.log(`${file.name} ä¸Šä¼ æˆåŠŸ`, res)
            },
            onError(file, err, res) {
              console.log(`${file.name} ä¸Šä¼ å‡ºé”™`, err, res)
            },
          },
            customUpload (file, insertFn) { // TS è¯­æ³•
              // file å³é€‰ä¸­çš„æ–‡ä»¶
              // è‡ªå·±å®žçŽ°ä¸Šä¼ ï¼Œå¹¶å¾—åˆ°å›¾ç‰‡ url alt href
              // var form = new FormData()
              // form.append('image', file)
              // form.append('folder', 'COURSE_IMG')
              var formData = new FormData()
              formData.append(file.name, file)
              formData.append('image', file)
              formData.append('folder', 'member')
              // formData.append('type', '')
              var xhr = new XMLHttpRequest()
              xhr.open(uploadConfig.methods, uploadConfig.action, true)
              // ä¸Šä¼ æ•°æ®æˆåŠŸï¼Œä¼šè§¦å‘
              xhr.send(formData)
              xhr.onreadystatechange = () => {
                // è‹¥å“åº”完成且请求成功
                if (xhr.readyState === 4 && xhr.status === 200) {
                  const result = JSON.parse(xhr.responseText)
                  console.log('result', result);
                  insertFn(result.data.url, '', result.data.url)
                }
              }
            },
            customInsert (res, insertFn) { // TS è¯­æ³•
              // customInsert(res, insertFn) {                  // JS è¯­æ³•
              // res å³æœåŠ¡ç«¯çš„è¿”å›žç»“æžœ
              console.log(res.data.url)
              // ä»Ž res ä¸­æ‰¾åˆ° url alt href ï¼Œç„¶åŽæ’入图片
              insertFn(res.url)
            }
          }
        }
      },
      mode: 'default', // or 'simple'
      mode: 'default' // or 'simple'
    }
  },
  beforeDestroy() {
  emits: ['input'],
  computed: {
    html: {
      get () {
        return this.info || ''
      },
      set (newValue) {
        this.$emit('input', newValue)
      }
    }
  },
  mounted () {
    setTimeout(() => {
      this.info = this.default
    }, 1200)
  },
  beforeDestroy () {
    const editor = this.editor
    if (editor == null) return
    editor.destroy() // ç»„件销毁时,及时销毁编辑器
  },
  methods: {
    onCreated (editor) {
      this.editor = Object.seal(editor)
      this.editor = Object.seal(editor) // ä¸€å®šè¦ç”¨ Object.seal() ï¼Œå¦åˆ™ä¼šæŠ¥é”™
      this.$emit('input', '123123')
    },
    onChange (editor) {
      console.log(this.html);
      // debugger
      if (!this.html||this.content.content==this.html) {
        return
      }
      this.$emit('edit', this.html)
    },
  },
    test () {
      console.log(this.info)
    }
  }
}
</script>
<style src="@wangeditor/editor/dist/css/style.css"></style>
<style lang="scss" scoped>
.wang_editor {
  border: 1px solid;
}
</style>
admin/src/views/platform/LogisticsRecord/operation.vue
@@ -0,0 +1,168 @@
<template>
  <div class="main_app">
    <QueryForm
      v-model="filters"
      :query-form-config="queryFormConfig"
      @handleQuery="getList(1)"
      @clear="clear"
    />
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column
        prop="name"
        label="车牌前照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="车牌后照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="驾驶员"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="联系方式"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="确认时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="签到时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="叫号时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业开始时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业完成时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业时长"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="叫号月台"
        min-width="100"
      />
      <el-table-column
        prop="name"
        label="月台组"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="运输单号/合同号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业情况"
        min-width="100"
        show-overflow-tooltip
      />
    </el-table>
    <pagination
      @size-change="handleSizeChange"
      @current-change="getList"
      :pagination="pagination"
    />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
export default {
  components: {
    Pagination,
    QueryForm
  },
  data () {
    return {
      loading: false,
      pagination: {
        capacity: 10,
        page: 1
      },
      filters: {},
      list: [],
      total: 0,
      isShowEdit: false,
      param: {},
      rules: {},
      queryFormConfig: {
        formItems: [
          {
            filed: 'aaaa',
            type: 'input',
            label: '车牌号'
          },
          {
            filed: 'bbb',
            type: 'input',
            label: '驾驶员'
          },
          {
            filed: 'selDate',
            type: 'daterange',
            label: '操作时间'
          }
        ],
        online: true
      },
    }
  },
  methods: {
    handleSub () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          alert('submit!')
        }
      })
    },
    getList (page) { },
    clear () { },
    handleEdit (row) {
      this.isShowEdit = true
    },
    handleDel () { },
    handleSizeChange (capacity) {
      this.pagination.capacity = capacity
    }
  }
}
</script>
<style>
</style>
admin/src/views/platform/LogisticsRecord/operationCity.vue
@@ -0,0 +1,168 @@
<template>
  <div class="main_app">
    <QueryForm
      v-model="filters"
      :query-form-config="queryFormConfig"
      @handleQuery="getList(1)"
      @clear="clear"
    />
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column
        prop="name"
        label="车牌前照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="车牌后照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="驾驶员"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="联系方式"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="确认时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="签到时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="叫号时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业开始时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业完成时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业时长"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="叫号月台"
        min-width="100"
      />
      <el-table-column
        prop="name"
        label="月台组"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="运输单号/合同号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业情况"
        min-width="100"
        show-overflow-tooltip
      />
    </el-table>
    <pagination
      @size-change="handleSizeChange"
      @current-change="getList"
      :pagination="pagination"
    />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
export default {
  components: {
    Pagination,
    QueryForm
  },
  data () {
    return {
      loading: false,
      pagination: {
        capacity: 10,
        page: 1
      },
      filters: {},
      list: [],
      total: 0,
      isShowEdit: false,
      param: {},
      rules: {},
      queryFormConfig: {
        formItems: [
          {
            filed: 'aaaa',
            type: 'input',
            label: '车牌号'
          },
          {
            filed: 'bbb',
            type: 'input',
            label: '驾驶员'
          },
          {
            filed: 'selDate',
            type: 'daterange',
            label: '操作时间'
          }
        ],
        online: true
      },
    }
  },
  methods: {
    handleSub () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          alert('submit!')
        }
      })
    },
    getList (page) { },
    clear () { },
    handleEdit (row) {
      this.isShowEdit = true
    },
    handleDel () { },
    handleSizeChange (capacity) {
      this.pagination.capacity = capacity
    }
  }
}
</script>
<style>
</style>
admin/src/views/platform/LogisticsRecord/subscribe.vue
@@ -0,0 +1,160 @@
<template>
  <div class="main_app">
    <QueryForm
      v-model="filters"
      :query-form-config="queryFormConfig"
      @handleQuery="getList(1)"
      @clear="clear"
    />
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column
        prop="name"
        label="车牌前照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="车牌后照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="驾驶员"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="联系方式"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="合同单号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="入库类型"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="预约到场时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="审批结果"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="审批人"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="操作时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="操作"
        min-width="80"
        align="center"
        show-overflow-tooltip
      >
        <template v-slot="scope">
          <el-button type="text" @click="handleEdit(scope.row)">预约详情</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      @size-change="handleSizeChange"
      @current-change="getList"
      :pagination="pagination"
    />
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
export default {
  components: {
    Pagination,
    QueryForm
  },
  data () {
    return {
      loading: false,
      pagination: {
        capacity: 10,
        page: 1
      },
      filters: {},
      list: [],
      total: 0,
      isShowEdit: false,
      param: {},
      rules: {},
      queryFormConfig: {
        formItems: [
          {
            filed: 'aaaa',
            type: 'input',
            label: '车牌号'
          },
          {
            filed: 'bbb',
            type: 'input',
            label: '驾驶员'
          },
          {
            filed: 'cc',
            type: 'input',
            label: '合同单号'
          },
          {
            filed: 'selDate',
            type: 'daterange',
            label: '操作时间'
          }
        ],
        online: true
      },
    }
  },
  methods: {
    handleSub () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          alert('submit!')
        }
      })
    },
    getList (page) { },
    clear () { },
    handleEdit (row) {
      this.isShowEdit = true
    },
    handleDel () { },
    handleSizeChange (capacity) {
      this.pagination.capacity = capacity
    }
  }
}
</script>
<style>
</style>
admin/src/views/platform/LogisticsRecord/waybill.vue
@@ -0,0 +1,185 @@
<template>
  <div class="main_app">
    <QueryForm
      v-model="filters"
      :query-form-config="queryFormConfig"
      @handleQuery="getList(1)"
      @clear="clear"
    />
    <div class="mb10 mt20">
      <el-button type="primary" @click="handleEdit()">新增</el-button>
    </div>
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column
        prop="name"
        label="车牌前照号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="任务来源"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="运输公司"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="驾驶员"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="联系方式"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="作业类型"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="运输单号"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="操作时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="操作"
        min-width="80"
        align="center"
        show-overflow-tooltip
      >
        <template v-slot="scope">
          <el-button type="text" @click="handleEdit(scope.row)">运单详情</el-button>
          <el-button type="text" class="red" @click="handleDel(scope.row)"
            >删除</el-button
          >
        </template>
      </el-table-column>
    </el-table>
    <pagination
      @size-change="handleSizeChange"
      @current-change="getList"
      :pagination="pagination"
    />
    <el-dialog
      :title="param.id ? '编辑作业任务' : '新增作业任务'"
      :visible.sync="isShowEdit"
      width="480px"
    >
      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
        <el-form-item label="运输单号" prop="name">
          <el-input v-model="param.aaa" placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="车前牌照号" prop="name">
          <el-input v-model="param.aaa" placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="驾驶员" prop="name">
          <el-input v-model="param.aaa" placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="联系方式" prop="name">
          <el-input v-model="param.aaa" placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="入园事由" prop="name">
          <el-input v-model="param.aaa" placeholder="请输入"></el-input>
        </el-form-item>
        <el-form-item label="总运输量" prop="name">
          <el-input v-model="param.aaa" placeholder="请输入" class="w300"></el-input>
          <span class="ml10">万支</span>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="isShowEdit = false">取消</el-button>
        <el-button type="primary" @click="handleSub">确定</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
export default {
  components: {
    Pagination,
    QueryForm
  },
  data () {
    return {
      loading: false,
      pagination: {
        capacity: 10,
        page: 1
      },
      filters: {},
      list: [],
      total: 0,
      isShowEdit: false,
      param: {},
      rules: {},
      queryFormConfig: {
        formItems: [
          {
            filed: 'aaaa',
            type: 'input',
            label: '车牌号'
          },
          {
            filed: 'bbb',
            type: 'input',
            label: '驾驶员'
          },
          {
            filed: 'cc',
            type: 'input',
            label: '运输单号'
          },
          {
            filed: 'selDate',
            type: 'daterange',
            label: '操作时间'
          }
        ],
        online: true
      },
    }
  },
  methods: {
    handleSub () {
      this.$refs.ruleForm.validate((valid) => {
        if (valid) {
          alert('submit!')
        }
      })
    },
    getList (page) { },
    clear () { },
    handleEdit (row) {
      this.isShowEdit = true
    },
    handleDel () { },
    handleSizeChange (capacity) {
      this.pagination.capacity = capacity
    }
  }
}
</script>
<style>
</style>
admin/src/views/platform/set/application.vue
ÎļþÃû´Ó admin/src/views/platform/set/center.vue ÐÞ¸Ä
@@ -1,5 +1,5 @@
<template>
  <div class="main_app">
    <div class="main_app">
    <el-form
      :model="param"
      :rules="rules"
@@ -9,7 +9,7 @@
    >
      <el-form-item label="市公司审批人">
        <el-select v-model="param.aa" class="w400" placeholder="请选择,多选">
          <el-option></el-option>
          <!-- <el-option></el-option> -->
        </el-select>
      </el-form-item>
      <el-form-item label="市公司日作业量">
@@ -17,24 +17,26 @@
        <span>万支</span>
      </el-form-item>
      <el-form-item label="物流车预约指南">
        <Editor v-if="param.content" v-model="param.content" :defaultConfig="{ readOnly : true }" />
        <RichEditor v-model="param.context" style="width: 900px" :default="param.context" />
      </el-form-item>
      <el-form-item label="物流车园区导览图">
        <Editor v-if="param.content" v-model="param.content" :defaultConfig="{ readOnly : true }" />
        <RichEditor v-model="param.context" style="width: 900px" placeholder="请输入内容" :default="param.context" />
      </el-form-item>
    </el-form>
  </div>
</template>
<script>
import { Editor } from '@wangeditor/editor-for-vue'
import RichEditor from '@/components/common/RichEditor'
export default {
  components: {
    Editor
    RichEditor: RichEditor
  },
  data () {
    return {
      param: {},
      param: {
        context: 'qqq'
      },
      rules: {}
    }
  }
admin/src/views/statistics/platformRecord.vue
admin/src/views/statistics/platformStatic.vue