提交 c73bcb54 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 536c8778
...@@ -15,9 +15,8 @@ ...@@ -15,9 +15,8 @@
"@wangeditor/editor-for-react": "^1.0.6", "@wangeditor/editor-for-react": "^1.0.6",
"@wangeditor/plugin-link-card": "^1.0.0", "@wangeditor/plugin-link-card": "^1.0.0",
"ali-oss": "^6.20.0", "ali-oss": "^6.20.0",
"antd": "^5.18.0", "antd": "^5.18.1",
"axios": "^1.6.2", "axios": "^1.6.2",
"blueimp-md5": "^2.19.0",
"dayjs": "^1.11.11", "dayjs": "^1.11.11",
"easy-formula-editor": "^0.0.2-alpha.1", "easy-formula-editor": "^0.0.2-alpha.1",
"echarts": "^5.4.3", "echarts": "^5.4.3",
...@@ -28,10 +27,10 @@ ...@@ -28,10 +27,10 @@
"qs": "^6.11.2", "qs": "^6.11.2",
"rc-slider-captcha": "^1.3.0", "rc-slider-captcha": "^1.3.0",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.3.1",
"react-error-boundary": "^4.0.13", "react-error-boundary": "^4.0.13",
"react-redux": "^8.1.3", "react-redux": "^8.1.3",
"react-router-dom": "^6.18.0", "react-router-dom": "^6.23.1",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"snabbdom": "^3.6.2", "snabbdom": "^3.6.2",
"xml-formatter": "^3.6.2" "xml-formatter": "^3.6.2"
...@@ -47,7 +46,7 @@ ...@@ -47,7 +46,7 @@
"less": "^4.2.0", "less": "^4.2.0",
"lint-staged": "^15.1.0", "lint-staged": "^15.1.0",
"prettier": "^3.3.1", "prettier": "^3.3.1",
"vite": "^5.2.12", "vite": "^5.3.0",
"vite-plugin-mkcert": "^1.17.5" "vite-plugin-mkcert": "^1.17.5"
} }
}, },
...@@ -146,9 +145,9 @@ ...@@ -146,9 +145,9 @@
"integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
}, },
"node_modules/@esbuild/aix-ppc64": { "node_modules/@esbuild/aix-ppc64": {
"version": "0.20.2", "version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
"integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
...@@ -161,10 +160,74 @@ ...@@ -161,10 +160,74 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/@esbuild/android-arm": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
"integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
"integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
"integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
"integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/darwin-x64": { "node_modules/@esbuild/darwin-x64": {
"version": "0.20.2", "version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
"integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
...@@ -177,6 +240,278 @@ ...@@ -177,6 +240,278 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
"integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
"integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
"integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
"integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
"integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
"integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
"cpu": [
"loong64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
"integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
"cpu": [
"mips64el"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
"integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
"cpu": [
"ppc64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
"integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
"cpu": [
"riscv64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
"integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
"cpu": [
"s390x"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
"integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
"integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
"integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"openbsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
"integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"sunos"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
"integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
"integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
"integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
}
},
"node_modules/@eslint-community/eslint-utils": { "node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0", "version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
...@@ -1168,9 +1503,9 @@ ...@@ -1168,9 +1503,9 @@
} }
}, },
"node_modules/antd": { "node_modules/antd": {
"version": "5.18.0", "version": "5.18.1",
"resolved": "https://registry.npmjs.org/antd/-/antd-5.18.0.tgz", "resolved": "https://registry.npmjs.org/antd/-/antd-5.18.1.tgz",
"integrity": "sha512-xAvqvioW34npeZb8/JLZmCh5mcHU5MLiA0IYWAlpLAVmSgjs3p0tNzbU6a7Yx+y7o7E8PHtlchWfO3yBLQ15FQ==", "integrity": "sha512-l762vsoIpA3xsVsbIExlce3hgFgiLdflGEgdo8NFnq17Qq3fHIMJklGzM8WNpdJJ4iUk4FzritmSSnHk0Y5kZA==",
"dependencies": { "dependencies": {
"@ant-design/colors": "^7.0.2", "@ant-design/colors": "^7.0.2",
"@ant-design/cssinjs": "^1.19.1", "@ant-design/cssinjs": "^1.19.1",
...@@ -1189,14 +1524,14 @@ ...@@ -1189,14 +1524,14 @@
"rc-cascader": "~3.26.0", "rc-cascader": "~3.26.0",
"rc-checkbox": "~3.3.0", "rc-checkbox": "~3.3.0",
"rc-collapse": "~3.7.3", "rc-collapse": "~3.7.3",
"rc-dialog": "~9.4.0", "rc-dialog": "~9.5.2",
"rc-drawer": "~7.2.0", "rc-drawer": "~7.2.0",
"rc-dropdown": "~4.2.0", "rc-dropdown": "~4.2.0",
"rc-field-form": "~2.2.0", "rc-field-form": "~2.2.1",
"rc-image": "~7.8.0", "rc-image": "~7.9.0",
"rc-input": "~1.5.1", "rc-input": "~1.5.1",
"rc-input-number": "~9.1.0", "rc-input-number": "~9.1.0",
"rc-mentions": "~2.13.1", "rc-mentions": "~2.14.0",
"rc-menu": "~9.14.0", "rc-menu": "~9.14.0",
"rc-motion": "^2.9.1", "rc-motion": "^2.9.1",
"rc-notification": "~5.6.0", "rc-notification": "~5.6.0",
...@@ -1440,11 +1775,6 @@ ...@@ -1440,11 +1775,6 @@
"integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==",
"dev": true "dev": true
}, },
"node_modules/blueimp-md5": {
"version": "2.19.0",
"resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz",
"integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w=="
},
"node_modules/bowser": { "node_modules/bowser": {
"version": "1.9.4", "version": "1.9.4",
"resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz", "resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz",
...@@ -2003,554 +2333,218 @@ ...@@ -2003,554 +2333,218 @@
"es-errors": "^1.3.0", "es-errors": "^1.3.0",
"es-object-atoms": "^1.0.0", "es-object-atoms": "^1.0.0",
"es-set-tostringtag": "^2.0.3", "es-set-tostringtag": "^2.0.3",
"es-to-primitive": "^1.2.1", "es-to-primitive": "^1.2.1",
"function.prototype.name": "^1.1.6", "function.prototype.name": "^1.1.6",
"get-intrinsic": "^1.2.4", "get-intrinsic": "^1.2.4",
"get-symbol-description": "^1.0.2", "get-symbol-description": "^1.0.2",
"globalthis": "^1.0.3", "globalthis": "^1.0.3",
"gopd": "^1.0.1", "gopd": "^1.0.1",
"has-property-descriptors": "^1.0.2", "has-property-descriptors": "^1.0.2",
"has-proto": "^1.0.3", "has-proto": "^1.0.3",
"has-symbols": "^1.0.3", "has-symbols": "^1.0.3",
"hasown": "^2.0.2", "hasown": "^2.0.2",
"internal-slot": "^1.0.7", "internal-slot": "^1.0.7",
"is-array-buffer": "^3.0.4", "is-array-buffer": "^3.0.4",
"is-callable": "^1.2.7", "is-callable": "^1.2.7",
"is-data-view": "^1.0.1", "is-data-view": "^1.0.1",
"is-negative-zero": "^2.0.3", "is-negative-zero": "^2.0.3",
"is-regex": "^1.1.4", "is-regex": "^1.1.4",
"is-shared-array-buffer": "^1.0.3", "is-shared-array-buffer": "^1.0.3",
"is-string": "^1.0.7", "is-string": "^1.0.7",
"is-typed-array": "^1.1.13", "is-typed-array": "^1.1.13",
"is-weakref": "^1.0.2", "is-weakref": "^1.0.2",
"object-inspect": "^1.13.1", "object-inspect": "^1.13.1",
"object-keys": "^1.1.1", "object-keys": "^1.1.1",
"object.assign": "^4.1.5", "object.assign": "^4.1.5",
"regexp.prototype.flags": "^1.5.2", "regexp.prototype.flags": "^1.5.2",
"safe-array-concat": "^1.1.2", "safe-array-concat": "^1.1.2",
"safe-regex-test": "^1.0.3", "safe-regex-test": "^1.0.3",
"string.prototype.trim": "^1.2.9", "string.prototype.trim": "^1.2.9",
"string.prototype.trimend": "^1.0.8", "string.prototype.trimend": "^1.0.8",
"string.prototype.trimstart": "^1.0.8", "string.prototype.trimstart": "^1.0.8",
"typed-array-buffer": "^1.0.2", "typed-array-buffer": "^1.0.2",
"typed-array-byte-length": "^1.0.1", "typed-array-byte-length": "^1.0.1",
"typed-array-byte-offset": "^1.0.2", "typed-array-byte-offset": "^1.0.2",
"typed-array-length": "^1.0.6", "typed-array-length": "^1.0.6",
"unbox-primitive": "^1.0.2", "unbox-primitive": "^1.0.2",
"which-typed-array": "^1.1.15" "which-typed-array": "^1.1.15"
}, },
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-iterator-helpers": {
"version": "1.0.19",
"resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
"integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.7",
"define-properties": "^1.2.1",
"es-abstract": "^1.23.3",
"es-errors": "^1.3.0",
"es-set-tostringtag": "^2.0.3",
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
"globalthis": "^1.0.3",
"has-property-descriptors": "^1.0.2",
"has-proto": "^1.0.3",
"has-symbols": "^1.0.3",
"internal-slot": "^1.0.7",
"iterator.prototype": "^1.1.2",
"safe-array-concat": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
"integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
"dev": true,
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
"integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.1"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-shim-unscopables": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
"integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
"dev": true,
"dependencies": {
"hasown": "^2.0.0"
}
},
"node_modules/es-to-primitive": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"dev": true,
"dependencies": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/es5-ext": {
"version": "0.10.64",
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
"integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
"hasInstallScript": true,
"dependencies": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
"esniff": "^2.0.1",
"next-tick": "^1.1.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/es6-iterator": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"dependencies": {
"d": "1",
"es5-ext": "^0.10.35",
"es6-symbol": "^3.1.1"
}
},
"node_modules/es6-symbol": {
"version": "3.1.4",
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
"integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
"dependencies": {
"d": "^1.0.2",
"ext": "^1.7.0"
},
"engines": {
"node": ">=0.12"
}
},
"node_modules/esbuild": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
"integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
"dev": true,
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"node": ">=12"
},
"optionalDependencies": {
"@esbuild/aix-ppc64": "0.20.2",
"@esbuild/android-arm": "0.20.2",
"@esbuild/android-arm64": "0.20.2",
"@esbuild/android-x64": "0.20.2",
"@esbuild/darwin-arm64": "0.20.2",
"@esbuild/darwin-x64": "0.20.2",
"@esbuild/freebsd-arm64": "0.20.2",
"@esbuild/freebsd-x64": "0.20.2",
"@esbuild/linux-arm": "0.20.2",
"@esbuild/linux-arm64": "0.20.2",
"@esbuild/linux-ia32": "0.20.2",
"@esbuild/linux-loong64": "0.20.2",
"@esbuild/linux-mips64el": "0.20.2",
"@esbuild/linux-ppc64": "0.20.2",
"@esbuild/linux-riscv64": "0.20.2",
"@esbuild/linux-s390x": "0.20.2",
"@esbuild/linux-x64": "0.20.2",
"@esbuild/netbsd-x64": "0.20.2",
"@esbuild/openbsd-x64": "0.20.2",
"@esbuild/sunos-x64": "0.20.2",
"@esbuild/win32-arm64": "0.20.2",
"@esbuild/win32-ia32": "0.20.2",
"@esbuild/win32-x64": "0.20.2"
}
},
"node_modules/esbuild/node_modules/@esbuild/android-arm": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
"integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild/node_modules/@esbuild/android-arm64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
"integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild/node_modules/@esbuild/android-x64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
"integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"android"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild/node_modules/@esbuild/darwin-arm64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
"integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"darwin"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
"integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild/node_modules/@esbuild/freebsd-x64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
"integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"freebsd"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild/node_modules/@esbuild/linux-arm": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
"integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
"cpu": [
"arm"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild/node_modules/@esbuild/linux-arm64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
"integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild/node_modules/@esbuild/linux-ia32": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
"integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
}
},
"node_modules/esbuild/node_modules/@esbuild/linux-loong64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
"integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
"cpu": [
"loong64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": { "engines": {
"node": ">=12" "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { "node_modules/es-define-property": {
"version": "0.20.2", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"cpu": [ "dependencies": {
"mips64el" "get-intrinsic": "^1.2.4"
], },
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": { "engines": {
"node": ">=12" "node": ">= 0.4"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { "node_modules/es-errors": {
"version": "0.20.2", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"cpu": [
"ppc64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": { "engines": {
"node": ">=12" "node": ">= 0.4"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { "node_modules/es-iterator-helpers": {
"version": "0.20.2", "version": "1.0.19",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz",
"integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==",
"cpu": [
"riscv64"
],
"dev": true, "dev": true,
"optional": true, "dependencies": {
"os": [ "call-bind": "^1.0.7",
"linux" "define-properties": "^1.2.1",
], "es-abstract": "^1.23.3",
"es-errors": "^1.3.0",
"es-set-tostringtag": "^2.0.3",
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
"globalthis": "^1.0.3",
"has-property-descriptors": "^1.0.2",
"has-proto": "^1.0.3",
"has-symbols": "^1.0.3",
"internal-slot": "^1.0.7",
"iterator.prototype": "^1.1.2",
"safe-array-concat": "^1.1.2"
},
"engines": { "engines": {
"node": ">=12" "node": ">= 0.4"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/linux-s390x": { "node_modules/es-object-atoms": {
"version": "0.20.2", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
"integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
"cpu": [
"s390x"
],
"dev": true, "dev": true,
"optional": true, "dependencies": {
"os": [ "es-errors": "^1.3.0"
"linux" },
],
"engines": { "engines": {
"node": ">=12" "node": ">= 0.4"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/linux-x64": { "node_modules/es-set-tostringtag": {
"version": "0.20.2", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
"integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
"cpu": [
"x64"
],
"dev": true, "dev": true,
"optional": true, "dependencies": {
"os": [ "get-intrinsic": "^1.2.4",
"linux" "has-tostringtag": "^1.0.2",
], "hasown": "^2.0.1"
},
"engines": { "engines": {
"node": ">=12" "node": ">= 0.4"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { "node_modules/es-shim-unscopables": {
"version": "0.20.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
"integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
"cpu": [
"x64"
],
"dev": true, "dev": true,
"optional": true, "dependencies": {
"os": [ "hasown": "^2.0.0"
"netbsd"
],
"engines": {
"node": ">=12"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { "node_modules/es-to-primitive": {
"version": "0.20.2", "version": "1.2.1",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"cpu": [
"x64"
],
"dev": true, "dev": true,
"optional": true, "dependencies": {
"os": [ "is-callable": "^1.1.4",
"openbsd" "is-date-object": "^1.0.1",
], "is-symbol": "^1.0.2"
},
"engines": { "engines": {
"node": ">=12" "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/sunos-x64": { "node_modules/es5-ext": {
"version": "0.20.2", "version": "0.10.64",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz",
"integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
"cpu": [ "hasInstallScript": true,
"x64" "dependencies": {
], "es6-iterator": "^2.0.3",
"dev": true, "es6-symbol": "^3.1.3",
"optional": true, "esniff": "^2.0.1",
"os": [ "next-tick": "^1.1.0"
"sunos" },
],
"engines": { "engines": {
"node": ">=12" "node": ">=0.10"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/win32-arm64": { "node_modules/es6-iterator": {
"version": "0.20.2", "version": "2.0.3",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"cpu": [ "dependencies": {
"arm64" "d": "1",
], "es5-ext": "^0.10.35",
"dev": true, "es6-symbol": "^3.1.1"
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/win32-ia32": { "node_modules/es6-symbol": {
"version": "0.20.2", "version": "3.1.4",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
"integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
"cpu": [ "dependencies": {
"ia32" "d": "^1.0.2",
], "ext": "^1.7.0"
"dev": true, },
"optional": true,
"os": [
"win32"
],
"engines": { "engines": {
"node": ">=12" "node": ">=0.12"
} }
}, },
"node_modules/esbuild/node_modules/@esbuild/win32-x64": { "node_modules/esbuild": {
"version": "0.20.2", "version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
"integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
"cpu": [
"x64"
],
"dev": true, "dev": true,
"optional": true, "hasInstallScript": true,
"os": [ "bin": {
"win32" "esbuild": "bin/esbuild"
], },
"engines": { "engines": {
"node": ">=12" "node": ">=12"
},
"optionalDependencies": {
"@esbuild/aix-ppc64": "0.21.5",
"@esbuild/android-arm": "0.21.5",
"@esbuild/android-arm64": "0.21.5",
"@esbuild/android-x64": "0.21.5",
"@esbuild/darwin-arm64": "0.21.5",
"@esbuild/darwin-x64": "0.21.5",
"@esbuild/freebsd-arm64": "0.21.5",
"@esbuild/freebsd-x64": "0.21.5",
"@esbuild/linux-arm": "0.21.5",
"@esbuild/linux-arm64": "0.21.5",
"@esbuild/linux-ia32": "0.21.5",
"@esbuild/linux-loong64": "0.21.5",
"@esbuild/linux-mips64el": "0.21.5",
"@esbuild/linux-ppc64": "0.21.5",
"@esbuild/linux-riscv64": "0.21.5",
"@esbuild/linux-s390x": "0.21.5",
"@esbuild/linux-x64": "0.21.5",
"@esbuild/netbsd-x64": "0.21.5",
"@esbuild/openbsd-x64": "0.21.5",
"@esbuild/sunos-x64": "0.21.5",
"@esbuild/win32-arm64": "0.21.5",
"@esbuild/win32-ia32": "0.21.5",
"@esbuild/win32-x64": "0.21.5"
} }
}, },
"node_modules/escape-html": { "node_modules/escape-html": {
...@@ -5009,9 +5003,9 @@ ...@@ -5009,9 +5003,9 @@
} }
}, },
"node_modules/rc-dialog": { "node_modules/rc-dialog": {
"version": "9.4.0", "version": "9.5.2",
"resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.4.0.tgz", "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.5.2.tgz",
"integrity": "sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ==", "integrity": "sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.10.1", "@babel/runtime": "^7.10.1",
"@rc-component/portal": "^1.0.0-8", "@rc-component/portal": "^1.0.0-8",
...@@ -5091,14 +5085,14 @@ ...@@ -5091,14 +5085,14 @@
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
}, },
"node_modules/rc-image": { "node_modules/rc-image": {
"version": "7.8.1", "version": "7.9.0",
"resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.8.1.tgz", "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.9.0.tgz",
"integrity": "sha512-Y7/ALO8kgAddl9WBHUQDcff7Yfcd1T2ALS/JPlRqkau8wcua48k99glv/CcgChy4xwUXCUdO1cM2l1NqtoZZHw==", "integrity": "sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.11.2", "@babel/runtime": "^7.11.2",
"@rc-component/portal": "^1.0.2", "@rc-component/portal": "^1.0.2",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"rc-dialog": "~9.4.0", "rc-dialog": "~9.5.2",
"rc-motion": "^2.6.2", "rc-motion": "^2.6.2",
"rc-util": "^5.34.1" "rc-util": "^5.34.1"
}, },
...@@ -5138,9 +5132,9 @@ ...@@ -5138,9 +5132,9 @@
} }
}, },
"node_modules/rc-mentions": { "node_modules/rc-mentions": {
"version": "2.13.2", "version": "2.14.0",
"resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.13.2.tgz", "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.14.0.tgz",
"integrity": "sha512-gJCF6MDax/2wl2CzvJEN9yyQKYDzGKA2hmmymQiEPiYUNUOk6UKvQFSB3TBfAi57vxntPMJZGfxNtda1BDb4kA==", "integrity": "sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.22.5", "@babel/runtime": "^7.22.5",
"@rc-component/trigger": "^2.0.0", "@rc-component/trigger": "^2.0.0",
...@@ -5576,9 +5570,9 @@ ...@@ -5576,9 +5570,9 @@
} }
}, },
"node_modules/react": { "node_modules/react": {
"version": "18.2.0", "version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0" "loose-envify": "^1.1.0"
}, },
...@@ -5587,15 +5581,15 @@ ...@@ -5587,15 +5581,15 @@
} }
}, },
"node_modules/react-dom": { "node_modules/react-dom": {
"version": "18.2.0", "version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"dependencies": { "dependencies": {
"loose-envify": "^1.1.0", "loose-envify": "^1.1.0",
"scheduler": "^0.23.0" "scheduler": "^0.23.2"
}, },
"peerDependencies": { "peerDependencies": {
"react": "^18.2.0" "react": "^18.3.1"
} }
}, },
"node_modules/react-error-boundary": { "node_modules/react-error-boundary": {
...@@ -6726,12 +6720,12 @@ ...@@ -6726,12 +6720,12 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "5.2.12", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.0.tgz",
"integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==", "integrity": "sha512-hA6vAVK977NyW1Qw+fLvqSo7xDPej7von7C3DwwqPRmnnnK36XEBC/J3j1V5lP8fbt7y0TgTKJbpNGSwM+Bdeg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"esbuild": "^0.20.1", "esbuild": "^0.21.3",
"postcss": "^8.4.38", "postcss": "^8.4.38",
"rollup": "^4.13.0" "rollup": "^4.13.0"
}, },
......
...@@ -26,9 +26,8 @@ ...@@ -26,9 +26,8 @@
"@wangeditor/editor-for-react": "^1.0.6", "@wangeditor/editor-for-react": "^1.0.6",
"@wangeditor/plugin-link-card": "^1.0.0", "@wangeditor/plugin-link-card": "^1.0.0",
"ali-oss": "^6.20.0", "ali-oss": "^6.20.0",
"antd": "^5.18.0", "antd": "^5.18.1",
"axios": "^1.6.2", "axios": "^1.6.2",
"blueimp-md5": "^2.19.0",
"dayjs": "^1.11.11", "dayjs": "^1.11.11",
"easy-formula-editor": "^0.0.2-alpha.1", "easy-formula-editor": "^0.0.2-alpha.1",
"echarts": "^5.4.3", "echarts": "^5.4.3",
...@@ -39,10 +38,10 @@ ...@@ -39,10 +38,10 @@
"qs": "^6.11.2", "qs": "^6.11.2",
"rc-slider-captcha": "^1.3.0", "rc-slider-captcha": "^1.3.0",
"react": "^18.2.0", "react": "^18.2.0",
"react-dom": "^18.2.0", "react-dom": "^18.3.1",
"react-error-boundary": "^4.0.13", "react-error-boundary": "^4.0.13",
"react-redux": "^8.1.3", "react-redux": "^8.1.3",
"react-router-dom": "^6.18.0", "react-router-dom": "^6.23.1",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"snabbdom": "^3.6.2", "snabbdom": "^3.6.2",
"xml-formatter": "^3.6.2" "xml-formatter": "^3.6.2"
...@@ -58,7 +57,7 @@ ...@@ -58,7 +57,7 @@
"less": "^4.2.0", "less": "^4.2.0",
"lint-staged": "^15.1.0", "lint-staged": "^15.1.0",
"prettier": "^3.3.1", "prettier": "^3.3.1",
"vite": "^5.2.12", "vite": "^5.3.0",
"vite-plugin-mkcert": "^1.17.5" "vite-plugin-mkcert": "^1.17.5"
}, },
"browserslist": [ "browserslist": [
......
import React, { useState, useEffect, forwardRef, useImperativeHandle, useRef } from 'react'; import { useState, useEffect, forwardRef } from 'react'
import { import { Divider, Input, Space, Button, Form, ColorPicker, Tabs, Select, Row, Col } from 'antd'
Modal, import './index.less'
Divider, import { addGallery } from '../utils/request'
Upload, import { SlateEditor, SlateTransforms, SlateElement } from '@wangeditor/editor'
Input,
Space,
Button,
Form,
Spin,
ColorPicker,
Tabs,
Select,
Row,
Col,
} from 'antd';
import { CloudUploadOutlined, CloseOutlined } from '@ant-design/icons';
import './index.less';
import $ from 'jquery';
import { partSize, normalUploader, multipartUploader } from '../utils/upload';
import { addGallery } from '../utils/request';
import { DomEditor, SlateEditor, SlateTransforms, SlateElement } from '@wangeditor/editor';
import { findNodeWithParent, fontFizeList } from '../utils/setting'; import { findNodeWithParent, fontFizeList } from '../utils/setting'
import GalleryFormItem from './galleryItem'; import GalleryFormItem from './galleryItem'
const temp = [ const temp = [
'http://zxts-book-file.zijingebook.com/2024/02/27/gallery-1709002611091-nrxnqw595pc.png', 'http://zxts-book-file.zijingebook.com/2024/02/27/gallery-1709002611091-nrxnqw595pc.png',
'http://zxts-book-file.zijingebook.com/2024/02/27/gallery-1709002615115-ngpulfnmspr.jpg', 'http://zxts-book-file.zijingebook.com/2024/02/27/gallery-1709002615115-ngpulfnmspr.jpg'
]; ]
const randomOne = Math.random().toString(16).substring(2, 10); const randomOne = Math.random().toString(16).substring(2, 10)
const GalleryModal = forwardRef((props, ref) => { const GalleryModal = props => {
const { const { editor, ossClient, galleryInfo, bookId, chapterId, setGalleryVisible, setGalleryInfo, selectionSize = 18 } = props
editor,
ossClient,
galleryInfo,
bookId,
chapterId,
setGalleryVisible,
setGalleryInfo,
selectionSize = 18,
} = props;
const [form] = Form.useForm(); const [form] = Form.useForm()
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false)
const flexValue = Form.useWatch('flex', form); const flexValue = Form.useWatch('flex', form)
const contentValue = Form.useWatch('content', form); const contentValue = Form.useWatch('content', form)
const [oldFlex, setOldFlex] = useState(null); const [oldFlex, setOldFlex] = useState(null)
const [picList, setPicList] = useState([]); const [picList, setPicList] = useState([])
const [themeValue, setThemeValue] = useState('#ab1941'); const [themeValue, setThemeValue] = useState('#ab1941')
const [fontsize, setFontsize] = useState(selectionSize); const [fontsize, setFontsize] = useState(selectionSize)
const [initValues, setInitValues] = useState({ const [initValues, setInitValues] = useState({
galleryTitle: '', galleryTitle: '',
flex: 1, flex: 1,
theme: '#ab1941', theme: '#ab1941',
fontSize: selectionSize || 18, fontSize: selectionSize || 18
}); })
// 监听图片改变 // 监听图片改变
useEffect(() => { useEffect(() => {
const newGalleryList = []; const newGalleryList = []
// eslint-disable-next-line guard-for-in // eslint-disable-next-line guard-for-in
for(let key in contentValue) { for (let key in contentValue) {
newGalleryList.push({ ...contentValue[key], key: key }); newGalleryList.push({ ...contentValue[key], key: key })
} }
setPicList(newGalleryList); setPicList(newGalleryList)
form.setFieldsValue({ gallery: newGalleryList }); form.setFieldsValue({ gallery: newGalleryList })
}, [contentValue]) }, [contentValue])
const textColorChange = (value, hex) => { const textColorChange = (value, hex) => {
setThemeValue(hex); setThemeValue(hex)
form.setFieldsValue({ theme: hex }); form.setFieldsValue({ theme: hex })
}; }
// tabs // tabs
const initialItems = [ const initialItems = [
{ {
label: '图 1', label: '图 1',
children: ( children: <GalleryFormItem ossClient={ossClient} form={form} galleryInfo={galleryInfo} activeKey={randomOne} setPicList={setPicList} />,
<GalleryFormItem
ossClient={ossClient}
form={form}
galleryInfo={galleryInfo}
activeKey={randomOne}
setPicList={setPicList}
/>
),
key: randomOne, key: randomOne,
forceRender: true, forceRender: true
}, }
]; ]
const [activeKey, setActiveKey] = useState(initialItems[0].key); const [activeKey, setActiveKey] = useState(initialItems[0].key)
const [items, setItems] = useState(initialItems); const [items, setItems] = useState(initialItems)
const onChange = (newActiveKey) => { const onChange = newActiveKey => {
setActiveKey(newActiveKey); setActiveKey(newActiveKey)
}; }
const add = () => { const add = () => {
let newPanes = [...items]; let newPanes = [...items]
let index = newPanes.length; let index = newPanes.length
if (index >= 10) return; if (index >= 10) return
const random = Math.random().toString(16).substring(2, 10); const random = Math.random().toString(16).substring(2, 10)
const newActiveKey = `${random}`; const newActiveKey = `${random}`
newPanes.push({ newPanes.push({
label: `图 ${index + 1}`, label: `图 ${index + 1}`,
children: ( children: <GalleryFormItem ossClient={ossClient} form={form} galleryInfo={galleryInfo} activeKey={newActiveKey} setPicList={setPicList} />,
<GalleryFormItem
ossClient={ossClient}
form={form}
galleryInfo={galleryInfo}
activeKey={newActiveKey}
setPicList={setPicList}
/>
),
key: newActiveKey, key: newActiveKey,
forceRender: true, forceRender: true
}); })
newPanes.forEach((item, index) => { newPanes.forEach((item, index) => {
item.label = `图 ${index + 1}`; item.label = `图 ${index + 1}`
}); })
setItems(newPanes); setItems(newPanes)
setActiveKey(newActiveKey); setActiveKey(newActiveKey)
}; }
const remove = async (targetKey) => { const remove = async targetKey => {
const tempGallery = picList.filter((item) => item.key !== targetKey); const tempGallery = picList.filter(item => item.key !== targetKey)
await setPicList(tempGallery); await setPicList(tempGallery)
console.log(tempGallery); console.log(tempGallery)
form.setFieldsValue({ gallery: tempGallery }); form.setFieldsValue({ gallery: tempGallery })
let newActiveKey = activeKey; let newActiveKey = activeKey
let lastIndex = -1; let lastIndex = -1
items.forEach((item, i) => { items.forEach((item, i) => {
if (item.key === targetKey) { if (item.key === targetKey) {
lastIndex = i - 1; lastIndex = i - 1
} }
}); })
let newPanes = items.filter((item) => item.key !== targetKey); let newPanes = items.filter(item => item.key !== targetKey)
if (newPanes.length && newActiveKey === targetKey) { if (newPanes.length && newActiveKey === targetKey) {
if (lastIndex >= 0) { if (lastIndex >= 0) {
newActiveKey = newPanes[lastIndex].key; newActiveKey = newPanes[lastIndex].key
} else { } else {
newActiveKey = newPanes[0].key; newActiveKey = newPanes[0].key
} }
} }
newPanes.forEach((item, index) => { newPanes.forEach((item, index) => {
item.label = `图 ${index + 1}`; item.label = `图 ${index + 1}`
}); })
setItems(newPanes); setItems(newPanes)
setActiveKey(newActiveKey); setActiveKey(newActiveKey)
}; }
const onEdit = (targetKey, action) => { const onEdit = (targetKey, action) => {
if (action === 'add') { if (action === 'add') {
add(); add()
} else { } else {
remove(targetKey); remove(targetKey)
} }
}; }
const [nowRandom, setNowRandom] = useState(null); const [nowRandom, setNowRandom] = useState(null)
useEffect(() => { useEffect(() => {
if (galleryInfo && Object.entries(galleryInfo).length > 0) { if (galleryInfo && Object.entries(galleryInfo).length > 0) {
const { galleryList, random, flex, title, theme = '', fontsize } = galleryInfo; const { galleryList, random, flex, title, theme = '', fontsize } = galleryInfo
let galleryArr = []; let galleryArr = []
try { try {
galleryArr = JSON.parse(decodeURI(galleryList)); galleryArr = JSON.parse(decodeURI(galleryList))
if (galleryArr && !(galleryArr instanceof Array)) { if (galleryArr && !(galleryArr instanceof Array)) {
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]; galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]
} }
} catch(err) { } catch (err) {
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]; galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]
} }
setInitValues({ setInitValues({
galleryTitle: title, galleryTitle: title,
flex: parseInt(flex), flex: parseInt(flex),
theme: theme, theme: theme,
gallery: galleryArr, gallery: galleryArr,
fontSize: fontsize, fontSize: fontsize
}); })
form.setFieldsValue({ form.setFieldsValue({
galleryTitle: title, galleryTitle: title,
flex: parseInt(flex), flex: parseInt(flex),
theme: theme, theme: theme,
gallery: galleryArr, gallery: galleryArr,
fontSize: fontsize, fontSize: fontsize
}); })
setPicList(galleryArr); setPicList(galleryArr)
setThemeValue(theme); setThemeValue(theme)
setOldFlex(parseInt(flex)); setOldFlex(parseInt(flex))
setFontsize(fontsize); setFontsize(fontsize)
let newPanel = []; let newPanel = []
let activeKey = ''; let activeKey = ''
galleryArr.forEach((item, index) => { galleryArr.forEach((item, index) => {
const newActiveKey = `${item.key}`; const newActiveKey = `${item.key}`
if (index === 0) { if (index === 0) {
activeKey = item.key; activeKey = item.key
} }
let obj = { let obj = {
label: `图 ${index + 1}`, label: `图 ${index + 1}`,
...@@ -215,43 +172,42 @@ const GalleryModal = forwardRef((props, ref) => { ...@@ -215,43 +172,42 @@ const GalleryModal = forwardRef((props, ref) => {
/> />
), ),
key: newActiveKey, key: newActiveKey,
forceRender: true, forceRender: true
}; }
newPanel.push(obj); newPanel.push(obj)
}); })
setItems(newPanel); setItems(newPanel)
setActiveKey(activeKey); setActiveKey(activeKey)
setNowRandom(random); setNowRandom(random)
setGalleryInfo({}); setGalleryInfo({})
} }
}, [galleryInfo]); }, [galleryInfo])
const onFinish = async (values) => { const onFinish = async values => {
editor.restoreSelection()
editor.restoreSelection();
// setLoading(true); // setLoading(true);
const { galleryTitle, flex, gallery, fontSize, theme = '' } = values; const { galleryTitle, flex, gallery, fontSize, theme = '' } = values
console.log(values); console.log(values)
if (parseInt(flex) !== 2) { if (parseInt(flex) !== 2) {
// 删除空白的p标签 // 删除空白的p标签
const nodeEntries = SlateEditor.nodes(editor, { const nodeEntries = SlateEditor.nodes(editor, {
match: (node) => { match: node => {
// JS syntax // JS syntax
if (SlateElement.isElement(node)) { if (SlateElement.isElement(node)) {
if (node.type === 'paragraph') { if (node.type === 'paragraph') {
return true; // 匹配 paragraph return true // 匹配 paragraph
} }
} }
return false; return false
}, },
universal: true, universal: true
}); })
for (let nodeEntry of nodeEntries) { for (let nodeEntry of nodeEntries) {
const [node, path] = nodeEntry; const [node, path] = nodeEntry
if (node.children[0].text === '') { if (node.children[0].text === '') {
SlateTransforms.removeNodes(editor); SlateTransforms.removeNodes(editor)
} }
} }
} }
...@@ -263,45 +219,40 @@ const GalleryModal = forwardRef((props, ref) => { ...@@ -263,45 +219,40 @@ const GalleryModal = forwardRef((props, ref) => {
galleryList: encodeURI(JSON.stringify(gallery)), galleryList: encodeURI(JSON.stringify(gallery)),
random: nowRandom, random: nowRandom,
theme, theme,
fontsize: fontSize || fontsize, fontsize: fontSize || fontsize
}; }
await addGallery({ await addGallery({
book_id: bookId, book_id: bookId,
chapter_id: chapterId, chapter_id: chapterId,
title: galleryTitle, title: galleryTitle,
content: JSON.stringify(gallery), content: JSON.stringify(gallery),
position: nowRandom, position: nowRandom
}); })
if (flex === 2) { if (flex === 2) {
const aPath = findNodeWithParent( const aPath = findNodeWithParent(editor.children, 'chapterGalleryInline', 'random', nowRandom)
editor.children, SlateTransforms.setNodes(editor, props, { at: aPath.reverse() })
'chapterGalleryInline',
'random',
nowRandom,
);
SlateTransforms.setNodes(editor, props, { at: aPath.reverse() });
} else { } else {
const aPath = findNodeWithParent(editor.children, 'chapterGallery', 'random', nowRandom); const aPath = findNodeWithParent(editor.children, 'chapterGallery', 'random', nowRandom)
SlateTransforms.setNodes(editor, props, { at: aPath.reverse() }); SlateTransforms.setNodes(editor, props, { at: aPath.reverse() })
} }
form.resetFields(); form.resetFields()
setGalleryVisible(false); setGalleryVisible(false)
setOldFlex(null); setOldFlex(null)
setLoading(false); setLoading(false)
return false; return false
} }
let random = Math.random().toString(10).substring(2, 10); let random = Math.random().toString(10).substring(2, 10)
await addGallery({ await addGallery({
book_id: bookId, book_id: bookId,
chapter_id: chapterId, chapter_id: chapterId,
title: galleryTitle, title: galleryTitle,
content: JSON.stringify(gallery), content: JSON.stringify(gallery),
position: random, position: random
}); })
if (parseInt(flex) === 2) { if (parseInt(flex) === 2) {
editor.insertNode({ editor.insertNode({
type: 'chapterGalleryInline', type: 'chapterGalleryInline',
...@@ -311,8 +262,8 @@ const GalleryModal = forwardRef((props, ref) => { ...@@ -311,8 +262,8 @@ const GalleryModal = forwardRef((props, ref) => {
theme, theme,
flex: flex, flex: flex,
fontsize: fontSize, fontsize: fontSize,
children: [{ text: '' }], children: [{ text: '' }]
}); })
} else { } else {
editor.insertNode({ editor.insertNode({
type: 'chapterGallery', type: 'chapterGallery',
...@@ -322,32 +273,22 @@ const GalleryModal = forwardRef((props, ref) => { ...@@ -322,32 +273,22 @@ const GalleryModal = forwardRef((props, ref) => {
theme, theme,
flex: flex, flex: flex,
fontsize: fontSize, fontsize: fontSize,
children: [{ text: '' }], children: [{ text: '' }]
}); })
} }
form.resetFields(); form.resetFields()
setOldFlex(null); setOldFlex(null)
setGalleryVisible(false); setGalleryVisible(false)
setLoading(false); setLoading(false)
}; }
return ( return (
<div> <div>
<Divider /> <Divider />
<div className='editor-content-form'> <div className="editor-content-form">
<Form <Form layout="vertical" name="validate_other" form={form} onFinish={onFinish} initialValues={initValues}>
layout='vertical' <Form.Item label="展示模式" name="flex" rules={[{ required: true, message: '请选择展示模式' }]}>
name='validate_other'
form={form}
onFinish={onFinish}
initialValues={initValues}
>
<Form.Item
label='展示模式'
name='flex'
rules={[{ required: true, message: '请选择展示模式' }]}
>
<Select> <Select>
<Select.Option disabled={oldFlex && oldFlex === 2} value={1}> <Select.Option disabled={oldFlex && oldFlex === 2} value={1}>
两图并列画廊 两图并列画廊
...@@ -367,42 +308,35 @@ const GalleryModal = forwardRef((props, ref) => { ...@@ -367,42 +308,35 @@ const GalleryModal = forwardRef((props, ref) => {
<Form.Item> <Form.Item>
<Row gutter={20}> <Row gutter={20}>
<Col span={12}> <Col span={12}>
<Form.Item label='字号' name='fontSize'> <Form.Item label="字号" name="fontSize">
<Select> <Select>
{fontFizeList.map((item, index) => { {fontFizeList.map((item, index) => {
return ( return (
<Select.Option value={item.value} key={index}> <Select.Option value={item.value} key={index}>
{item.name} {item.name}
</Select.Option> </Select.Option>
); )
})} })}
</Select> </Select>
</Form.Item> </Form.Item>
</Col> </Col>
<Col span={12}> <Col span={12}>
<div className='justcontent-color-inline'> <div className="justcontent-color-inline">
<Form.Item <Form.Item
label='画廊主题色' label="画廊主题色"
name='theme' name="theme"
className='flex-max' className="flex-max"
rules={[ rules={[
{ {
required: parseInt(flexValue) === 2 ? true : false, required: parseInt(flexValue) === 2 ? true : false,
message: '请选择颜色', message: '请选择颜色'
}, },
{ pattern: /^#[0-9A-Fa-f]{6}$/i, message: '请输入正确的16进制色值' }, { pattern: /^#[0-9A-Fa-f]{6}$/i, message: '请输入正确的16进制色值' }
]} ]}>
> <Input placeholder="" allowClear />
<Input placeholder='' allowClear />
</Form.Item> </Form.Item>
<Form.Item label={` `}> <Form.Item label={` `}>
<ColorPicker <ColorPicker disabledAlpha value={themeValue} defaultValue={themeValue} format="hex" onChange={textColorChange} />
disabledAlpha
value={themeValue}
defaultValue={themeValue}
format='hex'
onChange={textColorChange}
/>
</Form.Item> </Form.Item>
</div> </div>
</Col> </Col>
...@@ -411,34 +345,19 @@ const GalleryModal = forwardRef((props, ref) => { ...@@ -411,34 +345,19 @@ const GalleryModal = forwardRef((props, ref) => {
)} )}
{flexValue !== 2 && ( {flexValue !== 2 && (
<Form.Item <Form.Item label="画廊标题" name="galleryTitle" rules={[{ required: true, message: '请输入画廊标题' }]} extra="最多输入100字">
label='画廊标题' <Input maxLength={100} placeholder="" allowClear />
name='galleryTitle'
rules={[{ required: true, message: '请输入画廊标题' }]}
extra='最多输入100字'
>
<Input maxLength={100} placeholder='' allowClear />
</Form.Item> </Form.Item>
)} )}
<Form.Item <Form.Item label="图片" name="gallery" rules={[{ required: true, message: '请上传画廊图片' }]}>
label='图片' <Tabs type="editable-card" onChange={onChange} activeKey={activeKey} onEdit={onEdit} items={items}></Tabs>
name='gallery'
rules={[{ required: true, message: '请上传画廊图片' }]}
>
<Tabs
type='editable-card'
onChange={onChange}
activeKey={activeKey}
onEdit={onEdit}
items={items}
></Tabs>
</Form.Item> </Form.Item>
<Form.Item className='editor-form-buttons'> <Form.Item className="editor-form-buttons">
<Space> <Space>
<Button type='default' onClick={() => setGalleryVisible(false)}> <Button type="default" onClick={() => setGalleryVisible(false)}>
取消 取消
</Button> </Button>
<Button type='primary' loading={loading} htmlType='submit'> <Button type="primary" loading={loading} htmlType="submit">
{nowRandom ? '更新' : '插入'} {nowRandom ? '更新' : '插入'}
</Button> </Button>
</Space> </Space>
...@@ -446,7 +365,7 @@ const GalleryModal = forwardRef((props, ref) => { ...@@ -446,7 +365,7 @@ const GalleryModal = forwardRef((props, ref) => {
</Form> </Form>
</div> </div>
</div> </div>
); )
}); }
export default GalleryModal; export default forwardRef(GalleryModal)
import React, { useState, useEffect, useImperativeHandle, forwardRef } from 'react'; import { useState, useEffect, useImperativeHandle, forwardRef } from 'react'
import { CloudUploadOutlined } from '@ant-design/icons'; import { CloudUploadOutlined } from '@ant-design/icons'
import { Row, Col, Form, Input, Spin, Upload, Button } from 'antd'; import { Form, Input, Spin, Upload, Button } from 'antd'
import { partSize, normalUploader, multipartUploader } from '../utils/upload'; import { partSize, normalUploader, multipartUploader } from '../utils/upload'
const fileAccept = ['.png', '.jpg', '.jpeg', '.svg']; const fileAccept = ['.png', '.jpg', '.jpeg', '.svg']
const randomOne = Math.random().toString(16).substring(2, 10); const randomOne = Math.random().toString(16).substring(2, 10)
const GalleryFormItem = forwardRef((props, ref) => { const GalleryFormItem = (props, ref) => {
const { activeKey, ossClient, form, setPicList, galleryInfo } = props; const { activeKey, ossClient, form, setPicList, galleryInfo } = props
const [uploading, setUploading] = useState(false); // 文件上传状态 const [uploading, setUploading] = useState(false) // 文件上传状态
const [progress, setProgress] = useState(0); const [progress, setProgress] = useState(0)
const [file, setFile] = useState({}); const [file, setFile] = useState({})
const [fileList, setFileList] = useState([]); const [fileList, setFileList] = useState([])
const [imgUrl, setImgUrl] = useState(''); const [imgUrl, setImgUrl] = useState('')
useImperativeHandle(ref, () => { useImperativeHandle(ref, () => {
return { return {
uploading, uploading
}; }
}); })
useEffect(() => { useEffect(() => {
if (galleryInfo && Object.entries(galleryInfo).length > 0) { if (galleryInfo && Object.entries(galleryInfo).length > 0) {
const { galleryList } = galleryInfo; const { galleryList } = galleryInfo
let galleryArr = []; let galleryArr = []
try { try {
galleryArr = JSON.parse(decodeURI(galleryList)); galleryArr = JSON.parse(decodeURI(galleryList))
if (galleryArr && !(galleryArr instanceof Array)) { if (galleryArr && !(galleryArr instanceof Array)) {
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]; galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]
} }
} catch(err) { } catch (err) {
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]; galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]
} }
if (galleryArr.length > 0) { if (galleryArr.length > 0) {
const values = { ['content']: {} }; const values = { ['content']: {} }
galleryArr.forEach((item, index) => { galleryArr.forEach(item => {
values['content'][item.key] = { values['content'][item.key] = {
url: item.url, url: item.url,
title: item.title, title: item.title,
desc: item.desc desc: item.desc
}; }
}); })
form.setFieldsValue({...values, gallery: galleryArr }); form.setFieldsValue({ ...values, gallery: galleryArr })
const item = galleryArr.filter((item) => item.key === activeKey); const item = galleryArr.filter(item => item.key === activeKey)
if (item.length > 0) { if (item.length > 0) {
const itemGallery = item[0]; const itemGallery = item[0]
setImgUrl(itemGallery.url); setImgUrl(itemGallery.url)
} }
} }
} }
}, [galleryInfo]) }, [galleryInfo])
useEffect(() => {}, []) useEffect(() => {}, [])
const normFile = (e) => { const normFile = e => {
if (Array.isArray(e)) { if (Array.isArray(e)) {
return e; return e
} }
return e?.fileList; return e?.fileList
}; }
const uploadProps = { const uploadProps = {
name: 'file', name: 'file',
...@@ -70,107 +68,105 @@ const GalleryFormItem = forwardRef((props, ref) => { ...@@ -70,107 +68,105 @@ const GalleryFormItem = forwardRef((props, ref) => {
showUploadList: false, showUploadList: false,
accept: fileAccept.join(','), accept: fileAccept.join(','),
beforeUpload: (file, fileList) => { beforeUpload: (file, fileList) => {
const fileExt = file.name.substring(file.name.lastIndexOf('.')); const fileExt = file.name.substring(file.name.lastIndexOf('.'))
if (!fileAccept.includes(fileExt.toLowerCase())) { if (!fileAccept.includes(fileExt.toLowerCase())) {
message.error('请上传正确格式的图片'); message.error('请上传正确格式的图片')
return false; return false
} }
setFile(file); setFile(file)
setFileList(fileList); setFileList(fileList)
}, },
customRequest: async () => { customRequest: async () => {
setUploading(true); setUploading(true)
let data = null; let data = null
if (file.size >= partSize) { if (file.size >= partSize) {
data = await multipartUploader(file, 'gallery', ossClient, (progress, checkpoint) => { data = await multipartUploader(file, 'gallery', ossClient, (progress, checkpoint) => {
console.log(`上传进度 ${progress}`); console.log(`上传进度 ${progress}`)
setProgress(parseInt(progress * 100)); setProgress(parseInt(progress * 100))
}); })
console.log('multipartUploader --> ', data); console.log('multipartUploader --> ', data)
} else { } else {
data = await normalUploader(file, 'gallery', ossClient); data = await normalUploader(file, 'gallery', ossClient)
console.log('normalUploader --> ', data); console.log('normalUploader --> ', data)
} }
if (data.status === 200 && data.statusCode === 200) { if (data.status === 200 && data.statusCode === 200) {
const { url, name } = data; const { url, name } = data
const filename = file.name.substring(0, file.name.lastIndexOf('.')); const filename = file.name.substring(0, file.name.lastIndexOf('.'))
const values = { const values = {
['content']: { ['content']: {
[activeKey]: { [activeKey]: {
url: url, url: url,
title: '', title: '',
desc: '', desc: ''
}, }
}, }
}; }
setImgUrl(url); setImgUrl(url)
form.setFieldsValue({ ...values }); form.setFieldsValue({ ...values })
const allContent = form.getFieldValue("content"); const allContent = form.getFieldValue('content')
const newGalleryList = []; const newGalleryList = []
// eslint-disable-next-line guard-for-in // eslint-disable-next-line guard-for-in
for(let key in allContent) { for (let key in allContent) {
newGalleryList.push({ ...allContent[key], key: key }); newGalleryList.push({ ...allContent[key], key: key })
} }
setPicList(newGalleryList); setPicList(newGalleryList)
form.setFieldsValue({ gallery: newGalleryList }); form.setFieldsValue({ gallery: newGalleryList })
} }
setUploading(false); setUploading(false)
}, }
}; }
const changeTitleValue = (e) => { const changeTitleValue = e => {
const allContent = form.getFieldValue('content')
const allContent = form.getFieldValue("content"); const newGalleryList = []
const newGalleryList = [];
// eslint-disable-next-line guard-for-in // eslint-disable-next-line guard-for-in
for(let key in allContent) { for (let key in allContent) {
newGalleryList.push({ ...allContent[key], key: key }); newGalleryList.push({ ...allContent[key], key: key })
} }
setPicList(newGalleryList); setPicList(newGalleryList)
form.setFieldsValue({ gallery: newGalleryList }); form.setFieldsValue({ gallery: newGalleryList })
} }
const changeDescValue = (e) => { const changeDescValue = e => {
const allContent = form.getFieldValue("content"); const allContent = form.getFieldValue('content')
const newGalleryList = []; const newGalleryList = []
// eslint-disable-next-line guard-for-in // eslint-disable-next-line guard-for-in
for(let key in allContent) { for (let key in allContent) {
newGalleryList.push({ ...allContent[key], key: key }); newGalleryList.push({ ...allContent[key], key: key })
} }
setPicList(newGalleryList); setPicList(newGalleryList)
form.setFieldsValue({ gallery: newGalleryList }); form.setFieldsValue({ gallery: newGalleryList })
} }
return ( return (
<> <>
<Form.Item <Form.Item
label='上传图片' label="上传图片"
valuePropName='fileList' valuePropName="fileList"
getValueFromEvent={normFile} getValueFromEvent={normFile}
extra='最多可上传10张' extra="最多可上传10张"
name={['content', activeKey, 'url']} name={['content', activeKey, 'url']}
rules={[{ required: true, message: '请上传画廊图片' }]} rules={[{ required: true, message: '请上传画廊图片' }]}>
> <Spin spinning={uploading} tip="Loading">
<Spin spinning={uploading} tip='Loading'> <div className="editor-dragger">
<div className='editor-dragger'>
<Upload.Dragger {...uploadProps} showUploadList={false}> <Upload.Dragger {...uploadProps} showUploadList={false}>
{!imgUrl ? ( {!imgUrl ? (
<> <>
<div className='editor-uploader-process'> <div className="editor-uploader-process">
<p className='ant-upload-drag-icon'> <p className="ant-upload-drag-icon">
<CloudUploadOutlined style={{ fontSize: 40 }} /> <CloudUploadOutlined style={{ fontSize: 40 }} />
</p> </p>
<p className='ant-upload-text'>点击上传或拖拽到此处上传</p> <p className="ant-upload-text">点击上传或拖拽到此处上传</p>
<p className='ant-upload-hint'>支持上传 .png、.jpg、.jpeg、.svg格式的图片</p> <p className="ant-upload-hint">支持上传 .png、.jpg、.jpeg、.svg格式的图片</p>
</div> </div>
</> </>
) : ( ) : (
<div className='editor-uploader-result'> <div className="editor-uploader-result">
<div className='editor-uploader-result-img'> <div className="editor-uploader-result-img">
<img src={imgUrl} alt='' /> <img src={imgUrl} alt="" />
</div> </div>
<div className='editor-uploader-result-tips'> <div className="editor-uploader-result-tips">
<Button size='small' type='primary' ghost onClick={() => setImgUrl(null)}> <Button size="small" type="primary" ghost onClick={() => setImgUrl(null)}>
替换 替换
</Button> </Button>
</div> </div>
...@@ -180,29 +176,14 @@ const GalleryFormItem = forwardRef((props, ref) => { ...@@ -180,29 +176,14 @@ const GalleryFormItem = forwardRef((props, ref) => {
</div> </div>
</Spin> </Spin>
</Form.Item> </Form.Item>
<Form.Item <Form.Item label="标题" rules={[{ required: false, message: '请输入图片标题' }]} name={['content', activeKey, 'title']} extra="最多输入100字">
label='标题' <Input maxLength={100} placeholder="" allowClear onChange={changeTitleValue} />
rules={[{ required: false, message: '请输入图片标题' }]}
name={['content', activeKey, 'title']}
extra='最多输入100字'
>
<Input maxLength={100} placeholder='' allowClear onChange={changeTitleValue} />
</Form.Item> </Form.Item>
<Form.Item <Form.Item label="描述" rules={[{ required: false, message: '请输入图片描述' }]} name={['content', activeKey, 'desc']} extra="最多输入500字">
label='描述' <Input.TextArea maxLength={500} autoSize={{ minRows: 4, maxRows: 6 }} placeholder="请输入描述" onChange={changeDescValue} />
rules={[{ required: false, message: '请输入图片描述' }]}
name={['content', activeKey, 'desc']}
extra='最多输入500字'
>
<Input.TextArea
maxLength={500}
autoSize={{ minRows: 4, maxRows: 6 }}
placeholder='请输入描述'
onChange={changeDescValue}
/>
</Form.Item> </Form.Item>
</> </>
); )
}); }
export default GalleryFormItem; export default forwardRef(GalleryFormItem)
import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react'; import { useState, useEffect, forwardRef } from 'react'
import { Modal, Divider, Upload, Input, Space, Button, Form, Spin, message } from 'antd'; import { Divider, Upload, Input, Space, Button, Form, Spin, message } from 'antd'
import { CloudUploadOutlined } from '@ant-design/icons'; import { CloudUploadOutlined } from '@ant-design/icons'
import { SlateTransforms, SlateEditor, SlateElement } from '@wangeditor/editor'; import { SlateTransforms, SlateEditor, SlateElement } from '@wangeditor/editor'
import './index.less'; import './index.less'
import { partSize, normalUploader, multipartUploader } from '../utils/upload'; import { partSize, normalUploader, multipartUploader } from '../utils/upload'
const { Dragger } = Upload; const { Dragger } = Upload
const tImg = 'http://zxts-book-file.zijingebook.com/2024/02/27/image-1709025121892-8jswpoazmvk.png'; const ImageModal = (props, ref) => {
const ImageModal = forwardRef((props, ref) => { const { editor, ossClient, setImageVisible, imageInfo, setImageInfo } = props
const { editor, ossClient, setImageVisible, imageInfo, setImageInfo } = props;
const [imgUrl, setImgUrl] = useState(''); const [imgUrl, setImgUrl] = useState('')
const fileAccept = ['.png', '.jpg', '.jpeg', '.svg']; const fileAccept = ['.png', '.jpg', '.jpeg', '.svg']
const [form] = Form.useForm(); const [form] = Form.useForm()
const [uploading, setUploading] = useState(false); // 文件上传状态 const [uploading, setUploading] = useState(false) // 文件上传状态
const [progress, setProgress] = useState(0); const [progress, setProgress] = useState(0)
const [file, setFile] = useState({}); const [file, setFile] = useState({})
const [fileList, setFileList] = useState([]); const [fileList, setFileList] = useState([])
const [initValues, setInitValues] = useState({ imgUrl: '', imgTitle: '', imgDescript: '' }); const [initValues, setInitValues] = useState({ imgUrl: '', imgTitle: '', imgDescript: '' })
const [tempNodeInfo, setTempNodeInfo] = useState(null); const [tempNodeInfo, setTempNodeInfo] = useState(null)
useEffect(() => { useEffect(() => {
if (imageInfo && Object.entries(imageInfo).length > 0) { if (imageInfo && Object.entries(imageInfo).length > 0) {
const { image, node } = imageInfo; const { image, node } = imageInfo
setImgUrl(image.src); setImgUrl(image.src)
setInitValues({ imgUrl: image.src, imgTitle: image.alt, imgDescript: image.href }); setInitValues({ imgUrl: image.src, imgTitle: image.alt, imgDescript: image.href })
form.setFieldsValue({ imgUrl: image.src, imgTitle: image.alt, imgDescript: image.href }); form.setFieldsValue({ imgUrl: image.src, imgTitle: image.alt, imgDescript: image.href })
setTempNodeInfo(imageInfo); setTempNodeInfo(imageInfo)
setFile({}); setFile({})
setFileList([]); setFileList([])
setImageInfo({}); setImageInfo({})
} }
}, [imageInfo]); }, [imageInfo])
const normFile = (e) => { const normFile = e => {
if (Array.isArray(e)) { if (Array.isArray(e)) {
return e; return e
} }
return e?.fileList; return e?.fileList
}; }
const uploadProps = { const uploadProps = {
name: 'file', name: 'file',
maxCount: 1, maxCount: 1,
showUploadList: false, showUploadList: false,
accept: fileAccept.join(','), accept: fileAccept.join(','),
beforeUpload: (file, fileList) => { beforeUpload: (file, fileList) => {
const fileExt = file.name.substring(file.name.lastIndexOf('.')); const fileExt = file.name.substring(file.name.lastIndexOf('.'))
if (!fileAccept.includes(fileExt.toLowerCase())) { if (!fileAccept.includes(fileExt.toLowerCase())) {
message.error('请上传正确格式的图片'); message.error('请上传正确格式的图片')
return false; return false
} }
setFile(file); setFile(file)
setFileList(fileList); setFileList(fileList)
}, },
customRequest: async () => { customRequest: async () => {
setUploading(true); setUploading(true)
let data = null; let data = null
if (file.size >= partSize) { if (file.size >= partSize) {
data = await multipartUploader(file, 'image', ossClient, (progress, checkpoint) => { data = await multipartUploader(file, 'image', ossClient, (progress, checkpoint) => {
console.log(`上传进度 ${progress}`); console.log(`上传进度 ${progress}`)
setProgress(parseInt(progress * 100)); setProgress(parseInt(progress * 100))
}); })
console.log('multipartUploader --> ', data); console.log('multipartUploader --> ', data)
} else { } else {
data = await normalUploader(file, 'image', ossClient); data = await normalUploader(file, 'image', ossClient)
console.log('normalUploader --> ', data); console.log('normalUploader --> ', data)
} }
if (data.status === 200 && data.statusCode === 200) { if (data.status === 200 && data.statusCode === 200) {
const { url, name } = data; const { url, name } = data
setImgUrl(url); setImgUrl(url)
form.setFieldsValue({ imgUrl: url }); form.setFieldsValue({ imgUrl: url })
} }
setUploading(false); setUploading(false)
}, }
}; }
const clear = () => { const clear = () => {
setImgUrl(''); setImgUrl('')
setProgress(0); setProgress(0)
setUploading(false); setUploading(false)
setTempNodeInfo(null); setTempNodeInfo(null)
setInitValues({ imgUrl: imgUrl, imgTitle: '', imgDescript: '' }); setInitValues({ imgUrl: imgUrl, imgTitle: '', imgDescript: '' })
form.resetFields(); form.resetFields()
setImageVisible(false); setImageVisible(false)
}; }
const onFinish = (values) => { const onFinish = values => {
editor.restoreSelection(); editor.restoreSelection()
// editor.insertNode({ // editor.insertNode({
// type: 'chapterImage', // type: 'chapterImage',
// title: values.imgTitle, // title: values.imgTitle,
...@@ -99,21 +98,21 @@ const ImageModal = forwardRef((props, ref) => { ...@@ -99,21 +98,21 @@ const ImageModal = forwardRef((props, ref) => {
// }); // });
const nodeEntries = SlateEditor.nodes(editor, { const nodeEntries = SlateEditor.nodes(editor, {
match: (node) => { match: node => {
// JS syntax // JS syntax
if (SlateElement.isElement(node)) { if (SlateElement.isElement(node)) {
if (node.type === 'paragraph') { if (node.type === 'paragraph') {
return true; // 匹配 paragraph return true // 匹配 paragraph
} }
} }
return false; return false
}, },
universal: true, universal: true
}); })
for (let nodeEntry of nodeEntries) { for (let nodeEntry of nodeEntries) {
const [node, path] = nodeEntry; const [node, path] = nodeEntry
if (node.children[0].text === '') { if (node.children[0].text === '') {
SlateTransforms.removeNodes(editor); SlateTransforms.removeNodes(editor)
} }
} }
...@@ -128,96 +127,84 @@ const ImageModal = forwardRef((props, ref) => { ...@@ -128,96 +127,84 @@ const ImageModal = forwardRef((props, ref) => {
children: [ children: [
{ {
// 该字段必须要 // 该字段必须要
text: '', text: ''
}, }
], ]
}, }
], ]
}; }
const oP = { const oP = {
type: 'paragraph', type: 'paragraph',
children: [{ text: values.imgTitle }], children: [{ text: values.imgTitle }]
}; }
if (tempNodeInfo && Object.entries(tempNodeInfo).length > 0) { if (tempNodeInfo && Object.entries(tempNodeInfo).length > 0) {
const elem = editor.toDOMNode(tempNodeInfo.node); // 返回 HTMLElement const elem = editor.toDOMNode(tempNodeInfo.node) // 返回 HTMLElement
let nodeProps = JSON.parse(JSON.stringify(tempNodeInfo.node)); let nodeProps = JSON.parse(JSON.stringify(tempNodeInfo.node))
let obj = {}; let obj = {}
let cIndex = -1; let cIndex = -1
nodeProps.children.forEach((element, index) => { nodeProps.children.forEach((element, index) => {
if (element.type === 'image') { if (element.type === 'image') {
obj = { obj = {
...element, ...element,
alt: values.imgTitle, alt: values.imgTitle,
src: values.imgUrl, src: values.imgUrl,
href: values.imgDescript, href: values.imgDescript
}; }
cIndex = index; cIndex = index
} }
}); })
SlateTransforms.removeNodes(editor); SlateTransforms.removeNodes(editor)
const elem2 = elem.nextSibling; const elem2 = elem.nextSibling
if (elem2 && elem2.textContent === tempNodeInfo.image.alt) { if (elem2 && elem2.textContent === tempNodeInfo.image.alt) {
elem2.parentNode.removeChild(elem2); elem2.parentNode.removeChild(elem2)
} }
let nodes = []; let nodes = []
if (values.imgTitle) { if (values.imgTitle) {
nodes.push(oP); nodes.push(oP)
} }
nodes.push(oImg); nodes.push(oImg)
SlateTransforms.insertNodes(editor, nodes); SlateTransforms.insertNodes(editor, nodes)
clear(); clear()
return; return
} }
let nodes = []; let nodes = []
if (values.imgTitle) { if (values.imgTitle) {
nodes.push(oP); nodes.push(oP)
} }
nodes.push(oImg); nodes.push(oImg)
SlateTransforms.insertNodes(editor, nodes); SlateTransforms.insertNodes(editor, nodes)
clear(); clear()
}; }
return ( return (
<div> <div>
<Divider /> <Divider />
<div className='editor-content-form'> <div className="editor-content-form">
<Form <Form layout="vertical" name="validate_other" form={form} onFinish={onFinish} initialValues={initValues}>
layout='vertical' <Form.Item label="上传图片" valuePropName="fileList" name="imgUrl" getValueFromEvent={normFile} rules={[{ required: true, message: '请上传图片' }]}>
name='validate_other'
form={form}
onFinish={onFinish}
initialValues={initValues}
>
<Form.Item
label='上传图片'
valuePropName='fileList'
name='imgUrl'
getValueFromEvent={normFile}
rules={[{ required: true, message: '请上传图片' }]}
>
<Spin spinning={uploading} tip={`${progress}%`}> <Spin spinning={uploading} tip={`${progress}%`}>
<div className='editor-dragger'> <div className="editor-dragger">
<Dragger {...uploadProps} showUploadList={false}> <Dragger {...uploadProps} showUploadList={false}>
{!imgUrl && ( {!imgUrl && (
<div className='editor-uploader-process'> <div className="editor-uploader-process">
<p className='ant-upload-drag-icon'> <p className="ant-upload-drag-icon">
<CloudUploadOutlined style={{ fontSize: 40 }} /> <CloudUploadOutlined style={{ fontSize: 40 }} />
</p> </p>
<p className='ant-upload-text'>点击上传或拖拽到此处上传</p> <p className="ant-upload-text">点击上传或拖拽到此处上传</p>
<p className='ant-upload-hint'>支持上传 .png、.jpg、.jpeg、.svg格式的图片</p> <p className="ant-upload-hint">支持上传 .png、.jpg、.jpeg、.svg格式的图片</p>
</div> </div>
)} )}
{imgUrl && ( {imgUrl && (
<> <>
<div className='editor-uploader-result'> <div className="editor-uploader-result">
<div className='editor-uploader-result-img'> <div className="editor-uploader-result-img">
<img src={imgUrl} alt='' /> <img src={imgUrl} alt="" />
</div> </div>
<div className='editor-uploader-result-tips'> <div className="editor-uploader-result-tips">
<Button size='small' type='primary' ghost onClick={() => setImgUrl(null)}> <Button size="small" type="primary" ghost onClick={() => setImgUrl(null)}>
替换 替换
</Button> </Button>
</div> </div>
...@@ -228,23 +215,18 @@ const ImageModal = forwardRef((props, ref) => { ...@@ -228,23 +215,18 @@ const ImageModal = forwardRef((props, ref) => {
</div> </div>
</Spin> </Spin>
</Form.Item> </Form.Item>
<Form.Item label='图片标题' name='imgTitle' extra='最多输入100字'> <Form.Item label="图片标题" name="imgTitle" extra="最多输入100字">
<Input maxLength={100} placeholder='' allowClear /> <Input maxLength={100} placeholder="" allowClear />
</Form.Item> </Form.Item>
<Form.Item label='图片描述' name='imgDescript' extra='最多输入200字'> <Form.Item label="图片描述" name="imgDescript" extra="最多输入200字">
<Input.TextArea <Input.TextArea maxLength={200} autosize={{ minRows: 4, maxRows: 6 }} placeholder="" allowClear />
maxLength={200}
autosize={{ minRows: 4, maxRows: 6 }}
placeholder=''
allowClear
/>
</Form.Item> </Form.Item>
<Form.Item className='editor-form-buttons'> <Form.Item className="editor-form-buttons">
<Space> <Space>
<Button type='default' disabled={uploading} onClick={() => setImageVisible(false)}> <Button type="default" disabled={uploading} onClick={() => setImageVisible(false)}>
取消 取消
</Button> </Button>
<Button type='primary' disabled={uploading} htmlType='submit'> <Button type="primary" disabled={uploading} htmlType="submit">
插入 插入
</Button> </Button>
</Space> </Space>
...@@ -252,7 +234,7 @@ const ImageModal = forwardRef((props, ref) => { ...@@ -252,7 +234,7 @@ const ImageModal = forwardRef((props, ref) => {
</Form> </Form>
</div> </div>
</div> </div>
); )
}); }
export default ImageModal; export default forwardRef(ImageModal)
import { DomEditor, SlateRange } from '@wangeditor/editor'
class GalleryAuto {
constructor() {
this.title = '画廊'
this.iconSvg = `<svg width="24px" height="19px" viewBox="0 0 24 19" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>图标</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="图标" transform="translate(-677.000000, -1030.000000)">
<g id="右侧章节目录" transform="translate(551.000000, 592.000000)">
<rect id="边框" stroke="#CCCCCC" fill="#EEEEEE" opacity="0.302679084" x="0.5" y="50.5" width="259" height="666"></rect>
<g id="媒体资源" transform="translate(11.000000, 400.000000)" fill="#666666" fill-rule="nonzero">
<g id="视频播放" transform="translate(115.000000, 38.000000)">
<path d="M9.64798915,14 C9.76728423,14 9.87844555,13.9618138 9.97605061,13.8949881 L14.6312698,10.7128083 C14.8481699,10.5982498 15,10.3341289 15,10.0286396 C15,9.7486078 14.8698599,9.50039777 14.677361,9.3699284 L10.1278807,6.25775656 C10.0112969,6.09864757 9.83777677,6 9.64798915,6 C9.29281518,6 9.00813376,6.34049324 9.00813376,6.75735879 L9.00813376,6.79872713 L9,6.80509149 L9.01084501,13.1630867 C9.00813376,13.1885442 9.00813376,13.2140016 9.00813376,13.2426412 C9.00813376,13.6626889 9.29552643,14 9.64798915,14 L9.64798915,14 Z" id="路径"></path>
<path d="M2.27373675e-13,11 C2.27373675e-13,11.3572656 0.190598914,11.6873926 0.5,11.8660254 C0.809401074,12.0446582 1.19059893,12.0446582 1.5,11.8660254 C1.80940109,11.6873926 2,11.3572656 2,11 C2,10.6427344 1.80940109,10.3126074 1.5,10.1339746 C1.19059893,9.9553418 0.809401074,9.9553418 0.5,10.1339746 C0.190598914,10.3126074 2.27373675e-13,10.6427344 2.27373675e-13,11 L2.27373675e-13,11 Z" id="路径"></path>
<path d="M23.9946417,6.45843399 C23.9973208,6.41523376 24,6.37203354 24,6.32883331 C24,5.38382834 23.2364367,4.61972431 22.2960482,4.61972431 C21.9825854,4.61972431 21.6878768,4.70612477 21.4333557,4.85462555 L21.4199598,4.84652551 L20.5760214,5.33792809 L20.5760214,3.5910189 C20.5733423,1.61730851 18.9711989,0 17.0100469,0 L3.56329538,0 C1.60482251,0 2.27373675e-13,1.6146085 2.27373675e-13,3.5910189 L2.27373675e-13,8.06764246 L0.00535833892,8.06764246 C0.00535833892,8.54554498 0.391158741,8.93434702 0.868050904,8.93434702 C1.34494307,8.93434702 1.73074347,8.54554498 1.73074347,8.06764246 L1.73610181,8.06764246 L1.73610181,3.45331818 C1.73610181,2.50291317 2.50770261,1.72530908 3.45077026,1.72530908 L17.1198928,1.72530908 C18.0629605,1.72530908 18.8345613,2.50291317 18.8345613,3.45331818 L18.8345613,15.573682 C18.8345613,16.524087 18.0629605,17.3016911 17.1198928,17.3016911 L3.45344943,17.3016911 C2.51038178,17.3016911 1.73878098,16.524087 1.73878098,15.573682 L1.73878098,14.9958789 C1.73878098,14.5179764 1.35298058,14.1291744 0.876088413,14.1291744 C0.399196249,14.1291744 0.0133958473,14.5179764 0.0133958473,14.9958789 L0.00267916946,14.9958789 L0.00267916946,15.4089811 C0.00267916946,17.3853915 1.60750167,19 3.56597455,19 L17.0127261,19 C18.9738781,19 20.5760214,17.3853915 20.5760214,15.4089811 L20.5760214,13.678272 L21.4628265,14.1939747 L21.4655057,14.1912747 C21.7119893,14.3289754 21.9959812,14.4072758 22.2960482,14.4072758 C23.2364367,14.4072758 24,13.6404718 24,12.6981668 C24,12.6549666 23.9973208,12.6117664 23.9946417,12.5685662 L23.9946417,6.45843399 Z M22.2906899,11.9961631 C22.2826524,12.2067642 22.1058272,12.3768651 21.8888145,12.3768651 C21.8164769,12.3768651 21.7468185,12.357965 21.6878768,12.3228649 L20.5760214,11.6829615 L20.5760214,7.31703851 L21.6718017,6.69063521 C21.7334226,6.650135 21.8084394,6.62853489 21.8888145,6.62853489 C22.1111855,6.62853489 22.2906899,6.80673582 22.2906899,7.02273696 L22.2906899,11.9961631 L22.2906899,11.9961631 Z" id="形状"></path>
</g>
</g>
</g>
</g>
</g>
</svg>`
this.tag = 'button'
}
getValue(editor) {
return 'hello, 图片, , , 图片'
}
isActive(editor) {
return false
}
isDisabled(editor) {
const { selection } = editor
if (selection === null) return true
if (SlateRange.isExpanded(selection)) return true // 选区非折叠,禁用
const selectedElems = DomEditor.getSelectedElems(editor)
// const hasVoidElem = selectedElems.some(elem => editor.isVoid(elem))
// if (hasVoidElem) return true // 选中了 void 元素,禁用
// eslint-disable-next-line array-callback-return
const hasPreElem = selectedElems.some(elem => {
const type = DomEditor.getNodeType(elem)
// 代码块 引用 表格 禁用
if (type === 'pre' || type === 'blockquote' || type === 'table' || type === 'table-row' || type === 'table-cell') return true
})
if (hasPreElem) return true // 选中了 pre 原则,禁用
return false
}
exec(editor, value) {
// editor.insertText(value) // value 即 this.getValue(editor) 的返回值
if (this.isDisabled(editor)) {
return
}
editor.emit('GalleryMenuClick')
}
}
export default {
key: 'GalleryAuto', // 定义 menu key :要保证唯一、不重复(重要)
factory() {
return new GalleryAuto() // 把 `YourMenuClass` 替换为你菜单的 class
}
}
export { GalleryAuto }
import pic2 from '@/assets/images/pic2.png';
import uploadImg from '@/assets/images/svg/icon_editot_img.svg';
import { DomEditor, SlateTransforms as Transforms, SlateRange } from '@wangeditor/editor' import { DomEditor, SlateTransforms as Transforms, SlateRange } from '@wangeditor/editor'
// Extend menu // Extend menu
class ImageAuto { class ImageAuto {
constructor() { constructor() {
this.title = '图片'; this.title = '图片'
this.iconSvg = `<svg width="23px" height="21px" viewBox="0 0 23 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> this.iconSvg = `<svg width="23px" height="21px" viewBox="0 0 23 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>编辑器图片样式</title> <title>编辑器图片样式</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> <g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
...@@ -15,14 +13,14 @@ class ImageAuto { ...@@ -15,14 +13,14 @@ class ImageAuto {
</g> </g>
</g> </g>
</g> </g>
</svg>`; </svg>`
this.tag = 'button'; this.tag = 'button'
} }
getValue(editor) { getValue(editor) {
return 'hello, 图片, , , 图片'; return 'hello, 图片, , , 图片'
} }
isActive(editor) { isActive(editor) {
return false; // or true return false // or true
} }
isDisabled(editor) { isDisabled(editor) {
const { selection } = editor const { selection } = editor
...@@ -36,7 +34,7 @@ class ImageAuto { ...@@ -36,7 +34,7 @@ class ImageAuto {
// eslint-disable-next-line array-callback-return // eslint-disable-next-line array-callback-return
const hasPreElem = selectedElems.some(elem => { const hasPreElem = selectedElems.some(elem => {
const type = DomEditor.getNodeType(elem); const type = DomEditor.getNodeType(elem)
// 代码块 引用 表格 禁用 // 代码块 引用 表格 禁用
if (type === 'pre' || type === 'blockquote') return true if (type === 'pre' || type === 'blockquote') return true
}) })
...@@ -49,11 +47,11 @@ class ImageAuto { ...@@ -49,11 +47,11 @@ class ImageAuto {
} }
exec(editor, value) { exec(editor, value) {
// editor.insertText(value) // value 即 this.getValue(editor) 的返回值 // editor.insertText(value) // value 即 this.getValue(editor) 的返回值
editor.emit('ImageMenuClick'); editor.emit('ImageMenuClick')
if (this.isDisabled(editor)) { if (this.isDisabled(editor)) {
return; return
} }
const imageNode = this.getSelectedNode(editor) const imageNode = this.getSelectedNode(editor)
...@@ -63,19 +61,18 @@ class ImageAuto { ...@@ -63,19 +61,18 @@ class ImageAuto {
const hoverbar = DomEditor.getHoverbar(editor) const hoverbar = DomEditor.getHoverbar(editor)
if (hoverbar) hoverbar.hideAndClean() if (hoverbar) hoverbar.hideAndClean()
const { style = {} } = imageNode; const { style = {} } = imageNode
const props = { const props = {
style: { style: {
...style, ...style,
width: this.value, // 修改 width width: this.value, // 修改 width
height: '', // 清空 height height: '' // 清空 height
}, }
} }
Transforms.setNodes(editor, props, { Transforms.setNodes(editor, props, {
match: n => DomEditor.checkNodeType(n, 'chapterImage'), match: n => DomEditor.checkNodeType(n, 'chapterImage')
}) })
} }
} }
...@@ -97,29 +94,29 @@ class ImageWidthCustomer30 extends ImageAuto { ...@@ -97,29 +94,29 @@ class ImageWidthCustomer30 extends ImageAuto {
export default { export default {
key: 'ImageAuto', // 定义 menu key :要保证唯一、不重复(重要) key: 'ImageAuto', // 定义 menu key :要保证唯一、不重复(重要)
factory() { factory() {
return new ImageAuto(); // 把 `YourMenuClass` 替换为你菜单的 class return new ImageAuto() // 把 `YourMenuClass` 替换为你菜单的 class
}, }
}; }
const imageWidth100MenuChapterConf = { const imageWidth100MenuChapterConf = {
key: 'imageWidthChpater100', key: 'imageWidthChpater100',
factory() { factory() {
return new ImageWidthCustomer100() return new ImageWidthCustomer100()
}, }
} }
const imageWidth50MenuChapterConf = { const imageWidth50MenuChapterConf = {
key: 'imageWidthChpater50', key: 'imageWidthChpater50',
factory() { factory() {
return new ImageWidthCustomer50() return new ImageWidthCustomer50()
}, }
} }
const imageWidth30MenuChapterConf = { const imageWidth30MenuChapterConf = {
key: 'imageWidthChpater30', key: 'imageWidthChpater30',
factory() { factory() {
return new ImageWidthCustomer30() return new ImageWidthCustomer30()
}, }
} }
export { ImageAuto, imageWidth100MenuChapterConf, imageWidth50MenuChapterConf, imageWidth30MenuChapterConf }; export { ImageAuto, imageWidth100MenuChapterConf, imageWidth50MenuChapterConf, imageWidth30MenuChapterConf }
import { DomEditor, SlateTransforms as Transforms, SlateRange } from '@wangeditor/editor'
// Extend menu
class ImageAuto {
constructor() {
this.title = '图片'
this.iconSvg = `<svg width="23px" height="21px" viewBox="0 0 23 21" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>编辑器图片样式</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="图标" transform="translate(-500.000000, -387.000000)" fill="#BCBCBC" fill-rule="nonzero">
<g id="图片-(1)" transform="translate(500.000000, 387.000000)">
<path d="M23,0 L23,21 L0,21 L0,0 L23,0 Z M17.9968611,10.9295455 L11.5159722,16.3017273 L7.30633333,12.9939091 L1.91666667,17.3351818 L1.91666667,19.0909091 L21.0833333,19.0909091 L21.0833333,13.4794546 L17.9968611,10.9295455 Z M21.0833333,1.90909091 L1.91666667,1.90909091 L1.91666667,14.8800909 L7.29163888,10.5509091 L11.4833889,13.8447273 L17.9955833,8.44836363 L21.0833333,10.9989091 L21.0833333,1.90909091 Z M7.98611109,3.18181819 C9.57392975,3.18181819 10.8611111,4.46391186 10.8611111,6.04545456 C10.8611111,7.62699725 9.57392975,8.90909092 7.98611109,8.90909092 C6.39829244,8.90909092 5.11111109,7.62699725 5.11111109,6.04545456 C5.11111109,4.46391186 6.39829244,3.18181819 7.98611109,3.18181819 Z M7.98611109,5.0909091 C7.45683821,5.0909091 7.02777776,5.51827366 7.02777776,6.04545456 C7.02777776,6.57263545 7.45683821,7.00000001 7.98611109,7.00000001 C8.51538398,7.00000001 8.94444442,6.57263545 8.94444442,6.04545456 C8.94444442,5.51827366 8.51538398,5.0909091 7.98611109,5.0909091 Z" id="形状"></path>
</g>
</g>
</g>
</svg>`
this.tag = 'button'
}
getValue(editor) {
return 'hello, 图片, , , 图片'
}
isActive(editor) {
return false // or true
}
isDisabled(editor) {
const { selection } = editor
if (selection === null) return true
if (SlateRange.isExpanded(selection)) return true // 选区非折叠,禁用
const selectedElems = DomEditor.getSelectedElems(editor)
const hasVoidElem = selectedElems.some(elem => editor.isVoid(elem))
if (hasVoidElem) return true // 选中了 void 元素,禁用
// eslint-disable-next-line array-callback-return
const hasPreElem = selectedElems.some(elem => {
const type = DomEditor.getNodeType(elem)
// 代码块 引用 表格 禁用
if (type === 'pre' || type === 'blockquote') return true
})
if (hasPreElem) return true // 选中了 pre 原则,禁用
return false
}
getSelectedNode(editor) {
return DomEditor.getSelectedNodeByType(editor, 'chapterImage')
}
exec(editor, value) {
// editor.insertText(value) // value 即 this.getValue(editor) 的返回值
editor.emit('ImageMenuClick')
if (this.isDisabled(editor)) {
return
}
const imageNode = this.getSelectedNode(editor)
if (imageNode === null) return
// 隐藏 hoverbar
const hoverbar = DomEditor.getHoverbar(editor)
if (hoverbar) hoverbar.hideAndClean()
const { style = {} } = imageNode
const props = {
style: {
...style,
width: this.value, // 修改 width
height: '' // 清空 height
}
}
Transforms.setNodes(editor, props, {
match: n => DomEditor.checkNodeType(n, 'chapterImage')
})
}
}
class ImageWidthCustomer100 extends ImageAuto {
title = '100%' // 菜单标题
value = '100%' // css width 的值
}
class ImageWidthCustomer50 extends ImageAuto {
title = '50%' // 菜单标题
value = '50%' // css width 的值
}
class ImageWidthCustomer30 extends ImageAuto {
title = '30%' // 菜单标题
value = '30%' // css width 的值
}
export default {
key: 'ImageAuto', // 定义 menu key :要保证唯一、不重复(重要)
factory() {
return new ImageAuto() // 把 `YourMenuClass` 替换为你菜单的 class
}
}
const imageWidth100MenuChapterConf = {
key: 'imageWidthChpater100',
factory() {
return new ImageWidthCustomer100()
}
}
const imageWidth50MenuChapterConf = {
key: 'imageWidthChpater50',
factory() {
return new ImageWidthCustomer50()
}
}
const imageWidth30MenuChapterConf = {
key: 'imageWidthChpater30',
factory() {
return new ImageWidthCustomer30()
}
}
export { ImageAuto, imageWidth100MenuChapterConf, imageWidth50MenuChapterConf, imageWidth30MenuChapterConf }
...@@ -4,188 +4,194 @@ export default [ ...@@ -4,188 +4,194 @@ export default [
name: 'books', name: 'books',
key: '/books', key: '/books',
title: '书籍管理', title: '书籍管理',
component: 'books/index', component: 'books/index'
}, },
{ {
name: 'books-classify', name: 'books-classify',
key: '/books/classify', key: '/books/classify',
title: '书籍分类', title: '书籍分类',
component: 'books/classify/index', component: 'books/classify/index'
}, },
{ {
name: 'books-audit', name: 'books-audit',
key: '/books/audit', key: '/books/audit',
title: '书籍审核', title: '书籍审核',
component: 'books/audit/index', component: 'books/audit/index',
isChild: true, isChild: true
}, },
{ {
name: 'books-label', name: 'books-label',
key: '/books/label', key: '/books/label',
title: '书籍标签', title: '书籍标签',
component: 'books/label/index', component: 'books/label/index'
}, },
{ {
name: 'books-management', name: 'books-management',
key: '/books/management', key: '/books/management',
title: '写书管理', title: '写书管理',
component: 'books/management/index', component: 'books/management/index',
isChild: true, isChild: true
}, },
{ {
name: 'books-sale', name: 'books-sale',
key: '/books/sale', key: '/books/sale',
title: '在售书籍', title: '在售书籍',
component: 'books/sale/index', component: 'books/sale/index',
isChild: true, isChild: true
}, },
{ {
name: 'books-question-bank', name: 'books-question-bank',
key: '/books/question-bank', key: '/books/question-bank',
title: '题库管理', title: '题库管理',
component: 'books/question-bank/index', component: 'books/question-bank/index'
}, },
{ {
name: 'books-discussion', name: 'books-discussion',
key: '/books/discussion', key: '/books/discussion',
title: '讨论互动', title: '讨论互动',
component: 'books/discussion/index', component: 'books/discussion/index'
}, },
{ {
name: 'order-management', name: 'order-management',
key: '/books/order-management', key: '/books/order-management',
title: '订单管理', title: '订单管理',
component: 'books/order-management/index', component: 'books/order-management/index',
isChild: true, isChild: true
},
{
name: 'books-design',
key: '/books/design',
title: '在线设计',
component: 'books/design/index'
}, },
// 用户管理 // 用户管理
{ {
name: 'member', name: 'member',
key: '/member', key: '/member',
title: '用户管理', title: '用户管理',
component: 'member/index', component: 'member/index'
}, },
{ {
name: 'memberlist', name: 'memberlist',
key: '/member/list', key: '/member/list',
title: '用户管理', title: '用户管理',
component: 'member/list/index', component: 'member/list/index',
isChild: true, isChild: true
}, },
{ {
name: 'userlevel', name: 'userlevel',
key: '/member/userlevel', key: '/member/userlevel',
title: '用户等级', title: '用户等级',
component: 'member/userlevel/index', component: 'member/userlevel/index'
}, },
// 广告管理 // 广告管理
{ {
name: 'advertisement', name: 'advertisement',
key: '/advertisement', key: '/advertisement',
title: '广告管理', title: '广告管理',
component: 'advertisement/index', component: 'advertisement/index'
}, },
{ {
name: 'advert', name: 'advert',
key: '/advertisement/advert', key: '/advertisement/advert',
title: '广告管理', title: '广告管理',
component: 'advertisement/advert/index', component: 'advertisement/advert/index'
}, },
{ {
name: 'adsense', name: 'adsense',
key: '/advertisement/adsense', key: '/advertisement/adsense',
title: '广告位管理', title: '广告位管理',
component: 'advertisement/adsense/index', component: 'advertisement/adsense/index'
}, },
// 系统设置 // 系统设置
{ {
name: 'setting', name: 'setting',
key: '/setting', key: '/setting',
title: '系统设置', title: '系统设置',
component: 'setting/index', component: 'setting/index'
}, },
{ {
name: 'settingHelp', name: 'settingHelp',
key: '/setting/help', key: '/setting/help',
title: '帮助中心', title: '帮助中心',
component: 'setting/help/index', component: 'setting/help/index',
isChild: true, isChild: true
}, },
{ {
name: 'applied', name: 'applied',
key: '/setting/applied', key: '/setting/applied',
title: '应用管理', title: '应用管理',
component: 'setting/applied/index', component: 'setting/applied/index'
}, },
{ {
name: 'personalized', name: 'personalized',
key: '/setting/personalized-setting', key: '/setting/personalized-setting',
title: '个性化设置', title: '个性化设置',
component: 'setting/personalized-setting/index', component: 'setting/personalized-setting/index'
}, },
{ {
name: 'point', name: 'point',
key: '/setting/point-management', key: '/setting/point-management',
title: '积分管理', title: '积分管理',
component: 'setting/point-management/index', component: 'setting/point-management/index'
}, },
{ {
name: 'appversion', name: 'appversion',
key: '/setting/app-version', key: '/setting/app-version',
title: 'APP版本管理', title: 'APP版本管理',
component: 'setting/app-version/index', component: 'setting/app-version/index'
}, },
{ {
name: 'coupon', name: 'coupon',
key: '/setting/coupon', key: '/setting/coupon',
title: '优惠卷管理', title: '优惠卷管理',
component: 'setting/coupon/index', component: 'setting/coupon/index'
}, },
{ {
name: 'sensitive', name: 'sensitive',
key: '/setting/sensitive', key: '/setting/sensitive',
title: '敏感词搜索', title: '敏感词搜索',
component: 'setting/sensitive/index', component: 'setting/sensitive/index'
}, },
{ {
name: 'feedback', name: 'feedback',
key: '/setting/feedback', key: '/setting/feedback',
title: '意见反馈', title: '意见反馈',
component: 'setting/feedback/index', component: 'setting/feedback/index'
}, },
// 权限管理 // 权限管理
{ {
name: 'jurisdiction', name: 'jurisdiction',
key: '/jurisdiction', key: '/jurisdiction',
title: '权限管理', title: '权限管理',
component: 'jurisdiction/index', component: 'jurisdiction/index'
}, },
{ {
name: 'jurisdictionadmin', name: 'jurisdictionadmin',
key: '/jurisdiction/admin', key: '/jurisdiction/admin',
title: '管理员管理', title: '管理员管理',
component: 'jurisdiction/admin/index', component: 'jurisdiction/admin/index'
}, },
{ {
name: 'jurisdictionrole', name: 'jurisdictionrole',
key: '/jurisdiction/role', key: '/jurisdiction/role',
title: '角色管理', title: '角色管理',
component: 'jurisdiction/role/index', component: 'jurisdiction/role/index'
}, },
// 老师管理 // 老师管理
{ {
name: 'teacher', name: 'teacher',
key: '/teacher', key: '/teacher',
title: '老师管理', title: '老师管理',
component: 'teacher/index', component: 'teacher/index'
}, },
{ {
name: 'teacherlist', name: 'teacherlist',
key: '/teacher/list', key: '/teacher/list',
title: '老师管理', title: '老师管理',
component: 'teacher/query/index', component: 'teacher/query/index'
}, }
]; ]
const childThirdRoutes = { const childThirdRoutes = {
// 写书管理 // 写书管理
...@@ -196,7 +202,7 @@ const childThirdRoutes = { ...@@ -196,7 +202,7 @@ const childThirdRoutes = {
name: 'managementlist', name: 'managementlist',
meta: { title: '' }, meta: { title: '' },
hidden: true, hidden: true,
component: 'books/management/list/index', component: 'books/management/list/index'
}, },
{ {
path: '/books/management/add-edit', path: '/books/management/add-edit',
...@@ -205,7 +211,7 @@ const childThirdRoutes = { ...@@ -205,7 +211,7 @@ const childThirdRoutes = {
meta: { title: '' }, meta: { title: '' },
hidden: true, hidden: true,
back: true, back: true,
component: 'books/management/addedit/index', component: 'books/management/addedit/index'
}, },
{ {
path: '/books/management/chapter', path: '/books/management/chapter',
...@@ -214,8 +220,8 @@ const childThirdRoutes = { ...@@ -214,8 +220,8 @@ const childThirdRoutes = {
meta: { title: '' }, meta: { title: '' },
hidden: true, hidden: true,
back: true, back: true,
component: 'books/section/index', component: 'books/section/index'
}, }
], ],
// 书籍基本信息 // 书籍基本信息
'/books/audit': [ '/books/audit': [
...@@ -224,22 +230,22 @@ const childThirdRoutes = { ...@@ -224,22 +230,22 @@ const childThirdRoutes = {
key: '/books/audit/dataset', key: '/books/audit/dataset',
name: 'dataset', name: 'dataset',
meta: { meta: {
title: '', title: ''
}, },
hidden: true, hidden: true,
component: 'books/audit/table', component: 'books/audit/table'
}, },
{ {
path: '/books/audit/detail', path: '/books/audit/detail',
path: '/books/audit/detail', path: '/books/audit/detail',
key: 'dataset', key: 'dataset',
meta: { meta: {
title: '', title: ''
}, },
hidden: true, hidden: true,
back: true, back: true,
component: 'books/audit/detail', component: 'books/audit/detail'
}, }
], ],
// 书籍审核 // 书籍审核
'/books/sale': [ '/books/sale': [
...@@ -248,44 +254,44 @@ const childThirdRoutes = { ...@@ -248,44 +254,44 @@ const childThirdRoutes = {
key: '/books/sale/dataset', key: '/books/sale/dataset',
name: 'dataset', name: 'dataset',
meta: { meta: {
title: '', title: ''
}, },
hidden: true, hidden: true,
component: 'books/sale/table', component: 'books/sale/table'
}, },
{ {
path: '/books/sale/detail', path: '/books/sale/detail',
key: '/books/sale/detail', key: '/books/sale/detail',
name: 'detail', name: 'detail',
meta: { meta: {
title: '', title: ''
}, },
hidden: true, hidden: true,
back: true, back: true,
component: 'books/sale/edit', component: 'books/sale/edit'
}, },
{ {
path: '/books/sale/discussP', path: '/books/sale/discussP',
key: '/books/sale/discussP', key: '/books/sale/discussP',
name: 'discussP', name: 'discussP',
meta: { meta: {
title: '', title: ''
}, },
hidden: true, hidden: true,
back: true, back: true,
component: 'books/sale/discussList/index', component: 'books/sale/discussList/index'
}, },
{ {
path: '/books/sale/discuss-detail', path: '/books/sale/discuss-detail',
key: '/books/sale/discuss-detail', key: '/books/sale/discuss-detail',
key: 'discuss-detail', key: 'discuss-detail',
meta: { meta: {
title: '', title: ''
}, },
hidden: true, hidden: true,
back: true, back: true,
component: 'books/sale/discussDetail/index', component: 'books/sale/discussDetail/index'
}, }
], ],
// 订单管理 // 订单管理
'/books/order-management': [ '/books/order-management': [
...@@ -294,21 +300,21 @@ const childThirdRoutes = { ...@@ -294,21 +300,21 @@ const childThirdRoutes = {
key: '/books/order-management/dataset', key: '/books/order-management/dataset',
name: 'dataset', name: 'dataset',
meta: { meta: {
title: '', title: ''
}, },
hidden: true, hidden: true,
component: 'books/order-management/tab/table', component: 'books/order-management/tab/table'
}, },
{ {
path: '/books/order-management/sale-statistics', path: '/books/order-management/sale-statistics',
key: '/books/order-management/sale-statistics', key: '/books/order-management/sale-statistics',
name: 'sale-statistics', name: 'sale-statistics',
meta: { meta: {
title: '', title: ''
}, },
hidden: true, hidden: true,
component: 'books/order-management/tab/salesStatistics', component: 'books/order-management/tab/salesStatistics'
}, }
], ],
// 用户管理 // 用户管理
'/member/list': [ '/member/list': [
...@@ -318,7 +324,7 @@ const childThirdRoutes = { ...@@ -318,7 +324,7 @@ const childThirdRoutes = {
name: 'member-query', name: 'member-query',
hidden: true, hidden: true,
meta: {}, meta: {},
component: 'member/list/list', component: 'member/list/list'
}, },
{ {
path: '/member/list/detail', path: '/member/list/detail',
...@@ -326,8 +332,8 @@ const childThirdRoutes = { ...@@ -326,8 +332,8 @@ const childThirdRoutes = {
name: 'member-detail', name: 'member-detail',
hidden: true, hidden: true,
meta: {}, meta: {},
component: 'member/detail/index', component: 'member/detail/index'
}, }
], ],
// 帮助中心 // 帮助中心
'/setting/help': [ '/setting/help': [
...@@ -337,7 +343,7 @@ const childThirdRoutes = { ...@@ -337,7 +343,7 @@ const childThirdRoutes = {
anme: 'help-list', anme: 'help-list',
meta: {}, meta: {},
hidden: true, hidden: true,
component: 'setting/help/table', component: 'setting/help/table'
}, },
{ {
path: '/setting/help/addedit', path: '/setting/help/addedit',
...@@ -346,9 +352,9 @@ const childThirdRoutes = { ...@@ -346,9 +352,9 @@ const childThirdRoutes = {
meta: {}, meta: {},
hidden: true, hidden: true,
back: true, back: true,
component: 'setting/help/addedit/index', component: 'setting/help/addedit/index'
}, }
], ]
}; }
export { childThirdRoutes }; export { childThirdRoutes }
import md5 from 'blueimp-md5' import md5 from 'js-md5'
import qs from 'qs' import qs from 'qs'
import { useSelector } from 'react-redux' import { useSelector } from 'react-redux'
......
...@@ -13,10 +13,6 @@ const baseRouter = [ ...@@ -13,10 +13,6 @@ const baseRouter = [
{ {
path: '/userinfo', path: '/userinfo',
Component: lazy(() => import('@/pages/user-module/userInfo')) Component: lazy(() => import('@/pages/user-module/userInfo'))
},
{
path: '/books/design',
Component: lazy(() => import('@/pages/books/design/index'))
} }
] ]
}, },
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论