作者 朱兆平

预配模块

@@ -83,6 +83,15 @@ @@ -83,6 +83,15 @@
83 "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", 83 "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
84 "dev": true 84 "dev": true
85 }, 85 },
  86 + "adler-32": {
  87 + "version": "1.2.0",
  88 + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz",
  89 + "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=",
  90 + "requires": {
  91 + "exit-on-epipe": "~1.0.1",
  92 + "printj": "~1.1.0"
  93 + }
  94 + },
86 "ajv": { 95 "ajv": {
87 "version": "6.10.2", 96 "version": "6.10.2",
88 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 97 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
@@ -1947,6 +1956,17 @@ @@ -1947,6 +1956,17 @@
1947 "lazy-cache": "^1.0.3" 1956 "lazy-cache": "^1.0.3"
1948 } 1957 }
1949 }, 1958 },
  1959 + "cfb": {
  1960 + "version": "1.1.3",
  1961 + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.1.3.tgz",
  1962 + "integrity": "sha512-joXBW0nMuwV9no7UTMiyVJnQL6XIU3ThXVjFUDHgl9MpILPOomyfaGqC290VELZ48bbQKZXnQ81UT5HouTxHsw==",
  1963 + "requires": {
  1964 + "adler-32": "~1.2.0",
  1965 + "commander": "^2.16.0",
  1966 + "crc-32": "~1.2.0",
  1967 + "printj": "~1.1.2"
  1968 + }
  1969 + },
1950 "chalk": { 1970 "chalk": {
1951 "version": "1.1.3", 1971 "version": "1.1.3",
1952 "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1972 "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
@@ -2303,6 +2323,22 @@ @@ -2303,6 +2323,22 @@
2303 "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 2323 "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
2304 "dev": true 2324 "dev": true
2305 }, 2325 },
  2326 + "codepage": {
  2327 + "version": "1.14.0",
  2328 + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz",
  2329 + "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=",
  2330 + "requires": {
  2331 + "commander": "~2.14.1",
  2332 + "exit-on-epipe": "~1.0.1"
  2333 + },
  2334 + "dependencies": {
  2335 + "commander": {
  2336 + "version": "2.14.1",
  2337 + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
  2338 + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
  2339 + }
  2340 + }
  2341 + },
2306 "collection-visit": { 2342 "collection-visit": {
2307 "version": "1.0.0", 2343 "version": "1.0.0",
2308 "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 2344 "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -2375,8 +2411,7 @@ @@ -2375,8 +2411,7 @@
2375 "commander": { 2411 "commander": {
2376 "version": "2.17.1", 2412 "version": "2.17.1",
2377 "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", 2413 "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
2378 - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",  
2379 - "dev": true 2414 + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
2380 }, 2415 },
2381 "commondir": { 2416 "commondir": {
2382 "version": "1.0.1", 2417 "version": "1.0.1",
@@ -2596,8 +2631,7 @@ @@ -2596,8 +2631,7 @@
2596 "core-util-is": { 2631 "core-util-is": {
2597 "version": "1.0.2", 2632 "version": "1.0.2",
2598 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 2633 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
2599 - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",  
2600 - "dev": true 2634 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
2601 }, 2635 },
2602 "cosmiconfig": { 2636 "cosmiconfig": {
2603 "version": "2.2.2", 2637 "version": "2.2.2",
@@ -2622,6 +2656,15 @@ @@ -2622,6 +2656,15 @@
2622 } 2656 }
2623 } 2657 }
2624 }, 2658 },
  2659 + "crc-32": {
  2660 + "version": "1.2.0",
  2661 + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
  2662 + "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==",
  2663 + "requires": {
  2664 + "exit-on-epipe": "~1.0.1",
  2665 + "printj": "~1.1.0"
  2666 + }
  2667 + },
2625 "create-ecdh": { 2668 "create-ecdh": {
2626 "version": "4.0.3", 2669 "version": "4.0.3",
2627 "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", 2670 "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
@@ -3456,6 +3499,11 @@ @@ -3456,6 +3499,11 @@
3456 "safe-buffer": "^5.1.1" 3499 "safe-buffer": "^5.1.1"
3457 } 3500 }
3458 }, 3501 },
  3502 + "exit-on-epipe": {
  3503 + "version": "1.0.1",
  3504 + "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
  3505 + "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
  3506 + },
3459 "expand-brackets": { 3507 "expand-brackets": {
3460 "version": "2.1.4", 3508 "version": "2.1.4",
3461 "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 3509 "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@@ -3769,6 +3817,11 @@ @@ -3769,6 +3817,11 @@
3769 } 3817 }
3770 } 3818 }
3771 }, 3819 },
  3820 + "file-saver": {
  3821 + "version": "2.0.2",
  3822 + "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.2.tgz",
  3823 + "integrity": "sha512-Wz3c3XQ5xroCxd1G8b7yL0Ehkf0TC9oYC6buPFkNnU9EnaPlifeAFCyCh+iewXTyFRcg0a6j3J7FmJsIhlhBdw=="
  3824 + },
3772 "filesize": { 3825 "filesize": {
3773 "version": "3.6.1", 3826 "version": "3.6.1",
3774 "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", 3827 "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
@@ -3917,6 +3970,11 @@ @@ -3917,6 +3970,11 @@
3917 "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", 3970 "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
3918 "dev": true 3971 "dev": true
3919 }, 3972 },
  3973 + "frac": {
  3974 + "version": "1.1.2",
  3975 + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz",
  3976 + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
  3977 + },
3920 "fragment-cache": { 3978 "fragment-cache": {
3921 "version": "0.2.1", 3979 "version": "0.2.1",
3922 "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 3980 "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
@@ -5067,6 +5125,11 @@ @@ -5067,6 +5125,11 @@
5067 "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 5125 "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
5068 "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" 5126 "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
5069 }, 5127 },
  5128 + "immediate": {
  5129 + "version": "3.0.6",
  5130 + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
  5131 + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
  5132 + },
5070 "import-fresh": { 5133 "import-fresh": {
5071 "version": "3.1.0", 5134 "version": "3.1.0",
5072 "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", 5135 "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz",
@@ -5366,8 +5429,7 @@ @@ -5366,8 +5429,7 @@
5366 "isarray": { 5429 "isarray": {
5367 "version": "1.0.0", 5430 "version": "1.0.0",
5368 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 5431 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
5369 - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",  
5370 - "dev": true 5432 + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
5371 }, 5433 },
5372 "isexe": { 5434 "isexe": {
5373 "version": "2.0.0", 5435 "version": "2.0.0",
@@ -5509,6 +5571,17 @@ @@ -5509,6 +5571,17 @@
5509 "verror": "1.10.0" 5571 "verror": "1.10.0"
5510 } 5572 }
5511 }, 5573 },
  5574 + "jszip": {
  5575 + "version": "3.2.2",
  5576 + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.2.2.tgz",
  5577 + "integrity": "sha512-NmKajvAFQpbg3taXQXr/ccS2wcucR1AZ+NtyWp2Nq7HHVsXhcJFR8p0Baf32C2yVvBylFWVeKf+WI2AnvlPhpA==",
  5578 + "requires": {
  5579 + "lie": "~3.3.0",
  5580 + "pako": "~1.0.2",
  5581 + "readable-stream": "~2.3.6",
  5582 + "set-immediate-shim": "~1.0.1"
  5583 + }
  5584 + },
5512 "kind-of": { 5585 "kind-of": {
5513 "version": "3.2.2", 5586 "version": "3.2.2",
5514 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 5587 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
@@ -5542,6 +5615,14 @@ @@ -5542,6 +5615,14 @@
5542 "type-check": "~0.3.2" 5615 "type-check": "~0.3.2"
5543 } 5616 }
5544 }, 5617 },
  5618 + "lie": {
  5619 + "version": "3.3.0",
  5620 + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
  5621 + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
  5622 + "requires": {
  5623 + "immediate": "~3.0.5"
  5624 + }
  5625 + },
5545 "load-json-file": { 5626 "load-json-file": {
5546 "version": "1.1.0", 5627 "version": "1.1.0",
5547 "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 5628 "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
@@ -9563,8 +9644,7 @@ @@ -9563,8 +9644,7 @@
9563 "pako": { 9644 "pako": {
9564 "version": "1.0.10", 9645 "version": "1.0.10",
9565 "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", 9646 "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz",
9566 - "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==",  
9567 - "dev": true 9647 + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw=="
9568 }, 9648 },
9569 "parallel-transform": { 9649 "parallel-transform": {
9570 "version": "1.1.0", 9650 "version": "1.1.0",
@@ -10265,6 +10345,11 @@ @@ -10265,6 +10345,11 @@
10265 "utila": "~0.4" 10345 "utila": "~0.4"
10266 } 10346 }
10267 }, 10347 },
  10348 + "printj": {
  10349 + "version": "1.1.2",
  10350 + "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
  10351 + "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
  10352 + },
10268 "private": { 10353 "private": {
10269 "version": "0.1.8", 10354 "version": "0.1.8",
10270 "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", 10355 "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
@@ -10280,8 +10365,7 @@ @@ -10280,8 +10365,7 @@
10280 "process-nextick-args": { 10365 "process-nextick-args": {
10281 "version": "2.0.1", 10366 "version": "2.0.1",
10282 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 10367 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
10283 - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",  
10284 - "dev": true 10368 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
10285 }, 10369 },
10286 "progress": { 10370 "progress": {
10287 "version": "2.0.3", 10371 "version": "2.0.3",
@@ -10439,6 +10523,11 @@ @@ -10439,6 +10523,11 @@
10439 "unpipe": "1.0.0" 10523 "unpipe": "1.0.0"
10440 } 10524 }
10441 }, 10525 },
  10526 + "raw-loader": {
  10527 + "version": "0.5.1",
  10528 + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz",
  10529 + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao="
  10530 + },
10442 "read-pkg": { 10531 "read-pkg": {
10443 "version": "1.1.0", 10532 "version": "1.1.0",
10444 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 10533 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
@@ -10483,7 +10572,6 @@ @@ -10483,7 +10572,6 @@
10483 "version": "2.3.6", 10572 "version": "2.3.6",
10484 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 10573 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
10485 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 10574 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
10486 - "dev": true,  
10487 "requires": { 10575 "requires": {
10488 "core-util-is": "~1.0.0", 10576 "core-util-is": "~1.0.0",
10489 "inherits": "~2.0.3", 10577 "inherits": "~2.0.3",
@@ -11120,8 +11208,7 @@ @@ -11120,8 +11208,7 @@
11120 "safe-buffer": { 11208 "safe-buffer": {
11121 "version": "5.1.2", 11209 "version": "5.1.2",
11122 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 11210 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
11123 - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",  
11124 - "dev": true 11211 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
11125 }, 11212 },
11126 "safe-regex": { 11213 "safe-regex": {
11127 "version": "1.1.0", 11214 "version": "1.1.0",
@@ -11237,6 +11324,14 @@ @@ -11237,6 +11324,14 @@
11237 } 11324 }
11238 } 11325 }
11239 }, 11326 },
  11327 + "script-loader": {
  11328 + "version": "0.7.2",
  11329 + "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz",
  11330 + "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
  11331 + "requires": {
  11332 + "raw-loader": "~0.5.1"
  11333 + }
  11334 + },
11240 "scss-tokenizer": { 11335 "scss-tokenizer": {
11241 "version": "0.2.3", 11336 "version": "0.2.3",
11242 "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", 11337 "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz",
@@ -11316,6 +11411,11 @@ @@ -11316,6 +11411,11 @@
11316 "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 11411 "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
11317 "dev": true 11412 "dev": true
11318 }, 11413 },
  11414 + "set-immediate-shim": {
  11415 + "version": "1.0.1",
  11416 + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
  11417 + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
  11418 + },
11319 "set-value": { 11419 "set-value": {
11320 "version": "2.0.1", 11420 "version": "2.0.1",
11321 "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", 11421 "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -11641,6 +11741,14 @@ @@ -11641,6 +11741,14 @@
11641 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 11741 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
11642 "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 11742 "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
11643 }, 11743 },
  11744 + "ssf": {
  11745 + "version": "0.10.2",
  11746 + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.2.tgz",
  11747 + "integrity": "sha512-rDhAPm9WyIsY8eZEKyE8Qsotb3j/wBdvMWBUsOhJdfhKGLfQidRjiBUV0y/MkyCLiXQ38FG6LWW/VYUtqlIDZQ==",
  11748 + "requires": {
  11749 + "frac": "~1.1.2"
  11750 + }
  11751 + },
11644 "sshpk": { 11752 "sshpk": {
11645 "version": "1.16.1", 11753 "version": "1.16.1",
11646 "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 11754 "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
@@ -11778,7 +11886,6 @@ @@ -11778,7 +11886,6 @@
11778 "version": "1.1.1", 11886 "version": "1.1.1",
11779 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 11887 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
11780 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 11888 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
11781 - "dev": true,  
11782 "requires": { 11889 "requires": {
11783 "safe-buffer": "~5.1.0" 11890 "safe-buffer": "~5.1.0"
11784 } 11891 }
@@ -12385,8 +12492,7 @@ @@ -12385,8 +12492,7 @@
12385 "util-deprecate": { 12492 "util-deprecate": {
12386 "version": "1.0.2", 12493 "version": "1.0.2",
12387 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 12494 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
12388 - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",  
12389 - "dev": true 12495 + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
12390 }, 12496 },
12391 "utila": { 12497 "utila": {
12392 "version": "0.4.0", 12498 "version": "0.4.0",
@@ -13046,6 +13152,20 @@ @@ -13046,6 +13152,20 @@
13046 "async-limiter": "~1.0.0" 13152 "async-limiter": "~1.0.0"
13047 } 13153 }
13048 }, 13154 },
  13155 + "xlsx": {
  13156 + "version": "0.15.1",
  13157 + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.15.1.tgz",
  13158 + "integrity": "sha512-z+o4+QPMc32EPboLCzJAz94o0Zyy+8jrmWTsVpfzwknFln9qDO6/HN1KrGGVC4//sGA7dh4R3HA4fhbGIKCDOA==",
  13159 + "requires": {
  13160 + "adler-32": "~1.2.0",
  13161 + "cfb": "^1.1.3",
  13162 + "codepage": "~1.14.0",
  13163 + "commander": "~2.17.1",
  13164 + "crc-32": "~1.2.0",
  13165 + "exit-on-epipe": "~1.0.1",
  13166 + "ssf": "~0.10.2"
  13167 + }
  13168 + },
13049 "xtend": { 13169 "xtend": {
13050 "version": "4.0.2", 13170 "version": "4.0.2",
13051 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 13171 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
@@ -14,16 +14,20 @@ @@ -14,16 +14,20 @@
14 "echarts": "^3.3.2", 14 "echarts": "^3.3.2",
15 "element-ui": "^1.2.8", 15 "element-ui": "^1.2.8",
16 "eslint": "^5.14.1", 16 "eslint": "^5.14.1",
  17 + "file-saver": "^2.0.2",
17 "font-awesome": "^4.7.0", 18 "font-awesome": "^4.7.0",
18 "install": "^0.12.2", 19 "install": "^0.12.2",
19 "js-cookie": "^2.2.1", 20 "js-cookie": "^2.2.1",
  21 + "jszip": "^3.2.2",
20 "moment": "^2.24.0", 22 "moment": "^2.24.0",
21 "npm": "^6.8.0", 23 "npm": "^6.8.0",
22 "nprogress": "^0.2.0", 24 "nprogress": "^0.2.0",
  25 + "script-loader": "^0.7.2",
23 "vue": "^2.2.2", 26 "vue": "^2.2.2",
24 "vue-i18n": "^8.14.0", 27 "vue-i18n": "^8.14.0",
25 "vue-router": "^2.3.0", 28 "vue-router": "^2.3.0",
26 - "vuex": "^2.0.0-rc.6" 29 + "vuex": "^2.0.0-rc.6",
  30 + "xlsx": "^0.15.1"
27 }, 31 },
28 "devDependencies": { 32 "devDependencies": {
29 "autoprefixer": "^6.7.2", 33 "autoprefixer": "^6.7.2",
  1 +import request from '@/utils/request'
  2 +
  3 +export function fetchList(query) {
  4 + return request({
  5 + url: '/article/list',
  6 + method: 'get',
  7 + params: query
  8 + })
  9 +}
  10 +
  11 +export function fetchArticle(id) {
  12 + return request({
  13 + url: '/article/detail',
  14 + method: 'get',
  15 + params: { id }
  16 + })
  17 +}
  18 +
  19 +export function fetchPv(pv) {
  20 + return request({
  21 + url: '/article/pv',
  22 + method: 'get',
  23 + params: { pv }
  24 + })
  25 +}
  26 +
  27 +export function createArticle(data) {
  28 + return request({
  29 + url: '/article/create',
  30 + method: 'post',
  31 + data
  32 + })
  33 +}
  34 +
  35 +export function updateArticle(data) {
  36 + return request({
  37 + url: '/article/update',
  38 + method: 'post',
  39 + data
  40 + })
  41 +}
@@ -32,7 +32,7 @@ @@ -32,7 +32,7 @@
32 Auth: Lei.j1ang 32 Auth: Lei.j1ang
33 Created: 2018/1/19-13:59 33 Created: 2018/1/19-13:59
34 */ 34 */
35 -import treeToArray from './eval' 35 +import treeToArray from './eval.js'
36 export default { 36 export default {
37 name: 'TreeTable', 37 name: 'TreeTable',
38 props: { 38 props: {
@@ -68,8 +68,11 @@ export default { @@ -68,8 +68,11 @@ export default {
68 }, 68 },
69 methods: { 69 methods: {
70 showRow: function(row) { 70 showRow: function(row) {
71 - const show = (row.row.parent ? (row.row.parent._expanded && row.row.parent._show) : true)  
72 - row.row._show = show 71 + this.data
  72 + const show = (row.parent ? (row.parent._expanded && row.parent._show) : true)
  73 +// const show = (row.row.parent ? (row.row.parent._expanded && row.row.parent._show) : true)
  74 +// row.row._show = show
  75 + row._show = show
73 return show ? 'animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;' : 'display:none;' 76 return show ? 'animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;' : 'display:none;'
74 }, 77 },
75 // 切换下级是否展开 78 // 切换下级是否展开
  1 +const getters = {
  2 + sidebar: state => state.app.sidebar,
  3 + language: state => state.app.language,
  4 + size: state => state.app.size,
  5 + device: state => state.app.device,
  6 + visitedViews: state => state.tagsView.visitedViews,
  7 + cachedViews: state => state.tagsView.cachedViews,
  8 + token: state => state.user.token,
  9 + avatar: state => state.user.avatar,
  10 + name: state => state.user.name,
  11 + introduction: state => state.user.introduction,
  12 + status: state => state.user.status,
  13 + roles: state => state.user.roles,
  14 + setting: state => state.user.setting,
  15 + permission_routers: state => state.permission.routers,
  16 + addRouters: state => state.permission.addRouters,
  17 + errorLogs: state => state.errorLog.logs
  18 +}
  19 +export default getters
  1 +import Vue from 'vue'
  2 +import Vuex from 'vuex'
  3 +import app from './modules/app'
  4 +import errorLog from './modules/errorLog'
  5 +import permission from './modules/permission'
  6 +import tagsView from './modules/tagsView'
  7 +import user from './modules/user'
  8 +import getters from './getters'
  9 +
  10 +Vue.use(Vuex)
  11 +
  12 +const store = new Vuex.Store({
  13 + modules: {
  14 + app,
  15 + errorLog,
  16 + permission,
  17 + tagsView,
  18 + user
  19 + },
  20 + getters
  21 +})
  22 +
  23 +export default store
  1 +import Cookies from 'js-cookie'
  2 +
  3 +const app = {
  4 + state: {
  5 + sidebar: {
  6 + opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
  7 + withoutAnimation: false
  8 + },
  9 + device: 'desktop',
  10 + language: Cookies.get('language') || 'en',
  11 + size: Cookies.get('size') || 'medium'
  12 + },
  13 + mutations: {
  14 + TOGGLE_SIDEBAR: state => {
  15 + state.sidebar.opened = !state.sidebar.opened
  16 + state.sidebar.withoutAnimation = false
  17 + if (state.sidebar.opened) {
  18 + Cookies.set('sidebarStatus', 1)
  19 + } else {
  20 + Cookies.set('sidebarStatus', 0)
  21 + }
  22 + },
  23 + CLOSE_SIDEBAR: (state, withoutAnimation) => {
  24 + Cookies.set('sidebarStatus', 0)
  25 + state.sidebar.opened = false
  26 + state.sidebar.withoutAnimation = withoutAnimation
  27 + },
  28 + TOGGLE_DEVICE: (state, device) => {
  29 + state.device = device
  30 + },
  31 + SET_LANGUAGE: (state, language) => {
  32 + state.language = language
  33 + Cookies.set('language', language)
  34 + },
  35 + SET_SIZE: (state, size) => {
  36 + state.size = size
  37 + Cookies.set('size', size)
  38 + }
  39 + },
  40 + actions: {
  41 + toggleSideBar({ commit }) {
  42 + commit('TOGGLE_SIDEBAR')
  43 + },
  44 + closeSideBar({ commit }, { withoutAnimation }) {
  45 + commit('CLOSE_SIDEBAR', withoutAnimation)
  46 + },
  47 + toggleDevice({ commit }, device) {
  48 + commit('TOGGLE_DEVICE', device)
  49 + },
  50 + setLanguage({ commit }, language) {
  51 + commit('SET_LANGUAGE', language)
  52 + },
  53 + setSize({ commit }, size) {
  54 + commit('SET_SIZE', size)
  55 + }
  56 + }
  57 +}
  58 +
  59 +export default app
  1 +const errorLog = {
  2 + state: {
  3 + logs: []
  4 + },
  5 + mutations: {
  6 + ADD_ERROR_LOG: (state, log) => {
  7 + state.logs.push(log)
  8 + }
  9 + },
  10 + actions: {
  11 + addErrorLog({ commit }, log) {
  12 + commit('ADD_ERROR_LOG', log)
  13 + }
  14 + }
  15 +}
  16 +
  17 +export default errorLog
  1 +import { asyncRouterMap, constantRouterMap } from '@/router'
  2 +
  3 +/**
  4 + * 通过meta.role判断是否与当前用户权限匹配
  5 + * @param roles
  6 + * @param route
  7 + */
  8 +function hasPermission(roles, route) {
  9 + if (route.meta && route.meta.roles) {
  10 + return roles.some(role => route.meta.roles.includes(role))
  11 + } else {
  12 + return true
  13 + }
  14 +}
  15 +
  16 +/**
  17 + * 递归过滤异步路由表,返回符合用户角色权限的路由表
  18 + * @param routes asyncRouterMap
  19 + * @param roles
  20 + */
  21 +function filterAsyncRouter(routes, roles) {
  22 + const res = []
  23 +
  24 + routes.forEach(route => {
  25 + const tmp = { ...route }
  26 + if (hasPermission(roles, tmp)) {
  27 + if (tmp.children) {
  28 + tmp.children = filterAsyncRouter(tmp.children, roles)
  29 + }
  30 + res.push(tmp)
  31 + }
  32 + })
  33 +
  34 + return res
  35 +}
  36 +
  37 +const permission = {
  38 + state: {
  39 + routers: [],
  40 + addRouters: []
  41 + },
  42 + mutations: {
  43 + SET_ROUTERS: (state, routers) => {
  44 + state.addRouters = routers
  45 + state.routers = constantRouterMap.concat(routers)
  46 + }
  47 + },
  48 + actions: {
  49 + GenerateRoutes({ commit }, data) {
  50 + return new Promise(resolve => {
  51 + const { roles } = data
  52 + let accessedRouters
  53 + if (roles.includes('admin')) {
  54 + accessedRouters = asyncRouterMap
  55 + } else {
  56 + accessedRouters = filterAsyncRouter(asyncRouterMap, roles)
  57 + }
  58 + commit('SET_ROUTERS', accessedRouters)
  59 + resolve()
  60 + })
  61 + }
  62 + }
  63 +}
  64 +
  65 +export default permission
  1 +const tagsView = {
  2 + state: {
  3 + visitedViews: [],
  4 + cachedViews: []
  5 + },
  6 + mutations: {
  7 + ADD_VISITED_VIEW: (state, view) => {
  8 + if (state.visitedViews.some(v => v.path === view.path)) return
  9 + state.visitedViews.push(
  10 + Object.assign({}, view, {
  11 + title: view.meta.title || 'no-name'
  12 + })
  13 + )
  14 + },
  15 + ADD_CACHED_VIEW: (state, view) => {
  16 + if (state.cachedViews.includes(view.name)) return
  17 + if (!view.meta.noCache) {
  18 + state.cachedViews.push(view.name)
  19 + }
  20 + },
  21 +
  22 + DEL_VISITED_VIEW: (state, view) => {
  23 + for (const [i, v] of state.visitedViews.entries()) {
  24 + if (v.path === view.path) {
  25 + state.visitedViews.splice(i, 1)
  26 + break
  27 + }
  28 + }
  29 + },
  30 + DEL_CACHED_VIEW: (state, view) => {
  31 + for (const i of state.cachedViews) {
  32 + if (i === view.name) {
  33 + const index = state.cachedViews.indexOf(i)
  34 + state.cachedViews.splice(index, 1)
  35 + break
  36 + }
  37 + }
  38 + },
  39 +
  40 + DEL_OTHERS_VISITED_VIEWS: (state, view) => {
  41 + state.visitedViews = state.visitedViews.filter(v => {
  42 + return v.meta.affix || v.path === view.path
  43 + })
  44 + },
  45 + DEL_OTHERS_CACHED_VIEWS: (state, view) => {
  46 + for (const i of state.cachedViews) {
  47 + if (i === view.name) {
  48 + const index = state.cachedViews.indexOf(i)
  49 + state.cachedViews = state.cachedViews.slice(index, index + 1)
  50 + break
  51 + }
  52 + }
  53 + },
  54 +
  55 + DEL_ALL_VISITED_VIEWS: state => {
  56 + // keep affix tags
  57 + const affixTags = state.visitedViews.filter(tag => tag.meta.affix)
  58 + state.visitedViews = affixTags
  59 + },
  60 + DEL_ALL_CACHED_VIEWS: state => {
  61 + state.cachedViews = []
  62 + },
  63 +
  64 + UPDATE_VISITED_VIEW: (state, view) => {
  65 + for (let v of state.visitedViews) {
  66 + if (v.path === view.path) {
  67 + v = Object.assign(v, view)
  68 + break
  69 + }
  70 + }
  71 + }
  72 +
  73 + },
  74 + actions: {
  75 + addView({ dispatch }, view) {
  76 + dispatch('addVisitedView', view)
  77 + dispatch('addCachedView', view)
  78 + },
  79 + addVisitedView({ commit }, view) {
  80 + commit('ADD_VISITED_VIEW', view)
  81 + },
  82 + addCachedView({ commit }, view) {
  83 + commit('ADD_CACHED_VIEW', view)
  84 + },
  85 +
  86 + delView({ dispatch, state }, view) {
  87 + return new Promise(resolve => {
  88 + dispatch('delVisitedView', view)
  89 + dispatch('delCachedView', view)
  90 + resolve({
  91 + visitedViews: [...state.visitedViews],
  92 + cachedViews: [...state.cachedViews]
  93 + })
  94 + })
  95 + },
  96 + delVisitedView({ commit, state }, view) {
  97 + return new Promise(resolve => {
  98 + commit('DEL_VISITED_VIEW', view)
  99 + resolve([...state.visitedViews])
  100 + })
  101 + },
  102 + delCachedView({ commit, state }, view) {
  103 + return new Promise(resolve => {
  104 + commit('DEL_CACHED_VIEW', view)
  105 + resolve([...state.cachedViews])
  106 + })
  107 + },
  108 +
  109 + delOthersViews({ dispatch, state }, view) {
  110 + return new Promise(resolve => {
  111 + dispatch('delOthersVisitedViews', view)
  112 + dispatch('delOthersCachedViews', view)
  113 + resolve({
  114 + visitedViews: [...state.visitedViews],
  115 + cachedViews: [...state.cachedViews]
  116 + })
  117 + })
  118 + },
  119 + delOthersVisitedViews({ commit, state }, view) {
  120 + return new Promise(resolve => {
  121 + commit('DEL_OTHERS_VISITED_VIEWS', view)
  122 + resolve([...state.visitedViews])
  123 + })
  124 + },
  125 + delOthersCachedViews({ commit, state }, view) {
  126 + return new Promise(resolve => {
  127 + commit('DEL_OTHERS_CACHED_VIEWS', view)
  128 + resolve([...state.cachedViews])
  129 + })
  130 + },
  131 +
  132 + delAllViews({ dispatch, state }, view) {
  133 + return new Promise(resolve => {
  134 + dispatch('delAllVisitedViews', view)
  135 + dispatch('delAllCachedViews', view)
  136 + resolve({
  137 + visitedViews: [...state.visitedViews],
  138 + cachedViews: [...state.cachedViews]
  139 + })
  140 + })
  141 + },
  142 + delAllVisitedViews({ commit, state }) {
  143 + return new Promise(resolve => {
  144 + commit('DEL_ALL_VISITED_VIEWS')
  145 + resolve([...state.visitedViews])
  146 + })
  147 + },
  148 + delAllCachedViews({ commit, state }) {
  149 + return new Promise(resolve => {
  150 + commit('DEL_ALL_CACHED_VIEWS')
  151 + resolve([...state.cachedViews])
  152 + })
  153 + },
  154 +
  155 + updateVisitedView({ commit }, view) {
  156 + commit('UPDATE_VISITED_VIEW', view)
  157 + }
  158 + }
  159 +}
  160 +
  161 +export default tagsView
  1 +import { loginByUsername, logout, getUserInfo } from '@/api/login'
  2 +import { getToken, setToken, removeToken } from '@/utils/auth'
  3 +
  4 +const user = {
  5 + state: {
  6 + user: '',
  7 + status: '',
  8 + code: '',
  9 + token: getToken(),
  10 + name: '',
  11 + avatar: '',
  12 + introduction: '',
  13 + roles: [],
  14 + setting: {
  15 + articlePlatform: []
  16 + }
  17 + },
  18 +
  19 + mutations: {
  20 + SET_CODE: (state, code) => {
  21 + state.code = code
  22 + },
  23 + SET_TOKEN: (state, token) => {
  24 + state.token = token
  25 + },
  26 + SET_INTRODUCTION: (state, introduction) => {
  27 + state.introduction = introduction
  28 + },
  29 + SET_SETTING: (state, setting) => {
  30 + state.setting = setting
  31 + },
  32 + SET_STATUS: (state, status) => {
  33 + state.status = status
  34 + },
  35 + SET_NAME: (state, name) => {
  36 + state.name = name
  37 + },
  38 + SET_AVATAR: (state, avatar) => {
  39 + state.avatar = avatar
  40 + },
  41 + SET_ROLES: (state, roles) => {
  42 + state.roles = roles
  43 + }
  44 + },
  45 +
  46 + actions: {
  47 + // 用户名登录
  48 + LoginByUsername({ commit }, userInfo) {
  49 + const username = userInfo.username.trim()
  50 + return new Promise((resolve, reject) => {
  51 + loginByUsername(username, userInfo.password).then(response => {
  52 + const data = response.data
  53 + commit('SET_TOKEN', data.token)
  54 + setToken(response.data.token)
  55 + resolve()
  56 + }).catch(error => {
  57 + reject(error)
  58 + })
  59 + })
  60 + },
  61 +
  62 + // 获取用户信息
  63 + GetUserInfo({ commit, state }) {
  64 + return new Promise((resolve, reject) => {
  65 + getUserInfo(state.token).then(response => {
  66 + // 由于mockjs 不支持自定义状态码只能这样hack
  67 + if (!response.data) {
  68 + reject('Verification failed, please login again.')
  69 + }
  70 + const data = response.data
  71 +
  72 + if (data.roles && data.roles.length > 0) { // 验证返回的roles是否是一个非空数组
  73 + commit('SET_ROLES', data.roles)
  74 + } else {
  75 + reject('getInfo: roles must be a non-null array!')
  76 + }
  77 +
  78 + commit('SET_NAME', data.name)
  79 + commit('SET_AVATAR', data.avatar)
  80 + commit('SET_INTRODUCTION', data.introduction)
  81 + resolve(response)
  82 + }).catch(error => {
  83 + reject(error)
  84 + })
  85 + })
  86 + },
  87 +
  88 + // 第三方验证登录
  89 + // LoginByThirdparty({ commit, state }, code) {
  90 + // return new Promise((resolve, reject) => {
  91 + // commit('SET_CODE', code)
  92 + // loginByThirdparty(state.status, state.email, state.code).then(response => {
  93 + // commit('SET_TOKEN', response.data.token)
  94 + // setToken(response.data.token)
  95 + // resolve()
  96 + // }).catch(error => {
  97 + // reject(error)
  98 + // })
  99 + // })
  100 + // },
  101 +
  102 + // 登出
  103 + LogOut({ commit, state }) {
  104 + return new Promise((resolve, reject) => {
  105 + logout(state.token).then(() => {
  106 + commit('SET_TOKEN', '')
  107 + commit('SET_ROLES', [])
  108 + removeToken()
  109 + resolve()
  110 + }).catch(error => {
  111 + reject(error)
  112 + })
  113 + })
  114 + },
  115 +
  116 + // 前端 登出
  117 + FedLogOut({ commit }) {
  118 + return new Promise(resolve => {
  119 + commit('SET_TOKEN', '')
  120 + removeToken()
  121 + resolve()
  122 + })
  123 + },
  124 +
  125 + // 动态修改权限
  126 + ChangeRoles({ commit, dispatch }, role) {
  127 + return new Promise(resolve => {
  128 + commit('SET_TOKEN', role)
  129 + setToken(role)
  130 + getUserInfo(role).then(response => {
  131 + const data = response.data
  132 + commit('SET_ROLES', data.roles)
  133 + commit('SET_NAME', data.name)
  134 + commit('SET_AVATAR', data.avatar)
  135 + commit('SET_INTRODUCTION', data.introduction)
  136 + dispatch('GenerateRoutes', data) // 动态修改权限后 重绘侧边菜单
  137 + resolve()
  138 + })
  139 + })
  140 + }
  141 + }
  142 +}
  143 +
  144 +export default user
1 import axios from 'axios' 1 import axios from 'axios'
2 import { Message } from 'element-ui' 2 import { Message } from 'element-ui'
3 -import store from '@/store'  
4 -import { getToken } from '@/utils/auth'  
5 3
6 // create an axios instance 4 // create an axios instance
7 const service = axios.create({ 5 const service = axios.create({
@@ -15,7 +13,7 @@ service.interceptors.request.use( @@ -15,7 +13,7 @@ service.interceptors.request.use(
15 // Do something before request is sent 13 // Do something before request is sent
16 if (store.getters.token) { 14 if (store.getters.token) {
17 // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改 15 // 让每个请求携带token-- ['X-Token']为自定义key 请根据实际情况自行修改
18 - config.headers['X-Token'] = getToken() 16 + // config.headers['X-Token'] = getToken()
19 } 17 }
20 return config 18 return config
21 }, 19 },
  1 +/* eslint-disable */
  2 +require('script-loader!file-saver');
  3 +import XLSX from 'xlsx'
  4 +
  5 +function generateArray(table) {
  6 + var out = [];
  7 + var rows = table.querySelectorAll('tr');
  8 + var ranges = [];
  9 + for (var R = 0; R < rows.length; ++R) {
  10 + var outRow = [];
  11 + var row = rows[R];
  12 + var columns = row.querySelectorAll('td');
  13 + for (var C = 0; C < columns.length; ++C) {
  14 + var cell = columns[C];
  15 + var colspan = cell.getAttribute('colspan');
  16 + var rowspan = cell.getAttribute('rowspan');
  17 + var cellValue = cell.innerText;
  18 + if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;
  19 +
  20 + //Skip ranges
  21 + ranges.forEach(function (range) {
  22 + if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
  23 + for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
  24 + }
  25 + });
  26 +
  27 + //Handle Row Span
  28 + if (rowspan || colspan) {
  29 + rowspan = rowspan || 1;
  30 + colspan = colspan || 1;
  31 + ranges.push({
  32 + s: {
  33 + r: R,
  34 + c: outRow.length
  35 + },
  36 + e: {
  37 + r: R + rowspan - 1,
  38 + c: outRow.length + colspan - 1
  39 + }
  40 + });
  41 + };
  42 +
  43 + //Handle Value
  44 + outRow.push(cellValue !== "" ? cellValue : null);
  45 +
  46 + //Handle Colspan
  47 + if (colspan)
  48 + for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
  49 + }
  50 + out.push(outRow);
  51 + }
  52 + return [out, ranges];
  53 +};
  54 +
  55 +function datenum(v, date1904) {
  56 + if (date1904) v += 1462;
  57 + var epoch = Date.parse(v);
  58 + return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
  59 +}
  60 +
  61 +function sheet_from_array_of_arrays(data, opts) {
  62 + var ws = {};
  63 + var range = {
  64 + s: {
  65 + c: 10000000,
  66 + r: 10000000
  67 + },
  68 + e: {
  69 + c: 0,
  70 + r: 0
  71 + }
  72 + };
  73 + for (var R = 0; R != data.length; ++R) {
  74 + for (var C = 0; C != data[R].length; ++C) {
  75 + if (range.s.r > R) range.s.r = R;
  76 + if (range.s.c > C) range.s.c = C;
  77 + if (range.e.r < R) range.e.r = R;
  78 + if (range.e.c < C) range.e.c = C;
  79 + var cell = {
  80 + v: data[R][C]
  81 + };
  82 + if (cell.v == null) continue;
  83 + var cell_ref = XLSX.utils.encode_cell({
  84 + c: C,
  85 + r: R
  86 + });
  87 +
  88 + if (typeof cell.v === 'number') cell.t = 'n';
  89 + else if (typeof cell.v === 'boolean') cell.t = 'b';
  90 + else if (cell.v instanceof Date) {
  91 + cell.t = 'n';
  92 + cell.z = XLSX.SSF._table[14];
  93 + cell.v = datenum(cell.v);
  94 + } else cell.t = 's';
  95 +
  96 + ws[cell_ref] = cell;
  97 + }
  98 + }
  99 + if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
  100 + return ws;
  101 +}
  102 +
  103 +function Workbook() {
  104 + if (!(this instanceof Workbook)) return new Workbook();
  105 + this.SheetNames = [];
  106 + this.Sheets = {};
  107 +}
  108 +
  109 +function s2ab(s) {
  110 + var buf = new ArrayBuffer(s.length);
  111 + var view = new Uint8Array(buf);
  112 + for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
  113 + return buf;
  114 +}
  115 +
  116 +export function export_table_to_excel(id) {
  117 + var theTable = document.getElementById(id);
  118 + var oo = generateArray(theTable);
  119 + var ranges = oo[1];
  120 +
  121 + /* original data */
  122 + var data = oo[0];
  123 + var ws_name = "SheetJS";
  124 +
  125 + var wb = new Workbook(),
  126 + ws = sheet_from_array_of_arrays(data);
  127 +
  128 + /* add ranges to worksheet */
  129 + // ws['!cols'] = ['apple', 'banan'];
  130 + ws['!merges'] = ranges;
  131 +
  132 + /* add worksheet to workbook */
  133 + wb.SheetNames.push(ws_name);
  134 + wb.Sheets[ws_name] = ws;
  135 +
  136 + var wbout = XLSX.write(wb, {
  137 + bookType: 'xlsx',
  138 + bookSST: false,
  139 + type: 'binary'
  140 + });
  141 +
  142 + saveAs(new Blob([s2ab(wbout)], {
  143 + type: "application/octet-stream"
  144 + }), "test.xlsx")
  145 +}
  146 +
  147 +export function export_json_to_excel({
  148 + header,
  149 + data,
  150 + filename,
  151 + autoWidth = true,
  152 + bookType= 'xlsx'
  153 +} = {}) {
  154 + /* original data */
  155 + filename = filename || 'excel-list'
  156 + data = [...data]
  157 + data.unshift(header);
  158 + var ws_name = "SheetJS";
  159 + var wb = new Workbook(),
  160 + ws = sheet_from_array_of_arrays(data);
  161 +
  162 + if (autoWidth) {
  163 + /*设置worksheet每列的最大宽度*/
  164 + const colWidth = data.map(row => row.map(val => {
  165 + /*先判断是否为null/undefined*/
  166 + if (val == null) {
  167 + return {
  168 + 'wch': 10
  169 + };
  170 + }
  171 + /*再判断是否为中文*/
  172 + else if (val.toString().charCodeAt(0) > 255) {
  173 + return {
  174 + 'wch': val.toString().length * 2
  175 + };
  176 + } else {
  177 + return {
  178 + 'wch': val.toString().length
  179 + };
  180 + }
  181 + }))
  182 + /*以第一行为初始值*/
  183 + let result = colWidth[0];
  184 + for (let i = 1; i < colWidth.length; i++) {
  185 + for (let j = 0; j < colWidth[i].length; j++) {
  186 + if (result[j]['wch'] < colWidth[i][j]['wch']) {
  187 + result[j]['wch'] = colWidth[i][j]['wch'];
  188 + }
  189 + }
  190 + }
  191 + ws['!cols'] = result;
  192 + }
  193 +
  194 + /* add worksheet to workbook */
  195 + wb.SheetNames.push(ws_name);
  196 + wb.Sheets[ws_name] = ws;
  197 +
  198 + var wbout = XLSX.write(wb, {
  199 + bookType: bookType,
  200 + bookSST: false,
  201 + type: 'binary'
  202 + });
  203 + saveAs(new Blob([s2ab(wbout)], {
  204 + type: "application/octet-stream"
  205 + }), `${filename}.${bookType}`);
  206 +}
  1 +/* eslint-disable */
  2 +require('script-loader!file-saver');
  3 +import JSZip from 'jszip'
  4 +
  5 +export function export_txt_to_zip(th, jsonData, txtName, zipName) {
  6 + const zip = new JSZip()
  7 + const txt_name = txtName || 'file'
  8 + const zip_name = zipName || 'file'
  9 + const data = jsonData
  10 + let txtData = `${th}\r\n`
  11 + data.forEach((row) => {
  12 + let tempStr = ''
  13 + tempStr = row.toString()
  14 + txtData += `${tempStr}\r\n`
  15 + })
  16 + zip.file(`${txt_name}.txt`, txtData)
  17 + zip.generateAsync({
  18 + type: "blob"
  19 + }).then((blob) => {
  20 + saveAs(blob, `${zip_name}.zip`)
  21 + }, (err) => {
  22 + alert('导出失败')
  23 + })
  24 +}
@@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
9 <el-button v-waves :loading="downloadLoading" class="filter-item" type="primary" icon="el-icon-download" @click="handleDownload">{{ $t('table.export') }}</el-button> 9 <el-button v-waves :loading="downloadLoading" class="filter-item" type="primary" icon="el-icon-download" @click="handleDownload">{{ $t('table.export') }}</el-button>
10 <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-message" @click="handleCreate">批量发送</el-button> 10 <el-button class="filter-item" style="margin-left: 10px;" type="primary" icon="el-icon-message" @click="handleCreate">批量发送</el-button>
11 </div> 11 </div>
12 - <tree-table :data="data" :eval-func="func" :eval-args="args" :expand-all="expandAll" stripe="true" style="font-size: 13px" border @selection-change="handleSelectionChange"> 12 + <tree-table :data="data" :eval-func="func" :eval-args="args" :expand-all="expandAll" stripe style="font-size: 13px" border @selection-change="handleSelectionChange">
13 <el-table-column prop="waybillNo" label="主单号" width="110px" align="center" sortable> 13 <el-table-column prop="waybillNo" label="主单号" width="110px" align="center" sortable>
14 <template slot-scope="scope"> 14 <template slot-scope="scope">
15 <span>{{ scope.row.waybillNo }}</span> 15 <span>{{ scope.row.waybillNo }}</span>
@@ -80,7 +80,7 @@ @@ -80,7 +80,7 @@
80 <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" /> 80 <pagination v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit" @pagination="getList" />
81 81
82 <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" fullscreen="true"> 82 <el-dialog :title="textMap[dialogStatus]" :visible.sync="dialogFormVisible" fullscreen="true">
83 - <el-form ref="" :inline="true" :label-position="left" :rules="rules" :model="temp" label-width="100px" style="font-size: 13px"> 83 + <el-form ref="" :inline="true" label-position="left" :rules="rules" :model="temp" label-width="100px" style="font-size: 13px">
84 <div> 84 <div>
85 <el-tag type="info" effect="plain"> 85 <el-tag type="info" effect="plain">
86 航班信息 86 航班信息
@@ -350,7 +350,7 @@ @@ -350,7 +350,7 @@
350 Auth: Lei.j1ang 350 Auth: Lei.j1ang
351 Created: 2018/1/19-14:54 351 Created: 2018/1/19-14:54
352 */ 352 */
353 - 353 +import { fetchList } from '@/api/article'
354 import treeTable from '@/components/TreeTable' 354 import treeTable from '@/components/TreeTable'
355 import treeToArray from './customEval' 355 import treeToArray from './customEval'
356 import Pagination from '@/components/Pagination' 356 import Pagination from '@/components/Pagination'
@@ -359,7 +359,8 @@ import country from '@/utils/country.js' @@ -359,7 +359,8 @@ import country from '@/utils/country.js'
359 import companyType from '@/utils/companyType.js' 359 import companyType from '@/utils/companyType.js'
360 import dangerGoods from '@/utils/dangerGoods.js' 360 import dangerGoods from '@/utils/dangerGoods.js'
361 import goodsPackage from '@/utils/goodsPackage.js' 361 import goodsPackage from '@/utils/goodsPackage.js'
362 - 362 +import excel from '@/vendor/Export2Excel'
  363 +import { parseTime } from '@/utils'
363 const calendarTypeOptions = [ 364 const calendarTypeOptions = [
364 { key: 'CN', display_name: 'China' }, 365 { key: 'CN', display_name: 'China' },
365 { key: 'US', display_name: 'USA' }, 366 { key: 'US', display_name: 'USA' },
@@ -404,7 +405,9 @@ export default { @@ -404,7 +405,9 @@ export default {
404 expandAll: true, 405 expandAll: true,
405 total: 1, 406 total: 1,
406 resend: true, 407 resend: true,
407 - listLoading: true, 408 + listLoading: false,
  409 + downloadLoading: false,
  410 + loading: false,
408 multipleSelection: [], 411 multipleSelection: [],
409 dialogFormVisible: false, 412 dialogFormVisible: false,
410 dialogStatus: '', 413 dialogStatus: '',
@@ -517,7 +520,7 @@ export default { @@ -517,7 +520,7 @@ export default {
517 ] 520 ]
518 }, 521 },
519 { 522 {
520 - id: 4, 523 + id: 5,
521 waybillNo: '580-20728391', 524 waybillNo: '580-20728391',
522 houseWaybillNo: '', 525 houseWaybillNo: '',
523 custom: '4604', 526 custom: '4604',
@@ -605,6 +608,10 @@ export default { @@ -605,6 +608,10 @@ export default {
605 this.$refs[''].clearValidate() 608 this.$refs[''].clearValidate()
606 }) 609 })
607 }, 610 },
  611 + handleFilter() {
  612 + this.listQuery.page = 1
  613 + this.getList()
  614 + },
608 handleModifyStatus(row, status) { 615 handleModifyStatus(row, status) {
609 this.$message({ 616 this.$message({
610 message: '操作成功', 617 message: '操作成功',
@@ -613,7 +620,16 @@ export default { @@ -613,7 +620,16 @@ export default {
613 row.status = status 620 row.status = status
614 }, 621 },
615 getList() { 622 getList() {
  623 + this.listLoading = true
  624 + fetchList(this.listQuery).then(response => {
  625 + this.list = response.data.items
  626 + this.total = response.data.total
616 627
  628 + // Just to simulate the time of the request
  629 + setTimeout(() => {
  630 + this.listLoading = false
  631 + }, 1.5 * 1000)
  632 + })
617 }, 633 },
618 handleSelectionChange(val) { 634 handleSelectionChange(val) {
619 this.multipleSelection = val 635 this.multipleSelection = val
@@ -640,6 +656,18 @@ export default { @@ -640,6 +656,18 @@ export default {
640 this.$refs[''].clearValidate() 656 this.$refs[''].clearValidate()
641 }) 657 })
642 }, 658 },
  659 + handleDownload() {
  660 + this.downloadLoading = true
  661 + const tHeader = ['timestamp', 'title', 'type', 'importance', 'status']
  662 + const filterVal = ['timestamp', 'title', 'type', 'importance', 'status']
  663 + const data = this.formatJson(filterVal, this.list)
  664 + excel.export_json_to_excel({
  665 + header: tHeader,
  666 + data,
  667 + filename: 'table-list'
  668 + })
  669 + this.downloadLoading = false
  670 + },
643 remoteMethod(query) { 671 remoteMethod(query) {
644 if (query !== '') { 672 if (query !== '') {
645 this.loading = true 673 this.loading = true