Kaynağa Gözat

词云页面修改,下载表格及echarts图表

qinpeng 2 yıl önce
ebeveyn
işleme
3e77ce2ca7

BIN
dist.rar


+ 102 - 0
package-lock.json

@@ -2152,6 +2152,15 @@
       "integrity": "sha1-vxEWycdYxRt6kz0pa3LCIe2UKLY=",
       "dev": true
     },
+    "adler-32": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.2.0.tgz",
+      "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==",
+      "requires": {
+        "exit-on-epipe": "~1.0.1",
+        "printj": "~1.1.0"
+      }
+    },
     "aggregate-error": {
       "version": "3.1.0",
       "resolved": "https://registry.npm.taobao.org/aggregate-error/download/aggregate-error-3.1.0.tgz",
@@ -3132,6 +3141,22 @@
       "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz",
       "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
     },
+    "cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "requires": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      },
+      "dependencies": {
+        "adler-32": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
+          "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
+        }
+      }
+    },
     "chalk": {
       "version": "2.4.2",
       "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1613533846139&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz",
@@ -3473,6 +3498,11 @@
       "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz",
       "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
     },
+    "codepage": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz",
+      "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA=="
+    },
     "collection-visit": {
       "version": "1.0.0",
       "resolved": "https://registry.npm.taobao.org/collection-visit/download/collection-visit-1.0.0.tgz",
@@ -4044,6 +4074,11 @@
         }
       }
     },
+    "crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
+    },
     "create-ecdh": {
       "version": "4.0.4",
       "resolved": "https://registry.npm.taobao.org/create-ecdh/download/create-ecdh-4.0.4.tgz",
@@ -5357,6 +5392,11 @@
         "strip-eof": "^1.0.0"
       }
     },
+    "exit-on-epipe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
+      "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
+    },
     "expand-brackets": {
       "version": "2.1.4",
       "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-2.1.4.tgz",
@@ -5671,6 +5711,11 @@
         "schema-utils": "^2.5.0"
       }
     },
+    "file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+    },
     "file-uri-to-path": {
       "version": "1.0.0",
       "resolved": "https://registry.npm.taobao.org/file-uri-to-path/download/file-uri-to-path-1.0.0.tgz",
@@ -5830,6 +5875,11 @@
       "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
       "dev": true
     },
+    "frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
+    },
     "fragment-cache": {
       "version": "0.2.1",
       "resolved": "https://registry.npm.taobao.org/fragment-cache/download/fragment-cache-0.2.1.tgz",
@@ -9551,6 +9601,11 @@
         "renderkid": "^2.0.4"
       }
     },
+    "printj": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz",
+      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
+    },
     "process": {
       "version": "0.11.10",
       "resolved": "https://registry.npm.taobao.org/process/download/process-0.11.10.tgz",
@@ -10402,6 +10457,21 @@
         "debug": "^4.2.0"
       }
     },
+    "script-loader": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmmirror.com/script-loader/-/script-loader-0.7.2.tgz",
+      "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
+      "requires": {
+        "raw-loader": "~0.5.1"
+      },
+      "dependencies": {
+        "raw-loader": {
+          "version": "0.5.1",
+          "resolved": "https://registry.npmmirror.com/raw-loader/-/raw-loader-0.5.1.tgz",
+          "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q=="
+        }
+      }
+    },
     "scss-tokenizer": {
       "version": "0.2.3",
       "resolved": "https://registry.npm.taobao.org/scss-tokenizer/download/scss-tokenizer-0.2.3.tgz",
@@ -11004,6 +11074,14 @@
       "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
       "dev": true
     },
+    "ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "requires": {
+        "frac": "~1.1.2"
+      }
+    },
     "sshpk": {
       "version": "1.16.1",
       "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.16.1.tgz",
@@ -12964,6 +13042,16 @@
         }
       }
     },
+    "wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
+    },
+    "word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
+    },
     "word-wrap": {
       "version": "1.2.3",
       "resolved": "https://registry.npm.taobao.org/word-wrap/download/word-wrap-1.2.3.tgz",
@@ -13059,6 +13147,20 @@
         "async-limiter": "~1.0.0"
       }
     },
+    "xlsx": {
+      "version": "0.17.5",
+      "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.17.5.tgz",
+      "integrity": "sha512-lXNU0TuYsvElzvtI6O7WIVb9Zar1XYw7Xb3VAx2wn8N/n0whBYrCnHMxtFyIiUU1Wjf09WzmLALDfBO5PqTb1g==",
+      "requires": {
+        "adler-32": "~1.2.0",
+        "cfb": "^1.1.4",
+        "codepage": "~1.15.0",
+        "crc-32": "~1.2.0",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      }
+    },
     "xtend": {
       "version": "4.0.2",
       "resolved": "https://registry.npm.taobao.org/xtend/download/xtend-4.0.2.tgz",

+ 3 - 0
package.json

@@ -14,6 +14,7 @@
     "echarts": "^5.3.3",
     "element-ui": "^2.15.1",
     "emoji-vue": "^0.2.4",
+    "file-saver": "^2.0.5",
     "js-cookie": "^2.2.1",
     "js-md5": "^0.7.3",
     "mockjs": "^1.1.0",
@@ -21,12 +22,14 @@
     "nprogress": "^0.2.0",
     "sass-loader": "^9.0.0",
     "script-ext-html-webpack-plugin": "^2.1.5",
+    "script-loader": "^0.7.2",
     "tinymce": "^5.7.1",
     "vue": "^2.6.11",
     "vue-i18n": "^8.24.5",
     "vue-pdf": "^4.2.0",
     "vue-router": "^3.2.0",
     "vuex": "^3.4.0",
+    "xlsx": "^0.17.4",
     "ztree": "^3.5.24"
   },
   "devDependencies": {

+ 5 - 4
public/ciyun/ciyunindex.html

@@ -354,8 +354,8 @@
         })
         let query = location.href.split("?");
         let arr = query[1].split("&");
-        let partitionKey = null;
-        let searchType = null;
+        var partitionKey = null;
+        var searchType = null;
         arr.forEach((item) => {
             if (item.split("=")[0] == "partitionKey") {
                 partitionKey = item.split("=")[1];
@@ -365,6 +365,7 @@
             }
         });
         function getdata(isSelectStopWords) {
+            console.log(123);
             let data = {
                 searchType: searchType,
                 partitionKey: partitionKey,
@@ -803,8 +804,8 @@
                     layer.msg("该词已经存在,请勿重复添加")
                     return
                 }
-                oldstopWordList.unshift(val)
-                stopWordList.unshift(val)
+                oldstopWordList.unshift({ word: val })
+                stopWordList.unshift({ word: val })
                 $("#wordTable").show()
                 $("#addwordDom").hide()
                 updatawordData()

+ 3 - 0
public/config.js

@@ -0,0 +1,3 @@
+window.g = {
+    BASE_URL: 'https://mk.wmjh.cn',
+}

+ 2 - 0
public/index.html

@@ -11,6 +11,8 @@
     <title>
         <%= htmlWebpackPlugin.options.title %>
     </title>
+    <script type="text/javascript" src="config.js"></script>
+
 </head>
 
 <body>

+ 33 - 0
src/utils/setMethods.js

@@ -0,0 +1,33 @@
+export function json2excel(tableJson, filenames, autowidth, bookTypes) {
+    import("@/vendor/Export2Excel").then(excel => {
+        var tHeader = []
+        var dataArr = []
+        var sheetnames = []
+        for (var i in tableJson) {
+            tHeader.push(tableJson[i].tHeader)
+            dataArr.push(formatJson(tableJson[i].filterVal, tableJson[i].tableDatas))
+            sheetnames.push(tableJson[i].sheetName)
+        }
+        excel.export_json_to_excel({
+            header: tHeader,
+            data: dataArr,
+            sheetname: sheetnames,
+            filename: filenames,
+            autoWidth: autowidth,
+            bookType: bookTypes
+        })
+    })
+}
+
+// 数据过滤,时间过滤
+function formatJson(filterVal, jsonData) {
+    return jsonData.map(v =>
+        filterVal.map(j => {
+            if (j === "timestamp") {
+                return parseTime(v[j])
+            } else {
+                return v[j]
+            }
+        })
+    )
+}

+ 728 - 0
src/vendor/Blob.js

@@ -0,0 +1,728 @@
+/* Blob.js
+ * A Blob, File, FileReader & URL implementation.
+ * 2019-04-19
+ *
+ * By Eli Grey, http://eligrey.com
+ * By Jimmy Wärting, https://github.com/jimmywarting
+ * License: MIT
+ *   See https://github.com/eligrey/Blob.js/blob/master/LICENSE.md
+ */
+
+;(function () {
+  var global =
+    typeof window === "object" ? window : typeof self === "object" ? self : this
+
+  var BlobBuilder =
+    global.BlobBuilder ||
+    global.WebKitBlobBuilder ||
+    global.MSBlobBuilder ||
+    global.MozBlobBuilder
+
+  global.URL =
+    global.URL ||
+    global.webkitURL ||
+    function (href, a) {
+      a = document.createElement("a")
+      a.href = href
+      return a
+    }
+
+  var origBlob = global.Blob
+  var createObjectURL = URL.createObjectURL
+  var revokeObjectURL = URL.revokeObjectURL
+  var strTag = global.Symbol && global.Symbol.toStringTag
+  var blobSupported = false
+  var blobSupportsArrayBufferView = false
+  var arrayBufferSupported = !!global.ArrayBuffer
+  var blobBuilderSupported =
+    BlobBuilder && BlobBuilder.prototype.append && BlobBuilder.prototype.getBlob
+
+  try {
+    // Check if Blob constructor is supported
+    blobSupported = new Blob(["ä"]).size === 2
+
+    // Check if Blob constructor supports ArrayBufferViews
+    // Fails in Safari 6, so we need to map to ArrayBuffers there.
+    blobSupportsArrayBufferView = new Blob([new Uint8Array([1, 2])]).size === 2
+  } catch (e) {}
+
+  /**
+   * Helper function that maps ArrayBufferViews to ArrayBuffers
+   * Used by BlobBuilder constructor and old browsers that didn't
+   * support it in the Blob constructor.
+   */
+  function mapArrayBufferViews (ary) {
+    return ary.map(function (chunk) {
+      if (chunk.buffer instanceof ArrayBuffer) {
+        var buf = chunk.buffer
+
+        // if this is a subarray, make a copy so we only
+        // include the subarray region from the underlying buffer
+        if (chunk.byteLength !== buf.byteLength) {
+          var copy = new Uint8Array(chunk.byteLength)
+          copy.set(new Uint8Array(buf, chunk.byteOffset, chunk.byteLength))
+          buf = copy.buffer
+        }
+
+        return buf
+      }
+
+      return chunk
+    })
+  }
+
+  function BlobBuilderConstructor (ary, options) {
+    options = options || {}
+
+    var bb = new BlobBuilder()
+    mapArrayBufferViews(ary).forEach(function (part) {
+      bb.append(part)
+    })
+
+    return options.type ? bb.getBlob(options.type) : bb.getBlob()
+  }
+
+  function BlobConstructor (ary, options) {
+    return new origBlob(mapArrayBufferViews(ary), options || {})
+  }
+
+  if (global.Blob) {
+    BlobBuilderConstructor.prototype = Blob.prototype
+    BlobConstructor.prototype = Blob.prototype
+  }
+
+  /********************************************************/
+  /*               String Encoder fallback                */
+  /********************************************************/
+  function stringEncode (string) {
+    var pos = 0
+    var len = string.length
+    var out = []
+    var Arr = global.Uint8Array || Array // Use byte array when possible
+
+    var at = 0 // output position
+    var tlen = Math.max(32, len + (len >> 1) + 7) // 1.5x size
+    var target = new Arr((tlen >> 3) << 3) // ... but at 8 byte offset
+
+    while (pos < len) {
+      var value = string.charCodeAt(pos++)
+      if (value >= 0xd800 && value <= 0xdbff) {
+        // high surrogate
+        if (pos < len) {
+          var extra = string.charCodeAt(pos)
+          if ((extra & 0xfc00) === 0xdc00) {
+            ++pos
+            value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000
+          }
+        }
+        if (value >= 0xd800 && value <= 0xdbff) {
+          continue // drop lone surrogate
+        }
+      }
+
+      // expand the buffer if we couldn't write 4 bytes
+      if (at + 4 > target.length) {
+        tlen += 8 // minimum extra
+        tlen *= 1.0 + (pos / string.length) * 2 // take 2x the remaining
+        tlen = (tlen >> 3) << 3 // 8 byte offset
+
+        const update = new Uint8Array(tlen)
+        update.set(target)
+        target = update
+      }
+
+      if ((value & 0xffffff80) === 0) {
+        // 1-byte
+        target[at++] = value // ASCII
+        continue
+      } else if ((value & 0xfffff800) === 0) {
+        // 2-byte
+        target[at++] = ((value >> 6) & 0x1f) | 0xc0
+      } else if ((value & 0xffff0000) === 0) {
+        // 3-byte
+        target[at++] = ((value >> 12) & 0x0f) | 0xe0
+        target[at++] = ((value >> 6) & 0x3f) | 0x80
+      } else if ((value & 0xffe00000) === 0) {
+        // 4-byte
+        target[at++] = ((value >> 18) & 0x07) | 0xf0
+        target[at++] = ((value >> 12) & 0x3f) | 0x80
+        target[at++] = ((value >> 6) & 0x3f) | 0x80
+      } else {
+        // FIXME: do we care
+        continue
+      }
+
+      target[at++] = (value & 0x3f) | 0x80
+    }
+
+    return target.slice(0, at)
+  }
+
+  /********************************************************/
+  /*               String Decoder fallback                */
+  /********************************************************/
+  function stringDecode (buf) {
+    var end = buf.length
+    var res = []
+
+    var i = 0
+    while (i < end) {
+      var firstByte = buf[i]
+      var codePoint = null
+      var bytesPerSequence =
+        firstByte > 0xef ? 4 : firstByte > 0xdf ? 3 : firstByte > 0xbf ? 2 : 1
+
+      if (i + bytesPerSequence <= end) {
+        var secondByte, thirdByte, fourthByte, tempCodePoint
+
+        switch (bytesPerSequence) {
+          case 1:
+            if (firstByte < 0x80) {
+              codePoint = firstByte
+            }
+            break
+          case 2:
+            secondByte = buf[i + 1]
+            if ((secondByte & 0xc0) === 0x80) {
+              tempCodePoint = ((firstByte & 0x1f) << 0x6) | (secondByte & 0x3f)
+              if (tempCodePoint > 0x7f) {
+                codePoint = tempCodePoint
+              }
+            }
+            break
+          case 3:
+            secondByte = buf[i + 1]
+            thirdByte = buf[i + 2]
+            if ((secondByte & 0xc0) === 0x80 && (thirdByte & 0xc0) === 0x80) {
+              tempCodePoint =
+                ((firstByte & 0xf) << 0xc) |
+                ((secondByte & 0x3f) << 0x6) |
+                (thirdByte & 0x3f)
+              if (
+                tempCodePoint > 0x7ff &&
+                (tempCodePoint < 0xd800 || tempCodePoint > 0xdfff)
+              ) {
+                codePoint = tempCodePoint
+              }
+            }
+            break
+          case 4:
+            secondByte = buf[i + 1]
+            thirdByte = buf[i + 2]
+            fourthByte = buf[i + 3]
+            if (
+              (secondByte & 0xc0) === 0x80 &&
+              (thirdByte & 0xc0) === 0x80 &&
+              (fourthByte & 0xc0) === 0x80
+            ) {
+              tempCodePoint =
+                ((firstByte & 0xf) << 0x12) |
+                ((secondByte & 0x3f) << 0xc) |
+                ((thirdByte & 0x3f) << 0x6) |
+                (fourthByte & 0x3f)
+              if (tempCodePoint > 0xffff && tempCodePoint < 0x110000) {
+                codePoint = tempCodePoint
+              }
+            }
+        }
+      }
+
+      if (codePoint === null) {
+        // we did not generate a valid codePoint so insert a
+        // replacement char (U+FFFD) and advance only 1 byte
+        codePoint = 0xfffd
+        bytesPerSequence = 1
+      } else if (codePoint > 0xffff) {
+        // encode to utf16 (surrogate pair dance)
+        codePoint -= 0x10000
+        res.push(((codePoint >>> 10) & 0x3ff) | 0xd800)
+        codePoint = 0xdc00 | (codePoint & 0x3ff)
+      }
+
+      res.push(codePoint)
+      i += bytesPerSequence
+    }
+
+    var len = res.length
+    var str = ""
+    var i = 0
+
+    while (i < len) {
+      str += String.fromCharCode.apply(String, res.slice(i, (i += 0x1000)))
+    }
+
+    return str
+  }
+
+  // string -> buffer
+  var textEncode =
+    typeof TextEncoder === "function"
+      ? TextEncoder.prototype.encode.bind(new TextEncoder())
+      : stringEncode
+
+  // buffer -> string
+  var textDecode =
+    typeof TextDecoder === "function"
+      ? TextDecoder.prototype.decode.bind(new TextDecoder())
+      : stringDecode
+
+  function FakeBlobBuilder () {
+    function isDataView (obj) {
+      return obj && DataView.prototype.isPrototypeOf(obj)
+    }
+    function bufferClone (buf) {
+      var view = new Array(buf.byteLength)
+      var array = new Uint8Array(buf)
+      var i = view.length
+      while (i--) {
+        view[i] = array[i]
+      }
+      return view
+    }
+    function array2base64 (input) {
+      var byteToCharMap =
+        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
+
+      var output = []
+
+      for (var i = 0; i < input.length; i += 3) {
+        var byte1 = input[i]
+        var haveByte2 = i + 1 < input.length
+        var byte2 = haveByte2 ? input[i + 1] : 0
+        var haveByte3 = i + 2 < input.length
+        var byte3 = haveByte3 ? input[i + 2] : 0
+
+        var outByte1 = byte1 >> 2
+        var outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4)
+        var outByte3 = ((byte2 & 0x0f) << 2) | (byte3 >> 6)
+        var outByte4 = byte3 & 0x3f
+
+        if (!haveByte3) {
+          outByte4 = 64
+
+          if (!haveByte2) {
+            outByte3 = 64
+          }
+        }
+
+        output.push(
+          byteToCharMap[outByte1],
+          byteToCharMap[outByte2],
+          byteToCharMap[outByte3],
+          byteToCharMap[outByte4]
+        )
+      }
+
+      return output.join("")
+    }
+
+    var create =
+      Object.create ||
+      function (a) {
+        function c () {}
+        c.prototype = a
+        return new c()
+      }
+
+    if (arrayBufferSupported) {
+      var viewClasses = [
+        "[object Int8Array]",
+        "[object Uint8Array]",
+        "[object Uint8ClampedArray]",
+        "[object Int16Array]",
+        "[object Uint16Array]",
+        "[object Int32Array]",
+        "[object Uint32Array]",
+        "[object Float32Array]",
+        "[object Float64Array]"
+      ]
+
+      var isArrayBufferView =
+        ArrayBuffer.isView ||
+        function (obj) {
+          return (
+            obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
+          )
+        }
+    }
+
+    function concatTypedarrays (chunks) {
+      var size = 0
+      var i = chunks.length
+      while (i--) {
+        size += chunks[i].length
+      }
+      var b = new Uint8Array(size)
+      var offset = 0
+      for (i = 0, l = chunks.length; i < l; i++) {
+        var chunk = chunks[i]
+        b.set(chunk, offset)
+        offset += chunk.byteLength || chunk.length
+      }
+
+      return b
+    }
+
+    /********************************************************/
+    /*                   Blob constructor                   */
+    /********************************************************/
+    function Blob (chunks, opts) {
+      chunks = chunks || []
+      opts = opts == null ? {} : opts
+      for (var i = 0, len = chunks.length; i < len; i++) {
+        var chunk = chunks[i]
+        if (chunk instanceof Blob) {
+          chunks[i] = chunk._buffer
+        } else if (typeof chunk === "string") {
+          chunks[i] = textEncode(chunk)
+        } else if (
+          arrayBufferSupported &&
+          (ArrayBuffer.prototype.isPrototypeOf(chunk) ||
+            isArrayBufferView(chunk))
+        ) {
+          chunks[i] = bufferClone(chunk)
+        } else if (arrayBufferSupported && isDataView(chunk)) {
+          chunks[i] = bufferClone(chunk.buffer)
+        } else {
+          chunks[i] = textEncode(String(chunk))
+        }
+      }
+
+      this._buffer = global.Uint8Array
+        ? concatTypedarrays(chunks)
+        : [].concat.apply([], chunks)
+      this.size = this._buffer.length
+
+      this.type = opts.type || ""
+      if (/[^\u0020-\u007E]/.test(this.type)) {
+        this.type = ""
+      } else {
+        this.type = this.type.toLowerCase()
+      }
+    }
+
+    Blob.prototype.arrayBuffer = function () {
+      return Promise.resolve(this._buffer)
+    }
+
+    Blob.prototype.text = function () {
+      return Promise.resolve(textDecode(this._buffer))
+    }
+
+    Blob.prototype.slice = function (start, end, type) {
+      var slice = this._buffer.slice(start || 0, end || this._buffer.length)
+      return new Blob([slice], { type: type })
+    }
+
+    Blob.prototype.toString = function () {
+      return "[object Blob]"
+    }
+
+    /********************************************************/
+    /*                   File constructor                   */
+    /********************************************************/
+    function File (chunks, name, opts) {
+      opts = opts || {}
+      var a = Blob.call(this, chunks, opts) || this
+      a.name = name.replace(/\//g, ":")
+      a.lastModifiedDate = opts.lastModified
+        ? new Date(opts.lastModified)
+        : new Date()
+      a.lastModified = +a.lastModifiedDate
+
+      return a
+    }
+
+    File.prototype = create(Blob.prototype)
+    File.prototype.constructor = File
+
+    if (Object.setPrototypeOf) {
+      Object.setPrototypeOf(File, Blob)
+    } else {
+      try {
+        File.__proto__ = Blob
+      } catch (e) {}
+    }
+
+    File.prototype.toString = function () {
+      return "[object File]"
+    }
+
+    /********************************************************/
+    /*                FileReader constructor                */
+    /********************************************************/
+    function FileReader () {
+      if (!(this instanceof FileReader)) {
+        throw new TypeError(
+          "Failed to construct 'FileReader': Please use the 'new' operator, this DOM object constructor cannot be called as a function."
+        )
+      }
+
+      var delegate = document.createDocumentFragment()
+      this.addEventListener = delegate.addEventListener
+      this.dispatchEvent = function (evt) {
+        var local = this["on" + evt.type]
+        if (typeof local === "function") local(evt)
+        delegate.dispatchEvent(evt)
+      }
+      this.removeEventListener = delegate.removeEventListener
+    }
+
+    function _read (fr, blob, kind) {
+      if (!(blob instanceof Blob)) {
+        throw new TypeError(
+          "Failed to execute '" +
+            kind +
+            "' on 'FileReader': parameter 1 is not of type 'Blob'."
+        )
+      }
+
+      fr.result = ""
+
+      setTimeout(function () {
+        this.readyState = FileReader.LOADING
+        fr.dispatchEvent(new Event("load"))
+        fr.dispatchEvent(new Event("loadend"))
+      })
+    }
+
+    FileReader.EMPTY = 0
+    FileReader.LOADING = 1
+    FileReader.DONE = 2
+    FileReader.prototype.error = null
+    FileReader.prototype.onabort = null
+    FileReader.prototype.onerror = null
+    FileReader.prototype.onload = null
+    FileReader.prototype.onloadend = null
+    FileReader.prototype.onloadstart = null
+    FileReader.prototype.onprogress = null
+
+    FileReader.prototype.readAsDataURL = function (blob) {
+      _read(this, blob, "readAsDataURL")
+      this.result =
+        "data:" + blob.type + ";base64," + array2base64(blob._buffer)
+    }
+
+    FileReader.prototype.readAsText = function (blob) {
+      _read(this, blob, "readAsText")
+      this.result = textDecode(blob._buffer)
+    }
+
+    FileReader.prototype.readAsArrayBuffer = function (blob) {
+      _read(this, blob, "readAsText")
+      // return ArrayBuffer when possible
+      this.result = (blob._buffer.buffer || blob._buffer).slice()
+    }
+
+    FileReader.prototype.abort = function () {}
+
+    /********************************************************/
+    /*                         URL                          */
+    /********************************************************/
+    URL.createObjectURL = function (blob) {
+      return blob instanceof Blob
+        ? "data:" + blob.type + ";base64," + array2base64(blob._buffer)
+        : createObjectURL.call(URL, blob)
+    }
+
+    URL.revokeObjectURL = function (url) {
+      revokeObjectURL && revokeObjectURL.call(URL, url)
+    }
+
+    /********************************************************/
+    /*                         XHR                          */
+    /********************************************************/
+    var _send = global.XMLHttpRequest && global.XMLHttpRequest.prototype.send
+    if (_send) {
+      XMLHttpRequest.prototype.send = function (data) {
+        if (data instanceof Blob) {
+          this.setRequestHeader("Content-Type", data.type)
+          _send.call(this, textDecode(data._buffer))
+        } else {
+          _send.call(this, data)
+        }
+      }
+    }
+
+    global.FileReader = FileReader
+    global.File = File
+    global.Blob = Blob
+  }
+
+  function fixFileAndXHR () {
+    var isIE =
+      !!global.ActiveXObject ||
+      ("-ms-scroll-limit" in document.documentElement.style &&
+        "-ms-ime-align" in document.documentElement.style)
+
+    // Monkey patched
+    // IE don't set Content-Type header on XHR whose body is a typed Blob
+    // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/6047383
+    var _send = global.XMLHttpRequest && global.XMLHttpRequest.prototype.send
+    if (isIE && _send) {
+      XMLHttpRequest.prototype.send = function (data) {
+        if (data instanceof Blob) {
+          this.setRequestHeader("Content-Type", data.type)
+          _send.call(this, data)
+        } else {
+          _send.call(this, data)
+        }
+      }
+    }
+
+    try {
+      new File([], "")
+    } catch (e) {
+      try {
+        var klass = new Function(
+          "class File extends Blob {" +
+            "constructor(chunks, name, opts) {" +
+            "opts = opts || {};" +
+            "super(chunks, opts || {});" +
+            "this.name = name.replace(///g, \":\");" +
+            "this.lastModifiedDate = opts.lastModified ? new Date(opts.lastModified) : new Date();" +
+            "this.lastModified = +this.lastModifiedDate;" +
+            "}};" +
+            "return new File([], \"\"), File"
+        )()
+        global.File = klass
+      } catch (e) {
+        var klass = function (b, d, c) {
+          var blob = new Blob(b, c)
+          var t =
+            c && void 0 !== c.lastModified
+              ? new Date(c.lastModified)
+              : new Date()
+
+          blob.name = d.replace(/\//g, ":")
+          blob.lastModifiedDate = t
+          blob.lastModified = +t
+          blob.toString = function () {
+            return "[object File]"
+          }
+
+          if (strTag) {
+            blob[strTag] = "File"
+          }
+
+          return blob
+        }
+        global.File = klass
+      }
+    }
+  }
+
+  if (blobSupported) {
+    fixFileAndXHR()
+    global.Blob = blobSupportsArrayBufferView ? global.Blob : BlobConstructor
+  } else if (blobBuilderSupported) {
+    fixFileAndXHR()
+    global.Blob = BlobBuilderConstructor
+  } else {
+    FakeBlobBuilder()
+  }
+
+  if (strTag) {
+    File.prototype[strTag] = "File"
+    Blob.prototype[strTag] = "Blob"
+    FileReader.prototype[strTag] = "FileReader"
+  }
+
+  var blob = global.Blob.prototype
+  var stream
+
+  function promisify (obj) {
+    return new Promise(function (resolve, reject) {
+      obj.onload = obj.onerror = function (evt) {
+        obj.onload = obj.onerror = null
+
+        evt.type === "load"
+          ? resolve(obj.result || obj)
+          : reject(new Error("Failed to read the blob/file"))
+      }
+    })
+  }
+
+  try {
+    new ReadableStream({ type: "bytes" })
+    stream = function stream () {
+      var position = 0
+      var blob = this
+
+      return new ReadableStream({
+        type: "bytes",
+        autoAllocateChunkSize: 524288,
+
+        pull: function (controller) {
+          var v = controller.byobRequest.view
+          var chunk = blob.slice(position, position + v.byteLength)
+          return chunk.arrayBuffer().then(function (buffer) {
+            var uint8array = new Uint8Array(buffer)
+            var bytesRead = uint8array.byteLength
+
+            position += bytesRead
+            v.set(uint8array)
+            controller.byobRequest.respond(bytesRead)
+
+            if (position >= blob.size) controller.close()
+          })
+        }
+      })
+    }
+  } catch (e) {
+    try {
+      new ReadableStream({})
+      stream = function stream (blob) {
+        var position = 0
+        var blob = this
+
+        return new ReadableStream({
+          pull: function (controller) {
+            var chunk = blob.slice(position, position + 524288)
+
+            return chunk.arrayBuffer().then(function (buffer) {
+              position += buffer.byteLength
+              var uint8array = new Uint8Array(buffer)
+              controller.enqueue(uint8array)
+
+              if (position == blob.size) controller.close()
+            })
+          }
+        })
+      }
+    } catch (e) {
+      try {
+        new Response("").body.getReader().read()
+        stream = function stream () {
+          return new Response(this).body
+        }
+      } catch (e) {
+        stream = function stream () {
+          throw new Error(
+            "Include https://github.com/MattiasBuelens/web-streams-polyfill"
+          )
+        }
+      }
+    }
+  }
+
+  if (!blob.arrayBuffer) {
+    blob.arrayBuffer = function arrayBuffer () {
+      var fr = new FileReader()
+      fr.readAsArrayBuffer(this)
+      return promisify(fr)
+    }
+  }
+
+  if (!blob.text) {
+    blob.text = function text () {
+      var fr = new FileReader()
+      fr.readAsText(this)
+      return promisify(fr)
+    }
+  }
+
+  if (!blob.stream) {
+    blob.stream = stream
+  }
+})()

+ 253 - 0
src/vendor/Export2Excel.js

@@ -0,0 +1,253 @@
+/* eslint-disable */
+require("script-loader!file-saver")
+import XLSX from "xlsx"
+function generateArray(table) {
+  var out = []
+  var rows = table.querySelectorAll("tr")
+  var ranges = []
+  for (var R = 0; R < rows.length; ++R) {
+    var outRow = []
+    var row = rows[R]
+    var columns = row.querySelectorAll("td")
+    for (var C = 0; C < columns.length; ++C) {
+      var cell = columns[C]
+      var colspan = cell.getAttribute("colspan")
+      var rowspan = cell.getAttribute("rowspan")
+      var cellValue = cell.innerText
+      if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue
+
+      //Skip ranges
+      ranges.forEach(function(range) {
+        if (
+          R >= range.s.r &&
+          R <= range.e.r &&
+          outRow.length >= range.s.c &&
+          outRow.length <= range.e.c
+        ) {
+          for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null)
+        }
+      })
+
+      //Handle Row Span
+      if (rowspan || colspan) {
+        rowspan = rowspan || 1
+        colspan = colspan || 1
+        ranges.push({
+          s: {
+            r: R,
+            c: outRow.length
+          },
+          e: {
+            r: R + rowspan - 1,
+            c: outRow.length + colspan - 1
+          }
+        })
+      }
+
+      //Handle Value
+      outRow.push(cellValue !== "" ? cellValue : null)
+
+      //Handle Colspan
+      if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null)
+    }
+    out.push(outRow)
+  }
+  return [out, ranges]
+}
+
+function datenum(v, date1904) {
+  if (date1904) v += 1462
+  var epoch = Date.parse(v)
+  return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000)
+}
+
+function sheet_from_array_of_arrays(data, opts) {
+  var ws = {}
+  var range = {
+    s: {
+      c: 10000000,
+      r: 10000000
+    },
+    e: {
+      c: 0,
+      r: 0
+    }
+  }
+  for (var R = 0; R != data.length; ++R) {
+    for (var C = 0; C != data[R].length; ++C) {
+      if (range.s.r > R) range.s.r = R
+      if (range.s.c > C) range.s.c = C
+      if (range.e.r < R) range.e.r = R
+      if (range.e.c < C) range.e.c = C
+      var cell = {
+        v: data[R][C]
+      }
+      if (cell.v == null) continue
+      var cell_ref = XLSX.utils.encode_cell({
+        c: C,
+        r: R
+      })
+
+      if (typeof cell.v === "number") cell.t = "n"
+      else if (typeof cell.v === "boolean") cell.t = "b"
+      else if (cell.v instanceof Date) {
+        cell.t = "n"
+        cell.z = XLSX.SSF._table[14]
+        cell.v = datenum(cell.v)
+      } else cell.t = "s"
+
+      ws[cell_ref] = cell
+    }
+  }
+  if (range.s.c < 10000000) ws["!ref"] = XLSX.utils.encode_range(range)
+  return ws
+}
+
+function Workbook() {
+  if (!(this instanceof Workbook)) return new Workbook()
+  this.SheetNames = []
+  this.Sheets = {}
+}
+
+function s2ab(s) {
+  var buf = new ArrayBuffer(s.length)
+  var view = new Uint8Array(buf)
+  for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
+  return buf
+}
+
+export function export_table_to_excel(id) {
+  var theTable = document.getElementById(id)
+  var oo = generateArray(theTable)
+  var ranges = oo[1]
+
+  /* original data */
+  var data = oo[0]
+  var ws_name = "SheetJS"
+
+  var wb = new Workbook(),
+    ws = sheet_from_array_of_arrays(data)
+
+  /* add ranges to worksheet */
+  // ws['!cols'] = ['apple', 'banan'];
+  ws["!merges"] = ranges
+
+  /* add worksheet to workbook */
+  wb.SheetNames.push(ws_name)
+  wb.Sheets[ws_name] = ws
+
+  var wbout = XLSX.write(wb, {
+    bookType: "xlsx",
+    bookSST: false,
+    type: "binary"
+  })
+
+  saveAs(
+    new Blob([s2ab(wbout)], {
+      type: "application/octet-stream"
+    }),
+    "test.xlsx"
+  )
+}
+
+export function export_json_to_excel({
+  multiHeader = [],
+  header,
+  data,
+  sheetname,
+  filename,
+  merges = [],
+  autoWidth = true,
+  bookType = "xlsx"
+} = {}) {
+  /* original data */
+  filename = filename || "excel-list"
+  data = [...data]
+
+  for (var i = 0; i < header.length; i++) {
+    data[i].unshift(header[i])
+  }
+
+  // data.unshift(header)
+
+  for (let i = multiHeader.length - 1; i > -1; i--) {
+    data.unshift(multiHeader[i])
+  }
+
+  var ws_name = sheetname
+  var wb = new Workbook(),
+    ws = []
+  for (var j = 0; j < header.length; j++) {
+    ws.push(sheet_from_array_of_arrays(data[j]))
+  }
+
+  if (merges.length > 0) {
+    if (!ws["!merges"]) ws["!merges"] = []
+    merges.forEach(item => {
+      ws["!merges"].push(XLSX.utils.decode_range(item))
+    })
+  }
+  // console.log("width", autoWidth)
+  if (autoWidth) {
+    /*设置worksheet每列的最大宽度*/
+    var colWidth = []
+    for (var k = 0; k < header.length; k++) {
+      colWidth.push(
+        data[k].map(row =>
+          row.map(val => {
+            /*先判断是否为null/undefined*/
+            if (val == null) {
+              return {
+                wch: 10
+              }
+            } else if (val.toString().charCodeAt(0) > 255) {
+              /*再判断是否为中文*/
+              return {
+                wch: val.toString().length * 2
+              }
+            } else {
+              return {
+                wch: val.toString().length
+              }
+            }
+          })
+        )
+      )
+    }
+
+    /*以第一行为初始值*/
+    let result = []
+    for (var k = 0; k < colWidth.length; k++) {
+      result[k] = colWidth[k][0]
+      for (let i = 1; i < colWidth[k].length; i++) {
+        for (let j = 0; j < colWidth[k][i].length; j++) {
+          if (result[k][j]["wch"] < colWidth[k][i][j]["wch"]) {
+            result[k][j]["wch"] = colWidth[k][i][j]["wch"]
+          }
+        }
+      }
+    }
+    // 分别给sheet表设置宽度
+    for (var l = 0; l < result.length; l++) {
+      ws[l]["!cols"] = result[l]
+    }
+  }
+
+  /* add worksheet to workbook */
+  for (var k = 0; k < header.length; k++) {
+    wb.SheetNames.push(ws_name[k])
+    wb.Sheets[ws_name[k]] = ws[k]
+  }
+
+  var wbout = XLSX.write(wb, {
+    bookType: bookType,
+    bookSST: false,
+    type: "binary"
+  })
+  saveAs(
+    new Blob([s2ab(wbout)], {
+      type: "application/octet-stream"
+    }),
+    `${filename}.${bookType}`
+  )
+}

+ 79 - 14
src/views/Textanalysis/index.vue

@@ -82,7 +82,7 @@
                   >
                   </el-switch>
                 </span>
-                <span>
+                <span @click="downloadLeft">
                   <img src="../../assets/teacherdev/dowload-text.png" alt="" />
                   下载</span
                 >
@@ -144,7 +144,7 @@
               >
                 <img src="../../assets/teacherdev/duotone-chart4.png" alt="" />
               </span>
-              <span>
+              <span @click="downLoadEcharts">
                 <img src="../../assets/teacherdev/dowload-text.png" alt="" />
                 下载
               </span>
@@ -246,6 +246,8 @@ import "echarts/lib/component/legend";
 import "echarts/lib/component/title";
 import { postapi } from "@/api/api";
 import staticData from "../../common/data";
+import { json2excel } from "@/utils/setMethods";
+
 export default {
   components: {
     Header,
@@ -288,6 +290,43 @@ export default {
     };
   },
   methods: {
+    downloadLeft() {
+      let data = JSON.parse(JSON.stringify(this.leftList));
+      data.forEach((item) => {
+        item.ratio = item.ratio + "%";
+      });
+      var excelDatas = [
+        {
+          tHeader: ["等级", "数量", "占比"],
+          filterVal: ["name", "value", "ratio"], // 表一的数据字段
+          tableDatas: data, // 表一的整体json数据
+          sheetName: "sheet1", // 表一的sheet名字
+        },
+      ];
+      //引入的函数
+      json2excel(excelDatas, "等级分布", true, "xlsx");
+    },
+    downLoadEcharts() {
+      let chartsCanvas = document
+        .getElementById("main_echarts")
+        .querySelectorAll("canvas")[0];
+      chartsCanvas.style.background = "#fff";
+      let picInfo = chartsCanvas.toDataURL({
+        type: "png",
+        pixelRatio: 1.5, // 放大两倍下载。解决生成图片在移动端模糊问题
+        backgroundColor: "#fff",
+        excludeComponents: ["toolbox"], // 导出时忽略toolbox组件
+      }); // 获取到的是一串base64信息
+      const elink = document.createElement("a");
+      // 设置默认文件名,this.chartTitle为绘图时生成的标题
+      elink.download = "等级分布.png";
+      elink.style.display = "none";
+      elink.href = picInfo;
+      document.body.appendChild(elink);
+      elink.click();
+      URL.revokeObjectURL(elink.href); // 释放URL 对象
+      document.body.removeChild(elink);
+    },
     ciyunEvent() {
       window.open(
         "./ciyun/ciyunindex.html?partitionKey=" +
@@ -401,8 +440,29 @@ export default {
         var chartDom = document.getElementById(id);
         this.myChart = echarts.init(chartDom);
         var option = null;
+        let color1 = [
+          "#35776B",
+          "#3873CB",
+          "#9031AA",
+          "#EA1F1F",
+          "#CBCBCB",
+          "#888888",
+        ];
+        let color2 = [
+          "#B6D58A",
+          "#66AE5B",
+          "#35776B",
+          "#73CDDE",
+          "#4CA6EE",
+          "#3873CB",
+          "#9031AA",
+          "#EA1F1F",
+          "#CBCBCB",
+          "#888888",
+        ];
         if (type == "饼状图") {
           option = {
+            color: this.xifen ? color2 : color1,
             series: [
               {
                 name: "Access From",
@@ -417,13 +477,6 @@ export default {
                   borderColor: "#f5f5f5",
                   borderWidth: 5,
                 },
-                // emphasis: {
-                //   itemStyle: {
-                //     shadowBlur: 1,
-                //     shadowOffsetX: 0,
-                //     shadowColor: "rgba(0, 0, 0, 0.5)",
-                //   },
-                // },
               },
             ],
             xAxis: {
@@ -440,6 +493,7 @@ export default {
             },
           };
         } else if (type == "柱状图") {
+          let that = this;
           var gridWidth = 681; //可以根据canvas的宽度和grid的right,left,width进行计算
           var fontsize = 14; //字体大小
           var wordNum = parseInt(gridWidth / name.length / fontsize);
@@ -491,11 +545,12 @@ export default {
                 name: "",
                 data: valueStype,
                 type: "bar",
-                // label: {
-                //   show: true,
-                //   position: "inside",
-                //   formatter: "{b}\n{c}%", //这是关键,在需要的地方加上就行了
-                // },
+                itemStyle: {
+                  color: function (parms) {
+                    let color = that.xifen ? color2 : color1;
+                    return color[parms.dataIndex];
+                  },
+                },
               },
             ],
           };
@@ -533,12 +588,22 @@ export default {
             yAxis: {
               type: "value",
             },
+            dataZoom: [
+              {
+                type: "slider", //slider表示有滑动块的,inside表示内置的
+                show: true,
+                xAxisIndex: 0,
+                start: 50,
+                end: 100,
+              },
+            ],
             grid: {
               left: 1,
               right: 1,
               bottom: 1,
               containLabel: true,
             },
+
             series: [
               {
                 data: value,