shaogen1995 2 anos atrás
pai
commit
0da4f0e114

+ 318 - 0
package-lock.json

@@ -20,6 +20,7 @@
         "dayjs": "^1.11.7",
         "echarts": "^5.4.0",
         "js-base64": "^3.7.3",
+        "js-export-excel": "^1.1.4",
         "react": "^18.2.0",
         "react-dom": "^18.2.0",
         "react-lazyimg-component": "^1.0.1",
@@ -4412,6 +4413,21 @@
         "node": ">=8.9"
       }
     },
+    "node_modules/adler-32": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.2.0.tgz",
+      "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==",
+      "dependencies": {
+        "exit-on-epipe": "~1.0.1",
+        "printj": "~1.1.0"
+      },
+      "bin": {
+        "adler32": "bin/adler32.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/agent-base": {
       "version": "6.0.2",
       "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
@@ -5094,6 +5110,11 @@
         "node": ">=8"
       }
     },
+    "node_modules/blob.js": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/blob.js/-/blob.js-1.0.1.tgz",
+      "integrity": "sha512-TkPuWPeCHBbN+LWFg7BlXdSh6stRxwmAbuirKfiiHTMmo/uQfKFQMx2jrxVUkueKRiG+Tc7Os1Zn618Yc0MZpg=="
+    },
     "node_modules/bluebird": {
       "version": "3.7.2",
       "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz",
@@ -5307,6 +5328,26 @@
         "node": ">=4"
       }
     },
+    "node_modules/cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "dependencies": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/cfb/node_modules/adler-32": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
+      "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/chalk": {
       "version": "2.4.2",
       "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
@@ -5438,6 +5479,26 @@
         "node": ">= 4.0"
       }
     },
+    "node_modules/codepage": {
+      "version": "1.14.0",
+      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.14.0.tgz",
+      "integrity": "sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw==",
+      "dependencies": {
+        "commander": "~2.14.1",
+        "exit-on-epipe": "~1.0.1"
+      },
+      "bin": {
+        "codepage": "bin/codepage.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/codepage/node_modules/commander": {
+      "version": "2.14.1",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-2.14.1.tgz",
+      "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
+    },
     "node_modules/collect-v8-coverage": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
@@ -5657,6 +5718,17 @@
         "node": ">=10"
       }
     },
+    "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/cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -7379,6 +7451,14 @@
         "node": ">= 0.8.0"
       }
     },
+    "node_modules/exit-on-epipe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
+      "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/expect": {
       "version": "27.5.1",
       "resolved": "https://registry.npmmirror.com/expect/-/expect-27.5.1.tgz",
@@ -7546,6 +7626,11 @@
         "webpack": "^4.0.0 || ^5.0.0"
       }
     },
+    "node_modules/file-saver": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-1.3.8.tgz",
+      "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg=="
+    },
     "node_modules/filelist": {
       "version": "1.0.4",
       "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz",
@@ -7852,6 +7937,14 @@
         "node": ">= 0.6"
       }
     },
+    "node_modules/frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/fraction.js": {
       "version": "4.2.0",
       "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz",
@@ -10813,6 +10906,17 @@
       "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.3.tgz",
       "integrity": "sha512-PAr6Xg2jvd7MCR6Ld9Jg3BmTcjYsHEBx1VlwEwULb/qowPf5VD9kEMagj23Gm7JRnSvE/Da/57nChZjnvL8v6A=="
     },
+    "node_modules/js-export-excel": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/js-export-excel/-/js-export-excel-1.1.4.tgz",
+      "integrity": "sha512-19m7e3Gnn4CRfHXoFrLYj4fFfJ/KpvI7HRRn25p4GXYD+AlTV+1oU24NH6S904Ksi44tSx7futxhouOPAQ22oQ==",
+      "dependencies": {
+        "blob.js": "^1.0.1",
+        "file-saver": "^1.3.3",
+        "script-loader": "0.7.2",
+        "xlsx": "0.16.3"
+      }
+    },
     "node_modules/js-sdsl": {
       "version": "4.1.5",
       "resolved": "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.1.5.tgz",
@@ -13083,6 +13187,17 @@
         "node": ">=10"
       }
     },
+    "node_modules/printj": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz",
+      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==",
+      "bin": {
+        "printj": "bin/printj.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -13256,6 +13371,11 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmmirror.com/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q=="
+    },
     "node_modules/rc-align": {
       "version": "4.0.12",
       "resolved": "https://registry.npmmirror.com/rc-align/-/rc-align-4.0.12.tgz",
@@ -14764,6 +14884,14 @@
         "node": ">= 10.13.0"
       }
     },
+    "node_modules/script-loader": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmmirror.com/script-loader/-/script-loader-0.7.2.tgz",
+      "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
+      "dependencies": {
+        "raw-loader": "~0.5.1"
+      }
+    },
     "node_modules/scroll-into-view-if-needed": {
       "version": "2.2.31",
       "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
@@ -15099,6 +15227,17 @@
       "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
       "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
     },
+    "node_modules/ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "dependencies": {
+        "frac": "~1.1.2"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/stable": {
       "version": "0.1.8",
       "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz",
@@ -16474,6 +16613,22 @@
         "node": ">= 0.4"
       }
     },
+    "node_modules/wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
     "node_modules/word-wrap": {
       "version": "1.2.3",
       "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -16848,6 +17003,33 @@
         }
       }
     },
+    "node_modules/xlsx": {
+      "version": "0.16.3",
+      "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.16.3.tgz",
+      "integrity": "sha512-LInZ1OK6vpe+Em8XDZ5gDH3WixARwxI7UWc+3chLeafI6gUwECEgL43k4Tjbs1uRfkxpM7wQFy5DLE0hFBRqRw==",
+      "dependencies": {
+        "adler-32": "~1.2.0",
+        "cfb": "^1.1.4",
+        "codepage": "~1.14.0",
+        "commander": "~2.17.1",
+        "crc-32": "~1.2.0",
+        "exit-on-epipe": "~1.0.1",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      },
+      "bin": {
+        "xlsx": "bin/xlsx.njs"
+      },
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/xlsx/node_modules/commander": {
+      "version": "2.17.1",
+      "resolved": "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz",
+      "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
+    },
     "node_modules/xml-name-validator": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
@@ -20153,6 +20335,15 @@
         "regex-parser": "^2.2.11"
       }
     },
+    "adler-32": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.2.0.tgz",
+      "integrity": "sha512-/vUqU/UY4MVeFsg+SsK6c+/05RZXIHZMGJA+PX5JyWI0ZRcBpupnRuPLU/NXXoFwMYCPCoxIfElM2eS+DUXCqQ==",
+      "requires": {
+        "exit-on-epipe": "~1.0.1",
+        "printj": "~1.1.0"
+      }
+    },
     "agent-base": {
       "version": "6.0.2",
       "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz",
@@ -20698,6 +20889,11 @@
       "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
       "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
     },
+    "blob.js": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/blob.js/-/blob.js-1.0.1.tgz",
+      "integrity": "sha512-TkPuWPeCHBbN+LWFg7BlXdSh6stRxwmAbuirKfiiHTMmo/uQfKFQMx2jrxVUkueKRiG+Tc7Os1Zn618Yc0MZpg=="
+    },
     "bluebird": {
       "version": "3.7.2",
       "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz",
@@ -20876,6 +21072,22 @@
       "resolved": "https://registry.npmmirror.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz",
       "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw=="
     },
+    "cfb": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz",
+      "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==",
+      "requires": {
+        "adler-32": "~1.3.0",
+        "crc-32": "~1.2.0"
+      },
+      "dependencies": {
+        "adler-32": {
+          "version": "1.3.1",
+          "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz",
+          "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A=="
+        }
+      }
+    },
     "chalk": {
       "version": "2.4.2",
       "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz",
@@ -20981,6 +21193,22 @@
         "q": "^1.1.2"
       }
     },
+    "codepage": {
+      "version": "1.14.0",
+      "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.14.0.tgz",
+      "integrity": "sha512-iz3zJLhlrg37/gYRWgEPkaFTtzmnEv1h+r7NgZum2lFElYQPi0/5bnmuDfODHxfp0INEfnRqyfyeIJDbb7ahRw==",
+      "requires": {
+        "commander": "~2.14.1",
+        "exit-on-epipe": "~1.0.1"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.14.1",
+          "resolved": "https://registry.npmmirror.com/commander/-/commander-2.14.1.tgz",
+          "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw=="
+        }
+      }
+    },
     "collect-v8-coverage": {
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
@@ -21170,6 +21398,11 @@
         "yaml": "^1.10.0"
       }
     },
+    "crc-32": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz",
+      "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ=="
+    },
     "cross-spawn": {
       "version": "7.0.3",
       "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -22499,6 +22732,11 @@
       "resolved": "https://registry.npmmirror.com/exit/-/exit-0.1.2.tgz",
       "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ=="
     },
+    "exit-on-epipe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz",
+      "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw=="
+    },
     "expect": {
       "version": "27.5.1",
       "resolved": "https://registry.npmmirror.com/expect/-/expect-27.5.1.tgz",
@@ -22646,6 +22884,11 @@
         "schema-utils": "^3.0.0"
       }
     },
+    "file-saver": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-1.3.8.tgz",
+      "integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg=="
+    },
     "filelist": {
       "version": "1.0.4",
       "resolved": "https://registry.npmmirror.com/filelist/-/filelist-1.0.4.tgz",
@@ -22878,6 +23121,11 @@
       "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz",
       "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
     },
+    "frac": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz",
+      "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA=="
+    },
     "fraction.js": {
       "version": "4.2.0",
       "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.2.0.tgz",
@@ -25188,6 +25436,17 @@
       "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.3.tgz",
       "integrity": "sha512-PAr6Xg2jvd7MCR6Ld9Jg3BmTcjYsHEBx1VlwEwULb/qowPf5VD9kEMagj23Gm7JRnSvE/Da/57nChZjnvL8v6A=="
     },
+    "js-export-excel": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/js-export-excel/-/js-export-excel-1.1.4.tgz",
+      "integrity": "sha512-19m7e3Gnn4CRfHXoFrLYj4fFfJ/KpvI7HRRn25p4GXYD+AlTV+1oU24NH6S904Ksi44tSx7futxhouOPAQ22oQ==",
+      "requires": {
+        "blob.js": "^1.0.1",
+        "file-saver": "^1.3.3",
+        "script-loader": "0.7.2",
+        "xlsx": "0.16.3"
+      }
+    },
     "js-sdsl": {
       "version": "4.1.5",
       "resolved": "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.1.5.tgz",
@@ -26779,6 +27038,11 @@
         }
       }
     },
+    "printj": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmmirror.com/printj/-/printj-1.1.2.tgz",
+      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
+    },
     "process-nextick-args": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
@@ -26924,6 +27188,11 @@
         }
       }
     },
+    "raw-loader": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmmirror.com/raw-loader/-/raw-loader-0.5.1.tgz",
+      "integrity": "sha512-sf7oGoLuaYAScB4VGr0tzetsYlS8EJH6qnTCfQ/WVEa89hALQ4RQfCKt5xCyPQKPDUbVUAIP1QsxAwfAjlDp7Q=="
+    },
     "rc-align": {
       "version": "4.0.12",
       "resolved": "https://registry.npmmirror.com/rc-align/-/rc-align-4.0.12.tgz",
@@ -28017,6 +28286,14 @@
         "ajv-keywords": "^3.5.2"
       }
     },
+    "script-loader": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmmirror.com/script-loader/-/script-loader-0.7.2.tgz",
+      "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==",
+      "requires": {
+        "raw-loader": "~0.5.1"
+      }
+    },
     "scroll-into-view-if-needed": {
       "version": "2.2.31",
       "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
@@ -28306,6 +28583,14 @@
       "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
       "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
     },
+    "ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
+      "requires": {
+        "frac": "~1.1.2"
+      }
+    },
     "stable": {
       "version": "0.1.8",
       "resolved": "https://registry.npmmirror.com/stable/-/stable-0.1.8.tgz",
@@ -29387,6 +29672,16 @@
         "is-typed-array": "^1.1.9"
       }
     },
+    "wmf": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz",
+      "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw=="
+    },
+    "word": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz",
+      "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA=="
+    },
     "word-wrap": {
       "version": "1.2.3",
       "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -29717,6 +30012,29 @@
       "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
       "requires": {}
     },
+    "xlsx": {
+      "version": "0.16.3",
+      "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.16.3.tgz",
+      "integrity": "sha512-LInZ1OK6vpe+Em8XDZ5gDH3WixARwxI7UWc+3chLeafI6gUwECEgL43k4Tjbs1uRfkxpM7wQFy5DLE0hFBRqRw==",
+      "requires": {
+        "adler-32": "~1.2.0",
+        "cfb": "^1.1.4",
+        "codepage": "~1.14.0",
+        "commander": "~2.17.1",
+        "crc-32": "~1.2.0",
+        "exit-on-epipe": "~1.0.1",
+        "ssf": "~0.11.2",
+        "wmf": "~1.0.1",
+        "word": "~0.3.0"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "2.17.1",
+          "resolved": "https://registry.npmmirror.com/commander/-/commander-2.17.1.tgz",
+          "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg=="
+        }
+      }
+    },
     "xml-name-validator": {
       "version": "3.0.0",
       "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz",

+ 1 - 0
package.json

@@ -15,6 +15,7 @@
     "dayjs": "^1.11.7",
     "echarts": "^5.4.0",
     "js-base64": "^3.7.3",
+    "js-export-excel": "^1.1.4",
     "react": "^18.2.0",
     "react-dom": "^18.2.0",
     "react-lazyimg-component": "^1.0.1",

+ 3 - 0
src/assets/styles/base.css

@@ -54,6 +54,9 @@ textarea{
 :root {
   --themeColor: #9F1927
 }
+a {
+  color: var(--themeColor);
+}
 
 /* 按钮的危险颜色 */
 .ant-btn-text.ant-btn-dangerous {

+ 1 - 2
src/components/ImageLazy/index.tsx

@@ -40,8 +40,7 @@ function ImageLazy({ width = 100, height = 100, src, noLook }: Props) {
       <div className="lazyBox">
         <Lazyimg
           onLoad={onLoad}
-          // src={baseURL + src}
-          src={src}
+          src={baseURL + src}
           width={width}
           height={height}
           alt=""

+ 4 - 15
src/components/LookObjTable/index.tsx

@@ -81,7 +81,7 @@ function LookObjTable({ data, y }: Props) {
       { id: 2, value: "video", label: "视频文件" },
       { id: 3, value: "audio", label: "音频文件" },
       { id: 4, value: "model", label: "三维模型" },
-      { id: 5, value: "file", label: "文档资料" },
+      { id: 5, value: "doc", label: "文档资料" },
     ];
   }, []);
   const [fileSelect, setFileSelect] = useState("img");
@@ -127,7 +127,7 @@ function LookObjTable({ data, y }: Props) {
     });
   }, [dispatch]);
 
-  // 外层表格格式
+  // 里面表格格式
   const columns2 = useMemo(() => {
     const tempArr = [
       {
@@ -153,6 +153,7 @@ function LookObjTable({ data, y }: Props) {
   return (
     <div>
       <Table
+        size='small'
         scroll={{ y }}
         dataSource={data}
         columns={columns}
@@ -246,19 +247,6 @@ function LookObjTable({ data, y }: Props) {
               <p>666666666</p>
             </div>
           </div>
-
-          {/* <div className="rowThree">
-            <div>
-              <span>通长:</span>123
-            </div>
-            <div>
-              <span>通宽:</span>123
-            </div>
-            <div>
-              <span>通高:</span>123
-            </div>            
-          </div> */}
-
           <div className="rowFull">
             <span>外形尺寸:</span>
             <p>(通长)66666666&emsp;(通宽)66666666&emsp;(通高)66666666</p>
@@ -344,6 +332,7 @@ function LookObjTable({ data, y }: Props) {
 
           {/* 表格主体 */}
           <Table
+            size='small'
             scroll={{ y: 300 }}
             dataSource={results[fileSelect]}
             columns={columns2}

+ 62 - 73
src/components/ObjectAdd/index.tsx

@@ -25,14 +25,18 @@ import "./index.css";
 import { useDispatch, useSelector } from "react-redux";
 import { RootState } from "@/store";
 import ImageLazy from "../ImageLazy";
+import { object1AddUpFileAPI } from "@/store/action/object1";
+import dayjs from "dayjs";
 const { Option } = Select;
 
 type Props = {
   id: any;
   colsePage: any;
+  editId?: any;
+  dirCode: any;
 };
 
-function ObjectAdd({ id, colsePage }: Props) {
+function ObjectAdd({ id, colsePage, editId, dirCode }: Props) {
   const dispatch = useDispatch();
 
   // 没有通过校验
@@ -113,42 +117,11 @@ function ObjectAdd({ id, colsePage }: Props) {
   };
 
   // 表格数据
-  useEffect(() => {
-    dispatch({
-      type: "login/setFileData",
-      payload: {
-        img: [
-          {
-            id: 1,
-            name: "图片1",
-            time: "2022-12-13",
-            img: "https://ts1.cn.mm.bing.net/th/id/R-C.6d2d3fecd79a96e43d1a410640d7199b?rik=B7RCgF82Vb7P0A&riu=http%3a%2f%2f5b0988e595225.cdn.sohucs.com%2fimages%2f20190831%2f3e03e9c2473c40b180aa99a37c0589fa.jpeg&ehk=JXdgMrjnolHlMkdX9N0K7%2fzBc9wi7FSFDjSGclreQbI%3d&risl=&pid=ImgRaw&r=0",
-          },
-          {
-            id: 2,
-            name: "图片2",
-            time: "2022-12-14",
-            img: "",
-          },
-          {
-            id: 3,
-            name: "图片3",
-            time: "2022-12-14",
-            img: "",
-          },
-        ],
-        video: [
-          {
-            id: 4,
-            name: "视频1",
-            time: "2022-12-14",
-            img: "",
-          },
-        ],
-        audio: [],
-      },
-    });
-  }, [dispatch]);
+  // useEffect(() => {
+  //   dispatch({
+  //     type: "login/setFileData",
+  //     payload: {}});
+  // }, [dispatch]);
 
   const results = useSelector((state: RootState) => state.loginStore.fileData);
 
@@ -169,11 +142,11 @@ function ObjectAdd({ id, colsePage }: Props) {
     const tempArr = [
       {
         title: "附件名称",
-        dataIndex: "name",
+        dataIndex: "fileName",
       },
       {
         title: "上传时间",
-        dataIndex: "time",
+        dataIndex: "createTime",
       },
       {
         title: "操作",
@@ -202,7 +175,7 @@ function ObjectAdd({ id, colsePage }: Props) {
         title: "缩略图",
         render: (item: any) => (
           <div className="tableImg">
-            <ImageLazy width={120} height={70} src={item.img} />
+            <ImageLazy width={120} height={70} src={item.filePath} />
           </div>
         ),
       });
@@ -211,9 +184,8 @@ function ObjectAdd({ id, colsePage }: Props) {
     return tempArr;
   }, [delOne, fileSelect]);
 
-  const [cover, setCover] = useState(
-    "http://project.4dage.com:8016/content/1_1001/img/20220810_1553241331042.JPG"
-  );
+  // 封面地址
+  const [cover, setCover] = useState("");
 
   const fileSelectList = useMemo(() => {
     return [
@@ -221,13 +193,13 @@ function ObjectAdd({ id, colsePage }: Props) {
       { id: 2, value: "video", label: "视频文件" },
       { id: 3, value: "audio", label: "音频文件" },
       { id: 4, value: "model", label: "三维模型" },
-      { id: 5, value: "file", label: "文档资料" },
+      { id: 5, value: "doc", label: "文档资料" },
     ];
   }, []);
 
   // 上传封面
   const myInput = useRef<HTMLInputElement>(null);
-  const handeUpPhoto = (e: React.ChangeEvent<HTMLInputElement>) => {
+  const handeUpPhoto = async (e: React.ChangeEvent<HTMLInputElement>) => {
     if (e.target.files) {
       // 拿到files信息
       const filesInfo = e.target.files[0];
@@ -242,15 +214,17 @@ function ObjectAdd({ id, colsePage }: Props) {
         e.target.value = "";
         return message.warning("最大支持10M!");
       }
-
-      // 测试代码
-      console.log("-------", filesInfo);
-
       // 创建FormData对象
       const fd = new FormData();
       // 把files添加进FormData对象(‘photo’为后端需要的字段)
+      fd.append("type", "thumb");
+      fd.append("dirCode", dirCode);
       fd.append("file", filesInfo);
-      // fd.append("type", "img");
+      const res: any = await object1AddUpFileAPI(fd);
+      if (res.code === 0) {
+        message.success("上传成功!");
+        setCover(res.data.filePath);
+      }
     }
   };
 
@@ -264,7 +238,7 @@ function ObjectAdd({ id, colsePage }: Props) {
     myInput2.current?.click();
   };
   const handeUpPhoto2 = useCallback(
-    (e: React.ChangeEvent<HTMLInputElement>) => {
+    async (e: React.ChangeEvent<HTMLInputElement>) => {
       if (e.target.files) {
         // 拿到files信息
         const filesInfo = e.target.files[0];
@@ -272,34 +246,48 @@ function ObjectAdd({ id, colsePage }: Props) {
         // 创建FormData对象
         const fd = new FormData();
         // 把files添加进FormData对象(‘photo’为后端需要的字段)
+        fd.append("type", fileSelect);
+        fd.append("dirCode", dirCode);
         fd.append("file", filesInfo);
-        // fd.append("type", "img");
 
+        const res: any = await object1AddUpFileAPI(fd);
         e.target.value = "";
-        if (upFileFlagRef.current) {
-          console.log("重新上传", upFileFlagRef.current);
-
-          const id = upFileFlagRef.current;
-          const data = {
-            ...results,
-            [fileSelect]: results[fileSelect].map((v: any) => {
-              if (id !== v.id) return v;
-              else
-                return {
-                  id: 10,
-                  name: "9999",
-                  time: "2022-12-14",
-                  img: "",
-                };
-            }),
-          };
-          dispatch({ type: "login/setFileData", payload: data });
-        } else {
-          console.log("新上传");
+        if (res.code === 0) {
+          message.success("上传成功!");
+          if (upFileFlagRef.current) {
+            const id = upFileFlagRef.current;
+            const data = {
+              ...results,
+              [fileSelect]: results[fileSelect].map((v: any) => {
+                if (id !== v.id) return v;
+                else
+                  return {
+                    ...res.data,
+                    id:Date.now(),
+                    createTime: dayjs(Date.now()).format("YYYY-MM-DD"),
+                  };
+              }),
+            };
+            dispatch({ type: "login/setFileData", payload: data });
+          } else {
+            const data = {
+              ...results,
+              [fileSelect]: [
+                {
+                  ...res.data,
+                  id:Date.now(),
+                  createTime: dayjs(Date.now()).format("YYYY-MM-DD"),
+                },
+                ...results[fileSelect],
+              ],
+            };
+
+            dispatch({ type: "login/setFileData", payload: data });
+          }
         }
       }
     },
-    [dispatch, fileSelect, results]
+    [dirCode, dispatch, fileSelect, results]
   );
 
   return (
@@ -650,6 +638,7 @@ function ObjectAdd({ id, colsePage }: Props) {
               {/* 表格主体 */}
               <div className="addTableBox_table">
                 <Table
+                  size="small"
                   scroll={{ y: 300 }}
                   dataSource={results[fileSelect]}
                   columns={columns}

+ 3 - 0
src/pages/Layout/index.module.scss

@@ -169,6 +169,9 @@
                 padding: 0 15px;
                 font-size: 16px;
                 margin-right: 50px;
+                &:hover{
+                  color: var(--themeColor);
+                }
               }
 
               .active {

+ 68 - 53
src/pages/ObjectSon/Object1/AddObject1/index.tsx

@@ -2,37 +2,51 @@ import BreadTit from "@/components/BreadTit";
 import history, { urlParameter } from "@/utils/history";
 import { Input, message, Select, Table, Popconfirm, Button } from "antd";
 import TextArea from "antd/es/input/TextArea";
-import React, { useEffect, useMemo, useRef, useState } from "react";
+import React, {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from "react";
 import { useLocation } from "react-router-dom";
 import styles from "./index.module.scss";
 import ObjectAdd from "@/components/ObjectAdd";
 import ImageLazy from "@/components/ImageLazy/index";
 import { useSelector } from "react-redux";
 import { RootState } from "@/store";
+import { object1AddAPI } from "@/store/action/object1";
 function AddObject1() {
   // 从仓库中获取藏品来源下拉数据
   const options = useSelector(
     (state: RootState) => state.loginStore.selectAll["文物来源"]
   );
+  // 顶部数据
+  const [addInfoTop, setAddInfoTop] = useState<any>({});
+
+  // 进入页面新增请求函数
+  const object1AddAPIFu = useCallback(async () => {
+    const res = await object1AddAPI();
+    setAddInfoTop({
+      ...res.data,
+      sourceName: options[0].name ? options[0].name : "",
+    });
+  }, [options]);
 
   // 获取地址栏参数
   const location = useLocation();
   const [urlParam, setUrlParam] = useState<any>({});
   useEffect(() => {
-    setUrlParam(urlParameter(location.search));
-  }, [location]);
+    const obj = urlParameter(location.search);
+    setUrlParam(obj);
 
-  // 顶部数据
-  const [addInfoTop, setAddInfoTop] = useState({
-    num: "DJ20221212009",
-    user: "admin",
-    laiyuan: options[0].name ? options[0].name : "",
-    txt: "",
-  });
+    if (obj.id) {
+    } else object1AddAPIFu();
+  }, [location, object1AddAPIFu]);
 
   // 藏品来源下拉框
   const handleChange = (value: string) => {
-    setAddInfoTop({ ...addInfoTop, laiyuan: value });
+    setAddInfoTop({ ...addInfoTop, sourceName: value });
   };
 
   // 表格数据
@@ -56,31 +70,16 @@ function AddObject1() {
   };
 
   const results = useMemo(() => {
-    return [
-      {
-        id: 1,
-        name: "图片1",
-        img: "https://ts1.cn.mm.bing.net/th/id/R-C.6d2d3fecd79a96e43d1a410640d7199b?rik=B7RCgF82Vb7P0A&riu=http%3a%2f%2f5b0988e595225.cdn.sohucs.com%2fimages%2f20190831%2f3e03e9c2473c40b180aa99a37c0589fa.jpeg&ehk=JXdgMrjnolHlMkdX9N0K7%2fzBc9wi7FSFDjSGclreQbI%3d&risl=&pid=ImgRaw&r=0",
-      },
-      { id: 2, name: "图片2", img: "https://ts1.cn.mm" },
-      {
-        id: 3,
-        name: "图片3",
-        img: "http://project.4dage.com:8016/content/1_1001/img/20220810_1553241331042.JPG",
-      },
-      { id: 4, name: "图片4", img: "3" },
-      { id: 5, name: "图片4", img: "4" },
-      { id: 6, name: "图片4", img: "5" },
-      { id: 7, name: "图片4", img: "6" },
-      { id: 8, name: "图片4", img: "7" },
-      { id: 9, name: "图片4", img: "8" },
-      { id: 10, name: "图片4", img: "9" },
-      {
-        id: 11,
-        name: "图片4",
-        img: "https://ts1.cn.mm.bing.net/th/id/R-C.3745122e5760fe2283195293d76bc1e0?rik=YBMOcCcn7CX6Ig&riu=http%3a%2f%2fup.deskcity.org%2fpic%2f20%2fe4%2f4d%2f20e44dce0fe116832ba890edaf2ede32.jpg&ehk=vldj1pqTKyKgirU8ck%2f%2bJWEhtPm22Owe5VEmGNMeLpA%3d&risl=&pid=ImgRaw&r=0",
-      },
-    ];
+    return [];
+  }, []);
+
+  // 点击添加或者编辑
+
+  const addId = useRef<any>(null);
+
+  const addPageFu = useCallback((id?: any) => {
+    addId.current = id;
+    setAddPage(true);
   }, []);
 
   const columns = useMemo(() => {
@@ -94,7 +93,27 @@ function AddObject1() {
         ),
       },
       {
-        title: "标题",
+        title: "藏品编号名称",
+        dataIndex: "name",
+      },
+      {
+        title: "藏品编号",
+        dataIndex: "name",
+      },
+      {
+        title: "藏品名称",
+        dataIndex: "name",
+      },
+      {
+        title: "类别",
+        dataIndex: "name",
+      },
+      {
+        title: "完残程度",
+        dataIndex: "name",
+      },
+      {
+        title: "年代",
         dataIndex: "name",
       },
       {
@@ -118,7 +137,7 @@ function AddObject1() {
         ),
       },
     ];
-  }, []);
+  }, [addPageFu]);
 
   // 点击返回
   const cancelFu = () => {
@@ -138,15 +157,6 @@ function AddObject1() {
   // 点击添加或者编辑出来页面
   const [addPage, setAddPage] = useState(false);
 
-  // 点击添加或者编辑
-
-  const addId = useRef<any>(null);
-
-  const addPageFu = (id?: any) => {
-    addId.current = id;
-    setAddPage(true);
-  };
-
   return (
     <div className={styles.AddObject1}>
       <div className="breadTit">
@@ -169,7 +179,7 @@ function AddObject1() {
             </div>
             <div>
               <span className="bs">登记人员:</span>
-              <Input style={{ width: 400 }} value={addInfoTop.user} disabled />
+              <Input style={{ width: 400 }} value={addInfoTop.creatorName} disabled />
             </div>
           </div>
           <div className="row">
@@ -178,7 +188,7 @@ function AddObject1() {
               <Select
                 placeholder="请选择"
                 style={{ width: 400 }}
-                value={addInfoTop.laiyuan}
+                value={addInfoTop.sourceName}
                 onChange={handleChange}
                 options={options.map((v: any) => ({
                   label: v.name,
@@ -190,9 +200,9 @@ function AddObject1() {
           <div className="rowAll">
             <span>登记说明:</span>
             <TextArea
-              value={addInfoTop.txt}
+              value={addInfoTop.description}
               onChange={(e) =>
-                setAddInfoTop({ ...addInfoTop, txt: e.target.value })
+                setAddInfoTop({ ...addInfoTop, description: e.target.value })
               }
               rows={3}
               placeholder="请输入"
@@ -222,7 +232,8 @@ function AddObject1() {
           {/* 表格主体 */}
           <div className="addTableBox_table">
             <Table
-              scroll={{ y: 280 }}
+              size="small"
+              scroll={{ y: 300 }}
               rowSelection={{
                 type: "checkbox",
                 ...rowSelection,
@@ -246,7 +257,11 @@ function AddObject1() {
       </div>
       {/* 点击添加或者编辑出来的页面 */}
       {addPage ? (
-        <ObjectAdd id={addId.current} colsePage={() => setAddPage(false)} />
+        <ObjectAdd
+          id={addId.current}
+          colsePage={() => setAddPage(false)}
+          dirCode={addInfoTop.id}
+        />
       ) : null}
     </div>
   );

+ 1 - 1
src/pages/ObjectSon/Object1/AuditObject1/index.tsx

@@ -93,7 +93,7 @@ function AuditObject1() {
 
         <div className="goodsInfo">
           {/* 封装的表格信息 */}
-          <LookObjTable data={tableList} y={220} />
+          <LookObjTable data={tableList} y={245} />
           <br />
           <div className="inputBox1">
             <div className="inputBoxTit">

+ 1 - 1
src/pages/ObjectSon/Object1/LookObject1/index.tsx

@@ -87,7 +87,7 @@ function LookObject1() {
         <div className="topTit">藏品信息</div>
         <div className="goodsInfo">
           {/* 封装的表格信息 */}
-          <LookObjTable data={tableList} y={300} />
+          <LookObjTable data={tableList} y={340} />
         </div>
         <div className="backBtn">
           <AuthButton

+ 1 - 1
src/pages/ObjectSon/Object1/index.tsx

@@ -266,7 +266,7 @@ export default function Object1() {
               columns={columns}
               rowKey="id"
               pagination={{
-                showQuickJumper:true,
+                showQuickJumper: true,
                 position: ["bottomCenter"],
                 showSizeChanger: true,
                 current: tableSelect.pageNum,

+ 26 - 0
src/pages/ObjectSon/Object2/LookObject2/index.css

@@ -0,0 +1,26 @@
+.LookObject2Model .ant-modal {
+  width: 1000px !important;
+}
+.LookObject2Model .moveLocBox {
+  border-top: 1px solid #ccc;
+  padding-top: 10px;
+}
+.LookObject2Model .moveLocBox > div {
+  display: flex;
+  align-items: center;
+  margin-bottom: 15px;
+}
+.LookObject2Model .moveLocBox > div > span {
+  font-weight: 700;
+  width: 80px;
+}
+.LookObject2Model .moveLocBox > div > p {
+  width: calc(100% - 90px);
+}
+.LookObject2Model .moveLocBox .moveBtn {
+  justify-content: center;
+}
+.LookObject2Model .logBox {
+  border-top: 1px solid #ccc;
+  padding-top: 10px;
+}

+ 28 - 0
src/pages/ObjectSon/Object2/LookObject2/index.less

@@ -0,0 +1,28 @@
+.LookObject2Model{
+  .ant-modal{
+    width: 1000px !important;
+  }
+  .moveLocBox{
+    border-top: 1px solid #ccc;
+    padding-top: 10px;
+    &>div{
+      display: flex;
+      align-items: center;
+      margin-bottom: 15px;
+      &>span{
+        font-weight: 700;
+        width: 80px;
+      }
+      &>p{
+        width: calc(100% - 90px);
+      }
+    }
+    .moveBtn{
+      justify-content: center;
+    }
+  }
+  .logBox{
+    border-top: 1px solid #ccc;
+    padding-top: 10px;
+  }
+}

+ 100 - 3
src/pages/ObjectSon/Object2/LookObject2/index.module.scss

@@ -1,5 +1,102 @@
-.LookObject2{
-  :global{
-    
+.LookObject2 {
+  :global {
+    .objectSonMain {
+      padding: 0px 30px;
+
+      .topInfoBox {
+        width: 100%;
+        display: flex;
+        height: 370px;
+
+        .topInfoBoxL {
+          display: flex;
+          align-items: center;
+          padding-top: 20px;
+          width: 300px;
+          margin-right: 20px;
+        }
+
+        .topInfoBoxR {
+          padding-top: 10px;
+          width: calc(100% - 320px);
+
+          .topInfoBoxRTit{
+            margin-bottom: 10px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            padding: 0 10px 8px;
+            border-bottom: 1px solid #ccc;
+            &>div{
+              display: flex;
+              align-items: center;
+              &>h1{
+                font-size: 20px;
+              }
+              .bs{
+                margin-left: 10px;
+                color: #fff;
+                height: 20px;
+                line-height: 20px;
+                padding: 0 5px;
+                border-radius: 3px;
+                font-size: 12px;
+                background-color: var(--themeColor);
+              }
+            }
+          }
+
+          .topInfoBoxRTxt {
+            .row {
+              display: flex;
+              width: 100%;
+
+              &>div {
+                cursor: pointer;
+                padding: 0 5px;
+                width: 50%;
+                display: flex;
+                border: 1px solid #ccc;
+                height: 26px;
+                line-height: 24px;
+
+                span {
+                  font-weight: 700;
+                  display: inline-block;
+                  width: 100px;
+                  text-align: right;
+                }
+
+                p {
+                  overflow: hidden;
+                  text-overflow: ellipsis;
+                  white-space: nowrap;
+                  width: calc(100% - 110px);
+                }
+              }
+            }
+          }
+
+        }
+      }
+      .tableInfoBox{
+        width: 100%;
+        height: 265px;
+        .tableInfoBoxTit{
+          margin-bottom: 5px;
+          display: flex;
+          align-items: center;
+          .rowTit{
+            font-weight: 700;
+          }
+        }
+      }
+      .backBtn{
+        height: 40px;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+      }
+    }
   }
 }

+ 419 - 2
src/pages/ObjectSon/Object2/LookObject2/index.tsx

@@ -1,10 +1,24 @@
+import AuthButton from "@/components/AuthButton";
 import BreadTit from "@/components/BreadTit";
+import ImageLazy from "@/components/ImageLazy";
+import ObjectAdd from "@/components/ObjectAdd";
+import { RootState } from "@/store";
 import history, { urlParameter } from "@/utils/history";
-import { Button } from "antd";
-import React, { useEffect, useRef } from "react";
+import { Button, Cascader, Modal, Select, Table } from "antd";
+import React, {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from "react";
+import { useDispatch, useSelector } from "react-redux";
 import { useLocation } from "react-router-dom";
 import styles from "./index.module.scss";
+import "./index.css";
+import LookObject2Log from "./table";
 function LookObject2() {
+  const dispatch = useDispatch();
   // 获取地址栏参数
   const location = useLocation();
   const urlParamRef = useRef<any>({});
@@ -20,6 +34,149 @@ function LookObject2() {
       state: { k: urlParamRef.current.k ? urlParamRef.current.k : "1" },
     });
   };
+
+  // 附件类型下拉框
+
+  const fileSelectList = useMemo(() => {
+    return [
+      { id: 1, value: "img", label: "高清图片" },
+      { id: 2, value: "video", label: "视频文件" },
+      { id: 3, value: "audio", label: "音频文件" },
+      { id: 4, value: "model", label: "三维模型" },
+      { id: 5, value: "doc", label: "文档资料" },
+    ];
+  }, []);
+  const [fileSelect, setFileSelect] = useState("img");
+  const fileSelectChangeFu = (value: string) => {
+    setFileSelect(value);
+  };
+
+  // 里面的表格数据
+  const results = useSelector((state: RootState) => state.loginStore.fileData);
+  useEffect(() => {
+    dispatch({
+      type: "login/setFileData",
+      payload: {
+        img: [
+          {
+            id: 1,
+            name: "图片1",
+            time: "2022-12-13",
+            img: "https://ts1.cn.mm.bing.net/th/id/R-C.6d2d3fecd79a96e43d1a410640d7199b?rik=B7RCgF82Vb7P0A&riu=http%3a%2f%2f5b0988e595225.cdn.sohucs.com%2fimages%2f20190831%2f3e03e9c2473c40b180aa99a37c0589fa.jpeg&ehk=JXdgMrjnolHlMkdX9N0K7%2fzBc9wi7FSFDjSGclreQbI%3d&risl=&pid=ImgRaw&r=0",
+          },
+          {
+            id: 2,
+            name: "图片2",
+            time: "2022-12-14",
+            img: "",
+          },
+          {
+            id: 3,
+            name: "图片3",
+            time: "2022-12-14",
+            img: "",
+          },
+        ],
+        video: [
+          {
+            id: 4,
+            name: "视频1",
+            time: "2022-12-14",
+            img: "",
+          },
+        ],
+        audio: [],
+      },
+    });
+  }, [dispatch]);
+
+  // 里面表格格式
+  const columns = useMemo(() => {
+    const tempArr = [
+      {
+        title: "附件名称",
+        dataIndex: "name",
+      },
+      {
+        title: "上传人",
+        dataIndex: "time",
+      },
+
+      {
+        title: "上传时间",
+        dataIndex: "time",
+      },
+      {
+        title: "操作",
+        render: (item: any) => (
+          <a
+            target="_blank"
+            href="https://ts1.cn.mm.bing.net/th/id/R-C.6d2d3fecd79a96e43d1a410640d7199b?rik=B7RCgF82Vb7P0A&riu=http%3a%2f%2f5b0988e595225.cdn.sohucs.com%2fimages%2f20190831%2f3e03e9c2473c40b180aa99a37c0589fa.jpeg&ehk=JXdgMrjnolHlMkdX9N0K7%2fzBc9wi7FSFDjSGclreQbI%3d&risl=&pid=ImgRaw&r=0"
+            download
+            rel="noreferrer"
+          >
+            下载
+          </a>
+        ),
+      },
+    ] as any;
+    if (fileSelect === "img") {
+      tempArr.unshift({
+        title: "缩略图",
+        render: (item: any) => (
+          <ImageLazy width={80} height={50} src={item.img} />
+        ),
+      });
+    }
+    return tempArr;
+  }, [fileSelect]);
+
+  // 关于  申请编辑  申请移库  操作记录
+  const [titCut, setTitCut] = useState("");
+
+  const titCutFu = useCallback((val: string) => {
+    setTitCut(val);
+  }, []);
+
+  // 移库
+  const moveOptions = [
+    {
+      name: "库房1",
+      label: "库房1",
+      children: [
+        {
+          name: "房子1",
+          label: "房子1",
+          children: [{ name: "格子1", label: "格子1" }],
+        },
+        {
+          name: "房子0",
+          label: "房子0",
+          children: [{ name: "格子0", label: "格子0" }],
+        },
+      ],
+    },
+    {
+      name: "库房2",
+      label: "库房2",
+      children: [
+        {
+          name: "房子2",
+          label: "房子2",
+          children: [{ name: "格子2", label: "格子2" }],
+        },
+      ],
+    },
+  ];
+  const [moveLoc, setMoveLoc] = useState(["库房1", "格子1", "房子1"]);
+  const moveLocChangeFu = (val: any) => {
+    setMoveLoc(val);
+  };
+
+  const moveBtnOk = () => {
+    console.log("移库点击提交", moveLoc);
+  };
+
   return (
     <div className={styles.LookObject2}>
       <div className="breadTit">
@@ -30,10 +187,270 @@ function LookObject2() {
         </BreadTit>
       </div>
       <div className="objectSonMain">
+        {/* 上面的信息 */}
+        <div className="topInfoBox">
+          <div className="topInfoBoxL">
+            <ImageLazy
+              src="http://project.4dage.com:8016/content/1_1001/img/20220810_1553241331042.JPG"
+              width={300}
+              height={300}
+            />
+          </div>
+          <div className="topInfoBoxR">
+            <div className="topInfoBoxRTit">
+              <div>
+                <h1>陶瓷花瓶</h1>
+                <div className="bs">已入库</div>
+              </div>
+              <div>
+                <AuthButton
+                  size="small"
+                  type="primary"
+                  onClick={() => titCutFu("1")}
+                >
+                  申请编辑
+                </AuthButton>
+                &emsp;
+                <AuthButton
+                  size="small"
+                  type="primary"
+                  onClick={() => titCutFu("2")}
+                >
+                  申请移库
+                </AuthButton>
+                &emsp;
+                <AuthButton size="small" onClick={() => titCutFu("3")}>
+                  操作记录
+                </AuthButton>
+              </div>
+            </div>
+            <div className="topInfoBoxRTxt">
+              <div className="row">
+                <div>
+                  <span>藏品名称:</span>
+                  <p>
+                    阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松
+                  </p>
+                </div>
+                <div>
+                  <span>原名:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+              <div className="row">
+                <div>
+                  <span>藏品编号名称:</span>
+                  <p>666666666</p>
+                </div>
+                <div>
+                  <span>藏品编号:</span>
+                  <p>
+                    阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松阿松大阿松
+                  </p>
+                </div>
+              </div>
+              <div className="row">
+                <div>
+                  <span>年代:</span>
+                  <p>666666666</p>
+                </div>
+                <div>
+                  <span>文物质地:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+              <div className="row">
+                <div>
+                  <span>具体年代:</span>
+                  <p>666666666</p>
+                </div>
+                <div>
+                  <span>文物类别:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+
+              <div className="row">
+                <div>
+                  <span>实际数量:</span>
+                  <p>666666666</p>
+                </div>
+                <div>
+                  <span>文物级别:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+              <div className="row">
+                <div>
+                  <span>外形尺寸:</span>
+                  <p>(通长)66666666 (通宽)66666666 (通高)66666666 /cm</p>
+                </div>
+                <div>
+                  <span>具体尺寸:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+              <div className="row">
+                <div>
+                  <span>质量范围:</span>
+                  <p>666666666</p>
+                </div>
+                <div>
+                  <span>具体质量:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+
+              <div className="row">
+                <div>
+                  <span>完残程度:</span>
+                  <p>666666666</p>
+                </div>
+                <div>
+                  <span>保存状态:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+
+              <div className="row">
+                <div>
+                  <span>入藏时间范围:</span>
+                  <p>666666666</p>
+                </div>
+                <div>
+                  <span>入藏年度:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+
+              <div className="row">
+                <div>
+                  <span>著者:</span>
+                  <p>666666666</p>
+                </div>
+                <div>
+                  <span>版本:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+
+              <div className="row">
+                <div>
+                  <span>存卷:</span>
+                  <p>666666666</p>
+                </div>
+                <div>
+                  <span>来源说明:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+
+              <div className="row">
+                <div>
+                  <span>入库位置:</span>
+                  <p>666666666</p>
+                </div>
+                <div>
+                  <span>出库位置:</span>
+                  <p>666666666</p>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        {/* 下面的表格 */}
+        <div className="tableInfoBox">
+          <div className="tableInfoBoxTit">
+            <div className="rowTit">数字资源:</div>
+            <div className="rowRr">
+              <Select
+                style={{ width: 150 }}
+                value={fileSelect}
+                onChange={fileSelectChangeFu}
+                options={fileSelectList}
+              />
+            </div>
+          </div>
+          {/* 表格主体 */}
+          <Table
+            size="small"
+            scroll={{ y: 190 }}
+            dataSource={results[fileSelect]}
+            columns={columns}
+            rowKey="id"
+            pagination={false}
+          />
+        </div>
+
         <div className="backBtn">
           <Button onClick={cancelFu}>返回</Button>
         </div>
       </div>
+
+      {/* 点击上面的编辑 移库 操作记录出来的弹窗 */}
+      <Modal
+        wrapClassName="LookObject2Model"
+        destroyOnClose
+        open={!!titCut}
+        title={
+          titCut === "1" ? "申请编辑" : titCut === "2" ? "申请移库" : "操作记录"
+        }
+        onCancel={() => setTitCut("")}
+        footer={
+          [] // 设置footer为空,去掉 取消 确定默认按钮
+        }
+      >
+        {/*  申请编辑 */}
+        {titCut === "1" ? (
+          <ObjectAdd
+            dirCode={999999}
+            id={urlParamRef.current.id}
+            colsePage={() => setTitCut("")}
+            editId="edit"
+          />
+        ) : null}
+
+        {/* 申请移库 */}
+        {titCut === "2" ? (
+          <div className="moveLocBox">
+            <div>
+              <span>当前位置:</span>
+              <p>库房1/房子1/格子1</p>
+            </div>
+            <div>
+              <span>移库位置:</span>
+              <Cascader
+                style={{ width: 300 }}
+                allowClear={false}
+                value={moveLoc}
+                onChange={moveLocChangeFu}
+                fieldNames={{
+                  label: "name",
+                  value: "name",
+                  children: "children",
+                }}
+                options={moveOptions}
+                placeholder="请选择"
+              />
+            </div>
+            <br />
+            <br />
+            <div className="moveBtn">
+              <Button type="primary" onClick={moveBtnOk}>
+                提交
+              </Button>
+            </div>
+          </div>
+        ) : null}
+
+        {/* 操作记录 */}
+        {titCut === "3" ? (
+          <div className="logBox">
+            {/* 表格 */}
+            <LookObject2Log />
+          </div>
+        ) : null}
+      </Modal>
     </div>
   );
 }

+ 85 - 0
src/pages/ObjectSon/Object2/LookObject2/table.tsx

@@ -0,0 +1,85 @@
+import { Button, Table } from "antd";
+import React, { useMemo, useRef, useState } from "react";
+function LookObject2Log() {
+  const pageNumRef = useRef(1);
+  const pagePageRef = useRef(10);
+  const [tableSelect, setTableSelect] = useState({
+    pageNum: 1,
+    pageSize: 10,
+  });
+  const paginationChange = (pageNum: number, pageSize: number) => {
+    pageNumRef.current = pageNum;
+    pagePageRef.current = pageSize;
+    setTableSelect({ pageNum, pageSize });
+  };
+  const logResults = {
+    list: [
+      { id: 1, name: "123" },
+      { id: 2, name: "123" },
+      { id: 3, name: "123" },
+      { id: 4, name: "123" },
+      { id: 5, name: "123" },
+      { id: 6, name: "123" },
+      { id: 7, name: "123" },
+      { id: 8, name: "123" },
+      { id: 9, name: "123" },
+      { id: 10, name: "123" },
+      { id: 11, name: "123" },
+    ],
+    total: 11,
+  };
+
+  const columns = useMemo(() => {
+    return [
+      {
+        title: "序号",
+        render: (text: any, record: any, index: any) =>
+          index + 1 + (pageNumRef.current - 1) * pagePageRef.current,
+      },
+      {
+        title: "业务单号",
+        dataIndex: "name",
+      },
+      {
+        title: "业务类型",
+        dataIndex: "name",
+      },
+
+      {
+        title: "完成时间",
+        dataIndex: "name",
+      },
+      {
+        title: "操作",
+        render: (item: any) => (
+          <Button type="text" danger>
+            查看
+          </Button>
+        ),
+      },
+    ];
+  }, []);
+
+  return (
+    <Table
+      size="small"
+      scroll={{ y: 300 }}
+      dataSource={logResults.list}
+      columns={columns}
+      rowKey="id"
+      pagination={{
+        showQuickJumper: true,
+        position: ["bottomCenter"],
+        showSizeChanger: true,
+        current: tableSelect.pageNum,
+        pageSize: tableSelect.pageSize,
+        total: logResults.total,
+        onChange: paginationChange,
+      }}
+    />
+  );
+}
+
+const MemoLookObject2Log = React.memo(LookObject2Log);
+
+export default MemoLookObject2Log;

+ 1 - 0
src/pages/ObjectSon/Object2/index.module.scss

@@ -66,6 +66,7 @@
     }
 
     .tableBox {
+      padding: 0 30px;
       height: calc(100% - 176px);
 
     }

+ 15 - 19
src/pages/ObjectSon/Object2/index.tsx

@@ -10,6 +10,7 @@ import ImageLazy from "@/components/ImageLazy";
 import history from "@/utils/history";
 import { useLocation } from "react-router-dom";
 import dayjs from "dayjs";
+import ExportJsonExcel from "js-export-excel";
 const { Option } = Select;
 export default function Object2() {
   // 从仓库中获取藏品编号名称下拉数据
@@ -155,24 +156,20 @@ export default function Object2() {
   // 点击导出
   const deriveFu = () => {
     const name = dayjs(new Date()).format("YYYYMMDDHHmmss");
-    console.log("ppppppp", name);
-    //获取表格
-    const exportFileContent = document.getElementById("deriveBox")!.outerHTML;
-
-    console.log('121321',exportFileContent);
-    
-       //使用Blob
-       var blob = new Blob([exportFileContent], { type: "text/plain;charset=utf-8" });         //解决中文乱码问题
-       blob = new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type });
-       //设置链接
-       var link = window.URL.createObjectURL(blob);
-       var a = document.createElement("a");    //创建a标签
-       a.download = name;  //设置被下载的超链接目标(文件名)   建议文件后缀为 .xls
-       a.href = link;                            //设置a标签的链接
-       document.body.appendChild(a);            //a标签添加到页面
-       a.click();                                //设置a标签触发单击事件
-       document.body.removeChild(a);            //移除a标签
-
+    const option = {
+      fileName: name,
+      datas: [
+        {
+          sheetData: results.list,
+          sheetName: name,
+          sheetFilter: ["img", "name", "id"],
+          sheetHeader: ["图片", "名字", "id"],
+          // columnWidths: [10, 10, 10],
+        },
+      ],
+    };
+    const toExcel = new ExportJsonExcel(option); //new
+    toExcel.saveExcel(); //保存
   };
 
   return (
@@ -265,7 +262,6 @@ export default function Object2() {
         {/* 表格展示列表 */}
         <div className="tableBox" hidden={cutShow !== "cutShow2"}>
           <Table
-            id="deriveBox"
             scroll={{ y: 450 }}
             dataSource={results.list}
             columns={columns}

+ 15 - 0
src/store/action/object1.ts

@@ -0,0 +1,15 @@
+import http from "@/utils/http";
+
+/**
+ * 藏品登记页面点击新增
+ */
+export const object1AddAPI = (data?: any) => {
+  return http.post("cms/register/save", {...data});
+};
+
+/**
+ * 藏品登记页面点击新增
+ */
+export const object1AddUpFileAPI = (data: any) => {
+  return http.post("cms/register/goods/file/upload", data);
+};

+ 19 - 2
src/store/reducer/login.ts

@@ -1,7 +1,24 @@
 // 初始化状态应用注解
 const initState = {
-  selectAll: {} as any,
-  fileData: {} as any,
+  selectAll: {
+    "藏品编号名称":[],
+    "文物级别":[],
+    "文物来源":[],
+    "完残程度":[],
+    "保存状态":[],
+    "入藏时间范围":[],
+    "质量范围":[],
+    "文物类别":[],
+    "质地":[],
+    "年代":[],
+  } as any,
+  fileData: {
+    img:[],
+    video:[],
+    audio:[],
+    model:[],
+    doc:[]
+  } as any,
 };
 
 type LoginActionType =

+ 2 - 1
src/types/declaration.d.ts

@@ -3,4 +3,5 @@ declare module '*.scss';
 declare module '*.png';
 declare module '*.gif';
 declare module 'moment';
-declare module 'react-lazy-load-image-component'
+declare module 'react-lazy-load-image-component'
+declare module 'js-export-excel'

+ 10 - 5
src/utils/http.ts

@@ -4,11 +4,17 @@ import { getTokenInfo, removeTokenInfo } from "./storage";
 import { message } from "antd";
 // 请求基地址
 export const baseURL =
-  process.env.NODE_ENV === "development" ? "http://192.168.20.55:8038" : "";
+  // 线下的图片地址需要加上/api/
+  process.env.NODE_ENV === "development"
+    ? "http://192.168.20.55:8038/api/"
+    : "";
+// process.env.NODE_ENV === "development" ? "http://192.168.20.55:8038" : "";
 
 // 创建 axios 实例
 const http = axios.create({
-  baseURL: baseURL + "/api/",
+  // 线下的地址不用加/api/
+  baseURL: baseURL,
+  // baseURL: baseURL + "/api/",
   timeout: 5000,
 });
 
@@ -48,13 +54,12 @@ http.interceptors.response.use(
     return response.data;
   },
   async function (err) {
+    lodingDom.style.display = "none";
     // 如果因为网络原因,response没有,给提示消息
     if (!err.response) {
       message.warning("网络繁忙,请稍后重试");
-    }
-    else {
+    } else {
       message.warning("错误!");
-      lodingDom.style.display = "none";
     }
 
     return Promise.reject(err);