shaogen1995 преди 1 година
родител
ревизия
b5784122b4

+ 390 - 0
package-lock.json

@@ -19,6 +19,8 @@
         "antd": "^5.8.3",
         "antd-mobile": "^5.30.0",
         "axios": "^1.1.3",
+        "braft-editor": "^2.3.9",
+        "braft-utils": "^3.0.12",
         "dayjs": "^1.11.7",
         "echarts": "^5.4.0",
         "html2canvas": "^1.4.1",
@@ -5503,6 +5505,88 @@
         "node": ">=8"
       }
     },
+    "node_modules/braft-convert": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/braft-convert/-/braft-convert-2.3.0.tgz",
+      "integrity": "sha512-5km+dLHk8iYDv2iEYDrDQ2ld/ZoUx66QLql0qdm5PqZEcNXc8dBHGLORfzeu3iMw1jLeAiHxtdY5+ypuIhczVg==",
+      "dependencies": {
+        "draft-convert": "^2.0.0",
+        "draft-js": "^0.10.3"
+      },
+      "peerDependencies": {
+        "react": "^16.0.0"
+      }
+    },
+    "node_modules/braft-convert/node_modules/draft-convert": {
+      "version": "2.1.13",
+      "resolved": "https://registry.npmjs.org/draft-convert/-/draft-convert-2.1.13.tgz",
+      "integrity": "sha512-/h/n4JCfyO8aWby7wKBkccHdsuVbbDyHWXi/B3Zf2pN++lN1lDOIVt5ulXCcbH2Y5YJEFzMJw/YGfN+R0axxxg==",
+      "dependencies": {
+        "@babel/runtime": "^7.5.5",
+        "immutable": "~3.7.4",
+        "invariant": "^2.2.1"
+      },
+      "peerDependencies": {
+        "draft-js": ">=0.7.0",
+        "react": "^15.0.2 || ^16.0.0-rc || ^16.0.0 || ^17.0.0 || ^18.0.0",
+        "react-dom": "^15.0.2 || ^16.0.0-rc || ^16.0.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/braft-editor": {
+      "version": "2.3.9",
+      "resolved": "https://registry.npmmirror.com/braft-editor/-/braft-editor-2.3.9.tgz",
+      "integrity": "sha512-mqdPk/zI2dhFK8tW/A4Qj/AkkARLh5L/niNw+iif5wFqb6zh15rMlrShgz1nWO/QXyAKr8XtDgxiBbR0zWwtRg==",
+      "dependencies": {
+        "@babel/runtime": "^7.0.0",
+        "braft-convert": "^2.3.0",
+        "braft-finder": "^0.0.19",
+        "braft-utils": "^3.0.8",
+        "draft-convert": "^2.0.0",
+        "draft-js": "^0.10.3",
+        "draft-js-multidecorators": "^1.0.0",
+        "draftjs-utils": "^0.9.4",
+        "immutable": "~3.7.4"
+      },
+      "peerDependencies": {
+        "react": "^15.0.2|| ^16.0.0-rc || ^16.0.0",
+        "react-dom": "^15.0.2|| ^16.0.0-rc || ^16.0.0"
+      }
+    },
+    "node_modules/braft-editor/node_modules/braft-finder": {
+      "version": "0.0.19",
+      "resolved": "https://registry.npmmirror.com/braft-finder/-/braft-finder-0.0.19.tgz",
+      "integrity": "sha512-0kzI6/KbomJJhYX1hpjn4edCKhblyUyWdUrsgBmOrwy0vrj+pPkm69+Uf8Uj6KGAULM6LF0ooC++p7fqUGgFHw==",
+      "peerDependencies": {
+        "react": "^16.4.1",
+        "react-dom": "^16.4.1"
+      }
+    },
+    "node_modules/braft-editor/node_modules/draft-convert": {
+      "version": "2.1.13",
+      "resolved": "https://registry.npmmirror.com/draft-convert/-/draft-convert-2.1.13.tgz",
+      "integrity": "sha512-/h/n4JCfyO8aWby7wKBkccHdsuVbbDyHWXi/B3Zf2pN++lN1lDOIVt5ulXCcbH2Y5YJEFzMJw/YGfN+R0axxxg==",
+      "dependencies": {
+        "@babel/runtime": "^7.5.5",
+        "immutable": "~3.7.4",
+        "invariant": "^2.2.1"
+      },
+      "peerDependencies": {
+        "draft-js": ">=0.7.0",
+        "react": "^15.0.2 || ^16.0.0-rc || ^16.0.0 || ^17.0.0 || ^18.0.0",
+        "react-dom": "^15.0.2 || ^16.0.0-rc || ^16.0.0 || ^17.0.0 || ^18.0.0"
+      }
+    },
+    "node_modules/braft-utils": {
+      "version": "3.0.12",
+      "resolved": "https://registry.npmmirror.com/braft-utils/-/braft-utils-3.0.12.tgz",
+      "integrity": "sha512-O2cKysURNC4HSEMKgNmQ2RluwcrxvYrztlEmyPN5SzktiNX3vaLFQoo0Ez3PlIhvjaGrIBSIT2Oyh2N6mn6TFg==",
+      "peerDependencies": {
+        "braft-convert": "^2.1.4",
+        "draft-js": "^0.10.5",
+        "draftjs-utils": "^0.9.4",
+        "immutable": "~3.7.4"
+      }
+    },
     "node_modules/browser-process-hrtime": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
@@ -6813,6 +6897,37 @@
       "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
       "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
     },
+    "node_modules/draft-js": {
+      "version": "0.10.5",
+      "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.10.5.tgz",
+      "integrity": "sha512-LE6jSCV9nkPhfVX2ggcRLA4FKs6zWq9ceuO/88BpXdNCS7mjRTgs0NsV6piUCJX9YxMsB9An33wnkMmU2sD2Zg==",
+      "dependencies": {
+        "fbjs": "^0.8.15",
+        "immutable": "~3.7.4",
+        "object-assign": "^4.1.0"
+      },
+      "peerDependencies": {
+        "react": "^0.14.0 || ^15.0.0-rc || ^16.0.0-rc || ^16.0.0",
+        "react-dom": "^0.14.0 || ^15.0.0-rc || ^16.0.0-rc || ^16.0.0"
+      }
+    },
+    "node_modules/draft-js-multidecorators": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/draft-js-multidecorators/-/draft-js-multidecorators-1.0.0.tgz",
+      "integrity": "sha512-7qdy+YQol5iq38AoEerhgSJWhCzxvZLn1x5ODfUlGfWlg0SrZ9AXJbaxHVIjdSIZNrbVIm+WANujNxMqCmDSZQ==",
+      "dependencies": {
+        "immutable": "*"
+      }
+    },
+    "node_modules/draftjs-utils": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmjs.org/draftjs-utils/-/draftjs-utils-0.9.4.tgz",
+      "integrity": "sha512-KYjABSbGpJrwrwmxVj5UhfV37MF/p0QRxKIyL+/+QOaJ8J9z1FBKxkblThbpR0nJi9lxPQWGg+gh+v0dAsSCCg==",
+      "peerDependencies": {
+        "draft-js": "^0.10.x",
+        "immutable": "3.x.x || 4.x.x"
+      }
+    },
     "node_modules/duplexer": {
       "version": "0.1.2",
       "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz",
@@ -6885,6 +7000,14 @@
         "node": ">= 0.8"
       }
     },
+    "node_modules/encoding": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+      "dependencies": {
+        "iconv-lite": "^0.6.2"
+      }
+    },
     "node_modules/enhanced-resolve": {
       "version": "5.10.0",
       "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
@@ -7930,6 +8053,34 @@
         "bser": "2.1.1"
       }
     },
+    "node_modules/fbjs": {
+      "version": "0.8.18",
+      "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz",
+      "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==",
+      "dependencies": {
+        "core-js": "^1.0.0",
+        "isomorphic-fetch": "^2.1.1",
+        "loose-envify": "^1.0.0",
+        "object-assign": "^4.1.0",
+        "promise": "^7.1.1",
+        "setimmediate": "^1.0.5",
+        "ua-parser-js": "^0.7.30"
+      }
+    },
+    "node_modules/fbjs/node_modules/core-js": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+      "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==",
+      "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js."
+    },
+    "node_modules/fbjs/node_modules/promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+      "dependencies": {
+        "asap": "~2.0.3"
+      }
+    },
     "node_modules/fflate": {
       "version": "0.4.8",
       "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz",
@@ -8895,6 +9046,14 @@
       "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.16.tgz",
       "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ=="
     },
+    "node_modules/immutable": {
+      "version": "3.7.6",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz",
+      "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
     "node_modules/import-fresh": {
       "version": "3.3.0",
       "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -8983,6 +9142,14 @@
       "resolved": "https://registry.npmmirror.com/intersection-observer/-/intersection-observer-0.12.2.tgz",
       "integrity": "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg=="
     },
+    "node_modules/invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "dependencies": {
+        "loose-envify": "^1.0.0"
+      }
+    },
     "node_modules/ipaddr.js": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
@@ -9312,6 +9479,15 @@
       "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
     },
+    "node_modules/isomorphic-fetch": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+      "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==",
+      "dependencies": {
+        "node-fetch": "^1.0.1",
+        "whatwg-fetch": ">=0.10.0"
+      }
+    },
     "node_modules/istanbul-lib-coverage": {
       "version": "3.2.0",
       "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
@@ -11895,6 +12071,23 @@
         "tslib": "^2.0.3"
       }
     },
+    "node_modules/node-fetch": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+      "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+      "dependencies": {
+        "encoding": "^0.1.11",
+        "is-stream": "^1.0.1"
+      }
+    },
+    "node_modules/node-fetch/node_modules/is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
     "node_modules/node-forge": {
       "version": "1.3.1",
       "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz",
@@ -15455,6 +15648,11 @@
         "node": ">= 0.8.0"
       }
     },
+    "node_modules/setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
+    },
     "node_modules/setprototypeof": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -16401,6 +16599,28 @@
         "node": ">=4.2.0"
       }
     },
+    "node_modules/ua-parser-js": {
+      "version": "0.7.37",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz",
+      "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/ua-parser-js"
+        },
+        {
+          "type": "paypal",
+          "url": "https://paypal.me/faisalman"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/faisalman"
+        }
+      ],
+      "engines": {
+        "node": "*"
+      }
+    },
     "node_modules/unbox-primitive": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
@@ -21654,6 +21874,67 @@
         "fill-range": "^7.0.1"
       }
     },
+    "braft-convert": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/braft-convert/-/braft-convert-2.3.0.tgz",
+      "integrity": "sha512-5km+dLHk8iYDv2iEYDrDQ2ld/ZoUx66QLql0qdm5PqZEcNXc8dBHGLORfzeu3iMw1jLeAiHxtdY5+ypuIhczVg==",
+      "requires": {
+        "draft-convert": "^2.0.0",
+        "draft-js": "^0.10.3"
+      },
+      "dependencies": {
+        "draft-convert": {
+          "version": "2.1.13",
+          "resolved": "https://registry.npmjs.org/draft-convert/-/draft-convert-2.1.13.tgz",
+          "integrity": "sha512-/h/n4JCfyO8aWby7wKBkccHdsuVbbDyHWXi/B3Zf2pN++lN1lDOIVt5ulXCcbH2Y5YJEFzMJw/YGfN+R0axxxg==",
+          "requires": {
+            "@babel/runtime": "^7.5.5",
+            "immutable": "~3.7.4",
+            "invariant": "^2.2.1"
+          }
+        }
+      }
+    },
+    "braft-editor": {
+      "version": "2.3.9",
+      "resolved": "https://registry.npmmirror.com/braft-editor/-/braft-editor-2.3.9.tgz",
+      "integrity": "sha512-mqdPk/zI2dhFK8tW/A4Qj/AkkARLh5L/niNw+iif5wFqb6zh15rMlrShgz1nWO/QXyAKr8XtDgxiBbR0zWwtRg==",
+      "requires": {
+        "@babel/runtime": "^7.0.0",
+        "braft-convert": "^2.3.0",
+        "braft-finder": "^0.0.19",
+        "braft-utils": "^3.0.8",
+        "draft-convert": "^2.0.0",
+        "draft-js": "^0.10.3",
+        "draft-js-multidecorators": "^1.0.0",
+        "draftjs-utils": "^0.9.4",
+        "immutable": "~3.7.4"
+      },
+      "dependencies": {
+        "braft-finder": {
+          "version": "0.0.19",
+          "resolved": "https://registry.npmmirror.com/braft-finder/-/braft-finder-0.0.19.tgz",
+          "integrity": "sha512-0kzI6/KbomJJhYX1hpjn4edCKhblyUyWdUrsgBmOrwy0vrj+pPkm69+Uf8Uj6KGAULM6LF0ooC++p7fqUGgFHw==",
+          "requires": {}
+        },
+        "draft-convert": {
+          "version": "2.1.13",
+          "resolved": "https://registry.npmmirror.com/draft-convert/-/draft-convert-2.1.13.tgz",
+          "integrity": "sha512-/h/n4JCfyO8aWby7wKBkccHdsuVbbDyHWXi/B3Zf2pN++lN1lDOIVt5ulXCcbH2Y5YJEFzMJw/YGfN+R0axxxg==",
+          "requires": {
+            "@babel/runtime": "^7.5.5",
+            "immutable": "~3.7.4",
+            "invariant": "^2.2.1"
+          }
+        }
+      }
+    },
+    "braft-utils": {
+      "version": "3.0.12",
+      "resolved": "https://registry.npmmirror.com/braft-utils/-/braft-utils-3.0.12.tgz",
+      "integrity": "sha512-O2cKysURNC4HSEMKgNmQ2RluwcrxvYrztlEmyPN5SzktiNX3vaLFQoo0Ez3PlIhvjaGrIBSIT2Oyh2N6mn6TFg==",
+      "requires": {}
+    },
     "browser-process-hrtime": {
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
@@ -22686,6 +22967,30 @@
       "resolved": "https://registry.npmmirror.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
       "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA=="
     },
+    "draft-js": {
+      "version": "0.10.5",
+      "resolved": "https://registry.npmjs.org/draft-js/-/draft-js-0.10.5.tgz",
+      "integrity": "sha512-LE6jSCV9nkPhfVX2ggcRLA4FKs6zWq9ceuO/88BpXdNCS7mjRTgs0NsV6piUCJX9YxMsB9An33wnkMmU2sD2Zg==",
+      "requires": {
+        "fbjs": "^0.8.15",
+        "immutable": "~3.7.4",
+        "object-assign": "^4.1.0"
+      }
+    },
+    "draft-js-multidecorators": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmmirror.com/draft-js-multidecorators/-/draft-js-multidecorators-1.0.0.tgz",
+      "integrity": "sha512-7qdy+YQol5iq38AoEerhgSJWhCzxvZLn1x5ODfUlGfWlg0SrZ9AXJbaxHVIjdSIZNrbVIm+WANujNxMqCmDSZQ==",
+      "requires": {
+        "immutable": "*"
+      }
+    },
+    "draftjs-utils": {
+      "version": "0.9.4",
+      "resolved": "https://registry.npmjs.org/draftjs-utils/-/draftjs-utils-0.9.4.tgz",
+      "integrity": "sha512-KYjABSbGpJrwrwmxVj5UhfV37MF/p0QRxKIyL+/+QOaJ8J9z1FBKxkblThbpR0nJi9lxPQWGg+gh+v0dAsSCCg==",
+      "requires": {}
+    },
     "duplexer": {
       "version": "0.1.2",
       "resolved": "https://registry.npmmirror.com/duplexer/-/duplexer-0.1.2.tgz",
@@ -22745,6 +23050,14 @@
       "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
       "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
     },
+    "encoding": {
+      "version": "0.1.13",
+      "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+      "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+      "requires": {
+        "iconv-lite": "^0.6.2"
+      }
+    },
     "enhanced-resolve": {
       "version": "5.10.0",
       "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz",
@@ -23571,6 +23884,35 @@
         "bser": "2.1.1"
       }
     },
+    "fbjs": {
+      "version": "0.8.18",
+      "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.18.tgz",
+      "integrity": "sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==",
+      "requires": {
+        "core-js": "^1.0.0",
+        "isomorphic-fetch": "^2.1.1",
+        "loose-envify": "^1.0.0",
+        "object-assign": "^4.1.0",
+        "promise": "^7.1.1",
+        "setimmediate": "^1.0.5",
+        "ua-parser-js": "^0.7.30"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "1.2.7",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz",
+          "integrity": "sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA=="
+        },
+        "promise": {
+          "version": "7.3.1",
+          "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
+          "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+          "requires": {
+            "asap": "~2.0.3"
+          }
+        }
+      }
+    },
     "fflate": {
       "version": "0.4.8",
       "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz",
@@ -24322,6 +24664,11 @@
       "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.16.tgz",
       "integrity": "sha512-qenGE7CstVm1NrHQbMh8YaSzTZTFNP3zPqr3YU0S0UY441j4bJTg4A2Hh5KAhwgaiU6ZZ1Ar6y/2f4TblnMReQ=="
     },
+    "immutable": {
+      "version": "3.7.6",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz",
+      "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw=="
+    },
     "import-fresh": {
       "version": "3.3.0",
       "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -24391,6 +24738,14 @@
       "resolved": "https://registry.npmmirror.com/intersection-observer/-/intersection-observer-0.12.2.tgz",
       "integrity": "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg=="
     },
+    "invariant": {
+      "version": "2.2.4",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+      "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+      "requires": {
+        "loose-envify": "^1.0.0"
+      }
+    },
     "ipaddr.js": {
       "version": "2.0.1",
       "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
@@ -24642,6 +24997,15 @@
       "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz",
       "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
     },
+    "isomorphic-fetch": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz",
+      "integrity": "sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==",
+      "requires": {
+        "node-fetch": "^1.0.1",
+        "whatwg-fetch": ">=0.10.0"
+      }
+    },
     "istanbul-lib-coverage": {
       "version": "3.2.0",
       "resolved": "https://registry.npmmirror.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
@@ -26659,6 +27023,22 @@
         "tslib": "^2.0.3"
       }
     },
+    "node-fetch": {
+      "version": "1.7.3",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz",
+      "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==",
+      "requires": {
+        "encoding": "^0.1.11",
+        "is-stream": "^1.0.1"
+      },
+      "dependencies": {
+        "is-stream": {
+          "version": "1.1.0",
+          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+          "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="
+        }
+      }
+    },
     "node-forge": {
       "version": "1.3.1",
       "resolved": "https://registry.npmmirror.com/node-forge/-/node-forge-1.3.1.tgz",
@@ -29204,6 +29584,11 @@
         "send": "0.18.0"
       }
     },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="
+    },
     "setprototypeof": {
       "version": "1.2.0",
       "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -29960,6 +30345,11 @@
       "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.8.4.tgz",
       "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ=="
     },
+    "ua-parser-js": {
+      "version": "0.7.37",
+      "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz",
+      "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA=="
+    },
     "unbox-primitive": {
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz",

+ 2 - 0
package.json

@@ -14,6 +14,8 @@
     "antd": "^5.8.3",
     "antd-mobile": "^5.30.0",
     "axios": "^1.1.3",
+    "braft-editor": "^2.3.9",
+    "braft-utils": "^3.0.12",
     "dayjs": "^1.11.7",
     "echarts": "^5.4.0",
     "html2canvas": "^1.4.1",

+ 58 - 0
src/components/ZRichText/index.module.scss

@@ -0,0 +1,58 @@
+.ZRichText {
+  :global {
+    .txtBox {
+      width: 1000px;
+      border: 1px solid #ccc;
+
+      // 隐藏媒体功能
+      .control-item.media {
+        display: none;
+      }
+
+      .bf-content {
+        height: 300px;
+      }
+
+      .bf-controlbar {
+        position: relative;
+
+        .upImgBox {
+          position: absolute;
+          bottom: 13px;
+          right: 15px;
+          cursor: pointer;
+          color: var(--themeColor);
+        }
+
+        .upImgBoxNo {
+          display: none;
+        }
+
+      }
+    }
+
+    .noUpThumb {
+      position: relative;
+      overflow: hidden;
+      opacity: 0;
+      transition: top .2s;
+      color: #ff4d4f;
+      top: -10px;
+    }
+
+    .noUpThumbAc {
+      top: 0;
+      opacity: 1;
+    }
+
+    .bf-media .bf-image {
+      float: initial !important;
+      display: block;
+      margin: 10px auto;
+      max-width: 500px;
+      max-height: 500px;
+      text-align: center;
+    }
+
+  }
+}

+ 194 - 0
src/components/ZRichText/index.tsx

@@ -0,0 +1,194 @@
+import React, {
+  useCallback,
+  useEffect,
+  useMemo,
+  useRef,
+  useState,
+} from "react";
+import styles from "./index.module.scss";
+
+// 引入编辑器组件
+
+// 安装---npm install braft-editor --save --force
+// npm install braft-utils --save --force
+import { ContentUtils } from "braft-utils";
+import BraftEditor from "braft-editor";
+// 引入编辑器样式
+import "braft-editor/dist/index.css";
+
+import classNames from "classnames";
+import { MessageFu } from "@/utils/message";
+import { fileDomInitialFu } from "@/utils/domShow";
+import { baseURL } from "@/utils/http";
+
+import { forwardRef, useImperativeHandle } from "react";
+import { API_upFile } from "@/store/action/layout";
+
+type Props = {
+  check: boolean; //表单校验,为fasle表示不校验
+  dirCode: string; //文件的code码
+  isLook: boolean; //是否是查看进来
+  ref: any; //当前自己的ref,给父组件调用
+  myUrl: string; //上传的api地址
+};
+
+function ZRichText({ check, dirCode, isLook, myUrl }: Props, ref: any) {
+  // 添加 上传 图片的dom
+  useEffect(() => {
+    if (!isLook) {
+      setTimeout(() => {
+        const dom = document.querySelector(".bf-controlbar")!;
+        const div = document.createElement("div");
+        div.className = "upImgBox";
+        // div.title = "上传图片";
+        div.innerHTML = "上传图片";
+        div.onclick = async () => {
+          myInput.current?.click();
+        };
+        dom.appendChild(div);
+      }, 200);
+
+      // 监听 富文本 的 class 变化,在全屏的时候会 富文本会添加上 fullscreen 的类
+      // 修复顶部样式冲突问题
+
+      const editorDom = document.querySelector(
+        ".bf-container"
+      ) as HTMLDivElement;
+
+      const observer = new MutationObserver(() => {
+        // console.log("change");
+        const dom = document.querySelector(".layoutRightTop") as HTMLDivElement;
+
+        if (editorDom.className.includes("fullscreen")) dom.style.zIndex = "-1";
+        else dom.style.zIndex = "100";
+      });
+
+      observer.observe(editorDom, {
+        attributes: true,
+      });
+
+      // 销毁监听
+      return () => {
+        observer.disconnect();
+      };
+    }
+  }, [isLook]);
+
+  // 编辑器文本
+  const [editorValue, setEditorValue] = useState(
+    // 初始内容
+    BraftEditor.createEditorState("")
+  );
+
+  // 判断 富文本是否为空
+  const isTxtFlag = useMemo(() => {
+    const txt: string = editorValue.toHTML();
+    if (
+      txt.replaceAll("<p>", "").replaceAll("</p>", "").replaceAll(" ", "") ===
+      ""
+    ) {
+      return true;
+    } else return false;
+  }, [editorValue]);
+
+  const myInput = useRef<HTMLInputElement>(null);
+
+  // 上传图片
+  const handeUpPhoto = useCallback(
+    async (e: React.ChangeEvent<HTMLInputElement>) => {
+      if (e.target.files) {
+        // 拿到files信息
+        const filesInfo = e.target.files[0];
+        // 校验格式
+        const type = ["image/jpeg", "image/png"];
+        if (!type.includes(filesInfo.type)) {
+          e.target.value = "";
+          return MessageFu.warning("只支持png、jpg和jpeg格式!");
+        }
+        // 校验大小
+        if (filesInfo.size > 5 * 1024 * 1024) {
+          e.target.value = "";
+          return MessageFu.warning("最大支持5M!");
+        }
+        // 创建FormData对象
+        const fd = new FormData();
+        // 把files添加进FormData对象(‘photo’为后端需要的字段)
+        fd.append("type", "img");
+        fd.append("dirCode", dirCode);
+        fd.append("file", filesInfo);
+
+        e.target.value = "";
+
+        try {
+          const res = await API_upFile(fd, myUrl);
+          if (res.code === 0) {
+            MessageFu.success("上传成功!");
+            // 在光标位置插入图片
+            const newTxt = ContentUtils.insertMedias(editorValue, [
+              {
+                type: "IMAGE",
+                url: baseURL + res.data.filePath,
+              },
+            ]);
+
+            setEditorValue(newTxt);
+          }
+          fileDomInitialFu();
+        } catch (error) {
+          fileDomInitialFu();
+        }
+      }
+    },
+    [dirCode, editorValue, myUrl]
+  );
+
+  // 让父组件调用的 回显 富文本
+  const ritxtShowFu = useCallback((val: string) => {
+    setEditorValue(BraftEditor.createEditorState(val));
+  }, []);
+
+  // 让父组件调用的返回 富文本信息 和 表单校验
+  const fatherBtnOkFu = useCallback(() => {
+    return { val: editorValue.toHTML(), flag: isTxtFlag };
+  }, [editorValue, isTxtFlag]);
+
+  // 可以让父组件调用子组件的方法
+  useImperativeHandle(ref, () => ({
+    ritxtShowFu,
+    fatherBtnOkFu,
+  }));
+
+  return (
+    <div className={styles.ZRichText}>
+      <input
+        id="upInput"
+        type="file"
+        accept=".png,.jpg,.jpeg"
+        ref={myInput}
+        onChange={(e) => handeUpPhoto(e)}
+      />
+
+      <div className="txtBox">
+        <BraftEditor
+          readOnly={isLook}
+          placeholder="请输入内容"
+          value={editorValue}
+          onChange={(e) => setEditorValue(e)}
+          imageControls={["remove"]}
+        />
+      </div>
+      <div
+        className={classNames(
+          "noUpThumb",
+          check && isTxtFlag ? "noUpThumbAc" : ""
+        )}
+      >
+        请输入正文!
+      </div>
+    </div>
+  );
+}
+
+// const MemoZRichText = React.memo(ZRichText);
+
+export default forwardRef(ZRichText);

+ 3 - 1
src/pages/A4exhibit/index.tsx

@@ -96,7 +96,9 @@ function A4exhibit() {
 
   return (
     <div className={styles.A4exhibit}>
-      <div className="pageTitle">云展管理</div>
+      <div className="pageTitle">
+        云展管理 {addId ? (addId > 0 ? " - 编辑" : " - 新增") : ""}
+      </div>
 
       {/* 顶部筛选 */}
       <div className="A4top">

+ 3 - 1
src/pages/A5goods/index.tsx

@@ -108,7 +108,9 @@ function A5goods() {
 
   return (
     <div className={styles.A5goods}>
-      <div className="pageTitle">馆藏管理</div>
+      <div className="pageTitle">
+        馆藏管理 {addId ? (addId > 0 ? " - 编辑" : " - 新增") : ""}
+      </div>
       {/* 顶部筛选 */}
       <div className="A5top">
         <div className="A5topRow">

+ 14 - 0
src/pages/A6_1ques/A6QInfo/index.module.scss

@@ -0,0 +1,14 @@
+.A6QInfo{
+  position: absolute;
+  z-index: 10;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: #fff;
+  border-radius: 10px;
+  padding: 20px;
+  :global{
+    
+  }
+}

+ 23 - 0
src/pages/A6_1ques/A6QInfo/index.tsx

@@ -0,0 +1,23 @@
+import React, { useEffect } from "react";
+import styles from "./index.module.scss";
+
+type Props = {
+  sId: number;
+  closeFu: () => void;
+};
+
+function A6QInfo({ sId, closeFu }: Props) {
+  useEffect(() => {
+    console.log("详情", sId);
+  }, [sId]);
+
+  return (
+    <div className={styles.A6QInfo}>
+      <h1 onClick={closeFu}>A6QInfo详情</h1>
+    </div>
+  );
+}
+
+const MemoA6QInfo = React.memo(A6QInfo);
+
+export default MemoA6QInfo;

+ 102 - 0
src/pages/A6_1ques/A6Qadd/index.module.scss

@@ -0,0 +1,102 @@
+.A6Qadd {
+  position: absolute;
+  z-index: 12;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  background-color: #fff;
+  border-radius: 10px;
+  padding: 20px;
+
+  :global {
+    .A6QAmain {
+      width: 100%;
+      height: 100%;
+      overflow-y: auto;
+      padding-bottom: 30px;
+
+      #basic {
+        width: 1092px;
+      }
+
+      .formRow {
+        display: flex;
+
+        .formLeft {
+          position: relative;
+          top: 3px;
+          width: 92px;
+          text-align: right;
+
+          &>span {
+            color: #ff4d4f;
+          }
+        }
+
+        .formRight {
+          width: calc(100% - 92px);
+
+          // 题目的定制化样式
+          .A6Qlist2 {
+            margin-top: 15px;
+            width: 100%;
+
+            .A6Qlist2Son {
+              width: 100%;
+              position: relative;
+              border-radius: 6px;
+              border: 1px solid #ccc;
+              padding: 15px 15px 40px;
+
+              .A6Q2del {
+                position: absolute;
+                top: 0px;
+                left: -50px;
+                cursor: pointer;
+                border-radius: 4px;
+                padding: 0px 14px;
+                color: #fff;
+                background-color: #aaaaaa;
+                font-size: 24px;
+              }
+
+              .A6Q2_1{
+                display: flex;
+                width: 100%;
+                &>div{
+                  &:nth-of-type(1){
+                    &>span{
+                      color: #ff4d4f;
+                    }
+                    width: 70px;
+                  }
+                  &:nth-of-type(2){
+                    width: calc(100% - 70px);
+                  }
+                  .A6text{
+                    textarea{
+                      min-height: 70px !important;
+                    }
+                  }
+                }
+              }
+              .A6Q2_2{
+                padding-left: 70px;
+                margin-top: 15px;
+              }
+            }
+          }
+        }
+      }
+    }
+
+    .A6QAbtn {
+      position: absolute;
+      z-index: 10;
+      left: 1200px;
+      top: 50%;
+      transform: translateY(-50%);
+    }
+  }
+}

+ 271 - 0
src/pages/A6_1ques/A6Qadd/index.tsx

@@ -0,0 +1,271 @@
+import React, { useCallback, useEffect, useRef, useState } from "react";
+import styles from "./index.module.scss";
+import { A6QInfoType, A6QListType, options1, options2 } from "../data";
+import {
+  Button,
+  Checkbox,
+  DatePicker,
+  Form,
+  FormInstance,
+  Input,
+  Select,
+} from "antd";
+import MyPopconfirm from "@/components/MyPopconfirm";
+import ZRichText from "@/components/ZRichText";
+import dayjs from "dayjs";
+import TextArea from "antd/es/input/TextArea";
+
+type Props = {
+  sInfo: A6QInfoType;
+  closeFu: () => void;
+};
+
+function A6Qadd({ sInfo, closeFu }: Props) {
+  // 表单的ref
+  const FormBoxRef = useRef<FormInstance>(null);
+
+  const getInfoFu = useCallback(async (id: number) => {
+    FormBoxRef.current?.setFieldsValue({
+      // myTime: dayjs(data.releaseDate),
+    });
+  }, []);
+
+  useEffect(() => {
+    if (sInfo.txt === "编辑") getInfoFu(sInfo.id);
+    else if (sInfo.txt === "新增") {
+      // 新增
+      FormBoxRef.current?.setFieldsValue({
+        myTime: dayjs(Date.now()),
+        aaaaaaa: 1,
+      });
+      setList([
+        {
+          id: 1,
+          name: "",
+          type: "单选",
+          skip: "不需要",
+          custom: false,
+          sList: [
+            { id: 1.1, txt: "" },
+            { id: 1.2, txt: "" },
+          ],
+        },
+      ]);
+    }
+  }, [getInfoFu, sInfo]);
+
+  // 是否 已经点击过确定
+  const [fileCheck, setFileCheck] = useState(false);
+
+  // 富文本的ref
+  const ZRichTextRef = useRef<any>(null);
+
+  // 题目的数组
+  const [list, setList] = useState<A6QListType[]>([]);
+
+  // 点击新增题目
+  const addList = useCallback(() => {}, []);
+
+  // 信息的改变
+  const dataChangeFu = useCallback(
+    (
+      e: string | boolean,
+      rank: 1 | 2,
+      id: number,
+      key: "name" | "type" | "skip" | "custom" | "id" | "txt"
+    ) => {
+      let value: string | boolean;
+      if (typeof e === "string") value = e.replace(/\s+/g, "");
+      else value = e;
+      if (rank === 1 && key !== "txt") {
+        setList(
+          list.map((v) => ({
+            ...v,
+            [key]: id === v.id ? value : v[key],
+          }))
+        );
+      }
+    },
+    [list]
+  );
+
+  // 没有通过校验
+  const onFinishFailed = useCallback(() => {
+    setFileCheck(true);
+  }, []);
+
+  //  通过校验点击确定
+  const onFinish = useCallback(async (values: any) => {
+    setFileCheck(true);
+  }, []);
+
+  return (
+    <div className={styles.A6Qadd}>
+      <div className="A6QAmain">
+        <Form
+          ref={FormBoxRef}
+          name="basic"
+          labelCol={{ span: 2 }}
+          onFinish={onFinish}
+          onFinishFailed={onFinishFailed}
+          autoComplete="off"
+          scrollToFirstError
+        >
+          <Form.Item
+            label="标题"
+            name="name"
+            rules={[{ required: true, message: "请输入标题!" }]}
+            getValueFromEvent={(e) => e.target.value.replace(/\s+/g, "")}
+          >
+            <Input maxLength={50} showCount placeholder="请输入内容" />
+          </Form.Item>
+
+          {/* 富文本 */}
+          <div className="formRow">
+            <div className="formLeft">
+              <span> </span>
+              摘要:
+            </div>
+            <div className="formRight">
+              <ZRichText
+                check={false}
+                dirCode="A6Q"
+                isLook={false}
+                ref={ZRichTextRef}
+                // 待完善路径
+                myUrl="cms/exhibition/upload"
+              />
+            </div>
+          </div>
+
+          <Form.Item
+            label="发布日期"
+            name="myTime"
+            rules={[{ required: true, message: "请选择发布日期!" }]}
+          >
+            <DatePicker style={{ width: 200 }} />
+          </Form.Item>
+
+          <Form.Item
+            label="问卷状态"
+            name="aaaaaaa"
+            rules={[{ required: true, message: "请选择问卷状态!" }]}
+          >
+            <Select
+              placeholder="请选择"
+              style={{ width: 200 }}
+              options={[
+                { value: 1, label: "开启" },
+                { value: 0, label: "关闭" },
+              ]}
+            />
+          </Form.Item>
+
+          <div className="formRow">
+            <div className="formLeft">
+              <span>* </span>
+              题目:
+            </div>
+            <div className="formRight">
+              <div className="A6Qlist">
+                <div className="A6Qlist1">
+                  <Button type="primary" onClick={addList}>
+                    新增
+                  </Button>
+                  &emsp;
+                  <span>最多支持50题</span>
+                </div>
+                <div className="A6Qlist2">
+                  {list.map((v, i) => (
+                    <div className="A6Qlist2Son" key={v.id}>
+                      {/* 1级 删除 */}
+                      {i === 0 ? null : <div className="A6Q2del"> - </div>}
+
+                      {/* 题目 */}
+                      <div className="A6Q2_1">
+                        <div>
+                          <span>*</span> 题目 {i + 1}
+                        </div>
+                        <div>
+                          <TextArea
+                            value={v.name}
+                            onChange={(e) =>
+                              dataChangeFu(e.target.value, 1, v.id, "name")
+                            }
+                            className="A6text"
+                            placeholder="请输入内容"
+                            showCount
+                            maxLength={200}
+                          />
+                        </div>
+                      </div>
+
+                      <div className="A6Q2_2">
+                        {/* 类型 跳题 自定义 */}
+                        <div className="A6Q2_21">
+                          类型&emsp;
+                          <Select
+                            disabled={v.skip === "选项跳题"}
+                            value={v.type}
+                            onChange={(e) => dataChangeFu(e, 1, v.id, "type")}
+                            placeholder="请选择"
+                            style={{ width: 100 }}
+                            options={options1}
+                          />
+                          &emsp;&emsp;跳题&emsp;
+                          <Select
+                            value={v.skip}
+                            onChange={(e) => dataChangeFu(e, 1, v.id, "skip")}
+                            placeholder="请选择"
+                            style={{ width: 100 }}
+                            options={
+                              v.type === "单选"
+                                ? options2
+                                : options2.filter((c) => c.label !== "选项跳题")
+                            }
+                          />
+                          &emsp;&emsp;
+                          {v.type === "填空" ? null : (
+                            <Checkbox
+                              checked={v.custom}
+                              onChange={(e) =>
+                                dataChangeFu(
+                                  e.target.checked,
+                                  1,
+                                  v.id,
+                                  "custom"
+                                )
+                              }
+                            >
+                              支持填写自定义回答
+                            </Checkbox>
+                          )}
+                        </div>
+
+                        {/* 子选项 */}
+                      </div>
+                    </div>
+                  ))}
+                </div>
+              </div>
+            </div>
+          </div>
+
+          {/* 确定和取消按钮 */}
+          <Form.Item className="A6QAbtn">
+            <Button type="primary" htmlType="submit">
+              提交
+            </Button>
+            <br />
+            <br />
+            <MyPopconfirm txtK="取消" onConfirm={closeFu} />
+          </Form.Item>
+        </Form>
+      </div>
+    </div>
+  );
+}
+
+const MemoA6Qadd = React.memo(A6Qadd);
+
+export default MemoA6Qadd;

+ 52 - 0
src/pages/A6_1ques/data.ts

@@ -0,0 +1,52 @@
+export type A6QInfoType = {
+  id: number;
+  txt: "" | "新增" | "编辑" | "详情";
+};
+
+// 新增里面的题目列表
+export type A6QListType = {
+  id: number;
+  name: string;
+  type: "单选" | "多选" | "排序" | "填空";
+  skip: "不需要" | "答完跳题" | "选项跳题";
+  custom: boolean; //是否支持自定义回答
+  sList?: {
+    //除了填空以外的选项数组
+    id: number;
+    txt: string;
+  }[];
+};
+
+export const options1 = [
+  {
+    value: "单选",
+    label: "单选",
+  },
+  {
+    value: "多选",
+    label: "多选",
+  },
+  {
+    value: "排序",
+    label: "排序",
+  },
+  {
+    value: "填空",
+    label: "填空",
+  },
+];
+
+export const options2 = [
+  {
+    value: "不需要",
+    label: "不需要",
+  },
+  {
+    value: "答完跳题",
+    label: "答完跳题",
+  },
+  {
+    value: "选项跳题",
+    label: "选项跳题",
+  },
+];

+ 2 - 18
src/pages/A6_1ques/index.module.scss

@@ -1,4 +1,5 @@
 .A6_1ques {
+  position: relative;
   :global {
     .A6_1top {
       padding: 15px 24px;
@@ -13,24 +14,7 @@
       height: calc(100% - 77px);
       background-color: #fff;
       margin-top: 15px;
-      // overflow: hidden;
-      overflow-y: auto;
-
-      text-align: center;
-
-
-      #pdfDownBox {
-        padding: 20px 0;
-
-        img {
-          display: block;
-          margin: 0px auto;
-          max-width: 800px;
-          max-height: 500px;
-        }
-      }
-
-
+      overflow: hidden;
     }
   }
 }

+ 30 - 67
src/pages/A6_1ques/index.tsx

@@ -2,8 +2,9 @@ import React, { useCallback, useEffect, useRef, useState } from "react";
 import styles from "./index.module.scss";
 import { Button, Input } from "antd";
 import { useDispatch } from "react-redux";
-import { downloadPDF } from "@/utils/htmlToPdf";
-import downloadPDF2 from "@/utils/htmlToPdf2";
+import A6Qadd from "./A6Qadd";
+import { A6QInfoType } from "./data";
+import A6QInfo from "./A6QInfo";
 function A6_1ques() {
   const dispatch = useDispatch();
 
@@ -46,12 +47,24 @@ function A6_1ques() {
     });
   }, []);
 
-  // 点击新增和编辑
-  const [addId, setAddId] = useState(0);
+  // 点击新增和编辑/查看详情
+  const [info, setInfo] = useState<A6QInfoType>({
+    id: 0,
+    txt: "",
+  });
 
   return (
     <div className={styles.A6_1ques}>
-      <div className="pageTitle">问卷管理</div>
+      <div className="pageTitle">
+        问卷管理{" "}
+        {info.txt
+          ? info.txt === "新增"
+            ? " - 新增"
+            : info.txt === "编辑"
+            ? " - 编辑"
+            : " - 详情"
+          : ""}
+      </div>
 
       {/* 顶部筛选 */}
       <div className="A6_1top">
@@ -69,76 +82,17 @@ function A6_1ques() {
         <div>
           <Button onClick={resetSelectFu}>重置</Button>
           &emsp;&emsp;
-          <Button type="primary" onClick={() => setAddId(-1)}>
-            新增
-          </Button>
-          <Button
-            onClick={() =>
-              downloadPDF(document.querySelector("#pdfDownBox")!, "出库信息")
-            }
-          >
-            导出PDF1
-          </Button>
           <Button
-            onClick={() =>
-              downloadPDF2(document.querySelector("#pdfDownBox")!, "出库信息")
-            }
+            type="primary"
+            onClick={() => setInfo({ id: -1, txt: "新增" })}
           >
-            导出PDF2
+            新增
           </Button>
         </div>
       </div>
 
       {/* 表格主体 */}
       <div className="A6_1tableBox">
-        <div id="pdfDownBox">
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/poster/tab2Poster/thumb/20240129_1114311892.jpg"
-            alt=""
-          />
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/exhibition/img/1.jpg"
-            alt=""
-          />
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/exhibition/img/1.jpg"
-            alt=""
-          />
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/exhibition/img/1.jpg"
-            alt=""
-          />
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/exhibition/img/1.jpg"
-            alt=""
-          />{" "}
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/exhibition/img/1.jpg"
-            alt=""
-          />
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/exhibition/img/1.jpg"
-            alt=""
-          />
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/exhibition/img/1.jpg"
-            alt=""
-          />{" "}
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/exhibition/img/1.jpg"
-            alt=""
-          />
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/exhibition/img/1.jpg"
-            alt=""
-          />
-          <img
-            src="https://sit-chaozhoubwg.4dage.com/exhibition/img/1.jpg"
-            alt=""
-          />
-          <h1>115555654</h1>
-        </div>
-
         {/* <MyTable
           yHeight={625}
           list={tableInfo.list}
@@ -152,6 +106,15 @@ function A6_1ques() {
           }
         /> */}
       </div>
+
+      {/* 点击新增/编辑出来的页面 */}
+      {info.id ? (
+        info.txt === "详情" ? (
+          <A6QInfo sId={info.id} closeFu={() => setInfo({ id: 0, txt: "" })} />
+        ) : (
+          <A6Qadd sInfo={info} closeFu={() => setInfo({ id: 0, txt: "" })} />
+        )
+      ) : null}
     </div>
   );
 }

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

@@ -7,7 +7,6 @@
 
     .layoutLeft {
       position: relative;
-      z-index: 30;
       width: 220px;
       height: 100%;
       background-color: #A64735;

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

@@ -5,3 +5,4 @@ declare module "*.jpg";
 declare module "*.gif";
 declare module "*.svg";
 declare module "js-export-excel";
+declare module 'braft-utils';

+ 3 - 1
src/utils/htmlToPdf.ts

@@ -1,3 +1,4 @@
+// 这个导出一张pdf,不会有分页中间断开的问题。但是文件比较大
 import html2canvas from "html2canvas";
 import jsPDF from "jspdf";
 import { domShowFu } from "./domShow";
@@ -15,7 +16,7 @@ export const downloadPDF = (element: HTMLDivElement, pdfName: string) => {
       width *= contentScale;
     }
     html2canvas(element, {
-      // scale: 1,
+      scale: 1,
       useCORS: true,
       backgroundColor: "#FFFFFF",
       allowTaint: false,
@@ -50,3 +51,4 @@ export const downloadPDF = (element: HTMLDivElement, pdfName: string) => {
     });
   }
 };
+

+ 1 - 0
src/utils/htmlToPdf2.ts

@@ -1,3 +1,4 @@
+// 这个导出多张pdf,文件小。但是分页中间有断开的问题
 import html2canvas from "html2canvas";
 import JsPDF from "jspdf";
 import { domShowFu } from "./domShow";