From dad44b84ab21f9d1f860760a045015f1cab0aaec Mon Sep 17 00:00:00 2001
From: zrlibs <jesting_rr@163.com>
Date: 星期三, 19 三月 2025 10:57:14 +0800
Subject: [PATCH] fixed

---
 src/views/examples/report.vue                  |  304 ++++++--
 src/views/examples/excel.js                    |   27 
 src/views/account/login.vue                    |  150 +++-
 src/components/examples/data-table.vue         |    7 
 src/views/examples/data-table/dialogs/info.vue |  132 ++-
 package.json                                   |    1 
 src/views/examples/master-slave.vue            |  257 +++++-
 src/views/examples/data-table/index.vue        |  272 +++++-
 src/assets/login_bg.png                        |    0 
 src/less/examples.less                         |    4 
 src/libs/excel.js                              |   86 ++
 package-lock.json                              |  910 +++++++++++++++++++++++++
 12 files changed, 1,848 insertions(+), 302 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 3f4ddbd..d34f8d2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,6 +8,7 @@
       "name": "vue-project",
       "version": "0.0.0",
       "dependencies": {
+        "exceljs": "^4.4.0",
         "js-base64": "^3.7.7",
         "view-ui-plus": "^1.3.19",
         "vue": "^3.5.13",
@@ -859,6 +860,43 @@
         "node": ">=18"
       }
     },
+    "node_modules/@fast-csv/format": {
+      "version": "4.3.5",
+      "resolved": "https://registry.npmmirror.com/@fast-csv/format/-/format-4.3.5.tgz",
+      "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==",
+      "dependencies": {
+        "@types/node": "^14.0.1",
+        "lodash.escaperegexp": "^4.1.2",
+        "lodash.isboolean": "^3.0.3",
+        "lodash.isequal": "^4.5.0",
+        "lodash.isfunction": "^3.0.9",
+        "lodash.isnil": "^4.0.0"
+      }
+    },
+    "node_modules/@fast-csv/format/node_modules/@types/node": {
+      "version": "14.18.63",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-14.18.63.tgz",
+      "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ=="
+    },
+    "node_modules/@fast-csv/parse": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmmirror.com/@fast-csv/parse/-/parse-4.3.6.tgz",
+      "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==",
+      "dependencies": {
+        "@types/node": "^14.0.1",
+        "lodash.escaperegexp": "^4.1.2",
+        "lodash.groupby": "^4.6.0",
+        "lodash.isfunction": "^3.0.9",
+        "lodash.isnil": "^4.0.0",
+        "lodash.isundefined": "^3.0.1",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
+    "node_modules/@fast-csv/parse/node_modules/@types/node": {
+      "version": "14.18.63",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-14.18.63.tgz",
+      "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ=="
+    },
     "node_modules/@intlify/core-base": {
       "version": "11.1.1",
       "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-11.1.1.tgz",
@@ -1246,6 +1284,17 @@
       "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
       "dev": true
     },
+    "node_modules/@types/node": {
+      "version": "22.13.10",
+      "resolved": "https://registry.npmmirror.com/@types/node/-/node-22.13.10.tgz",
+      "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==",
+      "dev": true,
+      "optional": true,
+      "peer": true,
+      "dependencies": {
+        "undici-types": "~6.20.0"
+      }
+    },
     "node_modules/@vitejs/plugin-vue": {
       "version": "5.2.1",
       "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz",
@@ -1462,15 +1511,128 @@
       "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.13.tgz",
       "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ=="
     },
+    "node_modules/archiver": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmmirror.com/archiver/-/archiver-5.3.2.tgz",
+      "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==",
+      "dependencies": {
+        "archiver-utils": "^2.1.0",
+        "async": "^3.2.4",
+        "buffer-crc32": "^0.2.1",
+        "readable-stream": "^3.6.0",
+        "readdir-glob": "^1.1.2",
+        "tar-stream": "^2.2.0",
+        "zip-stream": "^4.1.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/archiver-utils": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-2.1.0.tgz",
+      "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
+      "dependencies": {
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.2.0",
+        "lazystream": "^1.0.0",
+        "lodash.defaults": "^4.2.0",
+        "lodash.difference": "^4.5.0",
+        "lodash.flatten": "^4.4.0",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.union": "^4.6.0",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/archiver-utils/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/archiver-utils/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/archiver-utils/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/async": {
+      "version": "3.2.6",
+      "resolved": "https://registry.npmmirror.com/async/-/async-3.2.6.tgz",
+      "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="
+    },
     "node_modules/async-validator": {
       "version": "3.5.2",
       "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-3.5.2.tgz",
       "integrity": "sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ=="
     },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
     "node_modules/batch-processor": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/batch-processor/-/batch-processor-1.0.0.tgz",
       "integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA=="
+    },
+    "node_modules/big-integer": {
+      "version": "1.6.52",
+      "resolved": "https://registry.npmmirror.com/big-integer/-/big-integer-1.6.52.tgz",
+      "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/binary": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/binary/-/binary-0.3.0.tgz",
+      "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==",
+      "dependencies": {
+        "buffers": "~0.1.1",
+        "chainsaw": "~0.1.0"
+      },
+      "engines": {
+        "node": "*"
+      }
     },
     "node_modules/birpc": {
       "version": "0.2.19",
@@ -1479,6 +1641,30 @@
       "dev": true,
       "funding": {
         "url": "https://github.com/sponsors/antfu"
+      }
+    },
+    "node_modules/bl": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz",
+      "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+      "dependencies": {
+        "buffer": "^5.5.0",
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.4.0"
+      }
+    },
+    "node_modules/bluebird": {
+      "version": "3.4.7",
+      "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.4.7.tgz",
+      "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA=="
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
       }
     },
     "node_modules/browserslist": {
@@ -1511,6 +1697,53 @@
       },
       "engines": {
         "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz",
+      "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "dependencies": {
+        "base64-js": "^1.3.1",
+        "ieee754": "^1.1.13"
+      }
+    },
+    "node_modules/buffer-crc32": {
+      "version": "0.2.13",
+      "resolved": "https://registry.npmmirror.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+      "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/buffer-indexof-polyfill": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz",
+      "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/buffers": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmmirror.com/buffers/-/buffers-0.1.1.tgz",
+      "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==",
+      "engines": {
+        "node": ">=0.2.0"
       }
     },
     "node_modules/bundle-name": {
@@ -1548,6 +1781,36 @@
         }
       ]
     },
+    "node_modules/chainsaw": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmmirror.com/chainsaw/-/chainsaw-0.1.0.tgz",
+      "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==",
+      "dependencies": {
+        "traverse": ">=0.3.0 <0.4"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/compress-commons": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/compress-commons/-/compress-commons-4.1.2.tgz",
+      "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==",
+      "dependencies": {
+        "buffer-crc32": "^0.2.13",
+        "crc32-stream": "^4.0.2",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+    },
     "node_modules/convert-source-map": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -1569,10 +1832,38 @@
         "url": "https://github.com/sponsors/mesqueeb"
       }
     },
+    "node_modules/core-util-is": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+    },
     "node_modules/countup.js": {
       "version": "1.9.3",
       "resolved": "https://registry.npmmirror.com/countup.js/-/countup.js-1.9.3.tgz",
       "integrity": "sha512-UHf2P/mFKaESqdPq+UdBJm/1y8lYdlcDd0nTZHNC8cxWoJwZr1Eldm1PpWui446vDl5Pd8PtRYkr3q6K4+Qa5A=="
+    },
+    "node_modules/crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
+      "bin": {
+        "crc32": "bin/crc32.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/crc32-stream": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmmirror.com/crc32-stream/-/crc32-stream-4.0.3.tgz",
+      "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==",
+      "dependencies": {
+        "crc-32": "^1.2.0",
+        "readable-stream": "^3.4.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
     },
     "node_modules/cross-spawn": {
       "version": "7.0.6",
@@ -1663,6 +1954,41 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/duplexer2": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmmirror.com/duplexer2/-/duplexer2-0.1.4.tgz",
+      "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
+      "dependencies": {
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "node_modules/duplexer2/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/duplexer2/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/duplexer2/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/electron-to-chromium": {
       "version": "1.5.109",
       "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.109.tgz",
@@ -1675,6 +2001,14 @@
       "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==",
       "dependencies": {
         "batch-processor": "1.0.0"
+      }
+    },
+    "node_modules/end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "dependencies": {
+        "once": "^1.4.0"
       }
     },
     "node_modules/entities": {
@@ -1764,6 +2098,25 @@
       "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
       "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
+    "node_modules/exceljs": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/exceljs/-/exceljs-4.4.0.tgz",
+      "integrity": "sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==",
+      "dependencies": {
+        "archiver": "^5.0.0",
+        "dayjs": "^1.8.34",
+        "fast-csv": "^4.3.1",
+        "jszip": "^3.10.1",
+        "readable-stream": "^3.6.0",
+        "saxes": "^5.0.1",
+        "tmp": "^0.2.0",
+        "unzipper": "^0.10.11",
+        "uuid": "^8.3.0"
+      },
+      "engines": {
+        "node": ">=8.3.0"
+      }
+    },
     "node_modules/execa": {
       "version": "9.5.2",
       "resolved": "https://registry.npmmirror.com/execa/-/execa-9.5.2.tgz",
@@ -1790,6 +2143,18 @@
         "url": "https://github.com/sindresorhus/execa?sponsor=1"
       }
     },
+    "node_modules/fast-csv": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmmirror.com/fast-csv/-/fast-csv-4.3.6.tgz",
+      "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==",
+      "dependencies": {
+        "@fast-csv/format": "4.3.5",
+        "@fast-csv/parse": "4.3.6"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
     "node_modules/figures": {
       "version": "6.1.0",
       "resolved": "https://registry.npmmirror.com/figures/-/figures-6.1.0.tgz",
@@ -1805,6 +2170,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+    },
     "node_modules/fs-extra": {
       "version": "11.3.0",
       "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.0.tgz",
@@ -1819,6 +2189,11 @@
         "node": ">=14.14"
       }
     },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+    },
     "node_modules/fsevents": {
       "version": "2.3.3",
       "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
@@ -1831,6 +2206,21 @@
       ],
       "engines": {
         "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/fstream": {
+      "version": "1.0.12",
+      "resolved": "https://registry.npmmirror.com/fstream/-/fstream-1.0.12.tgz",
+      "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==",
+      "deprecated": "This package is no longer supported.",
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "inherits": "~2.0.0",
+        "mkdirp": ">=0.5 0",
+        "rimraf": "2"
+      },
+      "engines": {
+        "node": ">=0.6"
       }
     },
     "node_modules/gensync": {
@@ -1858,6 +2248,26 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "deprecated": "Glob versions prior to v9 are no longer supported",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
     "node_modules/globals": {
       "version": "11.12.0",
       "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz",
@@ -1870,8 +2280,7 @@
     "node_modules/graceful-fs": {
       "version": "4.2.11",
       "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
-      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
-      "dev": true
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
     },
     "node_modules/hookable": {
       "version": "5.5.3",
@@ -1913,6 +2322,25 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
     "node_modules/image-size": {
       "version": "0.5.5",
       "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz",
@@ -1925,6 +2353,26 @@
       "engines": {
         "node": ">=0.10.0"
       }
+    },
+    "node_modules/immediate": {
+      "version": "3.0.6",
+      "resolved": "https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz",
+      "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "node_modules/is-docker": {
       "version": "3.0.0",
@@ -2022,6 +2470,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+    },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
@@ -2080,11 +2533,87 @@
         "graceful-fs": "^4.1.6"
       }
     },
+    "node_modules/jszip": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz",
+      "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
+      "dependencies": {
+        "lie": "~3.3.0",
+        "pako": "~1.0.2",
+        "readable-stream": "~2.3.6",
+        "setimmediate": "^1.0.5"
+      }
+    },
+    "node_modules/jszip/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/jszip/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/jszip/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
     "node_modules/kolorist": {
       "version": "1.8.0",
       "resolved": "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz",
       "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
       "dev": true
+    },
+    "node_modules/lazystream": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/lazystream/-/lazystream-1.0.1.tgz",
+      "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+      "dependencies": {
+        "readable-stream": "^2.0.5"
+      },
+      "engines": {
+        "node": ">= 0.6.3"
+      }
+    },
+    "node_modules/lazystream/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/lazystream/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/lazystream/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
     },
     "node_modules/less": {
       "version": "4.2.2",
@@ -2130,15 +2659,94 @@
       "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
       "dev": true
     },
+    "node_modules/lie": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz",
+      "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+      "dependencies": {
+        "immediate": "~3.0.5"
+      }
+    },
+    "node_modules/listenercount": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/listenercount/-/listenercount-1.0.1.tgz",
+      "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ=="
+    },
     "node_modules/lodash.chunk": {
       "version": "4.2.0",
       "resolved": "https://registry.npmmirror.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz",
       "integrity": "sha512-ZzydJKfUHJwHa+hF5X66zLFCBrWn5GeF28OHEr4WVWtNDXlQ/IjWKPBiikqKo2ne0+v6JgCgJ0GzJp8k8bHC7w=="
     },
+    "node_modules/lodash.defaults": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+      "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="
+    },
+    "node_modules/lodash.difference": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.difference/-/lodash.difference-4.5.0.tgz",
+      "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA=="
+    },
+    "node_modules/lodash.escaperegexp": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmmirror.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+      "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw=="
+    },
+    "node_modules/lodash.flatten": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmmirror.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+      "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g=="
+    },
+    "node_modules/lodash.groupby": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmmirror.com/lodash.groupby/-/lodash.groupby-4.6.0.tgz",
+      "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw=="
+    },
+    "node_modules/lodash.isboolean": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmmirror.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+      "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
+    },
+    "node_modules/lodash.isequal": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+      "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead."
+    },
+    "node_modules/lodash.isfunction": {
+      "version": "3.0.9",
+      "resolved": "https://registry.npmmirror.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
+      "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw=="
+    },
+    "node_modules/lodash.isnil": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmmirror.com/lodash.isnil/-/lodash.isnil-4.0.0.tgz",
+      "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng=="
+    },
+    "node_modules/lodash.isplainobject": {
+      "version": "4.0.6",
+      "resolved": "https://registry.npmmirror.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+      "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
+    },
+    "node_modules/lodash.isundefined": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmmirror.com/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz",
+      "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA=="
+    },
     "node_modules/lodash.throttle": {
       "version": "4.1.1",
       "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
       "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ=="
+    },
+    "node_modules/lodash.union": {
+      "version": "4.6.0",
+      "resolved": "https://registry.npmmirror.com/lodash.union/-/lodash.union-4.6.0.tgz",
+      "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw=="
+    },
+    "node_modules/lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="
     },
     "node_modules/lru-cache": {
       "version": "5.1.1",
@@ -2194,11 +2802,41 @@
         "node": ">=4"
       }
     },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
     "node_modules/mitt": {
       "version": "3.0.1",
       "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
       "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
       "dev": true
+    },
+    "node_modules/mkdirp": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz",
+      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+      "dependencies": {
+        "minimist": "^1.2.6"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
     },
     "node_modules/mrmime": {
       "version": "2.0.1",
@@ -2255,6 +2893,14 @@
       "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
       "dev": true
     },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/npm-run-path": {
       "version": "6.0.0",
       "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-6.0.0.tgz",
@@ -2291,6 +2937,14 @@
         "node": "*"
       }
     },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
     "node_modules/open": {
       "version": "10.1.0",
       "resolved": "https://registry.npmmirror.com/open/-/open-10.1.0.tgz",
@@ -2308,6 +2962,11 @@
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
+    },
+    "node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
     },
     "node_modules/parse-ms": {
       "version": "4.0.0",
@@ -2328,6 +2987,14 @@
       "dev": true,
       "engines": {
         "node": ">= 0.10"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
     "node_modules/path-key": {
@@ -2430,6 +3097,11 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
     "node_modules/prr": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz",
@@ -2437,11 +3109,63 @@
       "dev": true,
       "optional": true
     },
+    "node_modules/readable-stream": {
+      "version": "3.6.2",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz",
+      "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/readdir-glob": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/readdir-glob/-/readdir-glob-1.1.3.tgz",
+      "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
+      "dependencies": {
+        "minimatch": "^5.1.0"
+      }
+    },
+    "node_modules/readdir-glob/node_modules/brace-expansion": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0"
+      }
+    },
+    "node_modules/readdir-glob/node_modules/minimatch": {
+      "version": "5.1.6",
+      "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz",
+      "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+      "dependencies": {
+        "brace-expansion": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/rfdc": {
       "version": "1.4.1",
       "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz",
       "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
       "dev": true
+    },
+    "node_modules/rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "deprecated": "Rimraf versions prior to v4 are no longer supported",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
     },
     "node_modules/rollup": {
       "version": "4.34.8",
@@ -2493,6 +3217,25 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
     "node_modules/safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -2507,6 +3250,17 @@
       "dev": true,
       "optional": true
     },
+    "node_modules/saxes": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmmirror.com/saxes/-/saxes-5.0.1.tgz",
+      "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==",
+      "dependencies": {
+        "xmlchars": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
     "node_modules/select": {
       "version": "1.1.2",
       "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz",
@@ -2520,6 +3274,11 @@
       "bin": {
         "semver": "bin/semver.js"
       }
+    },
+    "node_modules/setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
     },
     "node_modules/shebang-command": {
       "version": "2.0.0",
@@ -2595,6 +3354,14 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
     "node_modules/strip-final-newline": {
       "version": "4.0.0",
       "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
@@ -2625,10 +3392,33 @@
       "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
       "dev": true
     },
+    "node_modules/tar-stream": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz",
+      "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+      "dependencies": {
+        "bl": "^4.0.3",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/tinycolor2": {
       "version": "1.6.0",
       "resolved": "https://registry.npmmirror.com/tinycolor2/-/tinycolor2-1.6.0.tgz",
       "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw=="
+    },
+    "node_modules/tmp": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmmirror.com/tmp/-/tmp-0.2.3.tgz",
+      "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==",
+      "engines": {
+        "node": ">=14.14"
+      }
     },
     "node_modules/totalist": {
       "version": "3.0.1",
@@ -2639,11 +3429,27 @@
         "node": ">=6"
       }
     },
+    "node_modules/traverse": {
+      "version": "0.3.9",
+      "resolved": "https://registry.npmmirror.com/traverse/-/traverse-0.3.9.tgz",
+      "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/tslib": {
       "version": "2.8.1",
       "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
       "dev": true
+    },
+    "node_modules/undici-types": {
+      "version": "6.20.0",
+      "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.20.0.tgz",
+      "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==",
+      "dev": true,
+      "optional": true,
+      "peer": true
     },
     "node_modules/unicorn-magic": {
       "version": "0.3.0",
@@ -2664,6 +3470,50 @@
       "dev": true,
       "engines": {
         "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/unzipper": {
+      "version": "0.10.14",
+      "resolved": "https://registry.npmmirror.com/unzipper/-/unzipper-0.10.14.tgz",
+      "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==",
+      "dependencies": {
+        "big-integer": "^1.6.17",
+        "binary": "~0.3.0",
+        "bluebird": "~3.4.1",
+        "buffer-indexof-polyfill": "~1.0.0",
+        "duplexer2": "~0.1.4",
+        "fstream": "^1.0.12",
+        "graceful-fs": "^4.2.2",
+        "listenercount": "~1.0.1",
+        "readable-stream": "~2.3.6",
+        "setimmediate": "~1.0.4"
+      }
+    },
+    "node_modules/unzipper/node_modules/readable-stream": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz",
+      "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/unzipper/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "node_modules/unzipper/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
       }
     },
     "node_modules/update-browserslist-db": {
@@ -2694,6 +3544,19 @@
       },
       "peerDependencies": {
         "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "node_modules/uuid": {
+      "version": "8.3.2",
+      "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz",
+      "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+      "bin": {
+        "uuid": "dist/bin/uuid"
       }
     },
     "node_modules/v-click-outside-x": {
@@ -2948,6 +3811,16 @@
         "node": ">= 8"
       }
     },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+    },
+    "node_modules/xmlchars": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz",
+      "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw=="
+    },
     "node_modules/yallist": {
       "version": "3.1.1",
       "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz",
@@ -2965,6 +3838,39 @@
       "funding": {
         "url": "https://github.com/sponsors/sindresorhus"
       }
+    },
+    "node_modules/zip-stream": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmmirror.com/zip-stream/-/zip-stream-4.1.1.tgz",
+      "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==",
+      "dependencies": {
+        "archiver-utils": "^3.0.4",
+        "compress-commons": "^4.1.2",
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/zip-stream/node_modules/archiver-utils": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmmirror.com/archiver-utils/-/archiver-utils-3.0.4.tgz",
+      "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==",
+      "dependencies": {
+        "glob": "^7.2.3",
+        "graceful-fs": "^4.2.0",
+        "lazystream": "^1.0.0",
+        "lodash.defaults": "^4.2.0",
+        "lodash.difference": "^4.5.0",
+        "lodash.flatten": "^4.4.0",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.union": "^4.6.0",
+        "normalize-path": "^3.0.0",
+        "readable-stream": "^3.6.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
     }
   }
 }
diff --git a/package.json b/package.json
index 55ff826..69961e1 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
     "preview": "vite preview"
   },
   "dependencies": {
+    "exceljs": "^4.4.0",
     "js-base64": "^3.7.7",
     "view-ui-plus": "^1.3.19",
     "vue": "^3.5.13",
diff --git a/src/assets/login_bg.png b/src/assets/login_bg.png
new file mode 100644
index 0000000..605ccfb
--- /dev/null
+++ b/src/assets/login_bg.png
Binary files differ
diff --git a/src/components/examples/data-table.vue b/src/components/examples/data-table.vue
index b3238bf..d2db141 100644
--- a/src/components/examples/data-table.vue
+++ b/src/components/examples/data-table.vue
@@ -7,6 +7,9 @@
       :data="data"
       :height="paged ? tableHeight - 70 : tableHeight"
       border
+      :highlight-row="highlightRow"
+      @on-current-change="onCurrentChange"
+      @on-selection-change="onSelectionChange"
       ref="refTable"
     ></Table>
     <Page
@@ -26,6 +29,7 @@
       @on-next="onNext"
       ref="refPage"
     />
+    <Spin fix :show="loading" />
   </div>
 </template>
 
@@ -63,6 +67,8 @@
       type: Array,
       default: () => [10, 20, 30, 40],
     },
+    loading: Boolean,
+    highlightRow: Boolean,
   },
   data() {
     return {};
@@ -133,6 +139,7 @@
 <style lang="less" scoped>
 .data-table {
   height: 100%;
+  position: relative;
   .text-center {
     text-align: center;
   }
diff --git a/src/less/examples.less b/src/less/examples.less
index 21eb951..d4188d2 100644
--- a/src/less/examples.less
+++ b/src/less/examples.less
@@ -125,4 +125,8 @@
             width: 5px;
         }
     }
+}
+
+.ivu-spin-fix{
+    background-color: rgba(255, 255, 255, .3);
 }
\ No newline at end of file
diff --git a/src/libs/excel.js b/src/libs/excel.js
new file mode 100644
index 0000000..80d70e7
--- /dev/null
+++ b/src/libs/excel.js
@@ -0,0 +1,86 @@
+import ExcelJS from 'exceljs'
+
+class Excel {
+    async exportExcel(options) {
+        const {
+            datas,
+            name,
+            columns,
+            sheetName = 'Sheet1',
+            frozenColumnId = 0,
+        } = options
+        const workbook = new ExcelJS.Workbook()
+        workbook.creator = 'mobox'
+        workbook.created = new Date()
+
+        this.worksheet = workbook.addWorksheet(sheetName)
+
+        this.headerRowId = 1
+
+        this.worksheet.columns = columns
+        this.worksheet.addRows(datas)
+        this.frozenColumnId = frozenColumnId
+        this.setStyles(datas)
+        workbook.xlsx.writeBuffer().then(data => {
+            let blob = new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
+            const a = document.createElement('a')
+            a.href = URL.createObjectURL(blob)
+            a.download = name + '.xlsx'
+            document.body.appendChild(a)
+            a.click()
+            document.body.removeChild(a)
+            window.URL.revokeObjectURL(a.href)
+        })
+    }
+    setStyles(datas) {
+        this.worksheet.eachRow({ includeEmpty: true }, (row) => {
+            row.height = 14
+            row.font = {
+                size: 9
+            }
+        })
+        this.worksheet.columns.forEach(column => column.style.alignment = Object.assign({
+            vertical: 'middle',
+            horizontal: 'center',
+            wrapText: true
+        }, column.style.alignment || {}))
+        for (let i = 1; i <= this.headerRowId; i++) {
+            let row = this.worksheet.getRow(i)
+            row.height = 18
+            row.eachCell(cell => {
+                cell.style.alignment = {
+                    vertical: 'middle',
+                    horizontal: 'center',
+                    wrapText: false
+                }
+                cell.fill = {
+                    type: 'pattern',
+                    pattern: 'solid',
+                    fgColor: { argb: 'dddddd' },
+                }
+                cell.border = {
+                    right: { style: 'thin' },
+                    bottom: { style: 'thin' }
+                }
+                cell.font = {
+                    size: 9
+                }
+            })
+        }
+        this.worksheet.autoFilter = {
+            from: {
+                row: this.headerRowId,
+                column: 1
+            },
+            to: {
+                row: datas.length,
+                column: this.worksheet.columns.length
+            }
+        }
+        this.worksheet.views = [
+            { state: 'frozen', xSplit: this.frozenColumnId, ySplit: this.headerRowId }
+        ]
+    }
+}
+
+export default Excel
\ No newline at end of file
diff --git a/src/views/account/login.vue b/src/views/account/login.vue
index 533b648..e126806 100644
--- a/src/views/account/login.vue
+++ b/src/views/account/login.vue
@@ -1,28 +1,52 @@
 <template>
   <div class="login-view">
-    <Form :model="formInline" :rules="ruleInline" inline ref="refFormInline">
-      <FormItem prop="user">
-        <Input type="text" v-model="formInline.user" placeholder="Username">
-          <template #prepend>
-            <Icon type="ios-person-outline"></Icon>
-          </template>
-        </Input>
-      </FormItem>
-      <FormItem prop="password">
-        <Input
-          type="password"
-          v-model="formInline.password"
-          placeholder="Password"
+    <div class="login-wrap">
+      <div class="login-account">
+        <div class="account-logo">
+          <img src="http://115.29.185.26:5101/userphoto?login=sa" />
+        </div>
+        <article class="ivu-typography ivu-text-center ivu-mt">
+          <h1 class="ivu-typography">Vue Template<!----></h1>
+          <div class="ivu-typography">
+            鍩轰簬 Vue3.0銆乂ueRouter 鍜孷iewUIPlus鐨勭鐞嗙郴缁熸ā鏉挎紨绀�+            <!---->
+          </div>
+        </article>
+        <Form
+          class="account-form"
+          :model="form"
+          :rules="rules"
+          label-position="top"
+          ref="refFormInline"
         >
-          <template #prepend>
-            <Icon type="ios-lock-outline"></Icon>
-          </template>
-        </Input>
-      </FormItem>
-      <FormItem>
-        <Button type="primary" @click="onSignIn">Signin</Button>
-      </FormItem>
-    </Form>
+          <div class="ivu-login">
+            <FormItem prop="user">
+              <Input
+                type="text"
+                v-model="form.user"
+                size="large"
+                prefix="ios-person-outline"
+              >
+              </Input>
+            </FormItem>
+            <FormItem prop="password">
+              <Input
+                type="password"
+                v-model="form.password"
+                size="large"
+                prefix="ios-lock-outline"
+              >
+              </Input>
+            </FormItem>
+            <FormItem>
+              <Button type="primary" @click="onSignIn" size="large" long
+                >鐧诲綍</Button
+              >
+            </FormItem>
+          </div>
+        </Form>
+      </div>
+    </div>
   </div>
 </template>
 
@@ -35,11 +59,11 @@
   name: "LoginView",
   data() {
     return {
-      formInline: {
-        user: "",
-        password: "",
+      form: {
+        user: "admin",
+        password: "0000",
       },
-      ruleInline: {
+      rules: {
         user: [
           {
             required: true,
@@ -53,24 +77,25 @@
             message: "Please fill in the password.",
             trigger: "blur",
           },
-          {
-            type: "string",
-            min: 6,
-            message: "The password length cannot be less than 6 bits",
-            trigger: "blur",
-          },
         ],
       },
     };
   },
   methods: {
     onSignIn() {
+      // 娴嬭瘯鐢ㄦ埛
+      if (this.form.user == "admin" && this.form.password == "0000") {
+        setToken("uid");
+        this.showSuccess("鐧诲綍鎴愬姛");
+        this.$router.push("/");
+        return;
+      }
       this.refFormInline.validate(async (valid) => {
         try {
           if (valid) {
             let res = await login({
-              user_login: Base64.encode(this.formInline.user),
-              user_psw: Base64.encode(this.formInline.password),
+              user_login: Base64.encode(this.form.user),
+              user_psw: Base64.encode(this.form.password),
             });
             setToken(res.session_id);
             this.showSuccess("鐧诲綍鎴愬姛");
@@ -97,11 +122,58 @@
 };
 </script>
 
-<style lang="less" scoped>
+<style lang="less">
 .login-view {
-  height: 100vh;
-  display: flex;
-  align-items: center;
-  justify-content: center;
+  background-repeat: no-repeat;
+  background-size: 100% 100%;
+  background-position: right bottom;
+  background-image: url("../../assets/login_bg.png");
+  background-attachment: fixed;
+  .login-wrap {
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    -webkit-box-orient: vertical;
+    -webkit-box-direction: normal;
+    -ms-flex-direction: column;
+    flex-direction: column;
+    height: 100vh;
+    overflow: auto;
+  }
+  .login-account {
+    -webkit-box-flex: 1;
+    -ms-flex: 1;
+    flex: 1;
+    padding: 16px 0 0;
+    max-width: 420px;
+    margin: 0 auto;
+    margin-top: 100px;
+  }
+  .account-logo {
+    width: 80px;
+    height: 80px;
+    margin: 0 auto;
+    border: 1px solid #eee;
+    border-radius: 50%;
+    background-color: #fafafc;
+    img {
+      width: 100%;
+      border-style: none;
+      border-radius: 100%;
+    }
+  }
+  .account-form {
+    margin-top: 32px;
+  }
+  .ivu-form-item {
+    margin-bottom: 24px;
+    vertical-align: top;
+    zoom: 1;
+  }
+  .ivu-form-item-content {
+    position: relative;
+    line-height: 32px;
+    font-size: 14px;
+  }
 }
 </style>
\ No newline at end of file
diff --git a/src/views/examples/data-table/dialogs/info.vue b/src/views/examples/data-table/dialogs/info.vue
index 79e9c06..ab53179 100644
--- a/src/views/examples/data-table/dialogs/info.vue
+++ b/src/views/examples/data-table/dialogs/info.vue
@@ -8,86 +8,63 @@
     <Form :model="form" :label-width="110">
       <template v-if="model != 'info'">
         <FormItem label="浠撳簱缂栫爜锛�>
-          <Input
-            v-model="form.WH_Code"
-            placeholder="Enter something..."
-            size="small"
-          ></Input>
+          <Input v-model="form.code" size="small"></Input>
         </FormItem>
         <FormItem label="浠撳簱鍚嶇О锛�>
-          <Input
-            v-model="form.WH_Code"
-            placeholder="Enter something..."
-            size="small"
-          ></Input>
+          <Input v-model="form.name" size="small"></Input>
         </FormItem>
         <FormItem label="浠撳簱璐熻矗浜猴細">
-          <Input
-            v-model="form.WH_Code"
-            placeholder="Enter something..."
-            size="small"
-          ></Input>
+          <Input v-model="form.leader" size="small"></Input>
         </FormItem>
         <FormItem label="浠撳簱鐢佃瘽锛�>
-          <Input
-            v-model="form.WH_Code"
-            placeholder="Enter something..."
-            size="small"
-          ></Input>
+          <Input v-model="form.tel" size="small"></Input>
         </FormItem>
         <FormItem label="涓婄骇浠撳簱缂栫爜锛�>
-          <Input
-            v-model="form.WH_Code"
-            placeholder="Enter something..."
-            size="small"
-          ></Input>
+          <Input v-model="form.topCode" size="small"></Input>
         </FormItem>
         <FormItem label="鍦板潃锛�>
-          <Input
-            v-model="form.WH_Code"
-            placeholder="Enter something..."
-            size="small"
-          ></Input>
+          <Input v-model="form.address" size="small"></Input>
         </FormItem>
         <FormItem>
-          <Checkbox v-model="form.WH_Code" size="small">鏄惁鏈骇</Checkbox>
+          <Checkbox v-model="form.isThisLevel" size="small">鏄惁鏈骇</Checkbox>
         </FormItem>
         <FormItem>
-          <Checkbox v-model="form.WH_Code" size="small">鏄惁浠g</Checkbox>
+          <Checkbox v-model="form.isEscrow" size="small">鏄惁浠g</Checkbox>
         </FormItem>
         <FormItem>
-          <Checkbox v-model="form.WH_Code" size="small">鏄惁鍚敤</Checkbox>
+          <Checkbox v-model="form.isEnable" size="small">鏄惁鍚敤</Checkbox>
         </FormItem>
       </template>
       <template v-else>
-        <FormItem label="浠撳簱缂栫爜锛�> 浠撳簱缂栫爜 </FormItem>
-        <FormItem label="浠撳簱鍚嶇О锛�> 浠撳簱鍚嶇О </FormItem>
-        <FormItem label="浠撳簱璐熻矗浜猴細"> 浠撳簱璐熻矗浜�</FormItem>
-        <FormItem label="浠撳簱鐢佃瘽锛�> 浠撳簱鐢佃瘽 </FormItem>
-        <FormItem label="涓婄骇浠撳簱缂栫爜锛�> 涓婄骇浠撳簱缂栫爜 </FormItem>
-        <FormItem label="鍦板潃锛�> 鍦板潃 </FormItem>
+        <FormItem label="浠撳簱缂栫爜锛�> {{ this.form.code }} </FormItem>
+        <FormItem label="浠撳簱鍚嶇О锛�> {{ this.form.name }} </FormItem>
+        <FormItem label="浠撳簱璐熻矗浜猴細"> {{ this.form.leader }} </FormItem>
+        <FormItem label="浠撳簱鐢佃瘽锛�> {{ this.form.tel }} </FormItem>
+        <FormItem label="涓婄骇浠撳簱缂栫爜锛�> {{ this.form.topCode }} </FormItem>
+        <FormItem label="鍦板潃锛�> {{ this.form.address }} </FormItem>
         <FormItem>
-          <Checkbox v-model="form.WH_Code" size="small" disabled
+          <Checkbox v-model="form.isThisLevel" size="small" disabled
             >鏄惁鏈骇</Checkbox
           >
         </FormItem>
         <FormItem>
-          <Checkbox v-model="form.WH_Code" size="small" disabled
+          <Checkbox v-model="form.isEscrow" size="small" disabled
             >鏄惁浠g</Checkbox
           >
         </FormItem>
         <FormItem>
-          <Checkbox v-model="form.WH_Code" size="small" disabled
+          <Checkbox v-model="form.isEnable" size="small" disabled
             >鏄惁鍚敤</Checkbox
           >
         </FormItem>
       </template>
+      <Spin fix :show="loading" />
     </Form>
     <template #footer>
       <template v-if="model != 'info'">
         <Space>
           <Button type="text" @click="onCancel">鍙栨秷</Button>
-          <Button type="primary" @click="onOk">纭畾</Button>
+          <Button type="primary" @click="onOk" :loading="loading">纭畾</Button>
         </Space>
       </template>
       <template v-else>
@@ -106,16 +83,64 @@
       type: String,
       default: () => "info",
     },
+    dataId: String,
   },
   data() {
     return {
-      form: {},
+      form: {
+        code: "",
+        name: "",
+        leader: "",
+        tel: "",
+        topCode: "",
+        address: "",
+        isThisLevel: false,
+        isEscrow: false,
+        isEnable: false,
+      },
+      loading: false,
     };
   },
   methods: {
-    onOk() {},
-    onCancel() {},
-    onClose() {},
+    onOk() {
+      this.loading = true;
+      setTimeout(() => {
+        this.loading = false;
+        this.onClose();
+      }, 2000);
+    },
+    onCancel() {
+      this.onClose();
+    },
+    onClose() {
+      this.$emit("update:modelValue", false);
+    },
+    loadData() {
+      if (!this.dataId) this.clear();
+      else this.loadFormData();
+    },
+    loadFormData() {
+      let data = this.$parent.data.find((d) => d.code == this.dataId);
+      Object.assign(this.form, data);
+    },
+    clear() {
+      this.code = "";
+      this.name = "";
+      this.leader = "";
+      this.tel = "";
+      this.topCode = "";
+      this.address = "";
+      this.isThisLevel = false;
+      this.isEscrow = false;
+      this.isEnable = false;
+    },
+  },
+  watch: {
+    modelValue(visible) {
+      if (visible) {
+        this.loadData();
+      }
+    },
   },
 };
 </script>
@@ -125,5 +150,18 @@
   .ivu-modal {
     top: 40px;
   }
+  .ivu-checkbox-input[disabled] {
+    cursor: default;
+  }
+  .ivu-checkbox-disabled .ivu-checkbox-inner {
+    border-color: #666;
+    background-color: #fff;
+  }
+  .ivu-checkbox-disabled.ivu-checkbox-checked .ivu-checkbox-inner:after {
+    border-color: #666;
+  }
+  .ivu-checkbox-disabled + span {
+    color: #666;
+  }
 }
 </style>
\ No newline at end of file
diff --git a/src/views/examples/data-table/index.vue b/src/views/examples/data-table/index.vue
index 134991f..7bb8601 100644
--- a/src/views/examples/data-table/index.vue
+++ b/src/views/examples/data-table/index.vue
@@ -5,73 +5,51 @@
         <Row>
           <Col span="6">
             <FormItem label="浠撳簱缂栫爜锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Input v-model="form.code" size="small"></Input>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="浠撳簱鍚嶇О锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Input v-model="form.name" size="small"></Input>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="浠撳簱璐熻矗浜猴細">
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Input v-model="form.leader" size="small"></Input>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="浠撳簱鐢佃瘽锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Input v-model="form.tel" size="small"></Input>
             </FormItem>
           </Col>
         </Row>
         <Row>
           <Col span="6">
             <FormItem label="涓婄骇浠撳簱缂栫爜锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Input v-model="form.topCode" size="small"></Input>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="鍦板潃锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Input v-model="form.address" size="small"></Input>
             </FormItem>
           </Col>
           <Col span="4">
             <FormItem :label-width="34">
-              <Checkbox v-model="form.WH_Code" size="small">鏄惁鏈骇</Checkbox>
+              <Checkbox v-model="form.isThisLevel" size="small"
+                >鏄惁鏈骇</Checkbox
+              >
             </FormItem>
           </Col>
           <Col span="4">
             <FormItem :label-width="34">
-              <Checkbox v-model="form.WH_Code" size="small">鏄惁浠g</Checkbox>
+              <Checkbox v-model="form.isEscrow" size="small">鏄惁浠g</Checkbox>
             </FormItem>
           </Col>
           <Col span="4">
             <FormItem :label-width="34">
-              <Checkbox v-model="form.WH_Code" size="small">鏄惁鍚敤</Checkbox>
+              <Checkbox v-model="form.isEnable" size="small">鏄惁鍚敤</Checkbox>
             </FormItem>
           </Col>
         </Row>
@@ -89,6 +67,16 @@
       :tableHeight="tableHeight"
       :columns="columns"
       :data="data"
+      :page="page"
+      :limit="limit"
+      :limits="limits"
+      :total="total"
+      :loading="loading"
+      @on-selection-change="onSelectionChange"
+      @on-change="onPageChange"
+      @on-page-size-change="onPageSizeChange"
+      @on-prev="onPrev"
+      @on-next="onNext"
     ></DataTable>
     <DataTableInfo
       v-model="infoDialog.visible"
@@ -113,9 +101,26 @@
       columns: [],
       data: [],
       tableHeight: 0,
+      // 鍒嗛〉淇℃伅
+      page: 1,
+      limit: 30,
+      limits: [10, 20, 30],
+      total: 0,
+      selection: [],
+      loading: false,
+      // 鏌ヨ琛ㄥ崟瀹氫箟
       form: {
-        WH_Code: "",
+        code: "",
+        name: "",
+        leader: "",
+        tel: "",
+        topCode: "",
+        address: "",
+        isThisLevel: false,
+        isEscrow: false,
+        isEnable: false,
       },
+      // 寮规鍙傛暟瀹氫箟
       infoDialog: {
         model: "info",
         visible: false,
@@ -127,13 +132,20 @@
     async loadColumns() {
       this.columns = [
         {
-          type: "index",
+          type: "selection",
+          width: 40,
+          fixed: "left",
+          align: "center",
+        },
+        {
+          key: "index",
           title: " ",
           render: (h, { index }) => {
-            return h(index);
+            return h("div", (this.page - 1) * this.limit + index + 1);
           },
-          width: 50,
+          width: 40,
           fixed: "left",
+          align: "center",
         },
         {
           key: "row_button",
@@ -159,7 +171,7 @@
                             type: "md-build",
                             size: 14,
                             color: "#f90",
-                            onClick: () => {},
+                            onClick: () => this.onEditRowClick(index),
                           }),
                       }
                     ),
@@ -203,54 +215,140 @@
           fixed: "left",
         },
         {
-          key: "WH_Code",
+          key: "code",
           title: "浠撳簱缂栫爜",
           width: 150,
           fixed: "left",
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "WH_Name",
+          key: "name",
           title: "浠撳簱鍚嶇О",
+          width: 200,
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "WH_Leader",
+          key: "leader",
           title: "浠撳簱璐熻矗浜�,
-          width: 100,
+          width: 150,
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "WH_Tel",
+          key: "tel",
           title: "浠撳簱鐢佃瘽",
-          width: 100,
+          width: 150,
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "Address",
+          key: "address",
           title: "鍦板潃",
-          width: 100,
+          width: 150,
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "TopLevelWH_Code",
+          key: "topCode",
           title: "涓婄骇浠撳簱缂栫爜",
           width: 100,
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "IsThisLevel",
+          key: "isThisLevel",
           title: "鏄惁鏈骇",
-          width: 70,
+          render: (h, { row }) => {
+            return h(
+              "div",
+              h(resolveComponent("Checkbox"), {
+                modelValue: row.isThisLevel,
+                disabled: true,
+                size: "small",
+              })
+            );
+          },
+          width: 80,
+          align: "center",
+          sortable: true,
         },
         {
-          key: "IsEscrow",
+          key: "isEscrow",
           title: "鏄惁浠g",
-          width: 70,
+          render: (h, { row }) => {
+            return h(
+              "div",
+              h(resolveComponent("Checkbox"), {
+                modelValue: row.isEscrow,
+                disabled: true,
+                size: "small",
+              })
+            );
+          },
+          width: 80,
+          align: "center",
+          sortable: true,
         },
         {
-          key: "IsEnable",
+          key: "isEnable",
           title: "鏄惁鍚敤",
-          width: 70,
+          render: (h, { row }) => {
+            return h(
+              "div",
+              h(resolveComponent("Checkbox"), {
+                modelValue: row.isEnable,
+                disabled: true,
+                size: "small",
+              })
+            );
+          },
+          width: 80,
+          align: "center",
+          sortable: true,
         },
       ];
     },
+    // 鍔犺浇鏁版嵁琛�     async loadData() {
-      this.data = [{}];
+      let msg = this.$Message.loading("姝e湪鍔犺浇鏁版嵁...");
+      this.loading = true;
+
+      let { data, total } = await this.fakeDataList();
+
+      msg();
+
+      this.data = data;
+      this.total = total;
+      this.loading = false;
+    },
+    // 娴嬭瘯鏁版嵁鍒楄〃
+    fakeDataList(limit) {
+      return new Promise((resolve) => {
+        let total = 99;
+        let fakeList = [];
+        for (let i = 0; i < (limit || this.limit); i++) {
+          let row = {
+            code: `浠撳簱缂栫爜-${(this.page - 1) * this.limit + i + 1}`,
+            name: `浠撳簱鍚嶇О-${(this.page - 1) * this.limit + i + 1}`,
+            leader: `浠撳簱璐熻矗浜�${(this.page - 1) * this.limit + i + 1}`,
+            tel: `浠撳簱鐢佃瘽-${(this.page - 1) * this.limit + i + 1}`,
+            address: `鍦板潃-${(this.page - 1) * this.limit + i + 1}`,
+            topCode: `涓婄骇浠撳簱缂栫爜-${(this.page - 1) * this.limit + i + 1}`,
+            isThisLevel:
+              ((this.page - 1) * this.limit + i + 1) % 2 == 0 ? true : false,
+            isEscrow:
+              ((this.page - 1) * this.limit + i + 1) % 2 == 0 ? true : false,
+            isEnable:
+              ((this.page - 1) * this.limit + i + 1) % 2 == 0 ? true : false,
+          };
+          if ((this.page - 1) * this.limit + i + 1 < 100) fakeList.push(row);
+        }
+        setTimeout(() => {
+          resolve({ data: fakeList, total });
+        }, 1 * 1000);
+      });
     },
     resize() {
       let height =
@@ -267,14 +365,35 @@
       this.infoDialog.visible = true;
     },
     onEditClick() {
+      if (this.selection.length == 0) return this.showWarning("鏈�鎷╂搷浣滈」");
+      else if (this.selection.length > 1)
+        return this.showWarning("鍙兘閫夋嫨涓�」杩涜缂栬緫");
+      let code = this.selection[0].code;
       this.infoDialog.model = "edit";
-      this.infoDialog.dataId = "";
+      this.infoDialog.dataId = code;
+      this.infoDialog.visible = true;
+    },
+    onEditRowClick(index) {
+      let code = this.data[index].code;
+      this.infoDialog.model = "edit";
+      this.infoDialog.dataId = code;
       this.infoDialog.visible = true;
     },
     onViewClick() {
+      if (this.selection.length == 0) return this.showWarning("鏈�鎷╂搷浣滈」");
+      else if (this.selection.length > 1)
+        return this.showWarning("鍙兘閫夋嫨涓�」鏌ョ湅");
+      let code = this.selection[0].code;
       this.infoDialog.model = "info";
-      this.infoDialog.dataId = "";
+      this.infoDialog.dataId = code;
       this.infoDialog.visible = true;
+    },
+    showWarning(tip) {
+      this.$Message.warning({
+        content: tip,
+        duration: 0,
+        closable: true,
+      });
     },
     async onDelClick() {
       this.$Modal.confirm({
@@ -300,12 +419,31 @@
         this.$Message.success("鍒犻櫎鎴愬姛锛�);
       }, 2000);
     },
+    onSelectionChange(selection) {
+      this.selection = selection;
+    },
+    onPageChange(page) {
+      this.page = page;
+      this.loadData();
+    },
+    onPageSizeChange(limit) {
+      this.limit = limit;
+      this.loadData();
+    },
+    onPrev(page) {
+      this.page = page;
+      this.loadData();
+    },
+    onNext(page) {
+      this.page = page;
+      this.loadData();
+    },
   },
   async mounted() {
     await this.loadColumns();
-    await this.loadData();
     this.$nextTick(() => {
       this.resize();
+      this.loadData();
     });
   },
   setup() {
@@ -315,16 +453,34 @@
 };
 </script>
 
-<style lang="less" scoped>
+<style lang="less">
 .example-data-table {
   height: 100%;
   .search-form,
   .buttons {
     margin-bottom: 9px;
   }
+  .table {
+    height: calc(100% - 170px);
+  }
   .ivu-form .ivu-form-item-label,
   .ivu-checkbox-wrapper {
     font-size: 12px;
   }
+  .ivu-input-wrapper {
+    .ivu-icon {
+      cursor: pointer;
+    }
+  }
+  .ivu-checkbox-input[disabled] {
+    cursor: default;
+  }
+  .ivu-checkbox-disabled .ivu-checkbox-inner {
+    border-color: #666;
+    background-color: #fff;
+  }
+  .ivu-checkbox-disabled.ivu-checkbox-checked .ivu-checkbox-inner:after {
+    border-color: #666;
+  }
 }
 </style>
\ No newline at end of file
diff --git a/src/views/examples/excel.js b/src/views/examples/excel.js
new file mode 100644
index 0000000..4a28e23
--- /dev/null
+++ b/src/views/examples/excel.js
@@ -0,0 +1,27 @@
+import Excel from '@/libs/excel'
+
+/**
+ * 瀵煎嚭鏁版嵁鍒皒lsx鏂囦欢
+ * @param {*} vm 
+ * @param {*} btn 
+ */
+export const exportExcel = async (vm, datas) => {
+    const columns = vm.columns.filter(c => c.key != 'index').map(c => ({
+        header: c.title,
+        key: c.key,
+        width: (c.width || 25) / 8,
+        style: {
+            alignment: {
+                horizontal: c.TextAlign || 'left'
+            }
+        }
+    }));
+    let frozenColumnId = 1
+    const excel = new Excel();
+    excel.exportExcel({
+        name: '瀵煎嚭鏂囦欢',
+        datas,
+        columns,
+        frozenColumnId,
+    })
+}
\ No newline at end of file
diff --git a/src/views/examples/master-slave.vue b/src/views/examples/master-slave.vue
index 0c3fa1a..a359d56 100644
--- a/src/views/examples/master-slave.vue
+++ b/src/views/examples/master-slave.vue
@@ -13,58 +13,34 @@
               <Row>
                 <Col span="6">
                   <FormItem label="浠撳簱缂栫爜锛�>
-                    <Input
-                      v-model="topForm.WH_Code"
-                      placeholder="Enter something..."
-                      size="small"
-                    ></Input>
+                    <Input v-model="topForm.WH_Code" size="small"></Input>
                   </FormItem>
                 </Col>
                 <Col span="6">
                   <FormItem label="浠撳簱鍚嶇О锛�>
-                    <Input
-                      v-model="topForm.WH_Code"
-                      placeholder="Enter something..."
-                      size="small"
-                    ></Input>
+                    <Input v-model="topForm.WH_Code" size="small"></Input>
                   </FormItem>
                 </Col>
                 <Col span="6">
                   <FormItem label="浠撳簱璐熻矗浜猴細">
-                    <Input
-                      v-model="topForm.WH_Code"
-                      placeholder="Enter something..."
-                      size="small"
-                    ></Input>
+                    <Input v-model="topForm.WH_Code" size="small"></Input>
                   </FormItem>
                 </Col>
                 <Col span="6">
                   <FormItem label="浠撳簱鐢佃瘽锛�>
-                    <Input
-                      v-model="topForm.WH_Code"
-                      placeholder="Enter something..."
-                      size="small"
-                    ></Input>
+                    <Input v-model="topForm.WH_Code" size="small"></Input>
                   </FormItem>
                 </Col>
               </Row>
               <Row>
                 <Col span="6">
                   <FormItem label="涓婄骇浠撳簱缂栫爜锛�>
-                    <Input
-                      v-model="topForm.WH_Code"
-                      placeholder="Enter something..."
-                      size="small"
-                    ></Input>
+                    <Input v-model="topForm.WH_Code" size="small"></Input>
                   </FormItem>
                 </Col>
                 <Col span="6">
                   <FormItem label="鍦板潃锛�>
-                    <Input
-                      v-model="topForm.WH_Code"
-                      placeholder="Enter something..."
-                      size="small"
-                    ></Input>
+                    <Input v-model="topForm.WH_Code" size="small"></Input>
                   </FormItem>
                 </Col>
                 <Col span="4">
@@ -98,6 +74,18 @@
             :tableHeight="tableTopHeight"
             :columns="topColumns"
             :data="topData"
+            :page="topPage"
+            :limit="topLimit"
+            :limits="topLimits"
+            :total="topTotal"
+            :loading="topLoading"
+            highlight-row
+            @on-current-change="onCurrentChange"
+            @on-change="onPageChange"
+            @on-page-size-change="onPageSizeChange"
+            @on-prev="onPrev"
+            @on-next="onNext"
+            ref="refTopTable"
           ></DataTable>
         </div>
       </template>
@@ -112,6 +100,7 @@
         </div>
       </template>
     </Split>
+    <Spin fix :show="loading" />
   </div>
 </template>
 
@@ -125,6 +114,9 @@
   },
   data() {
     return {
+      // 鍒嗛殧姣斾緥
+      split: 0.6,
+      // 涓昏〃鍙傛暟瀹氫箟
       topColumns: [],
       topData: [],
       tableTopHeight: 0,
@@ -132,173 +124,275 @@
       topForm: {
         WH_Code: "",
       },
+      topPage: 1,
+      topLimit: 30,
+      topLimits: [10, 20, 30],
+      topTotal: 0,
+      topLoading: false,
+      currentRow: undefined,
+      // 浠庤〃鍙傛暟瀹氫箟
       bottomColumns: [],
       bottomData: [],
-      split: 0.6,
+
+      loading: false,
     };
   },
   methods: {
     async loadTopColumns() {
       this.topColumns = [
         {
-          type: "index",
+          key: "index",
           title: " ",
           render: (h, { index }) => {
-            return h(index);
+            return h("div", (this.topPage - 1) * this.topLimit + index + 1);
           },
-          width: 50,
+          width: 40,
+          align: "center",
         },
         {
-          key: "",
+          key: "orderNo",
           title: "鍒拌揣鍗曞彿",
           width: 100,
         },
         {
-          key: "",
+          key: "checkNo",
           title: "妫�煡鍗曞彿",
           width: 100,
         },
         {
-          key: "",
+          key: "invertoryCode",
           title: "瀛樿揣缂栫爜",
           width: 100,
         },
         {
-          key: "",
+          key: "invertoryName",
           title: "瀛樿揣鍚嶇О",
           width: 100,
         },
         {
-          key: "",
+          key: "specModel",
           title: "瑙勬牸鍨嬪彿",
           width: 100,
         },
         {
-          key: "",
+          key: "logo",
           title: "鍝佺墝",
           width: 100,
         },
         {
-          key: "",
+          key: "desc",
           title: "鍙傛暟鎻忚堪",
           width: 100,
         },
         {
-          key: "",
+          key: "material",
           title: "鏉愭枡",
           width: 100,
         },
         {
-          key: "",
+          key: "unit",
           title: "鍗曚綅",
           width: 100,
         },
         {
-          key: "",
+          key: "count",
           title: "鍏ュ簱鏁伴噺",
           width: 100,
         },
         {
-          key: "",
+          key: "arriveDate",
           title: "鍒拌揣鏃ユ湡",
           width: 100,
         },
         {
-          key: "",
+          key: "checkDate",
           title: "妫�煡鏃ユ湡",
           width: 100,
         },
         {
-          key: "",
+          key: "business",
           title: "涓氬姟绫诲瀷",
           width: 100,
         },
       ];
     },
-    async loadTopData() {},
+    // 鍔犺浇涓昏〃鏁版嵁
+    async loadTopData() {
+      let msg = this.$Message.loading("姝e湪鍔犺浇鏁版嵁...");
+      this.topLoading = true;
+
+      this.bottomData = [];
+
+      let { data, total } = await this.fakeTopDataList();
+
+      msg();
+
+      this.topData = data;
+      this.topTotal = total;
+      this.topLoading = false;
+
+      this.$nextTick(() => {
+        let firstRow = this.refTopTable.refTable.objData[0];
+        if (firstRow) {
+          firstRow._isHighlight = true;
+          this.currentRow = this.topData[0];
+          this.loadBottomData();
+        }
+      });
+    },
+    // 涓昏〃娴嬭瘯鏁版嵁鍒楄〃
+    fakeTopDataList() {
+      return new Promise((resolve) => {
+        let total = 99;
+        let fakeList = [];
+        for (let i = 0; i < this.topLimit; i++) {
+          let row = {
+            orderNo: `鍒拌揣鍗曞彿-${(this.topPage - 1) * this.topLimit + i + 1}`,
+            checkNo: `妫�煡鍗曞彿-${(this.topPage - 1) * this.topLimit + i + 1}`,
+            invertoryCode: `瀛樿揣缂栫爜-${
+              (this.topPage - 1) * this.topLimit + i + 1
+            }`,
+            invertoryName: `瀛樿揣鍚嶇О-${
+              (this.topPage - 1) * this.topLimit + i + 1
+            }`,
+            specModel: `瑙勬牸鍨嬪彿-${(this.topPage - 1) * this.topLimit + i + 1}`,
+            logo: `鍝佺墝-${(this.topPage - 1) * this.topLimit + i + 1}`,
+            desc: `鍙傛暟鎻忚堪-${(this.topPage - 1) * this.topLimit + i + 1}`,
+            material: `鏉愭枡-${(this.topPage - 1) * this.topLimit + i + 1}`,
+            unit: `鍗曚綅-${(this.topPage - 1) * this.topLimit + i + 1}`,
+            count: `鍏ュ簱鏁伴噺-${(this.topPage - 1) * this.topLimit + i + 1}`,
+            arriveDate: `鍒拌揣鏃ユ湡-${
+              (this.topPage - 1) * this.topLimit + i + 1
+            }`,
+            checkDate: `妫�煡鏃ユ湡-${(this.topPage - 1) * this.topLimit + i + 1}`,
+            business: `涓氬姟绫诲瀷-${(this.topPage - 1) * this.topLimit + i + 1}`,
+          };
+          if ((this.topPage - 1) * this.topLimit + i + 1 < 100)
+            fakeList.push(row);
+        }
+        setTimeout(() => {
+          resolve({ data: fakeList, total });
+        }, 1 * 1000);
+      });
+    },
+    // 浠庤〃娴嬭瘯鏁版嵁鍒楄〃
+    fakeBottomDataList(topDataId) {
+      return new Promise((resolve) => {
+        let total = Math.floor(Math.random() * 10);
+        let fakeList = [];
+        for (let i = 0; i < total; i++) {
+          let row = {
+            checkOrder: `${topDataId}-${i + 1}`,
+            arriveOrder: `${topDataId}-${i + 1}`,
+            location: `${topDataId}-${i + 1}`,
+            supplier: `${topDataId}-${i + 1}`,
+            asnCode: `${topDataId}-${i + 1}`,
+            supplierCode: `${topDataId}-${i + 1}`,
+            WHName: `${topDataId}-${i + 1}`,
+            count: `${topDataId}-${i + 1}`,
+            canUsedCount: `${topDataId}-${i + 1}`,
+            invertoryCode: `${topDataId}-${i + 1}`,
+            invertoryName: `${topDataId}-${i + 1}`,
+            specModel: `${topDataId}-${i + 1}`,
+            logo: `${topDataId}-${i + 1}`,
+            wpn: `${topDataId}-${i + 1}`,
+          };
+          fakeList.push(row);
+        }
+        setTimeout(() => {
+          resolve(fakeList);
+        }, 1 * 1000);
+      });
+    },
     loadBottomColumns() {
       this.bottomColumns = [
         {
-          type: "index",
+          key: "index",
           title: " ",
           render: (h, { index }) => {
-            return h(index);
+            return h("div", index + 1);
           },
-          width: 50,
+          width: 40,
+          align: "center",
         },
         {
-          key: "",
+          key: "checkOrder",
           title: "妫�獙鍗�,
           width: 100,
         },
         {
-          key: "",
+          key: "arriveOrder",
           title: "鍒拌揣鍗�,
           width: 100,
         },
         {
-          key: "",
+          key: "location",
           title: "寰呮璐т綅",
           width: 100,
         },
         {
-          key: "",
+          key: "supplier",
           title: "渚涘簲鍟嗗悕绉�,
           width: 100,
         },
         {
-          key: "",
+          key: "asnCode",
           title: "ASN鍗曞彿",
           width: 100,
         },
         {
-          key: "",
+          key: "supplierCode",
           title: "渚涘簲鍟嗙紪鐮�,
           width: 100,
         },
         {
-          key: "",
+          key: "WHName",
           title: "浠撳簱鍚嶇О",
           width: 100,
         },
         {
-          key: "",
+          key: "count",
           title: "鏁伴噺",
           width: 100,
         },
         {
-          key: "",
+          key: "canUsedCount",
           title: "鍙敤缁戝畾鏁伴噺",
           width: 100,
         },
         {
-          key: "",
+          key: "invertoryCode",
           title: "瀛樿揣缂栫爜",
           width: 100,
         },
         {
-          key: "",
+          key: "invertoryName",
           title: "瀛樿揣鍚嶇О",
           width: 100,
         },
         {
-          key: "",
+          key: "specModel",
           title: "瑙勬牸鍨嬪彿",
           width: 100,
         },
         {
-          key: "",
+          key: "logo",
           title: "鍝佺墝",
           width: 100,
         },
         {
-          key: "",
+          key: "wpn",
           title: "WPN",
           width: 100,
         },
       ];
     },
-    async loadBottomData() {},
+    // 鍔犺浇浠庤〃鏁版嵁
+    async loadBottomData() {
+      let { orderNo } = this.currentRow;
+      let data = await this.fakeBottomDataList(orderNo);
+      this.bottomData = data;
+    },
     resize() {
       this.$nextTick(() => {
         let topHeight =
@@ -311,20 +405,43 @@
         this.tableBottomHeight = bottomHeight;
       });
     },
+    // 涓昏〃鍒囨崲閫夋嫨琛屾椂瑙﹀彂
+    async onCurrentChange(row) {
+      this.currentRow = row;
+      this.loading = true;
+      await this.loadBottomData();
+      this.loading = false;
+    },
+    onPageChange(page) {
+      this.topPage = page;
+      this.loadTopData();
+    },
+    onPageSizeChange(limit) {
+      this.topLimit = limit;
+      this.loadTopData();
+    },
+    onPrev(page) {
+      this.topPage = page;
+      this.loadTopData();
+    },
+    onNext(page) {
+      this.topPage = page;
+      this.loadTopData();
+    },
   },
   async mounted() {
     await this.loadTopColumns();
-    await this.loadTopData();
     await this.loadBottomColumns();
-    await this.loadBottomData();
-    this.$nextTick(() => {
+    this.$nextTick(async () => {
+      await this.loadTopData();
       this.resize();
     });
   },
   setup() {
     const refTopView = ref(null);
     const refBottomView = ref(null);
-    return { refTopView, refBottomView };
+    const refTopTable = ref(null);
+    return { refTopView, refBottomView, refTopTable };
   },
 };
 </script>
diff --git a/src/views/examples/report.vue b/src/views/examples/report.vue
index 311fa7e..5f41da9 100644
--- a/src/views/examples/report.vue
+++ b/src/views/examples/report.vue
@@ -5,37 +5,29 @@
         <Row>
           <Col span="6">
             <FormItem label="渚涘簲鍟嗙紪鐮侊細">
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Input v-model="form.SupplierCode" size="small">
+                <template #suffix>
+                  <Icon type="ios-more" />
+                </template>
+              </Input>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="渚涘簲鍟嗗悕绉帮細">
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Input v-model="form.SupplierName" size="small"></Input>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="ASN鍗曞彿锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
+              <Input v-model="form.ASNCode" size="small">
+                <template #suffix> <Icon type="ios-more" /> </template
               ></Input>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="瀛樿揣锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
+              <Input v-model="form.Invertory" size="small">
+                <template #suffix> <Icon type="ios-more" /> </template
               ></Input>
             </FormItem>
           </Col>
@@ -43,106 +35,114 @@
         <Row>
           <Col span="6">
             <FormItem label="浠h喘璁㈠崟鍙凤細">
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
+              <Input v-model="form.PurchaseOrderNo" size="small">
+                <template #suffix> <Icon type="ios-more" /> </template
               ></Input>
             </FormItem>
           </Col>
           <Col span="12">
             <FormItem label="璁㈠崟浜ゆ湡锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
+              <DatePicker
+                type="daterange"
+                v-model="form.OrderDate"
+                separator=" 鑷�"
                 size="small"
-              ></Input>
+                style="width: 100%"
+              ></DatePicker>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="鐘舵�锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Select v-model="form.State" size="small">
+                <Option :value="0">涓�/Option>
+                <Option :value="1">浜�/Option>
+                <Option :value="2">涓�/Option>
+              </Select>
             </FormItem>
           </Col>
         </Row>
         <Row>
           <Col span="6">
             <FormItem label="閲囪喘鍛橈細">
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Input v-model="form.Purchase" size="small"></Input>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="閲囪喘绫诲瀷锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Select v-model="form.PurchaseType" size="small">
+                <Option :value="0">涓�/Option>
+                <Option :value="1">浜�/Option>
+                <Option :value="2">涓�/Option>
+              </Select>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="鍗曟嵁绫诲瀷锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Select v-model="form.DocumentType" size="small">
+                <Option :value="0">涓�/Option>
+                <Option :value="1">浜�/Option>
+                <Option :value="2">涓�/Option>
+              </Select>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="鍏抽棴鐘舵�锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Select v-model="form.CloseState" size="small">
+                <Option :value="0">涓�/Option>
+                <Option :value="1">浜�/Option>
+                <Option :value="2">涓�/Option>
+              </Select>
             </FormItem>
           </Col>
         </Row>
         <Row>
           <Col span="6">
             <FormItem label="鏄惁鍒拌揣瀹屾垚锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <Select v-model="form.IsArrived" size="small">
+                <Option :value="0">涓�/Option>
+                <Option :value="1">浜�/Option>
+                <Option :value="2">涓�/Option>
+              </Select>
             </FormItem>
           </Col>
           <Col span="6">
             <FormItem label="ASN鍒涘缓鏃ユ湡锛�>
-              <Input
-                v-model="form.WH_Code"
-                placeholder="Enter something..."
-                size="small"
-              ></Input>
+              <DatePicker type="date" v-model="form.CreateTime" size="small" />
             </FormItem>
           </Col>
         </Row>
       </Form>
     </div>
     <div class="buttons">
-      <Button type="success" size="small" @click="onExportClick">瀵煎嚭</Button>
+      <Space>
+        <Button type="primary" size="small" @click="onSearchClick">鏌ヨ</Button>
+        <Button type="primary" size="small" @click="onClearClick">娓呯┖</Button>
+        <Button type="success" size="small" @click="onExportClick">瀵煎嚭</Button>
+      </Space>
     </div>
-    <DataTable
-      :tableHeight="tableHeight"
-      :columns="columns"
-      :data="data"
-    ></DataTable>
+    <div class="table">
+      <DataTable
+        :tableHeight="tableHeight"
+        :columns="columns"
+        :data="data"
+        :page="page"
+        :limit="limit"
+        :limits="limits"
+        :total="total"
+        :loading="loading"
+        @on-change="onPageChange"
+        @on-page-size-change="onPageSizeChange"
+        @on-prev="onPrev"
+        @on-next="onNext"
+      ></DataTable>
+    </div>
   </div>
 </template>
 
 <script>
 import { ref } from "vue";
 import DataTable from "@/components/examples/data-table.vue";
+import { exportExcel } from "./excel.js";
 export default {
   name: "ExampleReportView",
   components: {
@@ -153,85 +153,172 @@
       columns: [],
       data: [],
       tableHeight: 0,
+      // 鏌ヨ琛ㄥ崟鐨勫畾涔�       form: {
-        WH_Code: "",
+        SupplierCode: "",
+        ASNName: "",
+        ASNCode: "",
+        Invertory: "",
+        PurchaseOrderNo: "",
+        OrderDate: [],
+        State: "",
+        Purchase: "",
+        PurchaseType: "",
+        DocumentType: "",
+        CloseState: "",
+        IsArrived: "",
+        ASNCreateDate: "",
       },
+      // 鍒嗛〉鍙傛暟
+      page: 1,
+      limit: 30,
+      limits: [10, 20, 30],
+      total: 0,
+      loading: false,
     };
   },
   methods: {
     async loadColumns() {
       this.columns = [
         {
-          type: "index",
+          key: "index",
           title: " ",
           render: (h, { index }) => {
-            return h(index);
+            return h("div", (this.page - 1) * this.limit + index + 1);
           },
-          width: 50,
+          width: 40,
+          align: "center",
         },
         {
-          key: "",
+          key: "ASNCode",
           title: "ASN鍗曞彿",
           width: 100,
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "",
+          key: "CloseState",
           title: "鍏抽棴鐘舵�",
           width: 100,
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "",
+          key: "InventoryState",
           title: "瀛樿揣鐘舵�",
           width: 100,
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "",
+          key: "InvertoryName",
           title: "瀛樿揣鍚嶇О",
           width: 100,
+          resizable: true,
         },
         {
-          key: "",
+          key: "SpecModel",
           title: "瑙勬牸鍨嬪彿",
           width: 100,
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "",
+          key: "AuditState",
           title: "瀹℃牳鐘舵�",
           width: 100,
+          resizable: true,
         },
         {
-          key: "",
+          key: "SendDate",
           title: "鍙戣揣鏃ユ湡",
           width: 100,
+          sortable: true,
+          resizable: true,
         },
         {
-          key: "",
+          key: "SupplierCode",
           title: "渚涘簲鍟嗙紪鐮�,
           width: 100,
+          resizable: true,
         },
         {
-          key: "",
+          key: "SupplierName",
           title: "渚涘簲鍟嗗悕绉�,
           width: 100,
+          resizable: true,
         },
         {
-          key: "",
+          key: "Creator",
           title: "鍒涘缓浜�,
           width: 100,
         },
         {
-          key: "",
+          key: "CreateTime",
           title: "鍒涘缓鏃堕棿",
           width: 100,
+          sortable: true,
         },
         {
-          key: "",
+          key: "PurchasePoint",
           title: "閲囪喘鐐�,
           width: 100,
         },
       ];
     },
-    async loadData() {},
+    // 鍔犺浇鏁版嵁琛�+    async loadData() {
+      let msg = this.$Message.loading("姝e湪鍔犺浇鏁版嵁...");
+      this.loading = true;
+
+      let { data, total } = await this.fakeDataList();
+
+      msg();
+
+      this.data = data;
+      this.total = total;
+      this.loading = false;
+    },
+    // 鍔犺浇鍏ㄩ儴鏁版嵁(瀵煎嚭)
+    async loadAllData() {
+      let msg = this.$Message.loading("姝e湪鍔犺浇鏁版嵁...");
+      this.loading = true;
+
+      let { data } = await this.fakeDataList(this.total);
+
+      msg();
+
+      this.loading = false;
+
+      return data;
+    },
+    // 娴嬭瘯鏁版嵁鍒楄〃
+    fakeDataList(limit) {
+      return new Promise((resolve) => {
+        let total = 99;
+        let fakeList = [];
+        for (let i = 0; i < (limit || this.limit); i++) {
+          let row = {
+            ASNCode: `ASN鍗曞彿-${(this.page - 1) * this.limit + i + 1}`,
+            CloseState: `鍏抽棴鐘舵�-${(this.page - 1) * this.limit + i + 1}`,
+            InventoryState: `瀛樿揣鐘舵�-${(this.page - 1) * this.limit + i + 1}`,
+            InvertoryName: `瀛樿揣鍚嶇О-${(this.page - 1) * this.limit + i + 1}`,
+            SpecModel: `瑙勬牸鍨嬪彿-${(this.page - 1) * this.limit + i + 1}`,
+            AuditState: `瀹℃牳鐘舵�-${(this.page - 1) * this.limit + i + 1}`,
+            SendDate: `鍙戣揣鏃ユ湡-${(this.page - 1) * this.limit + i + 1}`,
+            SupplierCode: `渚涘簲鍟嗙紪鐮�${(this.page - 1) * this.limit + i + 1}`,
+            SupplierName: `渚涘簲鍟嗗悕绉�${(this.page - 1) * this.limit + i + 1}`,
+            Creator: `鍒涘缓浜�${(this.page - 1) * this.limit + i + 1}`,
+            CreateTime: `鍒涘缓鏃堕棿-${(this.page - 1) * this.limit + i + 1}`,
+            PurchasePoint: `閲囪喘鐐�${(this.page - 1) * this.limit + i + 1}`,
+          };
+          if ((this.page - 1) * this.limit + i + 1 < 100) fakeList.push(row);
+        }
+        setTimeout(() => {
+          resolve({ data: fakeList, total });
+        }, 1 * 1000);
+      });
+    },
     resize() {
       let height =
         this.refView.clientHeight -
@@ -241,11 +328,48 @@
         9;
       this.tableHeight = height;
     },
-    onExportClick() {},
+    onSearchClick() {
+      alert(JSON.stringify(this.form, "", "    "));
+    },
+    onClearClick() {
+      this.form.SupplierCode = "";
+      this.form.ASNName = "";
+      this.form.ASNCode = "";
+      this.form.Invertory = "";
+      this.form.PurchaseOrderNo = "";
+      this.form.OrderDate = [];
+      this.form.State = "";
+      this.form.Purchase = "";
+      this.form.PurchaseType = "";
+      this.form.DocumentType = "";
+      this.form.CloseState = "";
+      this.form.IsArrived = "";
+      this.form.ASNCreateDate = "";
+    },
+    async onExportClick() {
+      let datas = await this.loadAllData();
+      await exportExcel(this, datas);
+    },
+    onPageChange(page) {
+      this.page = page;
+      this.loadData();
+    },
+    onPageSizeChange(limit) {
+      this.limit = limit;
+      this.loadData();
+    },
+    onPrev(page) {
+      this.page = page;
+      this.loadData();
+    },
+    onNext(page) {
+      this.page = page;
+      this.loadData();
+    },
   },
   async mounted() {
     await this.loadColumns();
-    await this.loadData();
+    this.loadData();
     this.$nextTick(() => {
       this.resize();
     });
@@ -264,9 +388,17 @@
   .buttons {
     margin-bottom: 9px;
   }
+  .table {
+    height: calc(100% - 170px);
+  }
   .ivu-form .ivu-form-item-label,
   .ivu-checkbox-wrapper {
     font-size: 12px;
   }
+  .ivu-input-wrapper {
+    .ivu-icon {
+      cursor: pointer;
+    }
+  }
 }
 </style>
\ No newline at end of file

--
Gitblit v1.9.1