shaogen1995 1 hónapja
szülő
commit
74cc2c6e88
29 módosított fájl, 1262 hozzáadás és 277 törlés
  1. 0 21
      asd/后台大场景编辑/build/index.html
  2. 507 32
      后台大场景编辑/package-lock.json
  3. 1 0
      后台大场景编辑/package.json
  4. 5 1
      后台大场景编辑/public/index.html
  5. BIN
      后台大场景编辑/src/assets/img/IMGerror.png
  6. BIN
      后台大场景编辑/src/assets/img/loading.gif
  7. BIN
      后台大场景编辑/src/assets/img/tuBiao/1.png
  8. BIN
      后台大场景编辑/src/assets/img/tuBiao/1Ac.png
  9. BIN
      后台大场景编辑/src/assets/img/tuBiao/2.png
  10. BIN
      后台大场景编辑/src/assets/img/tuBiao/2Ac.png
  11. BIN
      后台大场景编辑/src/assets/img/tuBiao/3.png
  12. BIN
      后台大场景编辑/src/assets/img/tuBiao/3Ac.png
  13. 51 0
      后台大场景编辑/src/components/ImageLazy/index.module.scss
  14. 69 0
      后台大场景编辑/src/components/ImageLazy/index.tsx
  15. 18 0
      后台大场景编辑/src/components/MyTable/index.module.scss
  16. 162 0
      后台大场景编辑/src/components/MyTable/index.tsx
  17. 6 14
      后台大场景编辑/src/pages/A1List/index.tsx
  18. 57 69
      后台大场景编辑/src/pages/A9User/UserAdd/index.tsx
  19. 108 119
      后台大场景编辑/src/pages/A9User/index.tsx
  20. 38 0
      后台大场景编辑/src/pages/Layout/index.module.scss
  21. 38 10
      后台大场景编辑/src/pages/Layout/index.tsx
  22. 20 0
      后台大场景编辑/src/pages/Z2log/data.ts
  23. 25 0
      后台大场景编辑/src/pages/Z2log/index.module.scss
  24. 100 0
      后台大场景编辑/src/pages/Z2log/index.tsx
  25. 1 1
      后台大场景编辑/src/store/action/A9User.ts
  26. 17 0
      后台大场景编辑/src/store/action/Z2log.ts
  27. 27 0
      后台大场景编辑/src/store/reducer/Z2log.ts
  28. 8 6
      后台大场景编辑/src/store/reducer/index.ts
  29. 4 4
      后台大场景编辑/src/utils/http.ts

+ 0 - 21
asd/后台大场景编辑/build/index.html

@@ -1,21 +0,0 @@
-<!doctype html>
-<html lang="zh">
-
-<head>
-  <meta charset="utf-8" />
-  <link rel="icon" href="./favicon.ico" />
-  <meta name="viewport" content="width=device-width,initial-scale=1" />
-  <meta name="theme-color" content="#000000" />
-  <meta name="description" content="Web site created using create-react-app" />
-  <link rel="apple-touch-icon" href="./logo192.png" />
-  <script>const backUrl = "https://sit-beirenbigscene.4dage.com/backstage", threeUrl = `https://dev.itfinspread.com:8003/#/sso?redirectUrl=${backUrl}`</script>
-  <title>北人亦创国际会展中心-场景编辑后台</title>
-  <script defer="defer" src="./static/js/main.f24c7d1a.js"></script>
-  <link href="./static/css/main.c3fbf840.css" rel="stylesheet">
-</head>
-
-<body><noscript>You need to enable JavaScript to run this app.</noscript>
-  <div id="root"></div>
-</body>
-
-</html>

+ 507 - 32
后台大场景编辑/package-lock.json

@@ -17,6 +17,7 @@
         "@types/react": "^18.0.24",
         "@types/react-dom": "^18.0.8",
         "antd": "^5.0.4",
+        "antd-mobile": "^5.39.0",
         "axios": "^1.1.3",
         "dayjs": "^1.11.7",
         "echarts": "^5.4.0",
@@ -2236,6 +2237,31 @@
         "node": ">=10"
       }
     },
+    "node_modules/@floating-ui/core": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.2.tgz",
+      "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/utils": "^0.2.10"
+      }
+    },
+    "node_modules/@floating-ui/dom": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.2.tgz",
+      "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/core": "^1.7.2",
+        "@floating-ui/utils": "^0.2.10"
+      }
+    },
+    "node_modules/@floating-ui/utils": {
+      "version": "0.2.10",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz",
+      "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==",
+      "license": "MIT"
+    },
     "node_modules/@humanwhocodes/config-array": {
       "version": "0.11.7",
       "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz",
@@ -3084,9 +3110,10 @@
       }
     },
     "node_modules/@rc-component/mini-decimal": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.0.1.tgz",
-      "integrity": "sha512-9N8nRk0oKj1qJzANKl+n9eNSMUGsZtjwNuDCiZ/KA+dt1fE3zq5x2XxclRcAbOIXnZcJ53ozP2Pa60gyELXagA==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz",
+      "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==",
+      "license": "MIT",
       "dependencies": {
         "@babel/runtime": "^7.18.0"
       },
@@ -3183,6 +3210,79 @@
       "resolved": "https://registry.npmmirror.com/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz",
       "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA=="
     },
+    "node_modules/@react-spring/animated": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/animated/-/animated-9.6.1.tgz",
+      "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@react-spring/shared": "~9.6.1",
+        "@react-spring/types": "~9.6.1"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/@react-spring/core": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/core/-/core-9.6.1.tgz",
+      "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@react-spring/animated": "~9.6.1",
+        "@react-spring/rafz": "~9.6.1",
+        "@react-spring/shared": "~9.6.1",
+        "@react-spring/types": "~9.6.1"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/react-spring/donate"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/@react-spring/rafz": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/rafz/-/rafz-9.6.1.tgz",
+      "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ==",
+      "license": "MIT"
+    },
+    "node_modules/@react-spring/shared": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/shared/-/shared-9.6.1.tgz",
+      "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==",
+      "license": "MIT",
+      "dependencies": {
+        "@react-spring/rafz": "~9.6.1",
+        "@react-spring/types": "~9.6.1"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/@react-spring/types": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/types/-/types-9.6.1.tgz",
+      "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==",
+      "license": "MIT"
+    },
+    "node_modules/@react-spring/web": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/web/-/web-9.6.1.tgz",
+      "integrity": "sha512-X2zR6q2Z+FjsWfGAmAXlQaoUHbPmfuCaXpuM6TcwXPpLE1ZD4A1eys/wpXboFQmDkjnrlTmKvpVna1MjWpZ5Hw==",
+      "license": "MIT",
+      "dependencies": {
+        "@react-spring/animated": "~9.6.1",
+        "@react-spring/core": "~9.6.1",
+        "@react-spring/shared": "~9.6.1",
+        "@react-spring/types": "~9.6.1"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
     "node_modules/@rollup/plugin-babel": {
       "version": "5.3.1",
       "resolved": "https://registry.npmmirror.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
@@ -4227,6 +4327,24 @@
         "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
       }
     },
+    "node_modules/@use-gesture/core": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmmirror.com/@use-gesture/core/-/core-10.3.0.tgz",
+      "integrity": "sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A==",
+      "license": "MIT"
+    },
+    "node_modules/@use-gesture/react": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmmirror.com/@use-gesture/react/-/react-10.3.0.tgz",
+      "integrity": "sha512-3zc+Ve99z4usVP6l9knYVbVnZgfqhKah7sIG+PS2w+vpig2v2OLct05vs+ZXMzwxdNCMka8B+8WlOo0z6Pn6DA==",
+      "license": "MIT",
+      "dependencies": {
+        "@use-gesture/core": "10.3.0"
+      },
+      "peerDependencies": {
+        "react": ">= 16.8.0"
+      }
+    },
     "node_modules/@webassemblyjs/ast": {
       "version": "1.11.1",
       "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -4507,6 +4625,30 @@
         "node": ">= 6.0.0"
       }
     },
+    "node_modules/ahooks": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmmirror.com/ahooks/-/ahooks-3.9.0.tgz",
+      "integrity": "sha512-r20/C38aFyU3Zqp3620gkdLnxmQhnmWORB3eGGTDlM4i/fOc0GUvM+f2oleMzEu7b3+pHXyzz+FB6ojxsUdYdw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.21.0",
+        "dayjs": "^1.9.1",
+        "intersection-observer": "^0.12.0",
+        "js-cookie": "^3.0.5",
+        "lodash": "^4.17.21",
+        "react-fast-compare": "^3.2.2",
+        "resize-observer-polyfill": "^1.5.1",
+        "screenfull": "^5.0.0",
+        "tslib": "^2.4.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+      }
+    },
     "node_modules/ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
@@ -4658,6 +4800,90 @@
         "react-dom": ">=16.9.0"
       }
     },
+    "node_modules/antd-mobile": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmmirror.com/antd-mobile/-/antd-mobile-5.39.0.tgz",
+      "integrity": "sha512-x0cr1KYcYEOzLzD8r5S3NYtViTxTkHSh8krjM5q6RxphjabvEFQTZuf3i7gJzICprirJ4GO/F7K3m8qldCiEjw==",
+      "license": "MIT",
+      "dependencies": {
+        "@floating-ui/dom": "^1.4.2",
+        "@rc-component/mini-decimal": "^1.1.0",
+        "@react-spring/web": "~9.6.1",
+        "@use-gesture/react": "10.3.0",
+        "ahooks": "^3.7.6",
+        "antd-mobile-icons": "^0.3.0",
+        "antd-mobile-v5-count": "^1.0.1",
+        "classnames": "^2.3.2",
+        "dayjs": "^1.11.7",
+        "deepmerge": "^4.3.1",
+        "nano-memoize": "^3.0.16",
+        "rc-field-form": "^1.34.2",
+        "rc-segmented": "~2.4.1",
+        "rc-util": "^5.38.1",
+        "react-fast-compare": "^3.2.2",
+        "react-is": "^18.2.0",
+        "runes2": "^1.1.2",
+        "staged-components": "^1.1.3",
+        "tslib": "^2.5.0",
+        "use-sync-external-store": "^1.2.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+        "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/antd-mobile-icons": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/antd-mobile-icons/-/antd-mobile-icons-0.3.0.tgz",
+      "integrity": "sha512-rqINQpJWZWrva9moCd1Ye695MZYWmqLPE+bY8d2xLRy7iSQwPsinCdZYjpUPp2zL/LnKYSyXxP2ut2A+DC+whQ==",
+      "license": "MIT"
+    },
+    "node_modules/antd-mobile-v5-count": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/antd-mobile-v5-count/-/antd-mobile-v5-count-1.0.1.tgz",
+      "integrity": "sha512-YGsiEDCPUDz3SzfXi6gLZn/HpeSMW+jgPc4qiYUr1fSopg3hkUie2TnooJdExgfiETHefH3Ggs58He0OVfegLA==",
+      "license": "MIT"
+    },
+    "node_modules/antd-mobile/node_modules/rc-field-form": {
+      "version": "1.44.0",
+      "resolved": "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.44.0.tgz",
+      "integrity": "sha512-el7w87fyDUsca63Y/s8qJcq9kNkf/J5h+iTdqG5WsSHLH0e6Usl7QuYSmSVzJMgtp40mOVZIY/W/QP9zwrp1FA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.18.0",
+        "async-validator": "^4.1.0",
+        "rc-util": "^5.32.2"
+      },
+      "engines": {
+        "node": ">=8.x"
+      },
+      "peerDependencies": {
+        "react": ">=16.9.0",
+        "react-dom": ">=16.9.0"
+      }
+    },
+    "node_modules/antd-mobile/node_modules/rc-segmented": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.4.1.tgz",
+      "integrity": "sha512-KUi+JJFdKnumV9iXlm+BJ00O4NdVBp2TEexLCk6bK1x/RH83TvYKQMzIz/7m3UTRPD08RM/8VG/JNjWgWbd4cw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.11.1",
+        "classnames": "^2.2.1",
+        "rc-motion": "^2.4.4",
+        "rc-util": "^5.17.0"
+      },
+      "peerDependencies": {
+        "react": ">=16.0.0",
+        "react-dom": ">=16.0.0"
+      }
+    },
+    "node_modules/antd-mobile/node_modules/react-is": {
+      "version": "18.3.1",
+      "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+      "license": "MIT"
+    },
     "node_modules/anymatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz",
@@ -6270,9 +6496,10 @@
       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
     },
     "node_modules/deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+      "version": "4.3.1",
+      "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+      "license": "MIT",
       "engines": {
         "node": ">=0.10.0"
       }
@@ -10980,6 +11207,15 @@
       "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.5.tgz",
       "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
     },
+    "node_modules/js-cookie": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.5.tgz",
+      "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=14"
+      }
+    },
     "node_modules/js-export-excel": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/js-export-excel/-/js-export-excel-1.1.4.tgz",
@@ -11562,6 +11798,12 @@
         "multicast-dns": "cli.js"
       }
     },
+    "node_modules/nano-memoize": {
+      "version": "3.0.16",
+      "resolved": "https://registry.npmmirror.com/nano-memoize/-/nano-memoize-3.0.16.tgz",
+      "integrity": "sha512-JyK96AKVGAwVeMj3MoMhaSXaUNqgMbCRSQB3trUV8tYZfWEzqUBKdK1qJpfuNXgKeHOx1jv/IEYTM659ly7zUA==",
+      "license": "MIT"
+    },
     "node_modules/nanoid": {
       "version": "3.3.4",
       "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz",
@@ -14015,12 +14257,13 @@
       }
     },
     "node_modules/rc-util": {
-      "version": "5.28.0",
-      "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.28.0.tgz",
-      "integrity": "sha512-KYDjhGodswVj29v0TRciKTqRPgumIFvFDndbCD227pitQ+0Cei196rxk+OXb/blu6V8zdTRK5RjCJn+WmHLvBA==",
+      "version": "5.44.4",
+      "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.44.4.tgz",
+      "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==",
+      "license": "MIT",
       "dependencies": {
         "@babel/runtime": "^7.18.3",
-        "react-is": "^16.12.0"
+        "react-is": "^18.2.0"
       },
       "peerDependencies": {
         "react": ">=16.9.0",
@@ -14028,9 +14271,10 @@
       }
     },
     "node_modules/rc-util/node_modules/react-is": {
-      "version": "16.13.1",
-      "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz",
-      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+      "version": "18.3.1",
+      "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz",
+      "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+      "license": "MIT"
     },
     "node_modules/rc-virtual-list": {
       "version": "3.4.13",
@@ -14263,6 +14507,12 @@
       "resolved": "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
       "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg=="
     },
+    "node_modules/react-fast-compare": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+      "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==",
+      "license": "MIT"
+    },
     "node_modules/react-is": {
       "version": "17.0.2",
       "resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz",
@@ -14878,6 +15128,12 @@
         "queue-microtask": "^1.2.2"
       }
     },
+    "node_modules/runes2": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/runes2/-/runes2-1.1.4.tgz",
+      "integrity": "sha512-LNPnEDPOOU4ehF71m5JoQyzT2yxwD6ZreFJ7MxZUAoMKNMY1XrAo60H1CUoX5ncSm0rIuKlqn9JZNRrRkNou2g==",
+      "license": "MIT"
+    },
     "node_modules/safe-buffer": {
       "version": "5.2.1",
       "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -14989,6 +15245,18 @@
         "node": ">= 10.13.0"
       }
     },
+    "node_modules/screenfull": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmmirror.com/screenfull/-/screenfull-5.2.0.tgz",
+      "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
     "node_modules/script-loader": {
       "version": "0.7.2",
       "resolved": "https://registry.npmmirror.com/script-loader/-/script-loader-0.7.2.tgz",
@@ -15368,6 +15636,15 @@
       "resolved": "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz",
       "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="
     },
+    "node_modules/staged-components": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/staged-components/-/staged-components-1.1.3.tgz",
+      "integrity": "sha512-9EIswzDqjwlEu+ymkV09TTlJfzSbKgEnNteUnZSTxkpMgr5Wx2CzzA9WcMFWBNCldqVPsHVnRGGrApduq2Se5A==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
     "node_modules/statuses": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
@@ -15992,9 +16269,10 @@
       }
     },
     "node_modules/tslib": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz",
-      "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+      "version": "2.8.1",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+      "license": "0BSD"
     },
     "node_modules/tsutils": {
       "version": "3.21.0",
@@ -18702,6 +18980,28 @@
         }
       }
     },
+    "@floating-ui/core": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.2.tgz",
+      "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==",
+      "requires": {
+        "@floating-ui/utils": "^0.2.10"
+      }
+    },
+    "@floating-ui/dom": {
+      "version": "1.7.2",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.2.tgz",
+      "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==",
+      "requires": {
+        "@floating-ui/core": "^1.7.2",
+        "@floating-ui/utils": "^0.2.10"
+      }
+    },
+    "@floating-ui/utils": {
+      "version": "0.2.10",
+      "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz",
+      "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="
+    },
     "@humanwhocodes/config-array": {
       "version": "0.11.7",
       "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.7.tgz",
@@ -19341,9 +19641,9 @@
       }
     },
     "@rc-component/mini-decimal": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.0.1.tgz",
-      "integrity": "sha512-9N8nRk0oKj1qJzANKl+n9eNSMUGsZtjwNuDCiZ/KA+dt1fE3zq5x2XxclRcAbOIXnZcJ53ozP2Pa60gyELXagA==",
+      "version": "1.1.0",
+      "resolved": "https://registry.npmmirror.com/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz",
+      "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==",
       "requires": {
         "@babel/runtime": "^7.18.0"
       }
@@ -19409,6 +19709,56 @@
       "resolved": "https://registry.npmmirror.com/@react-dnd/shallowequal/-/shallowequal-4.0.2.tgz",
       "integrity": "sha512-/RVXdLvJxLg4QKvMoM5WlwNR9ViO9z8B/qPcc+C0Sa/teJY7QG7kJ441DwzOjMYEY7GmU4dj5EcGHIkKZiQZCA=="
     },
+    "@react-spring/animated": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/animated/-/animated-9.6.1.tgz",
+      "integrity": "sha512-ls/rJBrAqiAYozjLo5EPPLLOb1LM0lNVQcXODTC1SMtS6DbuBCPaKco5svFUQFMP2dso3O+qcC4k9FsKc0KxMQ==",
+      "requires": {
+        "@react-spring/shared": "~9.6.1",
+        "@react-spring/types": "~9.6.1"
+      }
+    },
+    "@react-spring/core": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/core/-/core-9.6.1.tgz",
+      "integrity": "sha512-3HAAinAyCPessyQNNXe5W0OHzRfa8Yo5P748paPcmMowZ/4sMfaZ2ZB6e5x5khQI8NusOHj8nquoutd6FRY5WQ==",
+      "requires": {
+        "@react-spring/animated": "~9.6.1",
+        "@react-spring/rafz": "~9.6.1",
+        "@react-spring/shared": "~9.6.1",
+        "@react-spring/types": "~9.6.1"
+      }
+    },
+    "@react-spring/rafz": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/rafz/-/rafz-9.6.1.tgz",
+      "integrity": "sha512-v6qbgNRpztJFFfSE3e2W1Uz+g8KnIBs6SmzCzcVVF61GdGfGOuBrbjIcp+nUz301awVmREKi4eMQb2Ab2gGgyQ=="
+    },
+    "@react-spring/shared": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/shared/-/shared-9.6.1.tgz",
+      "integrity": "sha512-PBFBXabxFEuF8enNLkVqMC9h5uLRBo6GQhRMQT/nRTnemVENimgRd+0ZT4yFnAQ0AxWNiJfX3qux+bW2LbG6Bw==",
+      "requires": {
+        "@react-spring/rafz": "~9.6.1",
+        "@react-spring/types": "~9.6.1"
+      }
+    },
+    "@react-spring/types": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/types/-/types-9.6.1.tgz",
+      "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q=="
+    },
+    "@react-spring/web": {
+      "version": "9.6.1",
+      "resolved": "https://registry.npmmirror.com/@react-spring/web/-/web-9.6.1.tgz",
+      "integrity": "sha512-X2zR6q2Z+FjsWfGAmAXlQaoUHbPmfuCaXpuM6TcwXPpLE1ZD4A1eys/wpXboFQmDkjnrlTmKvpVna1MjWpZ5Hw==",
+      "requires": {
+        "@react-spring/animated": "~9.6.1",
+        "@react-spring/core": "~9.6.1",
+        "@react-spring/shared": "~9.6.1",
+        "@react-spring/types": "~9.6.1"
+      }
+    },
     "@rollup/plugin-babel": {
       "version": "5.3.1",
       "resolved": "https://registry.npmmirror.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
@@ -20267,6 +20617,19 @@
         "eslint-visitor-keys": "^3.3.0"
       }
     },
+    "@use-gesture/core": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmmirror.com/@use-gesture/core/-/core-10.3.0.tgz",
+      "integrity": "sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A=="
+    },
+    "@use-gesture/react": {
+      "version": "10.3.0",
+      "resolved": "https://registry.npmmirror.com/@use-gesture/react/-/react-10.3.0.tgz",
+      "integrity": "sha512-3zc+Ve99z4usVP6l9knYVbVnZgfqhKah7sIG+PS2w+vpig2v2OLct05vs+ZXMzwxdNCMka8B+8WlOo0z6Pn6DA==",
+      "requires": {
+        "@use-gesture/core": "10.3.0"
+      }
+    },
     "@webassemblyjs/ast": {
       "version": "1.11.1",
       "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.1.tgz",
@@ -20508,6 +20871,22 @@
         "debug": "4"
       }
     },
+    "ahooks": {
+      "version": "3.9.0",
+      "resolved": "https://registry.npmmirror.com/ahooks/-/ahooks-3.9.0.tgz",
+      "integrity": "sha512-r20/C38aFyU3Zqp3620gkdLnxmQhnmWORB3eGGTDlM4i/fOc0GUvM+f2oleMzEu7b3+pHXyzz+FB6ojxsUdYdw==",
+      "requires": {
+        "@babel/runtime": "^7.21.0",
+        "dayjs": "^1.9.1",
+        "intersection-observer": "^0.12.0",
+        "js-cookie": "^3.0.5",
+        "lodash": "^4.17.21",
+        "react-fast-compare": "^3.2.2",
+        "resize-observer-polyfill": "^1.5.1",
+        "screenfull": "^5.0.0",
+        "tslib": "^2.4.1"
+      }
+    },
     "ajv": {
       "version": "6.12.6",
       "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
@@ -20632,6 +21011,71 @@
         "throttle-debounce": "^5.0.0"
       }
     },
+    "antd-mobile": {
+      "version": "5.39.0",
+      "resolved": "https://registry.npmmirror.com/antd-mobile/-/antd-mobile-5.39.0.tgz",
+      "integrity": "sha512-x0cr1KYcYEOzLzD8r5S3NYtViTxTkHSh8krjM5q6RxphjabvEFQTZuf3i7gJzICprirJ4GO/F7K3m8qldCiEjw==",
+      "requires": {
+        "@floating-ui/dom": "^1.4.2",
+        "@rc-component/mini-decimal": "^1.1.0",
+        "@react-spring/web": "~9.6.1",
+        "@use-gesture/react": "10.3.0",
+        "ahooks": "^3.7.6",
+        "antd-mobile-icons": "^0.3.0",
+        "antd-mobile-v5-count": "^1.0.1",
+        "classnames": "^2.3.2",
+        "dayjs": "^1.11.7",
+        "deepmerge": "^4.3.1",
+        "nano-memoize": "^3.0.16",
+        "rc-field-form": "^1.34.2",
+        "rc-segmented": "~2.4.1",
+        "rc-util": "^5.38.1",
+        "react-fast-compare": "^3.2.2",
+        "react-is": "^18.2.0",
+        "runes2": "^1.1.2",
+        "staged-components": "^1.1.3",
+        "tslib": "^2.5.0",
+        "use-sync-external-store": "^1.2.0"
+      },
+      "dependencies": {
+        "rc-field-form": {
+          "version": "1.44.0",
+          "resolved": "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-1.44.0.tgz",
+          "integrity": "sha512-el7w87fyDUsca63Y/s8qJcq9kNkf/J5h+iTdqG5WsSHLH0e6Usl7QuYSmSVzJMgtp40mOVZIY/W/QP9zwrp1FA==",
+          "requires": {
+            "@babel/runtime": "^7.18.0",
+            "async-validator": "^4.1.0",
+            "rc-util": "^5.32.2"
+          }
+        },
+        "rc-segmented": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmmirror.com/rc-segmented/-/rc-segmented-2.4.1.tgz",
+          "integrity": "sha512-KUi+JJFdKnumV9iXlm+BJ00O4NdVBp2TEexLCk6bK1x/RH83TvYKQMzIz/7m3UTRPD08RM/8VG/JNjWgWbd4cw==",
+          "requires": {
+            "@babel/runtime": "^7.11.1",
+            "classnames": "^2.2.1",
+            "rc-motion": "^2.4.4",
+            "rc-util": "^5.17.0"
+          }
+        },
+        "react-is": {
+          "version": "18.3.1",
+          "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz",
+          "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
+        }
+      }
+    },
+    "antd-mobile-icons": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmmirror.com/antd-mobile-icons/-/antd-mobile-icons-0.3.0.tgz",
+      "integrity": "sha512-rqINQpJWZWrva9moCd1Ye695MZYWmqLPE+bY8d2xLRy7iSQwPsinCdZYjpUPp2zL/LnKYSyXxP2ut2A+DC+whQ=="
+    },
+    "antd-mobile-v5-count": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmmirror.com/antd-mobile-v5-count/-/antd-mobile-v5-count-1.0.1.tgz",
+      "integrity": "sha512-YGsiEDCPUDz3SzfXi6gLZn/HpeSMW+jgPc4qiYUr1fSopg3hkUie2TnooJdExgfiETHefH3Ggs58He0OVfegLA=="
+    },
     "anymatch": {
       "version": "3.1.2",
       "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz",
@@ -21915,9 +22359,9 @@
       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
     },
     "deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+      "version": "4.3.1",
+      "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="
     },
     "default-gateway": {
       "version": "6.0.3",
@@ -25598,6 +26042,11 @@
       "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-3.7.5.tgz",
       "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA=="
     },
+    "js-cookie": {
+      "version": "3.0.5",
+      "resolved": "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.5.tgz",
+      "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw=="
+    },
     "js-export-excel": {
       "version": "1.1.4",
       "resolved": "https://registry.npmmirror.com/js-export-excel/-/js-export-excel-1.1.4.tgz",
@@ -26054,6 +26503,11 @@
         "thunky": "^1.0.2"
       }
     },
+    "nano-memoize": {
+      "version": "3.0.16",
+      "resolved": "https://registry.npmmirror.com/nano-memoize/-/nano-memoize-3.0.16.tgz",
+      "integrity": "sha512-JyK96AKVGAwVeMj3MoMhaSXaUNqgMbCRSQB3trUV8tYZfWEzqUBKdK1qJpfuNXgKeHOx1jv/IEYTM659ly7zUA=="
+    },
     "nanoid": {
       "version": "3.3.4",
       "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz",
@@ -27738,18 +28192,18 @@
       }
     },
     "rc-util": {
-      "version": "5.28.0",
-      "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.28.0.tgz",
-      "integrity": "sha512-KYDjhGodswVj29v0TRciKTqRPgumIFvFDndbCD227pitQ+0Cei196rxk+OXb/blu6V8zdTRK5RjCJn+WmHLvBA==",
+      "version": "5.44.4",
+      "resolved": "https://registry.npmmirror.com/rc-util/-/rc-util-5.44.4.tgz",
+      "integrity": "sha512-resueRJzmHG9Q6rI/DfK6Kdv9/Lfls05vzMs1Sk3M2P+3cJa+MakaZyWY8IPfehVuhPJFKrIY1IK4GqbiaiY5w==",
       "requires": {
         "@babel/runtime": "^7.18.3",
-        "react-is": "^16.12.0"
+        "react-is": "^18.2.0"
       },
       "dependencies": {
         "react-is": {
-          "version": "16.13.1",
-          "resolved": "https://registry.npmmirror.com/react-is/-/react-is-16.13.1.tgz",
-          "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+          "version": "18.3.1",
+          "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz",
+          "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
         }
       }
     },
@@ -27922,6 +28376,11 @@
       "resolved": "https://registry.npmmirror.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
       "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg=="
     },
+    "react-fast-compare": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmmirror.com/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
+      "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ=="
+    },
     "react-is": {
       "version": "17.0.2",
       "resolved": "https://registry.npmmirror.com/react-is/-/react-is-17.0.2.tgz",
@@ -28388,6 +28847,11 @@
         "queue-microtask": "^1.2.2"
       }
     },
+    "runes2": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmmirror.com/runes2/-/runes2-1.1.4.tgz",
+      "integrity": "sha512-LNPnEDPOOU4ehF71m5JoQyzT2yxwD6ZreFJ7MxZUAoMKNMY1XrAo60H1CUoX5ncSm0rIuKlqn9JZNRrRkNou2g=="
+    },
     "safe-buffer": {
       "version": "5.2.1",
       "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
@@ -28463,6 +28927,11 @@
         "ajv-keywords": "^3.5.2"
       }
     },
+    "screenfull": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmmirror.com/screenfull/-/screenfull-5.2.0.tgz",
+      "integrity": "sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA=="
+    },
     "script-loader": {
       "version": "0.7.2",
       "resolved": "https://registry.npmmirror.com/script-loader/-/script-loader-0.7.2.tgz",
@@ -28788,6 +29257,12 @@
       "resolved": "https://registry.npmmirror.com/stackframe/-/stackframe-1.3.4.tgz",
       "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw=="
     },
+    "staged-components": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmmirror.com/staged-components/-/staged-components-1.1.3.tgz",
+      "integrity": "sha512-9EIswzDqjwlEu+ymkV09TTlJfzSbKgEnNteUnZSTxkpMgr5Wx2CzzA9WcMFWBNCldqVPsHVnRGGrApduq2Se5A==",
+      "requires": {}
+    },
     "statuses": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz",
@@ -29286,9 +29761,9 @@
       }
     },
     "tslib": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz",
-      "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
+      "version": "2.8.1",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz",
+      "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
     },
     "tsutils": {
       "version": "3.21.0",

+ 1 - 0
后台大场景编辑/package.json

@@ -12,6 +12,7 @@
     "@types/react": "^18.0.24",
     "@types/react-dom": "^18.0.8",
     "antd": "^5.0.4",
+    "antd-mobile": "^5.39.0",
     "axios": "^1.1.3",
     "dayjs": "^1.11.7",
     "echarts": "^5.4.0",

+ 5 - 1
后台大场景编辑/public/index.html

@@ -9,8 +9,12 @@
     <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
 
     <script>
+      // 甲方地址备份记录
+      // const backUrl="http://124.127.126.120:19546/backstage/index.html"
+      // threeUrl=`https://dev.itfinspread.com:8003/#/sso?redirectUrl=${backUrl}`
+
       // 甲方服务器域名
-      const backUrl = 'http://192.168.20.55:3000'
+      const backUrl = 'http://192.168.20.55:3001'
       // const backUrl = 'https://sit-beirenbigscene.4dage.com/backstage'
 
       // 第三方网址跳转域名

BIN
后台大场景编辑/src/assets/img/IMGerror.png


BIN
后台大场景编辑/src/assets/img/loading.gif


BIN
后台大场景编辑/src/assets/img/tuBiao/1.png


BIN
后台大场景编辑/src/assets/img/tuBiao/1Ac.png


BIN
后台大场景编辑/src/assets/img/tuBiao/2.png


BIN
后台大场景编辑/src/assets/img/tuBiao/2Ac.png


BIN
后台大场景编辑/src/assets/img/tuBiao/3.png


BIN
后台大场景编辑/src/assets/img/tuBiao/3Ac.png


+ 51 - 0
后台大场景编辑/src/components/ImageLazy/index.module.scss

@@ -0,0 +1,51 @@
+.ImageLazy {
+  position: relative;
+
+  :global {
+    .lazyBox {
+      width: 100%;
+      height: 100%;
+      position: relative;
+
+      .adm-image {
+        width: 100%;
+        height: 100%;
+
+        img {
+          width: 100%;
+          height: 100%;
+        }
+      }
+
+      .lookImg {
+        cursor: pointer;
+        transition: opacity .3s;
+        opacity: 0;
+        pointer-events: none;
+        position: absolute;
+        top: 0;
+        left: 0;
+        width: 100%;
+        height: 100%;
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        font-size: 18px;
+        color: #fff;
+        background-color: rgba(0, 0, 0, .6);
+
+        &>div {
+          font-size: 14px;
+        }
+      }
+
+      &:hover {
+        .lookImg {
+          opacity: 1;
+          pointer-events: auto;
+        }
+      }
+    }
+  }
+
+}

+ 69 - 0
后台大场景编辑/src/components/ImageLazy/index.tsx

@@ -0,0 +1,69 @@
+import React, { useCallback, useState } from 'react'
+import styles from './index.module.scss'
+import { baseURL } from '@/utils/http'
+import imgLoding from '@/assets/img/loading.gif'
+import imgErr from '@/assets/img/IMGerror.png'
+import { EyeOutlined } from '@ant-design/icons'
+import { Image } from 'antd-mobile'
+
+type Props = {
+  width?: number | string
+  height?: number | string
+  src: string
+  srcBig?: string
+  noLook?: boolean
+  offline?: boolean
+}
+
+function ImageLazy({
+  width = 100,
+  height = 100,
+  src,
+  srcBig,
+  noLook,
+  offline = false
+}: Props) {
+  // 默认不能预览图片,加载成功之后能预览
+  const [lookImg, setLookImg] = useState(false)
+
+  // 图片加载完成
+  const onLoad = useCallback(() => {
+    setLookImg(true)
+  }, [])
+
+  // 点击预览图片
+  const lookBigImg = useCallback(() => {
+    // store.dispatch({
+    //   type: 'layout/lookBigImg',
+    //   payload: { url: offline ? src : baseURL + (srcBig ? srcBig : src), show: true }
+    // })
+  }, [])
+
+  return (
+    <div className={styles.ImageLazy} style={{ width: width, height: height }}>
+      <div className='lazyBox'>
+        <Image
+          lazy
+          onLoad={onLoad}
+          src={src ? (offline ? src : baseURL + src) : ''}
+          placeholder={<img src={imgLoding} alt='' />}
+          fallback={<img src={imgErr} alt='' />}
+          fit='cover'
+        />
+
+        {/* 图片预览 */}
+        {noLook || !lookImg ? null : (
+          <div className='lookImg' onClick={lookBigImg}>
+            <EyeOutlined />
+            &nbsp;
+            <div>预览</div>
+          </div>
+        )}
+      </div>
+    </div>
+  )
+}
+
+const MemoImageLazy = React.memo(ImageLazy)
+
+export default MemoImageLazy

+ 18 - 0
后台大场景编辑/src/components/MyTable/index.module.scss

@@ -0,0 +1,18 @@
+.MyTable {
+  :global {
+    .ant-table-body {
+      overflow-y: auto !important;
+      overflow-y: overlay !important;
+
+      .ant-table-row {
+        .ant-table-cell {
+          padding: 10px;
+
+          a {
+            color: var(--themeColor) !important;
+          }
+        }
+      }
+    }
+  }
+}

+ 162 - 0
后台大场景编辑/src/components/MyTable/index.tsx

@@ -0,0 +1,162 @@
+import React, { useCallback, useEffect, useMemo } from 'react'
+import styles from './index.module.scss'
+import { Table } from 'antd'
+import ImageLazy from '../ImageLazy'
+
+type Props = {
+  yHeight?: number //设置表格的高度
+  list: any //表格数据
+  columnsTemp: any[][] //表格展示
+  total?: number //总数
+  pageNum?: number
+  pageSize?: number
+  pagingInfo?: any | boolean
+  onChange?: (pageNum: number, pageSize: number) => void
+  lastBtn?: any
+  classKey?: string //一个组件多次使用的时候要传递,分别设置style
+  // 表格简单的合并
+  merge?: { type: string; num: number; loc: 'rowSpan' | 'colSpan' }
+  // 定制化表头
+  myTitle?: { name: string; Com: React.ReactNode }
+  // 为空的定制字段
+  isNull?: string
+}
+
+// 表格内容定制化
+const tableComObj = (key: string, val: string[]) => {
+  const obj = {
+    A: (
+      <a href={val[1]} target='_blank' title={val[1]} rel='noreferrer'>
+        {val[0]}
+      </a>
+    )
+  }
+  return Reflect.get(obj, key)
+}
+
+function MyTable({
+  yHeight,
+  list,
+  columnsTemp,
+  total,
+  pageNum = 1,
+  pageSize = 10,
+  pagingInfo = {
+    showQuickJumper: true,
+    position: ['bottomCenter'],
+    showSizeChanger: true
+  },
+  onChange,
+  lastBtn = [],
+  classKey = '',
+  merge,
+  myTitle,
+  isNull = '(空)'
+}: Props) {
+  useEffect(() => {
+    const dom = document.querySelector(`.MyTable${classKey} .ant-table-body`) as HTMLDivElement
+
+    if (dom && yHeight) dom.style.height = yHeight + 'px'
+  }, [classKey, yHeight])
+
+  // 页码变化
+  const paginationChange = useCallback(
+    () => (pageNum: number, pageSize: number) => {
+      if (onChange) {
+        onChange(pageNum, pageSize)
+      }
+    },
+    [onChange]
+  )
+
+  const dataChangeFu = useCallback(
+    (v: any) => {
+      /**
+       * index:序号
+       * txt:正常数据
+       * img:图片
+       * txtChange:判断显示不同字段
+       * text:文字比较多的情况
+       */
+
+      const obj = {
+        index: (_: any, __: any, index: number) => index + 1 + (pageNum - 1) * pageSize,
+        txt: (item: any) => item[v[2]] || isNull,
+        img: (item: any) => (
+          <div className='tableImgAuto'>
+            <ImageLazy
+              width={60}
+              height={60}
+              src={item[v[2]] || item.thumb}
+              srcBig={item.thumbPc}
+            />
+          </div>
+        ),
+        txtChange: (item: any) => Reflect.get(v[3], item[v[2]]) || v[4] || isNull,
+        text: (item: any) => {
+          let tempCom: any = item[v[2]] || isNull
+
+          if (tempCom.length >= v[3]) {
+            tempCom = tempCom.substring(0, v[3]) + '...'
+          }
+
+          if (v[4]) {
+            tempCom = tableComObj(v[4], [tempCom, item[v[2]]])
+          } else if (item[v[2]].length >= v[3]) {
+            tempCom = (
+              <span style={{ cursor: 'pointer' }} title={item[v[2]]}>
+                {tempCom}
+              </span>
+            )
+          }
+
+          return tempCom
+        }
+      }
+
+      return Reflect.get(obj, v[0])
+    },
+    [isNull, pageNum, pageSize]
+  )
+
+  const columns = useMemo(() => {
+    const arr: any = columnsTemp.map((v: any) => ({
+      title: myTitle && v.includes(myTitle.name) ? myTitle.Com : v[1],
+      render: dataChangeFu(v),
+      onCell:
+        merge && v.includes(merge.type)
+          ? // {rowSpan:3}
+            (item: any, index: number) => ({
+              rowSpan: index === 0 ? merge.num : 0
+            })
+          : ''
+    }))
+
+    return arr
+  }, [columnsTemp, dataChangeFu, merge, myTitle])
+
+  return (
+    <Table
+      className={`${styles.MyTable} MyTable${classKey}`}
+      scroll={{ y: yHeight ? yHeight : '' }}
+      dataSource={list}
+      columns={[...columns, ...lastBtn]}
+      rowKey='id'
+      pagination={
+        pagingInfo
+          ? {
+              ...pagingInfo,
+              current: pageNum,
+              pageSize: pageSize,
+              total: total,
+              onChange: paginationChange()
+            }
+          : false
+      }
+    />
+  )
+}
+
+const MemoMyTable = React.memo(MyTable)
+
+export default MemoMyTable

+ 6 - 14
后台大场景编辑/src/pages/A1List/index.tsx

@@ -7,8 +7,8 @@ import { A1tableType } from '@/types'
 import { A1_APIdel, A1_APIgetList, isTokenFlagAPI } from '@/store/action/A1List'
 import { MessageFu } from '@/utils/message'
 import history from '@/utils/history'
-import { getTokenInfo, removeTokenInfo } from '@/utils/storage'
-import clasNames from 'classnames'
+import { removeTokenInfo } from '@/utils/storage'
+// import clasNames from 'classnames'
 
 const isTokenFlagFu = (val: boolean, url: string) => {
   if (val) {
@@ -23,9 +23,9 @@ const isTokenFlagFu = (val: boolean, url: string) => {
 }
 
 function A1List() {
-  const userInfo = useMemo(() => {
-    return getTokenInfo().user
-  }, [])
+  // const userInfo = useMemo(() => {
+  //   return getTokenInfo().user
+  // }, [])
 
   const dispatch = useDispatch()
 
@@ -73,7 +73,7 @@ function A1List() {
   const lookFu = useCallback(async (code: string) => {
     const res = await isTokenFlagAPI()
     if (res.code === 0) {
-      isTokenFlagFu(res.data, `/webScene/index.html?m=${code}`)
+      isTokenFlagFu(res.data, `/scene/index.html?m=${code}`)
     }
   }, [])
 
@@ -145,14 +145,6 @@ function A1List() {
 
   return (
     <div className={styles.A1List}>
-      <div
-        className={clasNames(
-          'pageTitle',
-          userInfo.isAdmin !== 1 ? 'pageTitleToLeft' : ''
-        )}
-      >
-        数字孪生建模平台
-      </div>
       <div className='A1Top'>
         <div className='selectBox'>
           <div className='selectBoxL'>

+ 57 - 69
后台大场景编辑/src/pages/A9User/UserAdd/index.tsx

@@ -1,38 +1,35 @@
-import {
-  A9API_getUserInfoByIdAPI,
-  A9API_userSaveAPI,
-} from "@/store/action/A9User";
-import { SaveUserType } from "@/types";
-import { MessageFu } from "@/utils/message";
-import { Button, Form, Input, Modal, Popconfirm } from "antd";
-import React, { useCallback, useEffect, useRef } from "react";
-import styles from "./index.module.scss";
+import { A9API_getUserInfoByIdAPI, A9API_userSaveAPI } from '@/store/action/A9User'
+import { SaveUserType } from '@/types'
+import { MessageFu } from '@/utils/message'
+import { Button, Form, Input, Modal, Popconfirm } from 'antd'
+import React, { useCallback, useEffect, useRef } from 'react'
+import styles from './index.module.scss'
 
 type Props = {
-  id: any;
-  closePage: () => void;
-  upTableList: () => void;
-  addTableList: () => void;
-};
+  id: any
+  closePage: () => void
+  upTableList: () => void
+  addTableList: () => void
+}
 
 function UserAdd({ id, closePage, upTableList, addTableList }: Props) {
   // 没有通过校验
   const onFinishFailed = useCallback(() => {
     // return MessageFu.warning("有表单不符号规则!");
-  }, []);
+  }, [])
 
   // 设置表单初始数据(区分编辑和新增)
-  const FormBoxRef = useRef<any>({});
+  const FormBoxRef = useRef<any>({})
 
   const getInfoInAPIFu = useCallback(async (id: number) => {
-    const res = await A9API_getUserInfoByIdAPI(id);
-    FormBoxRef.current.setFieldsValue(res.data);
-  }, []);
+    const res = await A9API_getUserInfoByIdAPI(id)
+    FormBoxRef.current.setFieldsValue(res.data)
+  }, [])
 
   useEffect(() => {
-    if (id) getInfoInAPIFu(id);
-    FormBoxRef.current.setFieldsValue({ myRoleName: "管理员" });
-  }, [getInfoInAPIFu, id]);
+    if (id) getInfoInAPIFu(id)
+    FormBoxRef.current.setFieldsValue({ myRoleName: '管理员' })
+  }, [getInfoInAPIFu, id])
 
   // 通过校验点击确定
   const onFinish = useCallback(
@@ -40,102 +37,93 @@ function UserAdd({ id, closePage, upTableList, addTableList }: Props) {
       const obj: SaveUserType = {
         ...values,
         id: id ? id : null,
-        roleId: 2,
-      };
+        roleId: 2
+      }
 
-      const res: any = await A9API_userSaveAPI(obj);
+      const res: any = await A9API_userSaveAPI(obj)
 
       if (res.code === 0) {
-        MessageFu.success(id ? "编辑成功!" : "新增成功!");
-        if (id) upTableList();
-        else addTableList();
+        MessageFu.success(id ? '编辑成功!' : '新增成功!')
+        if (id) upTableList()
+        else addTableList()
 
-        closePage();
+        closePage()
       }
       // console.log("通过校验,点击确定");
     },
     [addTableList, closePage, id, upTableList]
-  );
+  )
 
   return (
     <Modal
       wrapClassName={styles.userAdd}
       destroyOnClose
       open={true}
-      title={id ? "编辑用户" : "新增用户"}
+      title={id ? '编辑用户' : '新增用户'}
       footer={
         [] // 设置footer为空,去掉 取消 确定默认按钮
       }
     >
-      <div className="userAddMain">
+      <div className='userAddMain'>
         <Form
           ref={FormBoxRef}
-          name="basic"
+          name='basic'
           labelCol={{ span: 5 }}
           onFinish={onFinish}
           onFinishFailed={onFinishFailed}
-          autoComplete="off"
+          autoComplete='off'
         >
           <Form.Item
-            label="用户名"
-            name="userName"
-            rules={[{ required: true, message: "请输入账号名!" }]}
-            getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
+            label='用户名'
+            name='userName'
+            rules={[{ required: true, message: '请输入账号名!' }]}
+            getValueFromEvent={e => e.target.value.replace(/\s+/g, '')}
           >
-            <Input
-              disabled={id}
-              maxLength={15}
-              showCount
-              placeholder="请输入内容"
-            />
+            <Input disabled={id} maxLength={15} showCount placeholder='请输入内容' />
           </Form.Item>
 
-          <Form.Item
-            label="用户角色"
-            name="myRoleName"
-            style={{ display: "none" }}
-          >
+          <Form.Item label='用户角色' name='myRoleName' style={{ display: 'none' }}>
             <Input disabled />
           </Form.Item>
 
           <Form.Item
-            label="真实姓名"
-            name="realName"
-            rules={[{ required: true, message: "请输入真实姓名!" }]}
-            getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
+            label='真实姓名'
+            name='realName'
+            rules={[{ required: true, message: '请输入真实姓名!' }]}
+            getValueFromEvent={e => e.target.value.replace(/\s+/g, '')}
           >
-            <Input maxLength={8} showCount placeholder="请输入内容" />
+            <Input maxLength={8} showCount placeholder='请输入内容' />
           </Form.Item>
 
           <Form.Item
-            label="手机号"
-            name="phone"
+            label='手机号'
+            name='phone'
             rules={[
-              { required: true, message: "请输入手机号!" },
+              // { required: true, message: "请输入手机号!" },
               // { max: 11, min: 11, message: "长度为11!" },
               {
                 pattern: /^1[3-9][0-9]{9}$/,
-                message: "请输入正确格式的手机号!",
-              },
+                message: '请输入正确格式的手机号!'
+              }
             ]}
-            getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
+            getValueFromEvent={e => e.target.value.replace(/\s+/g, '')}
           >
-            <Input maxLength={11} showCount placeholder="请输入11位手机号" />
+            <Input maxLength={11} showCount placeholder='请输入11位手机号' />
           </Form.Item>
 
-          {id ? null : <div className="passTit">* 默认密码 123456</div>}
+          {id ? null : <div className='passTit'>* 默认密码 123456</div>}
 
           {/* 确定和取消按钮 */}
           <br />
           <Form.Item wrapperCol={{ offset: 9, span: 16 }}>
-            <Button type="primary" htmlType="submit">
+            <Button type='primary' htmlType='submit'>
               提交
             </Button>
             &emsp;
             <Popconfirm
-              title="放弃编辑后,信息将不会保存!"
-              okText="放弃"
-              cancelText="取消"
+              title='放弃编辑后,信息将不会保存!'
+              okText='放弃'
+              cancelText='取消'
               okButtonProps={{ loading: false }}
               onConfirm={closePage}
             >
@@ -145,9 +133,9 @@ function UserAdd({ id, closePage, upTableList, addTableList }: Props) {
         </Form>
       </div>
     </Modal>
-  );
+  )
 }
 
-const MemoUserAdd = React.memo(UserAdd);
+const MemoUserAdd = React.memo(UserAdd)
 
-export default MemoUserAdd;
+export default MemoUserAdd

+ 108 - 119
后台大场景编辑/src/pages/A9User/index.tsx

@@ -1,132 +1,126 @@
-import { RootState } from "@/store";
+import { RootState } from '@/store'
 import {
   A9API_getUserListAPI,
-  A9API_userDisplayAPI,
-  A9API_userPassResetAPI,
-  A9API_userRemoveAPI,
-} from "@/store/action/A9User";
-import { UserTableAPIType, UserTableListType } from "@/types";
-import { MessageFu } from "@/utils/message";
-import { Input, Button, Table, Switch, Popconfirm } from "antd";
-import React, {
-  useCallback,
-  useEffect,
-  useMemo,
-  useRef,
-  useState,
-} from "react";
-import { useDispatch, useSelector } from "react-redux";
-import styles from "./index.module.scss";
-import UserAdd from "./UserAdd";
+  // A9API_userDisplayAPI,
+  // A9API_userPassResetAPI,
+  A9API_userRemoveAPI
+} from '@/store/action/A9User'
+import { UserTableAPIType, UserTableListType } from '@/types'
+import { MessageFu } from '@/utils/message'
+import { Input, Button, Table, Popconfirm } from 'antd'
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import { useDispatch, useSelector } from 'react-redux'
+import styles from './index.module.scss'
+import UserAdd from './UserAdd'
 
 function A9User() {
-  const dispatch = useDispatch();
+  const dispatch = useDispatch()
 
   // 顶部筛选
   const [tableSelect, setTableSelect] = useState<UserTableAPIType>({
     pageNum: 1,
     pageSize: 10,
-    realName: "",
-  });
+    realName: ''
+  })
 
   // 封装发送请求的函数
 
   const getList = useCallback(async () => {
-    dispatch(A9API_getUserListAPI(tableSelect));
-  }, [dispatch, tableSelect]);
+    dispatch(A9API_getUserListAPI(tableSelect))
+  }, [dispatch, tableSelect])
 
   // 防止发送了2次请求来对应页码
 
-  const getListRef = useRef(-1);
+  const getListRef = useRef(-1)
 
   useEffect(() => {
-    clearTimeout(getListRef.current);
+    clearTimeout(getListRef.current)
     getListRef.current = window.setTimeout(() => {
-      getList();
-    }, 100);
-  }, [getList, tableSelect]);
+      getList()
+    }, 100)
+  }, [getList, tableSelect])
 
   // 真实姓名的输入
-  const realNameTime = useRef(-1);
+  const realNameTime = useRef(-1)
   const realNameChange = useCallback(
     (e: React.ChangeEvent<HTMLInputElement>) => {
-      clearTimeout(realNameTime.current);
+      clearTimeout(realNameTime.current)
       realNameTime.current = window.setTimeout(() => {
         setTableSelect({
           ...tableSelect,
           realName: e.target.value,
-          pageNum: 1,
-        });
-      }, 500);
+          pageNum: 1
+        })
+      }, 500)
     },
     [tableSelect]
-  );
+  )
 
   // 点击重置
-  const [inputKey, setInputKey] = useState(1);
+  const [inputKey, setInputKey] = useState(1)
   const resetSelectFu = useCallback(() => {
     // 把2个输入框和时间选择器清空
-    setInputKey(Date.now());
+    setInputKey(Date.now())
     setTableSelect({
       pageNum: 1,
       pageSize: 10,
-      realName: "",
-    });
-  }, []);
+      realName: ''
+    })
+  }, [])
 
   // 从仓库中获取表格数据
-  const tableInfo = useSelector((state: RootState) => state.A9User.tableInfo);
+  const tableInfo = useSelector((state: RootState) => state.A9User.tableInfo)
 
   // 页码变化
   const paginationChange = useCallback(
     () => (pageNum: number, pageSize: number) => {
-      setTableSelect({ ...tableSelect, pageNum, pageSize });
+      setTableSelect({ ...tableSelect, pageNum, pageSize })
     },
     [tableSelect]
-  );
+  )
 
   // 切换表格中的启用停用状态
-  const isEnabledClickFu = useCallback(
-    async (val: boolean, id: number) => {
-      const isDisable = val ? 1 : 0;
-      const res: any = await A9API_userDisplayAPI(id, isDisable);
-      if (res.code === 0) getList();
-    },
-    [getList]
-  );
+  // const isEnabledClickFu = useCallback(
+  //   async (val: boolean, id: number) => {
+  //     const isDisable = val ? 1 : 0
+  //     const res: any = await A9API_userDisplayAPI(id, isDisable)
+  //     if (res.code === 0) getList()
+  //   },
+  //   [getList]
+  // )
 
   // 点击删除
   const delTableFu = useCallback(
     async (id: number) => {
-      const res: any = await A9API_userRemoveAPI(id);
+      const res: any = await A9API_userRemoveAPI(id)
       if (res.code === 0) {
-        MessageFu.success("删除成功!");
-        getList();
+        MessageFu.success('删除成功!')
+        getList()
       }
     },
     [getList]
-  );
+  )
 
   // 点击重置密码
-  const resetPassFu = useCallback(async (id: number) => {
-    const res: any = await A9API_userPassResetAPI(id);
-    if (res.code === 0) MessageFu.success("重置成功!");
-  }, []);
+  // const resetPassFu = useCallback(async (id: number) => {
+  //   const res: any = await A9API_userPassResetAPI(id)
+  //   if (res.code === 0) MessageFu.success('重置成功!')
+  // }, [])
 
   // 0------------点击新增或者编辑出来的页面
-  const [editPageShow, setEditPageShow] = useState(false);
-  const editId = useRef(0);
+  const [editPageShow, setEditPageShow] = useState(false)
+  const editId = useRef(0)
 
   const openEditPageFu = useCallback(
     (id: number) => {
       if (id === 0 && tableInfo.list.length >= 30)
-        return MessageFu.warning("最多支持30个用户!");
+        return MessageFu.warning('最多支持30个用户!')
 
-      editId.current = id;
-      setEditPageShow(true);
+      editId.current = id
+      setEditPageShow(true)
     },
     [tableInfo.list.length]
-  );
+  )
 
   const columns = useMemo(() => {
     return [
@@ -137,8 +131,8 @@ function A9User() {
       //     index + 1 + (pageNumRef.current - 1) * pagePageRef.current,
       // },
       {
-        title: "用户名",
-        dataIndex: "userName",
+        title: '用户名',
+        dataIndex: 'userName'
       },
       // {
       //   title: "用户角色",
@@ -146,39 +140,39 @@ function A9User() {
       //     item.isAdmin === 1 ? "超级管理员" : "管理员",
       // },
       {
-        title: "真实姓名",
-        dataIndex: "realName",
+        title: '真实姓名',
+        dataIndex: 'realName'
       },
       {
-        title: "手机号",
-        dataIndex: "phone",
+        title: '手机号',
+        render: (item: UserTableListType) => item.phone || '(空)'
       },
       {
-        title: "注册时间",
-        dataIndex: "createTime",
+        title: '注册时间',
+        dataIndex: 'createTime'
       },
 
-      {
-        title: "启用状态",
-        render: (item: UserTableListType) => (
-          <Switch
-            disabled={item.isAdmin === 1}
-            checkedChildren="启用"
-            unCheckedChildren="停用"
-            checked={item.isEnabled === 1}
-            onChange={(val) => isEnabledClickFu(val, item.id!)}
-          />
-        ),
-      },
+      // {
+      //   title: "启用状态",
+      //   render: (item: UserTableListType) => (
+      //     <Switch
+      //       disabled={item.isAdmin === 1}
+      //       checkedChildren="启用"
+      //       unCheckedChildren="停用"
+      //       checked={item.isEnabled === 1}
+      //       onChange={(val) => isEnabledClickFu(val, item.id!)}
+      //     />
+      //   ),
+      // },
 
       {
-        title: "操作",
+        title: '操作',
         render: (item: UserTableListType) => {
           return item.isAdmin === 1 ? (
-            "-"
+            '-'
           ) : (
             <>
-              <Popconfirm
+              {/* <Popconfirm
                 title="密码重制后为123456,是否重置?"
                 okText="重置"
                 cancelText="取消"
@@ -188,73 +182,68 @@ function A9User() {
                 <Button size="small" type="text">
                   重置密码
                 </Button>
-              </Popconfirm>
+              </Popconfirm> */}
 
-              <Button
-                size="small"
-                type="text"
-                onClick={() => openEditPageFu(item.id!)}
-              >
+              <Button size='small' type='text' onClick={() => openEditPageFu(item.id!)}>
                 编辑
               </Button>
               <Popconfirm
-                title="删除后无法恢复,是否删除?"
-                okText="删除"
-                cancelText="取消"
+                title='删除后无法恢复,是否删除?'
+                okText='删除'
+                cancelText='取消'
                 okButtonProps={{ loading: false }}
                 onConfirm={() => delTableFu(item.id!)}
               >
-                <Button size="small" type="text" danger>
+                {/* <Button size="small" type="text" danger>
                   删除
-                </Button>
+                </Button> */}
               </Popconfirm>
             </>
-          );
-        },
-      },
-    ];
-  }, [delTableFu, isEnabledClickFu, openEditPageFu, resetPassFu]);
+          )
+        }
+      }
+    ]
+  }, [delTableFu, openEditPageFu])
 
   return (
     <div className={styles.A9User}>
-      <div className="pageTitle">用户管理</div>
-      <div className="userTop">
-        <div className="selectBox">
-          <div className="selectBoxL">
-            <div className="row">
+      <div className='userTop'>
+        <div className='selectBox'>
+          <div className='selectBoxL'>
+            <div className='row'>
               <span>真实姓名:</span>
               <Input
                 key={inputKey}
                 maxLength={8}
                 style={{ width: 200 }}
-                placeholder="请输入"
+                placeholder='请输入'
                 allowClear
-                onChange={(e) => realNameChange(e)}
+                onChange={e => realNameChange(e)}
               />
             </div>
           </div>
-          <div className="selectBoxR">
-            <Button type="primary" onClick={() => openEditPageFu(0)}>
+          <div className='selectBoxR'>
+            <Button type='primary' onClick={() => openEditPageFu(0)}>
               新增
             </Button>
           </div>
         </div>
       </div>
       {/* 表格主体 */}
-      <div className="tableBox">
+      <div className='tableBox'>
         <Table
           scroll={{ y: 605 }}
           dataSource={tableInfo.list}
           columns={columns}
-          rowKey="id"
+          rowKey='id'
           pagination={{
             showQuickJumper: true,
-            position: ["bottomCenter"],
+            position: ['bottomCenter'],
             // showSizeChanger: true,
             current: tableSelect.pageNum,
             pageSize: tableSelect.pageSize,
             total: tableInfo.total,
-            onChange: paginationChange(),
+            onChange: paginationChange()
           }}
         />
       </div>
@@ -269,9 +258,9 @@ function A9User() {
         />
       ) : null}
     </div>
-  );
+  )
 }
 
-const MemoA9User = React.memo(A9User);
+const MemoA9User = React.memo(A9User)
 
-export default MemoA9User;
+export default MemoA9User

+ 38 - 0
后台大场景编辑/src/pages/Layout/index.module.scss

@@ -23,6 +23,12 @@
         & > img {
           width: 180px;
         }
+        .layTxt {
+          padding-left: 50px;
+          font-size: 20px;
+          color: #fff;
+          font-weight: 700;
+        }
       }
 
       .layoutLeftMain {
@@ -38,9 +44,33 @@
           color: black;
           text-align: center;
 
+          .txt {
+            padding-left: 30px;
+            & > img {
+              position: absolute;
+              top: 50%;
+              left: 54px;
+              transform: translateY(-50%);
+              margin-right: 15px;
+              width: 26px;
+              opacity: 0;
+            }
+            .txtImg1 {
+              opacity: 1;
+            }
+          }
+
           &:hover {
             color: #fff;
             background-color: var(--themeColor);
+            .txt {
+              .txtImg1 {
+                opacity: 0;
+              }
+              .txtImg2 {
+                opacity: 1;
+              }
+            }
           }
         }
 
@@ -48,6 +78,14 @@
           color: #fff;
           pointer-events: none;
           background-color: var(--themeColor);
+          .txt {
+            .txtImg1 {
+              opacity: 0;
+            }
+            .txtImg2 {
+              opacity: 1;
+            }
+          }
         }
       }
     }

+ 38 - 10
后台大场景编辑/src/pages/Layout/index.tsx

@@ -21,24 +21,39 @@ function Layout() {
     return [
       {
         id: 100,
+        img: 1,
         name: '场景管理',
         path: '/list',
         Com: React.lazy(() => import('../A1List'))
+      },
+      {
+        id: 900,
+        img: 2,
+        name: '用户管理',
+        path: '/user',
+        Com: React.lazy(() => import('../A9User'))
+      },
+      {
+        id: 901,
+        img: 3,
+        name: '系统日志',
+        path: '/log',
+        Com: React.lazy(() => import('../Z2log'))
       }
     ]
   }, [])
 
   useEffect(() => {
     // 如果是超级管理员
-    const userInfo = getTokenInfo().user
-    if (userInfo.isAdmin === 1) {
-      list.push({
-        id: 900,
-        name: '用户管理',
-        path: '/user',
-        Com: React.lazy(() => import('../A9User'))
-      })
-    }
+    // const userInfo = getTokenInfo().user
+    // if (userInfo.isAdmin === 1) {
+    //   list.push({
+    //     id: 900,
+    //     name: '用户管理',
+    //     path: '/user',
+    //     Com: React.lazy(() => import('../A9User'))
+    //   })
+    // }
   }, [list])
 
   // 点击跳转
@@ -100,6 +115,7 @@ function Layout() {
       <div className='layoutLeft'>
         <div className='layoutLeftTop'>
           {userInfo.isAdmin === 1 ? <img src={logonImg} alt='' /> : null}
+          <div className='layTxt'>数字孪生建模平台</div>
         </div>
         {/* 左边主体 */}
         <div className='layoutLeftMain'>
@@ -109,7 +125,19 @@ function Layout() {
               onClick={() => pathCutFu(v.path)}
               className={classNames('mainBoxL2Row', v.path === path ? 'active' : '')}
             >
-              <div className='txt'>{v.name}</div>
+              <div className='txt'>
+                <img
+                  className='txtImg1'
+                  src={require(`../../assets/img/tuBiao/${v.img}.png`)}
+                  alt=''
+                />
+                <img
+                  className='txtImg2'
+                  src={require(`../../assets/img/tuBiao/${v.img}Ac.png`)}
+                  alt=''
+                />
+                {v.name}
+              </div>
             </div>
           ))}
         </div>

+ 20 - 0
后台大场景编辑/src/pages/Z2log/data.ts

@@ -0,0 +1,20 @@
+export type LogTableType = {
+  createTime: string
+  creatorId: null
+  creatorName: string
+  description: string
+  id: number
+  ip: string
+  type: string
+  updateTime: null
+  userName: string
+}
+
+export const Z2tableC = [
+  ['index', '序号'],
+  ['txt', '账号', 'userName'],
+  ['txt', '操作日期', 'createTime'],
+  ['txt', 'IP记录', 'ip'],
+  ['txt', '操作模块', 'type'],
+  ['txt', '操作事件', 'description']
+]

+ 25 - 0
后台大场景编辑/src/pages/Z2log/index.module.scss

@@ -0,0 +1,25 @@
+.Z2log {
+  :global {
+    .logTop {
+      border-radius: 10px;
+      background-color: #fff;
+
+      .tableSelectBox {
+        padding: 20px 30px 20px;
+        display: flex;
+        align-items: center;
+
+        .row {
+          margin-right: 20px;
+        }
+      }
+    }
+
+    .tableMain {
+      padding: 0 24px;
+      border-radius: 10px;
+      height: calc(100% - 77px);
+      background-color: #fff;
+    }
+  }
+}

+ 100 - 0
后台大场景编辑/src/pages/Z2log/index.tsx

@@ -0,0 +1,100 @@
+import { RootState } from '@/store'
+import { Input, DatePicker } from 'antd'
+import React, { useCallback, useEffect, useRef, useState } from 'react'
+import { useDispatch, useSelector } from 'react-redux'
+
+import styles from './index.module.scss'
+
+import { getLogListAPI } from '@/store/action/Z2log'
+import MyTable from '@/components/MyTable'
+import { Z2tableC } from './data'
+
+const { RangePicker } = DatePicker
+
+function Z2log() {
+  const dispatch = useDispatch()
+
+  // 筛选和分页
+  const [fromData, setFromData] = useState({
+    searchKey: '',
+    pageSize: 10,
+    pageNum: 1,
+    startTime: '',
+    endTime: ''
+  })
+
+  // 账号的输入
+  const nameTime = useRef(-1)
+  const nameChange = useCallback(
+    (e: React.ChangeEvent<HTMLInputElement>) => {
+      clearTimeout(nameTime.current)
+      nameTime.current = window.setTimeout(() => {
+        setFromData({ ...fromData, searchKey: e.target.value, pageNum: 1 })
+      }, 500)
+    },
+    [fromData]
+  )
+  // 时间选择器改变
+  const timeChange = useCallback(
+    (date: any, dateString: any) => {
+      let startTime = ''
+      let endTime = ''
+      if (dateString[0] && dateString[1]) {
+        startTime = dateString[0] + ' 00:00:00'
+        endTime = dateString[1] + ' 23:59:59'
+      }
+      setFromData({ ...fromData, startTime, endTime, pageNum: 1 })
+    },
+    [fromData]
+  )
+
+  useEffect(() => {
+    dispatch(getLogListAPI(fromData))
+  }, [dispatch, fromData])
+
+  // ---------关于表格
+  const tableInfo = useSelector((state: RootState) => state.Z2log.tableInfo)
+
+  return (
+    <div className={styles.Z2log}>
+      <div className='logTop'>
+        <div className='tableSelectBox'>
+          <div className='row'>
+            <span>账号:</span>
+            <Input
+              maxLength={10}
+              showCount
+              style={{ width: 300 }}
+              placeholder='请输入账号'
+              allowClear
+              onChange={e => nameChange(e)}
+            />
+          </div>
+          <div className='row'>
+            <span>操作日期:</span>
+            <RangePicker onChange={timeChange} />
+          </div>
+        </div>
+      </div>
+
+      {/* 表格主体 */}
+      <div className='tableMain'>
+        <MyTable
+          yHeight={625}
+          list={tableInfo.list}
+          columnsTemp={Z2tableC}
+          pageNum={fromData.pageNum}
+          pageSize={fromData.pageSize}
+          total={tableInfo.total}
+          onChange={(pageNum, pageSize) =>
+            setFromData({ ...fromData, pageNum, pageSize })
+          }
+        />
+      </div>
+    </div>
+  )
+}
+
+const MemoZ2log = React.memo(Z2log)
+
+export default MemoZ2log

+ 1 - 1
后台大场景编辑/src/store/action/A9User.ts

@@ -6,7 +6,7 @@ import { AppDispatch } from '..'
  */
 export const A9API_getUserListAPI = (data: UserTableAPIType): any => {
   return async (dispatch: AppDispatch) => {
-    const res = await http.post('sys/user/list', data)
+    const res = await http.post('sys/user/list', { ...data, source: 'SSO' })
     if (res.code === 0) {
       const obj = {
         list: res.data.records,

+ 17 - 0
后台大场景编辑/src/store/action/Z2log.ts

@@ -0,0 +1,17 @@
+import http from "@/utils/http";
+import { AppDispatch } from "..";
+/**
+ * 获取日志表格列表
+ */
+export const getLogListAPI = (data: any):any => {
+  return async (dispatch: AppDispatch) => {
+    const res = await http.post("sys/log/list", data);
+    if (res.code === 0) {
+      const obj = {
+        list: res.data.records,
+        total: res.data.total,
+      };
+      dispatch({ type: "Z2/getList", payload: obj });
+    }
+  };
+};

+ 27 - 0
后台大场景编辑/src/store/reducer/Z2log.ts

@@ -0,0 +1,27 @@
+import { LogTableType } from '@/pages/Z2log/data'
+
+// 初始化状态
+const initState = {
+  // 列表数据
+  tableInfo: {
+    list: [] as LogTableType[],
+    total: 0
+  }
+}
+
+// 定义 action 类型
+type Props = {
+  type: 'Z2/getList'
+  payload: { list: LogTableType[]; total: number }
+}
+
+// reducer
+export default function logReducer(state = initState, action: Props) {
+  switch (action.type) {
+    // 获取列表数据
+    case 'Z2/getList':
+      return { ...state, tableInfo: action.payload }
+    default:
+      return state
+  }
+}

+ 8 - 6
后台大场景编辑/src/store/reducer/index.ts

@@ -1,16 +1,18 @@
-import { combineReducers } from "redux";
+import { combineReducers } from 'redux'
 
-import A0layout from "./layout";
-import A1List from "./A1List";
+import A0layout from './layout'
+import A1List from './A1List'
 
-import A9User from "./A9User";
+import A9User from './A9User'
+import Z2log from './Z2log'
 
 // 合并 reducer
 const rootReducer = combineReducers({
   A0layout,
   A1List,
   A9User,
-});
+  Z2log
+})
 
 // 默认导出
-export default rootReducer;
+export default rootReducer

+ 4 - 4
后台大场景编辑/src/utils/http.ts

@@ -10,8 +10,8 @@ export const isLocal = process.env.NODE_ENV === 'development'
 // 请求基地址
 export const baseURL =
   // 线下的图片地址需要加上/api/
-  // isLocal ? 'http://192.168.20.61:8102/api/' : ''
-  isLocal ? 'https://sit-beirenbigscene.4dage.com' : ''
+  isLocal ? 'http://192.168.20.61:8102/api/' : ''
+// isLocal ? 'https://sit-beirenbigscene.4dage.com' : ''
 
 // 处理  类型“AxiosResponse<any, any>”上不存在属性“code”
 declare module 'axios' {
@@ -24,10 +24,10 @@ declare module 'axios' {
 // 创建 axios 实例
 const http = axios.create({
   // --------线下的地址不用加/api/
-  // baseURL: baseURL,
+  baseURL: baseURL,
 
   // --------打包或线上环境接口需要加上api/
-  baseURL: baseURL + '/api/',
+  // baseURL: baseURL + '/api/',
   timeout: 10000
 })