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

chore: update

上级 536c8778
......@@ -15,9 +15,8 @@
"@wangeditor/editor-for-react": "^1.0.6",
"@wangeditor/plugin-link-card": "^1.0.0",
"ali-oss": "^6.20.0",
"antd": "^5.18.0",
"antd": "^5.18.1",
"axios": "^1.6.2",
"blueimp-md5": "^2.19.0",
"dayjs": "^1.11.11",
"easy-formula-editor": "^0.0.2-alpha.1",
"echarts": "^5.4.3",
......@@ -28,10 +27,10 @@
"qs": "^6.11.2",
"rc-slider-captcha": "^1.3.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-dom": "^18.3.1",
"react-error-boundary": "^4.0.13",
"react-redux": "^8.1.3",
"react-router-dom": "^6.18.0",
"react-router-dom": "^6.23.1",
"redux-persist": "^6.0.0",
"snabbdom": "^3.6.2",
"xml-formatter": "^3.6.2"
......@@ -47,7 +46,7 @@
"less": "^4.2.0",
"lint-staged": "^15.1.0",
"prettier": "^3.3.1",
"vite": "^5.2.12",
"vite": "^5.3.0",
"vite-plugin-mkcert": "^1.17.5"
}
},
......@@ -146,9 +145,9 @@
"integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
},
"node_modules/@esbuild/aix-ppc64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
"integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
"integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
"cpu": [
"ppc64"
],
......@@ -161,10 +160,74 @@
"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": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
"integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
"integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
"cpu": [
"x64"
],
......@@ -177,6 +240,278 @@
"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": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
......@@ -1168,9 +1503,9 @@
}
},
"node_modules/antd": {
"version": "5.18.0",
"resolved": "https://registry.npmjs.org/antd/-/antd-5.18.0.tgz",
"integrity": "sha512-xAvqvioW34npeZb8/JLZmCh5mcHU5MLiA0IYWAlpLAVmSgjs3p0tNzbU6a7Yx+y7o7E8PHtlchWfO3yBLQ15FQ==",
"version": "5.18.1",
"resolved": "https://registry.npmjs.org/antd/-/antd-5.18.1.tgz",
"integrity": "sha512-l762vsoIpA3xsVsbIExlce3hgFgiLdflGEgdo8NFnq17Qq3fHIMJklGzM8WNpdJJ4iUk4FzritmSSnHk0Y5kZA==",
"dependencies": {
"@ant-design/colors": "^7.0.2",
"@ant-design/cssinjs": "^1.19.1",
......@@ -1189,14 +1524,14 @@
"rc-cascader": "~3.26.0",
"rc-checkbox": "~3.3.0",
"rc-collapse": "~3.7.3",
"rc-dialog": "~9.4.0",
"rc-dialog": "~9.5.2",
"rc-drawer": "~7.2.0",
"rc-dropdown": "~4.2.0",
"rc-field-form": "~2.2.0",
"rc-image": "~7.8.0",
"rc-field-form": "~2.2.1",
"rc-image": "~7.9.0",
"rc-input": "~1.5.1",
"rc-input-number": "~9.1.0",
"rc-mentions": "~2.13.1",
"rc-mentions": "~2.14.0",
"rc-menu": "~9.14.0",
"rc-motion": "^2.9.1",
"rc-notification": "~5.6.0",
......@@ -1440,11 +1775,6 @@
"integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==",
"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": {
"version": "1.9.4",
"resolved": "https://registry.npmjs.org/bowser/-/bowser-1.9.4.tgz",
......@@ -2033,524 +2363,188 @@
"string.prototype.trimend": "^1.0.8",
"string.prototype.trimstart": "^1.0.8",
"typed-array-buffer": "^1.0.2",
"typed-array-byte-length": "^1.0.1",
"typed-array-byte-offset": "^1.0.2",
"typed-array-length": "^1.0.6",
"unbox-primitive": "^1.0.2",
"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"
}
"typed-array-byte-length": "^1.0.1",
"typed-array-byte-offset": "^1.0.2",
"typed-array-length": "^1.0.6",
"unbox-primitive": "^1.0.2",
"which-typed-array": "^1.1.15"
},
"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": ">= 0.4"
},
"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"
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"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": {
"node": ">=12"
}
"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"
},
"node_modules/esbuild/node_modules/@esbuild/linux-mips64el": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
"integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
"cpu": [
"mips64el"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"engines": {
"node": ">=12"
"node": ">= 0.4"
}
},
"node_modules/esbuild/node_modules/@esbuild/linux-ppc64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
"integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
"cpu": [
"ppc64"
],
"dev": true,
"optional": true,
"os": [
"linux"
],
"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": ">=12"
"node": ">= 0.4"
}
},
"node_modules/esbuild/node_modules/@esbuild/linux-riscv64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
"integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
"cpu": [
"riscv64"
],
"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,
"optional": true,
"os": [
"linux"
],
"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": ">=12"
"node": ">= 0.4"
}
},
"node_modules/esbuild/node_modules/@esbuild/linux-s390x": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
"integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
"cpu": [
"s390x"
],
"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,
"optional": true,
"os": [
"linux"
],
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">=12"
"node": ">= 0.4"
}
},
"node_modules/esbuild/node_modules/@esbuild/linux-x64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
"integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
"cpu": [
"x64"
],
"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,
"optional": true,
"os": [
"linux"
],
"dependencies": {
"get-intrinsic": "^1.2.4",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.1"
},
"engines": {
"node": ">=12"
"node": ">= 0.4"
}
},
"node_modules/esbuild/node_modules/@esbuild/netbsd-x64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
"integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
"cpu": [
"x64"
],
"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,
"optional": true,
"os": [
"netbsd"
],
"engines": {
"node": ">=12"
"dependencies": {
"hasown": "^2.0.0"
}
},
"node_modules/esbuild/node_modules/@esbuild/openbsd-x64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
"integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
"cpu": [
"x64"
],
"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,
"optional": true,
"os": [
"openbsd"
],
"dependencies": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
},
"engines": {
"node": ">=12"
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/esbuild/node_modules/@esbuild/sunos-x64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
"integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
"cpu": [
"x64"
],
"dev": true,
"optional": true,
"os": [
"sunos"
],
"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": ">=12"
"node": ">=0.10"
}
},
"node_modules/esbuild/node_modules/@esbuild/win32-arm64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
"integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
"cpu": [
"arm64"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"engines": {
"node": ">=12"
"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/esbuild/node_modules/@esbuild/win32-ia32": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
"integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
"cpu": [
"ia32"
],
"dev": true,
"optional": true,
"os": [
"win32"
],
"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": ">=12"
"node": ">=0.12"
}
},
"node_modules/esbuild/node_modules/@esbuild/win32-x64": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
"integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
"cpu": [
"x64"
],
"node_modules/esbuild": {
"version": "0.21.5",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
"integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
"dev": true,
"optional": true,
"os": [
"win32"
],
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
},
"engines": {
"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": {
......@@ -5009,9 +5003,9 @@
}
},
"node_modules/rc-dialog": {
"version": "9.4.0",
"resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.4.0.tgz",
"integrity": "sha512-AScCexaLACvf8KZRqCPz12BJ8olszXOS4lKlkMyzDQHS1m0zj1KZMYgmMCh39ee0Dcv8kyrj8mTqxuLyhH+QuQ==",
"version": "9.5.2",
"resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.5.2.tgz",
"integrity": "sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==",
"dependencies": {
"@babel/runtime": "^7.10.1",
"@rc-component/portal": "^1.0.0-8",
......@@ -5091,14 +5085,14 @@
"integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
},
"node_modules/rc-image": {
"version": "7.8.1",
"resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.8.1.tgz",
"integrity": "sha512-Y7/ALO8kgAddl9WBHUQDcff7Yfcd1T2ALS/JPlRqkau8wcua48k99glv/CcgChy4xwUXCUdO1cM2l1NqtoZZHw==",
"version": "7.9.0",
"resolved": "https://registry.npmjs.org/rc-image/-/rc-image-7.9.0.tgz",
"integrity": "sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==",
"dependencies": {
"@babel/runtime": "^7.11.2",
"@rc-component/portal": "^1.0.2",
"classnames": "^2.2.6",
"rc-dialog": "~9.4.0",
"rc-dialog": "~9.5.2",
"rc-motion": "^2.6.2",
"rc-util": "^5.34.1"
},
......@@ -5138,9 +5132,9 @@
}
},
"node_modules/rc-mentions": {
"version": "2.13.2",
"resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.13.2.tgz",
"integrity": "sha512-gJCF6MDax/2wl2CzvJEN9yyQKYDzGKA2hmmymQiEPiYUNUOk6UKvQFSB3TBfAi57vxntPMJZGfxNtda1BDb4kA==",
"version": "2.14.0",
"resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-2.14.0.tgz",
"integrity": "sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==",
"dependencies": {
"@babel/runtime": "^7.22.5",
"@rc-component/trigger": "^2.0.0",
......@@ -5576,9 +5570,9 @@
}
},
"node_modules/react": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
"integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
"dependencies": {
"loose-envify": "^1.1.0"
},
......@@ -5587,15 +5581,15 @@
}
},
"node_modules/react-dom": {
"version": "18.2.0",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
"integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
"integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
"dependencies": {
"loose-envify": "^1.1.0",
"scheduler": "^0.23.0"
"scheduler": "^0.23.2"
},
"peerDependencies": {
"react": "^18.2.0"
"react": "^18.3.1"
}
},
"node_modules/react-error-boundary": {
......@@ -6726,12 +6720,12 @@
}
},
"node_modules/vite": {
"version": "5.2.12",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz",
"integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==",
"version": "5.3.0",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.3.0.tgz",
"integrity": "sha512-hA6vAVK977NyW1Qw+fLvqSo7xDPej7von7C3DwwqPRmnnnK36XEBC/J3j1V5lP8fbt7y0TgTKJbpNGSwM+Bdeg==",
"dev": true,
"dependencies": {
"esbuild": "^0.20.1",
"esbuild": "^0.21.3",
"postcss": "^8.4.38",
"rollup": "^4.13.0"
},
......
......@@ -26,9 +26,8 @@
"@wangeditor/editor-for-react": "^1.0.6",
"@wangeditor/plugin-link-card": "^1.0.0",
"ali-oss": "^6.20.0",
"antd": "^5.18.0",
"antd": "^5.18.1",
"axios": "^1.6.2",
"blueimp-md5": "^2.19.0",
"dayjs": "^1.11.11",
"easy-formula-editor": "^0.0.2-alpha.1",
"echarts": "^5.4.3",
......@@ -39,10 +38,10 @@
"qs": "^6.11.2",
"rc-slider-captcha": "^1.3.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-dom": "^18.3.1",
"react-error-boundary": "^4.0.13",
"react-redux": "^8.1.3",
"react-router-dom": "^6.18.0",
"react-router-dom": "^6.23.1",
"redux-persist": "^6.0.0",
"snabbdom": "^3.6.2",
"xml-formatter": "^3.6.2"
......@@ -58,7 +57,7 @@
"less": "^4.2.0",
"lint-staged": "^15.1.0",
"prettier": "^3.3.1",
"vite": "^5.2.12",
"vite": "^5.3.0",
"vite-plugin-mkcert": "^1.17.5"
},
"browserslist": [
......
import React, { useState, useEffect, forwardRef, useImperativeHandle, useRef } from 'react';
import {
Modal,
Divider,
Upload,
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 { useState, useEffect, forwardRef } from 'react'
import { Divider, Input, Space, Button, Form, ColorPicker, Tabs, Select, Row, Col } from 'antd'
import './index.less'
import { addGallery } from '../utils/request'
import { SlateEditor, SlateTransforms, SlateElement } from '@wangeditor/editor'
import { findNodeWithParent, fontFizeList } from '../utils/setting';
import GalleryFormItem from './galleryItem';
import { findNodeWithParent, fontFizeList } from '../utils/setting'
import GalleryFormItem from './galleryItem'
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-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 GalleryModal = forwardRef((props, ref) => {
const {
editor,
ossClient,
galleryInfo,
bookId,
chapterId,
setGalleryVisible,
setGalleryInfo,
selectionSize = 18,
} = props;
const randomOne = Math.random().toString(16).substring(2, 10)
const GalleryModal = props => {
const { editor, ossClient, galleryInfo, bookId, chapterId, setGalleryVisible, setGalleryInfo, selectionSize = 18 } = props
const [form] = Form.useForm();
const [loading, setLoading] = useState(false);
const flexValue = Form.useWatch('flex', form);
const contentValue = Form.useWatch('content', form);
const [form] = Form.useForm()
const [loading, setLoading] = useState(false)
const flexValue = Form.useWatch('flex', form)
const contentValue = Form.useWatch('content', form)
const [oldFlex, setOldFlex] = useState(null);
const [picList, setPicList] = useState([]);
const [themeValue, setThemeValue] = useState('#ab1941');
const [fontsize, setFontsize] = useState(selectionSize);
const [oldFlex, setOldFlex] = useState(null)
const [picList, setPicList] = useState([])
const [themeValue, setThemeValue] = useState('#ab1941')
const [fontsize, setFontsize] = useState(selectionSize)
const [initValues, setInitValues] = useState({
galleryTitle: '',
flex: 1,
theme: '#ab1941',
fontSize: selectionSize || 18,
});
fontSize: selectionSize || 18
})
// 监听图片改变
useEffect(() => {
const newGalleryList = [];
const newGalleryList = []
// eslint-disable-next-line guard-for-in
for(let key in contentValue) {
newGalleryList.push({ ...contentValue[key], key: key });
for (let key in contentValue) {
newGalleryList.push({ ...contentValue[key], key: key })
}
setPicList(newGalleryList);
form.setFieldsValue({ gallery: newGalleryList });
setPicList(newGalleryList)
form.setFieldsValue({ gallery: newGalleryList })
}, [contentValue])
const textColorChange = (value, hex) => {
setThemeValue(hex);
form.setFieldsValue({ theme: hex });
};
setThemeValue(hex)
form.setFieldsValue({ theme: hex })
}
// tabs
const initialItems = [
{
label: '图 1',
children: (
<GalleryFormItem
ossClient={ossClient}
form={form}
galleryInfo={galleryInfo}
activeKey={randomOne}
setPicList={setPicList}
/>
),
children: <GalleryFormItem ossClient={ossClient} form={form} galleryInfo={galleryInfo} activeKey={randomOne} setPicList={setPicList} />,
key: randomOne,
forceRender: true,
},
];
const [activeKey, setActiveKey] = useState(initialItems[0].key);
const [items, setItems] = useState(initialItems);
forceRender: true
}
]
const [activeKey, setActiveKey] = useState(initialItems[0].key)
const [items, setItems] = useState(initialItems)
const onChange = (newActiveKey) => {
setActiveKey(newActiveKey);
};
const onChange = newActiveKey => {
setActiveKey(newActiveKey)
}
const add = () => {
let newPanes = [...items];
let index = newPanes.length;
if (index >= 10) return;
const random = Math.random().toString(16).substring(2, 10);
const newActiveKey = `${random}`;
let newPanes = [...items]
let index = newPanes.length
if (index >= 10) return
const random = Math.random().toString(16).substring(2, 10)
const newActiveKey = `${random}`
newPanes.push({
label: `图 ${index + 1}`,
children: (
<GalleryFormItem
ossClient={ossClient}
form={form}
galleryInfo={galleryInfo}
activeKey={newActiveKey}
setPicList={setPicList}
/>
),
children: <GalleryFormItem ossClient={ossClient} form={form} galleryInfo={galleryInfo} activeKey={newActiveKey} setPicList={setPicList} />,
key: newActiveKey,
forceRender: true,
});
forceRender: true
})
newPanes.forEach((item, index) => {
item.label = `图 ${index + 1}`;
});
setItems(newPanes);
setActiveKey(newActiveKey);
};
const remove = async (targetKey) => {
const tempGallery = picList.filter((item) => item.key !== targetKey);
await setPicList(tempGallery);
console.log(tempGallery);
form.setFieldsValue({ gallery: tempGallery });
item.label = `图 ${index + 1}`
})
setItems(newPanes)
setActiveKey(newActiveKey)
}
const remove = async targetKey => {
const tempGallery = picList.filter(item => item.key !== targetKey)
await setPicList(tempGallery)
console.log(tempGallery)
form.setFieldsValue({ gallery: tempGallery })
let newActiveKey = activeKey;
let lastIndex = -1;
let newActiveKey = activeKey
let lastIndex = -1
items.forEach((item, i) => {
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 (lastIndex >= 0) {
newActiveKey = newPanes[lastIndex].key;
newActiveKey = newPanes[lastIndex].key
} else {
newActiveKey = newPanes[0].key;
newActiveKey = newPanes[0].key
}
}
newPanes.forEach((item, index) => {
item.label = `图 ${index + 1}`;
});
item.label = `图 ${index + 1}`
})
setItems(newPanes);
setActiveKey(newActiveKey);
};
setItems(newPanes)
setActiveKey(newActiveKey)
}
const onEdit = (targetKey, action) => {
if (action === 'add') {
add();
add()
} else {
remove(targetKey);
remove(targetKey)
}
}
};
const [nowRandom, setNowRandom] = useState(null);
const [nowRandom, setNowRandom] = useState(null)
useEffect(() => {
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 {
galleryArr = JSON.parse(decodeURI(galleryList));
galleryArr = JSON.parse(decodeURI(galleryList))
if (galleryArr && !(galleryArr instanceof Array)) {
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }];
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]
}
} catch(err) {
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }];
} catch (err) {
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]
}
setInitValues({
galleryTitle: title,
flex: parseInt(flex),
theme: theme,
gallery: galleryArr,
fontSize: fontsize,
});
fontSize: fontsize
})
form.setFieldsValue({
galleryTitle: title,
flex: parseInt(flex),
theme: theme,
gallery: galleryArr,
fontSize: fontsize,
});
setPicList(galleryArr);
setThemeValue(theme);
setOldFlex(parseInt(flex));
setFontsize(fontsize);
fontSize: fontsize
})
setPicList(galleryArr)
setThemeValue(theme)
setOldFlex(parseInt(flex))
setFontsize(fontsize)
let newPanel = [];
let activeKey = '';
let newPanel = []
let activeKey = ''
galleryArr.forEach((item, index) => {
const newActiveKey = `${item.key}`;
const newActiveKey = `${item.key}`
if (index === 0) {
activeKey = item.key;
activeKey = item.key
}
let obj = {
label: `图 ${index + 1}`,
......@@ -215,43 +172,42 @@ const GalleryModal = forwardRef((props, ref) => {
/>
),
key: newActiveKey,
forceRender: true,
};
newPanel.push(obj);
});
setItems(newPanel);
setActiveKey(activeKey);
setNowRandom(random);
setGalleryInfo({});
forceRender: true
}
}, [galleryInfo]);
newPanel.push(obj)
})
setItems(newPanel)
setActiveKey(activeKey)
const onFinish = async (values) => {
setNowRandom(random)
setGalleryInfo({})
}
}, [galleryInfo])
editor.restoreSelection();
const onFinish = async values => {
editor.restoreSelection()
// setLoading(true);
const { galleryTitle, flex, gallery, fontSize, theme = '' } = values;
console.log(values);
const { galleryTitle, flex, gallery, fontSize, theme = '' } = values
console.log(values)
if (parseInt(flex) !== 2) {
// 删除空白的p标签
const nodeEntries = SlateEditor.nodes(editor, {
match: (node) => {
match: node => {
// JS syntax
if (SlateElement.isElement(node)) {
if (node.type === 'paragraph') {
return true; // 匹配 paragraph
return true // 匹配 paragraph
}
}
return false;
return false
},
universal: true,
});
universal: true
})
for (let nodeEntry of nodeEntries) {
const [node, path] = nodeEntry;
const [node, path] = nodeEntry
if (node.children[0].text === '') {
SlateTransforms.removeNodes(editor);
SlateTransforms.removeNodes(editor)
}
}
}
......@@ -263,45 +219,40 @@ const GalleryModal = forwardRef((props, ref) => {
galleryList: encodeURI(JSON.stringify(gallery)),
random: nowRandom,
theme,
fontsize: fontSize || fontsize,
};
fontsize: fontSize || fontsize
}
await addGallery({
book_id: bookId,
chapter_id: chapterId,
title: galleryTitle,
content: JSON.stringify(gallery),
position: nowRandom,
});
position: nowRandom
})
if (flex === 2) {
const aPath = findNodeWithParent(
editor.children,
'chapterGalleryInline',
'random',
nowRandom,
);
SlateTransforms.setNodes(editor, props, { at: aPath.reverse() });
const aPath = findNodeWithParent(editor.children, 'chapterGalleryInline', 'random', nowRandom)
SlateTransforms.setNodes(editor, props, { at: aPath.reverse() })
} else {
const aPath = findNodeWithParent(editor.children, 'chapterGallery', 'random', nowRandom);
SlateTransforms.setNodes(editor, props, { at: aPath.reverse() });
const aPath = findNodeWithParent(editor.children, 'chapterGallery', 'random', nowRandom)
SlateTransforms.setNodes(editor, props, { at: aPath.reverse() })
}
form.resetFields();
setGalleryVisible(false);
setOldFlex(null);
form.resetFields()
setGalleryVisible(false)
setOldFlex(null)
setLoading(false);
return false;
setLoading(false)
return false
}
let random = Math.random().toString(10).substring(2, 10);
let random = Math.random().toString(10).substring(2, 10)
await addGallery({
book_id: bookId,
chapter_id: chapterId,
title: galleryTitle,
content: JSON.stringify(gallery),
position: random,
});
position: random
})
if (parseInt(flex) === 2) {
editor.insertNode({
type: 'chapterGalleryInline',
......@@ -311,8 +262,8 @@ const GalleryModal = forwardRef((props, ref) => {
theme,
flex: flex,
fontsize: fontSize,
children: [{ text: '' }],
});
children: [{ text: '' }]
})
} else {
editor.insertNode({
type: 'chapterGallery',
......@@ -322,32 +273,22 @@ const GalleryModal = forwardRef((props, ref) => {
theme,
flex: flex,
fontsize: fontSize,
children: [{ text: '' }],
});
children: [{ text: '' }]
})
}
form.resetFields();
setOldFlex(null);
setGalleryVisible(false);
setLoading(false);
};
form.resetFields()
setOldFlex(null)
setGalleryVisible(false)
setLoading(false)
}
return (
<div>
<Divider />
<div className='editor-content-form'>
<Form
layout='vertical'
name='validate_other'
form={form}
onFinish={onFinish}
initialValues={initValues}
>
<Form.Item
label='展示模式'
name='flex'
rules={[{ required: true, message: '请选择展示模式' }]}
>
<div className="editor-content-form">
<Form layout="vertical" name="validate_other" form={form} onFinish={onFinish} initialValues={initValues}>
<Form.Item label="展示模式" name="flex" rules={[{ required: true, message: '请选择展示模式' }]}>
<Select>
<Select.Option disabled={oldFlex && oldFlex === 2} value={1}>
两图并列画廊
......@@ -367,42 +308,35 @@ const GalleryModal = forwardRef((props, ref) => {
<Form.Item>
<Row gutter={20}>
<Col span={12}>
<Form.Item label='字号' name='fontSize'>
<Form.Item label="字号" name="fontSize">
<Select>
{fontFizeList.map((item, index) => {
return (
<Select.Option value={item.value} key={index}>
{item.name}
</Select.Option>
);
)
})}
</Select>
</Form.Item>
</Col>
<Col span={12}>
<div className='justcontent-color-inline'>
<div className="justcontent-color-inline">
<Form.Item
label='画廊主题色'
name='theme'
className='flex-max'
label="画廊主题色"
name="theme"
className="flex-max"
rules={[
{
required: parseInt(flexValue) === 2 ? true : false,
message: '请选择颜色',
message: '请选择颜色'
},
{ pattern: /^#[0-9A-Fa-f]{6}$/i, message: '请输入正确的16进制色值' },
]}
>
<Input placeholder='' allowClear />
{ pattern: /^#[0-9A-Fa-f]{6}$/i, message: '请输入正确的16进制色值' }
]}>
<Input placeholder="" allowClear />
</Form.Item>
<Form.Item label={` `}>
<ColorPicker
disabledAlpha
value={themeValue}
defaultValue={themeValue}
format='hex'
onChange={textColorChange}
/>
<ColorPicker disabledAlpha value={themeValue} defaultValue={themeValue} format="hex" onChange={textColorChange} />
</Form.Item>
</div>
</Col>
......@@ -411,34 +345,19 @@ const GalleryModal = forwardRef((props, ref) => {
)}
{flexValue !== 2 && (
<Form.Item
label='画廊标题'
name='galleryTitle'
rules={[{ required: true, message: '请输入画廊标题' }]}
extra='最多输入100字'
>
<Input maxLength={100} placeholder='' allowClear />
<Form.Item label="画廊标题" name="galleryTitle" rules={[{ required: true, message: '请输入画廊标题' }]} extra="最多输入100字">
<Input maxLength={100} placeholder="" allowClear />
</Form.Item>
)}
<Form.Item
label='图片'
name='gallery'
rules={[{ required: true, message: '请上传画廊图片' }]}
>
<Tabs
type='editable-card'
onChange={onChange}
activeKey={activeKey}
onEdit={onEdit}
items={items}
></Tabs>
<Form.Item label="图片" name="gallery" rules={[{ required: true, message: '请上传画廊图片' }]}>
<Tabs type="editable-card" onChange={onChange} activeKey={activeKey} onEdit={onEdit} items={items}></Tabs>
</Form.Item>
<Form.Item className='editor-form-buttons'>
<Form.Item className="editor-form-buttons">
<Space>
<Button type='default' onClick={() => setGalleryVisible(false)}>
<Button type="default" onClick={() => setGalleryVisible(false)}>
取消
</Button>
<Button type='primary' loading={loading} htmlType='submit'>
<Button type="primary" loading={loading} htmlType="submit">
{nowRandom ? '更新' : '插入'}
</Button>
</Space>
......@@ -446,7 +365,7 @@ const GalleryModal = forwardRef((props, ref) => {
</Form>
</div>
</div>
);
});
)
}
export default GalleryModal;
export default forwardRef(GalleryModal)
import React, { useState, useEffect, useImperativeHandle, forwardRef } from 'react';
import { CloudUploadOutlined } from '@ant-design/icons';
import { Row, Col, Form, Input, Spin, Upload, Button } from 'antd';
import { partSize, normalUploader, multipartUploader } from '../utils/upload';
import { useState, useEffect, useImperativeHandle, forwardRef } from 'react'
import { CloudUploadOutlined } from '@ant-design/icons'
import { Form, Input, Spin, Upload, Button } from 'antd'
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 GalleryFormItem = forwardRef((props, ref) => {
const { activeKey, ossClient, form, setPicList, galleryInfo } = props;
const randomOne = Math.random().toString(16).substring(2, 10)
const GalleryFormItem = (props, ref) => {
const { activeKey, ossClient, form, setPicList, galleryInfo } = props
const [uploading, setUploading] = useState(false); // 文件上传状态
const [progress, setProgress] = useState(0);
const [file, setFile] = useState({});
const [fileList, setFileList] = useState([]);
const [imgUrl, setImgUrl] = useState('');
const [uploading, setUploading] = useState(false) // 文件上传状态
const [progress, setProgress] = useState(0)
const [file, setFile] = useState({})
const [fileList, setFileList] = useState([])
const [imgUrl, setImgUrl] = useState('')
useImperativeHandle(ref, () => {
return {
uploading,
};
});
uploading
}
})
useEffect(() => {
if (galleryInfo && Object.entries(galleryInfo).length > 0) {
const { galleryList } = galleryInfo;
let galleryArr = [];
const { galleryList } = galleryInfo
let galleryArr = []
try {
galleryArr = JSON.parse(decodeURI(galleryList));
galleryArr = JSON.parse(decodeURI(galleryList))
if (galleryArr && !(galleryArr instanceof Array)) {
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }];
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]
}
} catch(err) {
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }];
} catch (err) {
galleryArr = [{ url: '', title: '', desc: '', key: randomOne }]
}
if (galleryArr.length > 0) {
const values = { ['content']: {} };
galleryArr.forEach((item, index) => {
const values = { ['content']: {} }
galleryArr.forEach(item => {
values['content'][item.key] = {
url: item.url,
title: item.title,
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) {
const itemGallery = item[0];
setImgUrl(itemGallery.url);
const itemGallery = item[0]
setImgUrl(itemGallery.url)
}
}
}
......@@ -56,13 +55,12 @@ const GalleryFormItem = forwardRef((props, ref) => {
useEffect(() => {}, [])
const normFile = (e) => {
const normFile = e => {
if (Array.isArray(e)) {
return e;
return e
}
return e?.fileList
}
return e?.fileList;
};
const uploadProps = {
name: 'file',
......@@ -70,107 +68,105 @@ const GalleryFormItem = forwardRef((props, ref) => {
showUploadList: false,
accept: fileAccept.join(','),
beforeUpload: (file, fileList) => {
const fileExt = file.name.substring(file.name.lastIndexOf('.'));
const fileExt = file.name.substring(file.name.lastIndexOf('.'))
if (!fileAccept.includes(fileExt.toLowerCase())) {
message.error('请上传正确格式的图片');
return false;
message.error('请上传正确格式的图片')
return false
}
setFile(file);
setFileList(fileList);
setFile(file)
setFileList(fileList)
},
customRequest: async () => {
setUploading(true);
let data = null;
setUploading(true)
let data = null
if (file.size >= partSize) {
data = await multipartUploader(file, 'gallery', ossClient, (progress, checkpoint) => {
console.log(`上传进度 ${progress}`);
setProgress(parseInt(progress * 100));
});
console.log('multipartUploader --> ', data);
console.log(`上传进度 ${progress}`)
setProgress(parseInt(progress * 100))
})
console.log('multipartUploader --> ', data)
} else {
data = await normalUploader(file, 'gallery', ossClient);
console.log('normalUploader --> ', data);
data = await normalUploader(file, 'gallery', ossClient)
console.log('normalUploader --> ', data)
}
if (data.status === 200 && data.statusCode === 200) {
const { url, name } = data;
const filename = file.name.substring(0, file.name.lastIndexOf('.'));
const { url, name } = data
const filename = file.name.substring(0, file.name.lastIndexOf('.'))
const values = {
['content']: {
[activeKey]: {
url: url,
title: '',
desc: '',
},
},
};
setImgUrl(url);
form.setFieldsValue({ ...values });
const allContent = form.getFieldValue("content");
const newGalleryList = [];
desc: ''
}
}
}
setImgUrl(url)
form.setFieldsValue({ ...values })
const allContent = form.getFieldValue('content')
const newGalleryList = []
// eslint-disable-next-line guard-for-in
for(let key in allContent) {
newGalleryList.push({ ...allContent[key], key: key });
for (let key in allContent) {
newGalleryList.push({ ...allContent[key], key: key })
}
setPicList(newGalleryList)
form.setFieldsValue({ gallery: newGalleryList })
}
setUploading(false)
}
setPicList(newGalleryList);
form.setFieldsValue({ gallery: newGalleryList });
}
setUploading(false);
},
};
const changeTitleValue = (e) => {
const allContent = form.getFieldValue("content");
const newGalleryList = [];
const changeTitleValue = e => {
const allContent = form.getFieldValue('content')
const newGalleryList = []
// eslint-disable-next-line guard-for-in
for(let key in allContent) {
newGalleryList.push({ ...allContent[key], key: key });
for (let key in allContent) {
newGalleryList.push({ ...allContent[key], key: key })
}
setPicList(newGalleryList);
form.setFieldsValue({ gallery: newGalleryList });
setPicList(newGalleryList)
form.setFieldsValue({ gallery: newGalleryList })
}
const changeDescValue = (e) => {
const allContent = form.getFieldValue("content");
const newGalleryList = [];
const changeDescValue = e => {
const allContent = form.getFieldValue('content')
const newGalleryList = []
// eslint-disable-next-line guard-for-in
for(let key in allContent) {
newGalleryList.push({ ...allContent[key], key: key });
for (let key in allContent) {
newGalleryList.push({ ...allContent[key], key: key })
}
setPicList(newGalleryList);
form.setFieldsValue({ gallery: newGalleryList });
setPicList(newGalleryList)
form.setFieldsValue({ gallery: newGalleryList })
}
return (
<>
<Form.Item
label='上传图片'
valuePropName='fileList'
label="上传图片"
valuePropName="fileList"
getValueFromEvent={normFile}
extra='最多可上传10张'
extra="最多可上传10张"
name={['content', activeKey, 'url']}
rules={[{ required: true, message: '请上传画廊图片' }]}
>
<Spin spinning={uploading} tip='Loading'>
<div className='editor-dragger'>
rules={[{ required: true, message: '请上传画廊图片' }]}>
<Spin spinning={uploading} tip="Loading">
<div className="editor-dragger">
<Upload.Dragger {...uploadProps} showUploadList={false}>
{!imgUrl ? (
<>
<div className='editor-uploader-process'>
<p className='ant-upload-drag-icon'>
<div className="editor-uploader-process">
<p className="ant-upload-drag-icon">
<CloudUploadOutlined style={{ fontSize: 40 }} />
</p>
<p className='ant-upload-text'>点击上传或拖拽到此处上传</p>
<p className='ant-upload-hint'>支持上传 .png、.jpg、.jpeg、.svg格式的图片</p>
<p className="ant-upload-text">点击上传或拖拽到此处上传</p>
<p className="ant-upload-hint">支持上传 .png、.jpg、.jpeg、.svg格式的图片</p>
</div>
</>
) : (
<div className='editor-uploader-result'>
<div className='editor-uploader-result-img'>
<img src={imgUrl} alt='' />
<div className="editor-uploader-result">
<div className="editor-uploader-result-img">
<img src={imgUrl} alt="" />
</div>
<div className='editor-uploader-result-tips'>
<Button size='small' type='primary' ghost onClick={() => setImgUrl(null)}>
<div className="editor-uploader-result-tips">
<Button size="small" type="primary" ghost onClick={() => setImgUrl(null)}>
替换
</Button>
</div>
......@@ -180,29 +176,14 @@ const GalleryFormItem = forwardRef((props, ref) => {
</div>
</Spin>
</Form.Item>
<Form.Item
label='标题'
rules={[{ required: false, message: '请输入图片标题' }]}
name={['content', activeKey, 'title']}
extra='最多输入100字'
>
<Input maxLength={100} placeholder='' allowClear onChange={changeTitleValue} />
<Form.Item label="标题" rules={[{ required: false, message: '请输入图片标题' }]} name={['content', activeKey, 'title']} extra="最多输入100字">
<Input maxLength={100} placeholder="" allowClear onChange={changeTitleValue} />
</Form.Item>
<Form.Item
label='描述'
rules={[{ required: false, message: '请输入图片描述' }]}
name={['content', activeKey, 'desc']}
extra='最多输入500字'
>
<Input.TextArea
maxLength={500}
autoSize={{ minRows: 4, maxRows: 6 }}
placeholder='请输入描述'
onChange={changeDescValue}
/>
<Form.Item label="描述" rules={[{ required: false, message: '请输入图片描述' }]} name={['content', activeKey, 'desc']} extra="最多输入500字">
<Input.TextArea maxLength={500} autoSize={{ minRows: 4, maxRows: 6 }} placeholder="请输入描述" onChange={changeDescValue} />
</Form.Item>
</>
);
});
)
}
export default GalleryFormItem;
export default forwardRef(GalleryFormItem)
import React, { useState, useEffect, forwardRef, useImperativeHandle } from 'react';
import { Modal, Divider, Upload, Input, Space, Button, Form, Spin, message } from 'antd';
import { CloudUploadOutlined } from '@ant-design/icons';
import { SlateTransforms, SlateEditor, SlateElement } from '@wangeditor/editor';
import './index.less';
import { useState, useEffect, forwardRef } from 'react'
import { Divider, Upload, Input, Space, Button, Form, Spin, message } from 'antd'
import { CloudUploadOutlined } from '@ant-design/icons'
import { SlateTransforms, SlateEditor, SlateElement } from '@wangeditor/editor'
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 = forwardRef((props, ref) => {
const { editor, ossClient, setImageVisible, imageInfo, setImageInfo } = props;
const ImageModal = (props, ref) => {
const { editor, ossClient, setImageVisible, imageInfo, setImageInfo } = props
const [imgUrl, setImgUrl] = useState('');
const fileAccept = ['.png', '.jpg', '.jpeg', '.svg'];
const [form] = Form.useForm();
const [uploading, setUploading] = useState(false); // 文件上传状态
const [progress, setProgress] = useState(0);
const [file, setFile] = useState({});
const [fileList, setFileList] = useState([]);
const [initValues, setInitValues] = useState({ imgUrl: '', imgTitle: '', imgDescript: '' });
const [tempNodeInfo, setTempNodeInfo] = useState(null);
const [imgUrl, setImgUrl] = useState('')
const fileAccept = ['.png', '.jpg', '.jpeg', '.svg']
const [form] = Form.useForm()
const [uploading, setUploading] = useState(false) // 文件上传状态
const [progress, setProgress] = useState(0)
const [file, setFile] = useState({})
const [fileList, setFileList] = useState([])
const [initValues, setInitValues] = useState({ imgUrl: '', imgTitle: '', imgDescript: '' })
const [tempNodeInfo, setTempNodeInfo] = useState(null)
useEffect(() => {
if (imageInfo && Object.entries(imageInfo).length > 0) {
const { image, node } = imageInfo;
setImgUrl(image.src);
setInitValues({ imgUrl: image.src, imgTitle: image.alt, imgDescript: image.href });
form.setFieldsValue({ imgUrl: image.src, imgTitle: image.alt, imgDescript: image.href });
setTempNodeInfo(imageInfo);
setFile({});
setFileList([]);
setImageInfo({});
const { image, node } = imageInfo
setImgUrl(image.src)
setInitValues({ imgUrl: image.src, imgTitle: image.alt, imgDescript: image.href })
form.setFieldsValue({ imgUrl: image.src, imgTitle: image.alt, imgDescript: image.href })
setTempNodeInfo(imageInfo)
setFile({})
setFileList([])
setImageInfo({})
}
}, [imageInfo]);
}, [imageInfo])
const normFile = (e) => {
const normFile = e => {
if (Array.isArray(e)) {
return e;
return e
}
return e?.fileList
}
return e?.fileList;
};
const uploadProps = {
name: 'file',
maxCount: 1,
showUploadList: false,
accept: fileAccept.join(','),
beforeUpload: (file, fileList) => {
const fileExt = file.name.substring(file.name.lastIndexOf('.'));
const fileExt = file.name.substring(file.name.lastIndexOf('.'))
if (!fileAccept.includes(fileExt.toLowerCase())) {
message.error('请上传正确格式的图片');
return false;
message.error('请上传正确格式的图片')
return false
}
setFile(file);
setFileList(fileList);
setFile(file)
setFileList(fileList)
},
customRequest: async () => {
setUploading(true);
let data = null;
setUploading(true)
let data = null
if (file.size >= partSize) {
data = await multipartUploader(file, 'image', ossClient, (progress, checkpoint) => {
console.log(`上传进度 ${progress}`);
setProgress(parseInt(progress * 100));
});
console.log('multipartUploader --> ', data);
console.log(`上传进度 ${progress}`)
setProgress(parseInt(progress * 100))
})
console.log('multipartUploader --> ', data)
} else {
data = await normalUploader(file, 'image', ossClient);
console.log('normalUploader --> ', data);
data = await normalUploader(file, 'image', ossClient)
console.log('normalUploader --> ', data)
}
if (data.status === 200 && data.statusCode === 200) {
const { url, name } = data;
setImgUrl(url);
form.setFieldsValue({ imgUrl: url });
const { url, name } = data
setImgUrl(url)
form.setFieldsValue({ imgUrl: url })
}
setUploading(false)
}
}
setUploading(false);
},
};
const clear = () => {
setImgUrl('');
setProgress(0);
setUploading(false);
setTempNodeInfo(null);
setInitValues({ imgUrl: imgUrl, imgTitle: '', imgDescript: '' });
form.resetFields();
setImageVisible(false);
};
setImgUrl('')
setProgress(0)
setUploading(false)
setTempNodeInfo(null)
setInitValues({ imgUrl: imgUrl, imgTitle: '', imgDescript: '' })
form.resetFields()
setImageVisible(false)
}
const onFinish = (values) => {
editor.restoreSelection();
const onFinish = values => {
editor.restoreSelection()
// editor.insertNode({
// type: 'chapterImage',
// title: values.imgTitle,
......@@ -99,21 +98,21 @@ const ImageModal = forwardRef((props, ref) => {
// });
const nodeEntries = SlateEditor.nodes(editor, {
match: (node) => {
match: node => {
// JS syntax
if (SlateElement.isElement(node)) {
if (node.type === 'paragraph') {
return true; // 匹配 paragraph
return true // 匹配 paragraph
}
}
return false;
return false
},
universal: true,
});
universal: true
})
for (let nodeEntry of nodeEntries) {
const [node, path] = nodeEntry;
const [node, path] = nodeEntry
if (node.children[0].text === '') {
SlateTransforms.removeNodes(editor);
SlateTransforms.removeNodes(editor)
}
}
......@@ -128,96 +127,84 @@ const ImageModal = forwardRef((props, ref) => {
children: [
{
// 该字段必须要
text: '',
},
],
},
],
};
text: ''
}
]
}
]
}
const oP = {
type: 'paragraph',
children: [{ text: values.imgTitle }],
};
children: [{ text: values.imgTitle }]
}
if (tempNodeInfo && Object.entries(tempNodeInfo).length > 0) {
const elem = editor.toDOMNode(tempNodeInfo.node); // 返回 HTMLElement
let nodeProps = JSON.parse(JSON.stringify(tempNodeInfo.node));
let obj = {};
let cIndex = -1;
const elem = editor.toDOMNode(tempNodeInfo.node) // 返回 HTMLElement
let nodeProps = JSON.parse(JSON.stringify(tempNodeInfo.node))
let obj = {}
let cIndex = -1
nodeProps.children.forEach((element, index) => {
if (element.type === 'image') {
obj = {
...element,
alt: values.imgTitle,
src: values.imgUrl,
href: values.imgDescript,
};
cIndex = index;
href: values.imgDescript
}
cIndex = index
}
});
})
SlateTransforms.removeNodes(editor);
const elem2 = elem.nextSibling;
SlateTransforms.removeNodes(editor)
const elem2 = elem.nextSibling
if (elem2 && elem2.textContent === tempNodeInfo.image.alt) {
elem2.parentNode.removeChild(elem2);
elem2.parentNode.removeChild(elem2)
}
let nodes = [];
let nodes = []
if (values.imgTitle) {
nodes.push(oP);
nodes.push(oP)
}
nodes.push(oImg);
SlateTransforms.insertNodes(editor, nodes);
clear();
return;
nodes.push(oImg)
SlateTransforms.insertNodes(editor, nodes)
clear()
return
}
let nodes = [];
let nodes = []
if (values.imgTitle) {
nodes.push(oP);
nodes.push(oP)
}
nodes.push(oImg);
nodes.push(oImg)
SlateTransforms.insertNodes(editor, nodes);
clear();
};
SlateTransforms.insertNodes(editor, nodes)
clear()
}
return (
<div>
<Divider />
<div className='editor-content-form'>
<Form
layout='vertical'
name='validate_other'
form={form}
onFinish={onFinish}
initialValues={initValues}
>
<Form.Item
label='上传图片'
valuePropName='fileList'
name='imgUrl'
getValueFromEvent={normFile}
rules={[{ required: true, message: '请上传图片' }]}
>
<div className="editor-content-form">
<Form layout="vertical" 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}%`}>
<div className='editor-dragger'>
<div className="editor-dragger">
<Dragger {...uploadProps} showUploadList={false}>
{!imgUrl && (
<div className='editor-uploader-process'>
<p className='ant-upload-drag-icon'>
<div className="editor-uploader-process">
<p className="ant-upload-drag-icon">
<CloudUploadOutlined style={{ fontSize: 40 }} />
</p>
<p className='ant-upload-text'>点击上传或拖拽到此处上传</p>
<p className='ant-upload-hint'>支持上传 .png、.jpg、.jpeg、.svg格式的图片</p>
<p className="ant-upload-text">点击上传或拖拽到此处上传</p>
<p className="ant-upload-hint">支持上传 .png、.jpg、.jpeg、.svg格式的图片</p>
</div>
)}
{imgUrl && (
<>
<div className='editor-uploader-result'>
<div className='editor-uploader-result-img'>
<img src={imgUrl} alt='' />
<div className="editor-uploader-result">
<div className="editor-uploader-result-img">
<img src={imgUrl} alt="" />
</div>
<div className='editor-uploader-result-tips'>
<Button size='small' type='primary' ghost onClick={() => setImgUrl(null)}>
<div className="editor-uploader-result-tips">
<Button size="small" type="primary" ghost onClick={() => setImgUrl(null)}>
替换
</Button>
</div>
......@@ -228,23 +215,18 @@ const ImageModal = forwardRef((props, ref) => {
</div>
</Spin>
</Form.Item>
<Form.Item label='图片标题' name='imgTitle' extra='最多输入100字'>
<Input maxLength={100} placeholder='' allowClear />
<Form.Item label="图片标题" name="imgTitle" extra="最多输入100字">
<Input maxLength={100} placeholder="" allowClear />
</Form.Item>
<Form.Item label='图片描述' name='imgDescript' extra='最多输入200字'>
<Input.TextArea
maxLength={200}
autosize={{ minRows: 4, maxRows: 6 }}
placeholder=''
allowClear
/>
<Form.Item label="图片描述" name="imgDescript" extra="最多输入200字">
<Input.TextArea maxLength={200} autosize={{ minRows: 4, maxRows: 6 }} placeholder="" allowClear />
</Form.Item>
<Form.Item className='editor-form-buttons'>
<Form.Item className="editor-form-buttons">
<Space>
<Button type='default' disabled={uploading} onClick={() => setImageVisible(false)}>
<Button type="default" disabled={uploading} onClick={() => setImageVisible(false)}>
取消
</Button>
<Button type='primary' disabled={uploading} htmlType='submit'>
<Button type="primary" disabled={uploading} htmlType="submit">
插入
</Button>
</Space>
......@@ -252,7 +234,7 @@ const ImageModal = forwardRef((props, ref) => {
</Form>
</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'
// Extend menu
class ImageAuto {
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">
<title>编辑器图片样式</title>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
......@@ -15,14 +13,14 @@ class ImageAuto {
</g>
</g>
</g>
</svg>`;
this.tag = 'button';
</svg>`
this.tag = 'button'
}
getValue(editor) {
return 'hello, 图片, , , 图片';
return 'hello, 图片, , , 图片'
}
isActive(editor) {
return false; // or true
return false // or true
}
isDisabled(editor) {
const { selection } = editor
......@@ -36,7 +34,7 @@ class ImageAuto {
// eslint-disable-next-line array-callback-return
const hasPreElem = selectedElems.some(elem => {
const type = DomEditor.getNodeType(elem);
const type = DomEditor.getNodeType(elem)
// 代码块 引用 表格 禁用
if (type === 'pre' || type === 'blockquote') return true
})
......@@ -50,10 +48,10 @@ class ImageAuto {
exec(editor, value) {
// editor.insertText(value) // value 即 this.getValue(editor) 的返回值
editor.emit('ImageMenuClick');
editor.emit('ImageMenuClick')
if (this.isDisabled(editor)) {
return;
return
}
const imageNode = this.getSelectedNode(editor)
......@@ -63,19 +61,18 @@ class ImageAuto {
const hoverbar = DomEditor.getHoverbar(editor)
if (hoverbar) hoverbar.hideAndClean()
const { style = {} } = imageNode;
const { style = {} } = imageNode
const props = {
style: {
...style,
width: this.value, // 修改 width
height: '', // 清空 height
},
height: '' // 清空 height
}
}
Transforms.setNodes(editor, props, {
match: n => DomEditor.checkNodeType(n, 'chapterImage'),
match: n => DomEditor.checkNodeType(n, 'chapterImage')
})
}
}
......@@ -97,29 +94,29 @@ class ImageWidthCustomer30 extends ImageAuto {
export default {
key: 'ImageAuto', // 定义 menu key :要保证唯一、不重复(重要)
factory() {
return new ImageAuto(); // 把 `YourMenuClass` 替换为你菜单的 class
},
};
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 };
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 [
name: 'books',
key: '/books',
title: '书籍管理',
component: 'books/index',
component: 'books/index'
},
{
name: 'books-classify',
key: '/books/classify',
title: '书籍分类',
component: 'books/classify/index',
component: 'books/classify/index'
},
{
name: 'books-audit',
key: '/books/audit',
title: '书籍审核',
component: 'books/audit/index',
isChild: true,
isChild: true
},
{
name: 'books-label',
key: '/books/label',
title: '书籍标签',
component: 'books/label/index',
component: 'books/label/index'
},
{
name: 'books-management',
key: '/books/management',
title: '写书管理',
component: 'books/management/index',
isChild: true,
isChild: true
},
{
name: 'books-sale',
key: '/books/sale',
title: '在售书籍',
component: 'books/sale/index',
isChild: true,
isChild: true
},
{
name: 'books-question-bank',
key: '/books/question-bank',
title: '题库管理',
component: 'books/question-bank/index',
component: 'books/question-bank/index'
},
{
name: 'books-discussion',
key: '/books/discussion',
title: '讨论互动',
component: 'books/discussion/index',
component: 'books/discussion/index'
},
{
name: 'order-management',
key: '/books/order-management',
title: '订单管理',
component: 'books/order-management/index',
isChild: true,
isChild: true
},
{
name: 'books-design',
key: '/books/design',
title: '在线设计',
component: 'books/design/index'
},
// 用户管理
{
name: 'member',
key: '/member',
title: '用户管理',
component: 'member/index',
component: 'member/index'
},
{
name: 'memberlist',
key: '/member/list',
title: '用户管理',
component: 'member/list/index',
isChild: true,
isChild: true
},
{
name: 'userlevel',
key: '/member/userlevel',
title: '用户等级',
component: 'member/userlevel/index',
component: 'member/userlevel/index'
},
// 广告管理
{
name: 'advertisement',
key: '/advertisement',
title: '广告管理',
component: 'advertisement/index',
component: 'advertisement/index'
},
{
name: 'advert',
key: '/advertisement/advert',
title: '广告管理',
component: 'advertisement/advert/index',
component: 'advertisement/advert/index'
},
{
name: 'adsense',
key: '/advertisement/adsense',
title: '广告位管理',
component: 'advertisement/adsense/index',
component: 'advertisement/adsense/index'
},
// 系统设置
{
name: 'setting',
key: '/setting',
title: '系统设置',
component: 'setting/index',
component: 'setting/index'
},
{
name: 'settingHelp',
key: '/setting/help',
title: '帮助中心',
component: 'setting/help/index',
isChild: true,
isChild: true
},
{
name: 'applied',
key: '/setting/applied',
title: '应用管理',
component: 'setting/applied/index',
component: 'setting/applied/index'
},
{
name: 'personalized',
key: '/setting/personalized-setting',
title: '个性化设置',
component: 'setting/personalized-setting/index',
component: 'setting/personalized-setting/index'
},
{
name: 'point',
key: '/setting/point-management',
title: '积分管理',
component: 'setting/point-management/index',
component: 'setting/point-management/index'
},
{
name: 'appversion',
key: '/setting/app-version',
title: 'APP版本管理',
component: 'setting/app-version/index',
component: 'setting/app-version/index'
},
{
name: 'coupon',
key: '/setting/coupon',
title: '优惠卷管理',
component: 'setting/coupon/index',
component: 'setting/coupon/index'
},
{
name: 'sensitive',
key: '/setting/sensitive',
title: '敏感词搜索',
component: 'setting/sensitive/index',
component: 'setting/sensitive/index'
},
{
name: 'feedback',
key: '/setting/feedback',
title: '意见反馈',
component: 'setting/feedback/index',
component: 'setting/feedback/index'
},
// 权限管理
{
name: 'jurisdiction',
key: '/jurisdiction',
title: '权限管理',
component: 'jurisdiction/index',
component: 'jurisdiction/index'
},
{
name: 'jurisdictionadmin',
key: '/jurisdiction/admin',
title: '管理员管理',
component: 'jurisdiction/admin/index',
component: 'jurisdiction/admin/index'
},
{
name: 'jurisdictionrole',
key: '/jurisdiction/role',
title: '角色管理',
component: 'jurisdiction/role/index',
component: 'jurisdiction/role/index'
},
// 老师管理
{
name: 'teacher',
key: '/teacher',
title: '老师管理',
component: 'teacher/index',
component: 'teacher/index'
},
{
name: 'teacherlist',
key: '/teacher/list',
title: '老师管理',
component: 'teacher/query/index',
},
];
component: 'teacher/query/index'
}
]
const childThirdRoutes = {
// 写书管理
......@@ -196,7 +202,7 @@ const childThirdRoutes = {
name: 'managementlist',
meta: { title: '' },
hidden: true,
component: 'books/management/list/index',
component: 'books/management/list/index'
},
{
path: '/books/management/add-edit',
......@@ -205,7 +211,7 @@ const childThirdRoutes = {
meta: { title: '' },
hidden: true,
back: true,
component: 'books/management/addedit/index',
component: 'books/management/addedit/index'
},
{
path: '/books/management/chapter',
......@@ -214,8 +220,8 @@ const childThirdRoutes = {
meta: { title: '' },
hidden: true,
back: true,
component: 'books/section/index',
},
component: 'books/section/index'
}
],
// 书籍基本信息
'/books/audit': [
......@@ -224,22 +230,22 @@ const childThirdRoutes = {
key: '/books/audit/dataset',
name: 'dataset',
meta: {
title: '',
title: ''
},
hidden: true,
component: 'books/audit/table',
component: 'books/audit/table'
},
{
path: '/books/audit/detail',
path: '/books/audit/detail',
key: 'dataset',
meta: {
title: '',
title: ''
},
hidden: true,
back: true,
component: 'books/audit/detail',
},
component: 'books/audit/detail'
}
],
// 书籍审核
'/books/sale': [
......@@ -248,44 +254,44 @@ const childThirdRoutes = {
key: '/books/sale/dataset',
name: 'dataset',
meta: {
title: '',
title: ''
},
hidden: true,
component: 'books/sale/table',
component: 'books/sale/table'
},
{
path: '/books/sale/detail',
key: '/books/sale/detail',
name: 'detail',
meta: {
title: '',
title: ''
},
hidden: true,
back: true,
component: 'books/sale/edit',
component: 'books/sale/edit'
},
{
path: '/books/sale/discussP',
key: '/books/sale/discussP',
name: 'discussP',
meta: {
title: '',
title: ''
},
hidden: true,
back: true,
component: 'books/sale/discussList/index',
component: 'books/sale/discussList/index'
},
{
path: '/books/sale/discuss-detail',
key: '/books/sale/discuss-detail',
key: 'discuss-detail',
meta: {
title: '',
title: ''
},
hidden: true,
back: true,
component: 'books/sale/discussDetail/index',
},
component: 'books/sale/discussDetail/index'
}
],
// 订单管理
'/books/order-management': [
......@@ -294,21 +300,21 @@ const childThirdRoutes = {
key: '/books/order-management/dataset',
name: 'dataset',
meta: {
title: '',
title: ''
},
hidden: true,
component: 'books/order-management/tab/table',
component: 'books/order-management/tab/table'
},
{
path: '/books/order-management/sale-statistics',
key: '/books/order-management/sale-statistics',
name: 'sale-statistics',
meta: {
title: '',
title: ''
},
hidden: true,
component: 'books/order-management/tab/salesStatistics',
},
component: 'books/order-management/tab/salesStatistics'
}
],
// 用户管理
'/member/list': [
......@@ -318,7 +324,7 @@ const childThirdRoutes = {
name: 'member-query',
hidden: true,
meta: {},
component: 'member/list/list',
component: 'member/list/list'
},
{
path: '/member/list/detail',
......@@ -326,8 +332,8 @@ const childThirdRoutes = {
name: 'member-detail',
hidden: true,
meta: {},
component: 'member/detail/index',
},
component: 'member/detail/index'
}
],
// 帮助中心
'/setting/help': [
......@@ -337,7 +343,7 @@ const childThirdRoutes = {
anme: 'help-list',
meta: {},
hidden: true,
component: 'setting/help/table',
component: 'setting/help/table'
},
{
path: '/setting/help/addedit',
......@@ -346,9 +352,9 @@ const childThirdRoutes = {
meta: {},
hidden: 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 { useSelector } from 'react-redux'
......
......@@ -13,10 +13,6 @@ const baseRouter = [
{
path: '/userinfo',
Component: lazy(() => import('@/pages/user-module/userInfo'))
},
{
path: '/books/design',
Component: lazy(() => import('@/pages/books/design/index'))
}
]
},
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论