邻里互助

This commit is contained in:
Leo_Ding 2025-07-07 16:26:31 +08:00
parent ae7e6f07e3
commit 69a80a2e2f
54 changed files with 3571 additions and 743 deletions

View File

@ -2,7 +2,7 @@
NODE_ENV=development NODE_ENV=development
# app # app
VITE_TITLE=GuXuan-Admin VITE_TITLE=JinShan-Admin
VITE_PUBLIC_PATH=/ VITE_PUBLIC_PATH=/
VITE_OUT_DIR=dist VITE_OUT_DIR=dist
VITE_PERMISSION=false VITE_PERMISSION=false
@ -12,7 +12,7 @@ VITE_ROUTER_BASE=/
VITE_ROUTER_HISTORY=hash VITE_ROUTER_HISTORY=hash
# api # api
VITE_API_BASIC=/ VITE_API_BASIC=http://10.10.1.6:8071
VITE_API_HTTP=/api/v1/ VITE_API_HTTP=/api/v1/
# storage # storage
VITE_STORAGE_NAMESPACE = gin-admin_local_ VITE_STORAGE_NAMESPACE = gin-admin_local_

View File

@ -2,7 +2,7 @@
NODE_ENV=production NODE_ENV=production
# app # app
VITE_TITLE=GuXuan-Admin VITE_TITLE=JinShan-Admin
VITE_PUBLIC_PATH=/ VITE_PUBLIC_PATH=/
VITE_OUT_DIR=dist VITE_OUT_DIR=dist
VITE_PERMISSION=true VITE_PERMISSION=true

View File

@ -1,8 +1,8 @@
# GuXuan-Admin-Template # JinShan-Admin-Template
> GIN-Admin-vue is a frontend project for [gin-admin](https://github.com/LyricTian/gin-admin) base on Ant Design React. > GIN-Admin-vue is a frontend project for [gin-admin](https://github.com/LyricTian/gin-admin) base on Ant Design React.
![guxuan-admin-template](./demo.png) ![JinShan-Admin-template](./demo.png)
- [Preview](http://101.42.232.163:8040) - [Preview](http://101.42.232.163:8040)
- Username: admin - Username: admin

View File

@ -1,9 +1,10 @@
export default () => ({ export default () => ({
host: true, host: true,
port: 8080, port: 8080,
open:true,
proxy: { proxy: {
'/api': { '/api': {
target: 'http://101.42.232.163:8080/api', target: 'http://10.10.1.6:8071',
// target: 'http://127.0.0.1:8045/api', // target: 'http://127.0.0.1:8045/api',
changeOrigin: true, changeOrigin: true,
rewrite: (path) => path.replace('/api', ''), rewrite: (path) => path.replace('/api', ''),

581
package-lock.json generated
View File

@ -1,11 +1,11 @@
{ {
"name": "gin-admin", "name": "JinShan-Admin",
"version": "1.0.0", "version": "1.0.0",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "gin-admin", "name": "JinShan-Admin",
"version": "1.0.0", "version": "1.0.0",
"dependencies": { "dependencies": {
"@ant-design/colors": "^7.0.0", "@ant-design/colors": "^7.0.0",
@ -49,10 +49,12 @@
"husky": "^8.0.3", "husky": "^8.0.3",
"less": "^4.2.0", "less": "^4.2.0",
"lint-staged": "^14.0.0", "lint-staged": "^14.0.0",
"mockjs": "^1.1.0",
"rollup-plugin-visualizer": "^5.9.2", "rollup-plugin-visualizer": "^5.9.2",
"vite": "^4.4.9", "vite": "^4.4.9",
"vite-plugin-compression": "^0.5.1", "vite-plugin-compression": "^0.5.1",
"vite-plugin-eslint": "^1.8.1", "vite-plugin-eslint": "^1.8.1",
"vite-plugin-mock": "^3.0.2",
"vite-plugin-progress": "^0.0.7", "vite-plugin-progress": "^0.0.7",
"vitepress": "^1.0.0-beta.7" "vitepress": "^1.0.0-beta.7"
} }
@ -1479,6 +1481,20 @@
"@ctrl/tinycolor": "^3.4.0" "@ctrl/tinycolor": "^3.4.0"
} }
}, },
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
},
"engines": {
"node": ">= 8"
}
},
"node_modules/argparse": { "node_modules/argparse": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
@ -1533,6 +1549,19 @@
"node": "*" "node": "*"
} }
}, },
"node_modules/binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/body-scroll-lock": { "node_modules/body-scroll-lock": {
"version": "4.0.0-beta.0", "version": "4.0.0-beta.0",
"resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz", "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz",
@ -1591,6 +1620,22 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/bundle-require": {
"version": "4.2.1",
"resolved": "https://registry.npmmirror.com/bundle-require/-/bundle-require-4.2.1.tgz",
"integrity": "sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==",
"dev": true,
"license": "MIT",
"dependencies": {
"load-tsconfig": "^0.2.3"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"peerDependencies": {
"esbuild": ">=0.17"
}
},
"node_modules/callsites": { "node_modules/callsites": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
@ -1624,6 +1669,44 @@
"url": "https://github.com/chalk/chalk?sponsor=1" "url": "https://github.com/chalk/chalk?sponsor=1"
} }
}, },
"node_modules/chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"engines": {
"node": ">= 8.10.0"
},
"funding": {
"url": "https://paulmillr.com/funding/"
},
"optionalDependencies": {
"fsevents": "~2.3.2"
}
},
"node_modules/chokidar/node_modules/glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/cli-cursor": { "node_modules/cli-cursor": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-4.0.0.tgz", "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-4.0.0.tgz",
@ -1764,6 +1847,39 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true "dev": true
}, },
"node_modules/connect": {
"version": "3.7.0",
"resolved": "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz",
"integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"finalhandler": "1.1.2",
"parseurl": "~1.3.3",
"utils-merge": "1.0.1"
},
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/connect/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/connect/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true,
"license": "MIT"
},
"node_modules/copy-anything": { "node_modules/copy-anything": {
"version": "2.0.6", "version": "2.0.6",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
@ -1949,6 +2065,13 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
}, },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"dev": true,
"license": "MIT"
},
"node_modules/emoji-regex": { "node_modules/emoji-regex": {
"version": "8.0.0", "version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@ -1959,6 +2082,16 @@
"resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
"integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
}, },
"node_modules/encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/errno": { "node_modules/errno": {
"version": "0.1.8", "version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
@ -2018,6 +2151,13 @@
"node": ">=6" "node": ">=6"
} }
}, },
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"dev": true,
"license": "MIT"
},
"node_modules/escape-string-regexp": { "node_modules/escape-string-regexp": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@ -2446,6 +2586,42 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/finalhandler/node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
},
"node_modules/finalhandler/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true,
"license": "MIT"
},
"node_modules/find-up": { "node_modules/find-up": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@ -2737,6 +2913,19 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true "dev": true
}, },
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/is-docker": { "node_modules/is-docker": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
@ -3137,6 +3326,16 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/load-tsconfig": {
"version": "0.2.5",
"resolved": "https://registry.npmmirror.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
"integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
"dev": true,
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
},
"node_modules/locate-path": { "node_modules/locate-path": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@ -3385,12 +3584,23 @@
"integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==", "integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==",
"dev": true "dev": true
}, },
"node_modules/mockjs": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz",
"integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
"dev": true,
"dependencies": {
"commander": "*"
},
"bin": {
"random": "bin/random"
}
},
"node_modules/ms": { "node_modules/ms": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true, "dev": true
"optional": true
}, },
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "4.0.2", "version": "4.0.2",
@ -3438,6 +3648,16 @@
"node": ">= 4.4.x" "node": ">= 4.4.x"
} }
}, },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/npm-run-path": { "node_modules/npm-run-path": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz", "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz",
@ -3476,6 +3696,19 @@
"url": "https://github.com/fb55/nth-check?sponsor=1" "url": "https://github.com/fb55/nth-check?sponsor=1"
} }
}, },
"node_modules/on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
"dev": true,
"license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/once": { "node_modules/once": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@ -3599,6 +3832,16 @@
"node": ">= 0.10" "node": ">= 0.10"
} }
}, },
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/path-exists": { "node_modules/path-exists": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@ -3625,6 +3868,13 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/path-to-regexp": {
"version": "6.3.0",
"resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
"integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
"dev": true,
"license": "MIT"
},
"node_modules/picocolors": { "node_modules/picocolors": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@ -3886,6 +4136,19 @@
"integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==",
"dev": true "dev": true
}, },
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
"engines": {
"node": ">=8.10.0"
}
},
"node_modules/regenerator-runtime": { "node_modules/regenerator-runtime": {
"version": "0.13.9", "version": "0.13.9",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
@ -4363,6 +4626,16 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/string-argv": { "node_modules/string-argv": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz",
@ -4538,6 +4811,16 @@
"node": ">= 10.0.0" "node": ">= 10.0.0"
} }
}, },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
"node_modules/untildify": { "node_modules/untildify": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz", "resolved": "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz",
@ -4562,6 +4845,16 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true "dev": true
}, },
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/vite": { "node_modules/vite": {
"version": "4.4.9", "version": "4.4.9",
"resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz", "resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz",
@ -4666,6 +4959,48 @@
"vite": ">=2" "vite": ">=2"
} }
}, },
"node_modules/vite-plugin-mock": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/vite-plugin-mock/-/vite-plugin-mock-3.0.2.tgz",
"integrity": "sha512-bD//HvkTygGmk+LsIAdf0jGNlCv4iWv0kZlH9UEgWT6QYoUwfjQAE4SKxHRw2tfLgVhbPQVv/+X3YlNWvueGUA==",
"dev": true,
"license": "MIT",
"dependencies": {
"bundle-require": "^4.0.1",
"chokidar": "^3.5.3",
"connect": "^3.7.0",
"debug": "^4.3.4",
"fast-glob": "^3.2.12",
"path-to-regexp": "^6.2.1",
"picocolors": "^1.0.0"
},
"engines": {
"node": ">=16.0.0"
},
"peerDependencies": {
"esbuild": ">=0.17",
"mockjs": ">=1.1.0",
"vite": ">=4.0.0"
}
},
"node_modules/vite-plugin-mock/node_modules/debug": {
"version": "4.4.1",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz",
"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/vite-plugin-progress": { "node_modules/vite-plugin-progress": {
"version": "0.0.7", "version": "0.0.7",
"resolved": "https://registry.npmjs.org/vite-plugin-progress/-/vite-plugin-progress-0.0.7.tgz", "resolved": "https://registry.npmjs.org/vite-plugin-progress/-/vite-plugin-progress-0.0.7.tgz",
@ -5977,6 +6312,16 @@
} }
} }
}, },
"anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
"requires": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
}
},
"argparse": { "argparse": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
@ -6025,6 +6370,12 @@
"resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz",
"integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==" "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw=="
}, },
"binary-extensions": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz",
"integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true
},
"body-scroll-lock": { "body-scroll-lock": {
"version": "4.0.0-beta.0", "version": "4.0.0-beta.0",
"resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz", "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz",
@ -6074,6 +6425,15 @@
"run-applescript": "^5.0.0" "run-applescript": "^5.0.0"
} }
}, },
"bundle-require": {
"version": "4.2.1",
"resolved": "https://registry.npmmirror.com/bundle-require/-/bundle-require-4.2.1.tgz",
"integrity": "sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==",
"dev": true,
"requires": {
"load-tsconfig": "^0.2.3"
}
},
"callsites": { "callsites": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
@ -6095,6 +6455,33 @@
"supports-color": "^7.1.0" "supports-color": "^7.1.0"
} }
}, },
"chokidar": {
"version": "3.6.0",
"resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
"requires": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
"fsevents": "~2.3.2",
"glob-parent": "~5.1.2",
"is-binary-path": "~2.1.0",
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.6.0"
},
"dependencies": {
"glob-parent": {
"version": "5.1.2",
"resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
"requires": {
"is-glob": "^4.0.1"
}
}
}
},
"cli-cursor": { "cli-cursor": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-4.0.0.tgz", "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-4.0.0.tgz",
@ -6212,6 +6599,35 @@
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
"dev": true "dev": true
}, },
"connect": {
"version": "3.7.0",
"resolved": "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz",
"integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
"dev": true,
"requires": {
"debug": "2.6.9",
"finalhandler": "1.1.2",
"parseurl": "~1.3.3",
"utils-merge": "1.0.1"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
}
}
},
"copy-anything": { "copy-anything": {
"version": "2.0.6", "version": "2.0.6",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz", "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
@ -6363,6 +6779,12 @@
} }
} }
}, },
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
"dev": true
},
"emoji-regex": { "emoji-regex": {
"version": "8.0.0", "version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@ -6373,6 +6795,12 @@
"resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz", "resolved": "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz",
"integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==" "integrity": "sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw=="
}, },
"encodeurl": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
"dev": true
},
"errno": { "errno": {
"version": "0.1.8", "version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
@ -6419,6 +6847,12 @@
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true "dev": true
}, },
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"dev": true
},
"escape-string-regexp": { "escape-string-regexp": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@ -6737,6 +7171,38 @@
"to-regex-range": "^5.0.1" "to-regex-range": "^5.0.1"
} }
}, },
"finalhandler": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz",
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
"dev": true,
"requires": {
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "~2.3.0",
"parseurl": "~1.3.3",
"statuses": "~1.5.0",
"unpipe": "~1.0.0"
},
"dependencies": {
"debug": {
"version": "2.6.9",
"resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
}
}
},
"find-up": { "find-up": {
"version": "4.1.0", "version": "4.1.0",
"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@ -6946,6 +7412,15 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true "dev": true
}, },
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
"requires": {
"binary-extensions": "^2.0.0"
}
},
"is-docker": { "is-docker": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
@ -7238,6 +7713,12 @@
} }
} }
}, },
"load-tsconfig": {
"version": "0.2.5",
"resolved": "https://registry.npmmirror.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz",
"integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==",
"dev": true
},
"locate-path": { "locate-path": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@ -7431,12 +7912,20 @@
"integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==", "integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==",
"dev": true "dev": true
}, },
"mockjs": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz",
"integrity": "sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==",
"dev": true,
"requires": {
"commander": "*"
}
},
"ms": { "ms": {
"version": "2.1.3", "version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"dev": true, "dev": true
"optional": true
}, },
"nanoid": { "nanoid": {
"version": "4.0.2", "version": "4.0.2",
@ -7466,6 +7955,12 @@
"sax": "^1.2.4" "sax": "^1.2.4"
} }
}, },
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
"npm-run-path": { "npm-run-path": {
"version": "5.1.0", "version": "5.1.0",
"resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz", "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.1.0.tgz",
@ -7497,6 +7992,15 @@
"boolbase": "^1.0.0" "boolbase": "^1.0.0"
} }
}, },
"on-finished": {
"version": "2.3.0",
"resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz",
"integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
"dev": true,
"requires": {
"ee-first": "1.1.1"
}
},
"once": { "once": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@ -7587,6 +8091,12 @@
"integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
"dev": true "dev": true
}, },
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"dev": true
},
"path-exists": { "path-exists": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@ -7604,6 +8114,12 @@
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true "dev": true
}, },
"path-to-regexp": {
"version": "6.3.0",
"resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
"integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==",
"dev": true
},
"picocolors": { "picocolors": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@ -7761,6 +8277,15 @@
} }
} }
}, },
"readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
"requires": {
"picomatch": "^2.2.1"
}
},
"regenerator-runtime": { "regenerator-runtime": {
"version": "0.13.9", "version": "0.13.9",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
@ -8117,6 +8642,12 @@
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
}, },
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
"dev": true
},
"string-argv": { "string-argv": {
"version": "0.3.2", "version": "0.3.2",
"resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz", "resolved": "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz",
@ -8254,6 +8785,12 @@
"integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
"dev": true "dev": true
}, },
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
"dev": true
},
"untildify": { "untildify": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz", "resolved": "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz",
@ -8275,6 +8812,12 @@
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"dev": true "dev": true
}, },
"utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
"dev": true
},
"vite": { "vite": {
"version": "4.4.9", "version": "4.4.9",
"resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz", "resolved": "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz",
@ -8337,6 +8880,32 @@
"rollup": "^2.77.2" "rollup": "^2.77.2"
} }
}, },
"vite-plugin-mock": {
"version": "3.0.2",
"resolved": "https://registry.npmmirror.com/vite-plugin-mock/-/vite-plugin-mock-3.0.2.tgz",
"integrity": "sha512-bD//HvkTygGmk+LsIAdf0jGNlCv4iWv0kZlH9UEgWT6QYoUwfjQAE4SKxHRw2tfLgVhbPQVv/+X3YlNWvueGUA==",
"dev": true,
"requires": {
"bundle-require": "^4.0.1",
"chokidar": "^3.5.3",
"connect": "^3.7.0",
"debug": "^4.3.4",
"fast-glob": "^3.2.12",
"path-to-regexp": "^6.2.1",
"picocolors": "^1.0.0"
},
"dependencies": {
"debug": {
"version": "4.4.1",
"resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz",
"integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==",
"dev": true,
"requires": {
"ms": "^2.1.3"
}
}
}
},
"vite-plugin-progress": { "vite-plugin-progress": {
"version": "0.0.7", "version": "0.0.7",
"resolved": "https://registry.npmjs.org/vite-plugin-progress/-/vite-plugin-progress-0.0.7.tgz", "resolved": "https://registry.npmjs.org/vite-plugin-progress/-/vite-plugin-progress-0.0.7.tgz",

View File

@ -1,5 +1,5 @@
{ {
"name": "guxuan-admin", "name": "JinShan-Admin",
"private": true, "private": true,
"version": "1.0.0", "version": "1.0.0",
"scripts": { "scripts": {
@ -58,10 +58,12 @@
"husky": "^8.0.3", "husky": "^8.0.3",
"less": "^4.2.0", "less": "^4.2.0",
"lint-staged": "^14.0.0", "lint-staged": "^14.0.0",
"mockjs": "^1.1.0",
"rollup-plugin-visualizer": "^5.9.2", "rollup-plugin-visualizer": "^5.9.2",
"vite": "^4.4.9", "vite": "^4.4.9",
"vite-plugin-compression": "^0.5.1", "vite-plugin-compression": "^0.5.1",
"vite-plugin-eslint": "^1.8.1", "vite-plugin-eslint": "^1.8.1",
"vite-plugin-mock": "^3.0.2",
"vite-plugin-progress": "^0.0.7", "vite-plugin-progress": "^0.0.7",
"vitepress": "^1.0.0-beta.7" "vitepress": "^1.0.0-beta.7"
} }

View File

@ -0,0 +1,16 @@
/**
* 区域模块接口
*/
import request from '@/utils/request'
// 获取项目列表
export const getProjectList = (params) => request.basic.get('/api/v1/activities', params)
// 获取单挑数据
export const getItem = (id) => request.basic.get(`/api/v1/activities/${id}`)
// 添加条目
export const createProject = (params) => request.basic.post('/api/v1/activities', params)
// 更新role
export const updateItem = (id, params) => request.basic.put(`/api/v1/activities/${id}`, params)
// 删除数据
export const delItem = (id) => request.basic.delete(`/api/v1/activities/${id}`)
//获取活动报名列表
export const getActivityList=(params)=>request.basic.get('/api/v1/activity-details',params)

View File

@ -0,0 +1,15 @@
/**
* 消息公告
*/
import request from '@/utils/request'
// 获取公告列表
export const getNoticesList = (params) => request.basic.get('/api/v1/notices', params)
// 获取条目
export const getNotices = (id) => request.basic.get(`/api/v1/notices/${id}`)
// 添加公告
export const createNotices = (params) => request.basic.post('/api/v1/notices', params)
// 更新公告
export const updateNotices = (id, params) => request.basic.put(`/api/v1/notices/${id}`, params)
// 删除公告
export const delNotices = (id) => request.basic.delete(`/api/v1/notices/${id}`)

View File

@ -5,3 +5,10 @@ export const getRegion = (params) => request.basic.get('/region', params)
// 获取 验证码ID // 获取 验证码ID
export const getCaptcha = (params) => request.basic.get('/api/v1/captcha/id', params) export const getCaptcha = (params) => request.basic.get('/api/v1/captcha/id', params)
//上传图片
export const uploadFile=(params)=>request.basic.post('/api/v1/upload',params,{
headers: {
'Content-Type': 'multipart/form-data'
},
})

View File

@ -0,0 +1,14 @@
/**
* 图片管理接口
*/
import request from '@/utils/request'
// 获取菜单列表
export const getDataList = (params) => request.basic.get('/api/v1/banners', params)
// 获取菜单条数据
export const getMenu = (id) => request.basic.get(`/api/v1/banners/${id}`)
// 添加菜单
export const createMenu = (params) => request.basic.post('/api/v1/banners', params)
// 更新菜单
export const updateMenu = (id, params) => request.basic.put(`/api/v1/banners/${id}`, params)
// 删除菜单
export const delMenu = (id) => request.basic.delete(`/api/v1/banners/${id}`)

14
src/apis/modules/mock.js Normal file
View File

@ -0,0 +1,14 @@
/**
* 权限接口
*/
import request from '@/utils/request'
// 获取role列表
export const getUserRoleList = (params) => request.basic.get('/system/getUserRoleList', params)
// 获取role条数据
export const getRole = (id) => request.basic.get(`/api/v1/roles/${id}`)
// 添加role
export const createRole = (params) => request.basic.post('/api/v1/roles', params)
// 更新role
export const updateRole = (id, params) => request.basic.put(`/api/v1/roles/${id}`, params)
// 删除role
export const delRole = (id) => request.basic.delete(`/api/v1/roles/${id}`)

View File

@ -2,6 +2,7 @@ import request from '@/utils/request'
// 登录 // 登录
export const login = (params) => request.basic.post('/api/v1/login', params) export const login = (params) => request.basic.post('/api/v1/login', params)
export const mocklogin = (params) => request.basic.post('/api/login', params)
// 获取用户详情 // 获取用户详情
export const getUserDetail = () => request.basic.get('/api/v1/current/user') export const getUserDetail = () => request.basic.get('/api/v1/current/user')
// 更新用户信息 // 更新用户信息

BIN
src/assets/blankSpace.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
src/assets/errImg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -0,0 +1,539 @@
/* Logo 字体 */
@font-face {
font-family: "iconfont logo";
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
}
.logo {
font-family: "iconfont logo";
font-size: 160px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* tabs */
.nav-tabs {
position: relative;
}
.nav-tabs .nav-more {
position: absolute;
right: 0;
bottom: 0;
height: 42px;
line-height: 42px;
color: #666;
}
#tabs {
border-bottom: 1px solid #eee;
}
#tabs li {
cursor: pointer;
width: 100px;
height: 40px;
line-height: 40px;
text-align: center;
font-size: 16px;
border-bottom: 2px solid transparent;
position: relative;
z-index: 1;
margin-bottom: -1px;
color: #666;
}
#tabs .active {
border-bottom-color: #f00;
color: #222;
}
.tab-container .content {
display: none;
}
/* 页面布局 */
.main {
padding: 30px 100px;
width: 960px;
margin: 0 auto;
}
.main .logo {
color: #333;
text-align: left;
margin-bottom: 30px;
line-height: 1;
height: 110px;
margin-top: -50px;
overflow: hidden;
*zoom: 1;
}
.main .logo a {
font-size: 160px;
color: #333;
}
.helps {
margin-top: 40px;
}
.helps pre {
padding: 20px;
margin: 10px 0;
border: solid 1px #e7e1cd;
background-color: #fffdef;
overflow: auto;
}
.icon_lists {
width: 100% !important;
overflow: hidden;
*zoom: 1;
}
.icon_lists li {
width: 100px;
margin-bottom: 10px;
margin-right: 20px;
text-align: center;
list-style: none !important;
cursor: default;
}
.icon_lists li .code-name {
line-height: 1.2;
}
.icon_lists .icon {
display: block;
height: 100px;
line-height: 100px;
font-size: 42px;
margin: 10px auto;
color: #333;
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
-moz-transition: font-size 0.25s linear, width 0.25s linear;
transition: font-size 0.25s linear, width 0.25s linear;
}
.icon_lists .icon:hover {
font-size: 100px;
}
.icon_lists .svg-icon {
/* 通过设置 font-size 来改变图标大小 */
width: 1em;
/* 图标和文字相邻时,垂直对齐 */
vertical-align: -0.15em;
/* 通过设置 color 来改变 SVG 的颜色/fill */
fill: currentColor;
/* path stroke 溢出 viewBox 部分在 IE 下会显示
normalize.css 中也包含这行 */
overflow: hidden;
}
.icon_lists li .name,
.icon_lists li .code-name {
color: #666;
}
/* markdown 样式 */
.markdown {
color: #666;
font-size: 14px;
line-height: 1.8;
}
.highlight {
line-height: 1.5;
}
.markdown img {
vertical-align: middle;
max-width: 100%;
}
.markdown h1 {
color: #404040;
font-weight: 500;
line-height: 40px;
margin-bottom: 24px;
}
.markdown h2,
.markdown h3,
.markdown h4,
.markdown h5,
.markdown h6 {
color: #404040;
margin: 1.6em 0 0.6em 0;
font-weight: 500;
clear: both;
}
.markdown h1 {
font-size: 28px;
}
.markdown h2 {
font-size: 22px;
}
.markdown h3 {
font-size: 16px;
}
.markdown h4 {
font-size: 14px;
}
.markdown h5 {
font-size: 12px;
}
.markdown h6 {
font-size: 12px;
}
.markdown hr {
height: 1px;
border: 0;
background: #e9e9e9;
margin: 16px 0;
clear: both;
}
.markdown p {
margin: 1em 0;
}
.markdown>p,
.markdown>blockquote,
.markdown>.highlight,
.markdown>ol,
.markdown>ul {
width: 80%;
}
.markdown ul>li {
list-style: circle;
}
.markdown>ul li,
.markdown blockquote ul>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown>ul li p,
.markdown>ol li p {
margin: 0.6em 0;
}
.markdown ol>li {
list-style: decimal;
}
.markdown>ol li,
.markdown blockquote ol>li {
margin-left: 20px;
padding-left: 4px;
}
.markdown code {
margin: 0 3px;
padding: 0 5px;
background: #eee;
border-radius: 3px;
}
.markdown strong,
.markdown b {
font-weight: 600;
}
.markdown>table {
border-collapse: collapse;
border-spacing: 0px;
empty-cells: show;
border: 1px solid #e9e9e9;
width: 95%;
margin-bottom: 24px;
}
.markdown>table th {
white-space: nowrap;
color: #333;
font-weight: 600;
}
.markdown>table th,
.markdown>table td {
border: 1px solid #e9e9e9;
padding: 8px 16px;
text-align: left;
}
.markdown>table th {
background: #F7F7F7;
}
.markdown blockquote {
font-size: 90%;
color: #999;
border-left: 4px solid #e9e9e9;
padding-left: 0.8em;
margin: 1em 0;
}
.markdown blockquote p {
margin: 0;
}
.markdown .anchor {
opacity: 0;
transition: opacity 0.3s ease;
margin-left: 8px;
}
.markdown .waiting {
color: #ccc;
}
.markdown h1:hover .anchor,
.markdown h2:hover .anchor,
.markdown h3:hover .anchor,
.markdown h4:hover .anchor,
.markdown h5:hover .anchor,
.markdown h6:hover .anchor {
opacity: 1;
display: inline-block;
}
.markdown>br,
.markdown>p>br {
clear: both;
}
.hljs {
display: block;
background: white;
padding: 0.5em;
color: #333333;
overflow-x: auto;
}
.hljs-comment,
.hljs-meta {
color: #969896;
}
.hljs-string,
.hljs-variable,
.hljs-template-variable,
.hljs-strong,
.hljs-emphasis,
.hljs-quote {
color: #df5000;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-type {
color: #a71d5d;
}
.hljs-literal,
.hljs-symbol,
.hljs-bullet,
.hljs-attribute {
color: #0086b3;
}
.hljs-section,
.hljs-name {
color: #63a35c;
}
.hljs-tag {
color: #333333;
}
.hljs-title,
.hljs-attr,
.hljs-selector-id,
.hljs-selector-class,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #795da3;
}
.hljs-addition {
color: #55a532;
background-color: #eaffea;
}
.hljs-deletion {
color: #bd2c00;
background-color: #ffecec;
}
.hljs-link {
text-decoration: underline;
}
/* 代码高亮 */
/* PrismJS 1.15.0
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
/**
* prism.js default theme for JavaScript, CSS and HTML
* Based on dabblet (http://dabblet.com)
* @author Lea Verou
*/
code[class*="language-"],
pre[class*="language-"] {
color: black;
background: none;
text-shadow: 0 1px white;
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
text-align: left;
white-space: pre;
word-spacing: normal;
word-break: normal;
word-wrap: normal;
line-height: 1.5;
-moz-tab-size: 4;
-o-tab-size: 4;
tab-size: 4;
-webkit-hyphens: none;
-moz-hyphens: none;
-ms-hyphens: none;
hyphens: none;
}
pre[class*="language-"]::-moz-selection,
pre[class*="language-"] ::-moz-selection,
code[class*="language-"]::-moz-selection,
code[class*="language-"] ::-moz-selection {
text-shadow: none;
background: #b3d4fc;
}
pre[class*="language-"]::selection,
pre[class*="language-"] ::selection,
code[class*="language-"]::selection,
code[class*="language-"] ::selection {
text-shadow: none;
background: #b3d4fc;
}
@media print {
code[class*="language-"],
pre[class*="language-"] {
text-shadow: none;
}
}
/* Code blocks */
pre[class*="language-"] {
padding: 1em;
margin: .5em 0;
overflow: auto;
}
:not(pre)>code[class*="language-"],
pre[class*="language-"] {
background: #f5f2f0;
}
/* Inline code */
:not(pre)>code[class*="language-"] {
padding: .1em;
border-radius: .3em;
white-space: normal;
}
.token.comment,
.token.prolog,
.token.doctype,
.token.cdata {
color: slategray;
}
.token.punctuation {
color: #999;
}
.namespace {
opacity: .7;
}
.token.property,
.token.tag,
.token.boolean,
.token.number,
.token.constant,
.token.symbol,
.token.deleted {
color: #905;
}
.token.selector,
.token.attr-name,
.token.string,
.token.char,
.token.builtin,
.token.inserted {
color: #690;
}
.token.operator,
.token.entity,
.token.url,
.language-css .token.string,
.style .token.string {
color: #9a6e3a;
background: hsla(0, 0%, 100%, .5);
}
.token.atrule,
.token.attr-value,
.token.keyword {
color: #07a;
}
.token.function,
.token.class-name {
color: #DD4A68;
}
.token.regex,
.token.important,
.token.variable {
color: #e90;
}
.token.important,
.token.bold {
font-weight: bold;
}
.token.italic {
font-style: italic;
}
.token.entity {
cursor: help;
}

View File

@ -0,0 +1,23 @@
@font-face {
font-family: "iconfont"; /* Project id 4966438 */
src: url('iconfont.woff2?t=1751607897346') format('woff2'),
url('iconfont.woff?t=1751607897346') format('woff'),
url('iconfont.ttf?t=1751607897346') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.icon-huodongliebiao-copy:before {
content: "\e600";
}
.icon-gonggao:before {
content: "\e62a";
}

View File

@ -0,0 +1 @@
window._iconfont_svg_string_4966438='<svg><symbol id="icon-huodongliebiao-copy" viewBox="0 0 1024 1024"><path d="M419.749 488.787H219.263c-38.598 0-70-31.402-70-70V218.3c0-38.598 31.402-70 70-70h200.486c38.598 0 70 31.402 70 70v200.486c0 38.599-31.402 70.001-70 70.001zM219.263 208.3c-5.514 0-10 4.486-10 10v200.486c0 5.514 4.486 10 10 10h200.486c5.514 0 10-4.486 10-10V218.3c0-5.514-4.486-10-10-10H219.263zM419.749 875.699H219.263c-38.598 0-70-31.401-70-70V605.214c0-38.599 31.402-70 70-70h200.486c38.598 0 70 31.401 70 70v200.485c0 38.599-31.402 70-70 70zM219.263 595.214c-5.514 0-10 4.486-10 10v200.485c0 5.514 4.486 10 10 10h200.486c5.514 0 10-4.486 10-10V605.214c0-5.514-4.486-10-10-10H219.263zM844.737 277.999h-248c-16.568 0-30-13.432-30-30s13.432-30 30-30h248c16.568 0 30 13.432 30 30s-13.431 30-30 30zM844.737 419.088h-248c-16.568 0-30-13.432-30-30s13.432-30 30-30h248c16.568 0 30 13.432 30 30s-13.431 30-30 30z" fill="#007dc3" ></path><path d="M844.737 664.912h-248c-16.568 0-30-13.432-30-30s13.432-30 30-30h248c16.568 0 30 13.432 30 30s-13.431 30-30 30zM844.737 806.001h-248c-16.568 0-30-13.432-30-30s13.432-30 30-30h248c16.568 0 30 13.432 30 30s-13.431 30-30 30z" fill="#007dc3" ></path></symbol><symbol id="icon-gonggao" viewBox="0 0 1030 1024"><path d="M748.8 281.6c-6.4-6.4-12.8-19.2-19.2-25.6-12.8-19.2-38.4-19.2-51.2-6.4-19.2 12.8-19.2 38.4-6.4 57.6 6.4 12.8 12.8 19.2 19.2 25.6 38.4 51.2 70.4 96 70.4 179.2s-32 134.4-70.4 185.6l-12.8 19.2c-12.8 19.2-6.4 44.8 6.4 57.6 6.4 6.4 12.8 6.4 19.2 6.4 12.8 0 25.6-6.4 32-19.2l12.8-19.2c38.4-57.6 89.6-128 89.6-236.8-6.4-102.4-44.8-166.4-89.6-224zM512 0c-25.6 0-51.2 12.8-83.2 44.8l-217.6 224h-96c-64 0-115.2 51.2-115.2 121.6v236.8c0 64 51.2 121.6 115.2 121.6h96l217.6 230.4c32 32 57.6 44.8 83.2 44.8s57.6-19.2 57.6-76.8v-876.8c0-51.2-32-70.4-57.6-70.4z m-19.2 934.4c-6.4 0-6.4-6.4-12.8-12.8l-230.4-236.8c-6.4-6.4-19.2-12.8-25.6-12.8h-115.2c-19.2 0-38.4-19.2-38.4-38.4v-236.8c0-19.2 19.2-38.4 38.4-38.4h115.2c12.8 0 19.2-6.4 25.6-12.8l230.4-236.8 12.8-12.8v838.4z" fill="#666666" ></path><path d="M864 121.6c-12.8-19.2-38.4-19.2-51.2-6.4s-19.2 38.4-6.4 57.6c76.8 89.6 147.2 198.4 147.2 339.2 0 147.2-70.4 249.6-147.2 339.2-12.8 19.2-12.8 38.4 6.4 57.6 6.4 6.4 12.8 12.8 25.6 12.8s19.2-6.4 25.6-12.8c83.2-96 166.4-224 166.4-390.4-6.4-179.2-89.6-300.8-166.4-396.8z" fill="#666666" ></path></symbol></svg>',(c=>{var t=(e=(e=document.getElementsByTagName("script"))[e.length-1]).getAttribute("data-injectcss"),e=e.getAttribute("data-disable-injectsvg");if(!e){var n,o,i,s,d,l=function(t,e){e.parentNode.insertBefore(t,e)};if(t&&!c.__iconfont__svg__cssinject__){c.__iconfont__svg__cssinject__=!0;try{document.write("<style>.svgfont {display: inline-block;width: 1em;height: 1em;fill: currentColor;vertical-align: -0.1em;font-size:16px;}</style>")}catch(t){console&&console.log(t)}}n=function(){var t,e=document.createElement("div");e.innerHTML=c._iconfont_svg_string_4966438,(e=e.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",e=e,(t=document.body).firstChild?l(e,t.firstChild):t.appendChild(e))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(n,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),n()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(i=n,s=c.document,d=!1,h(),s.onreadystatechange=function(){"complete"==s.readyState&&(s.onreadystatechange=null,a())})}function a(){d||(d=!0,i())}function h(){try{s.documentElement.doScroll("left")}catch(t){return void setTimeout(h,50)}a()}})(window);

View File

@ -0,0 +1,23 @@
{
"id": "4966438",
"name": "近山",
"font_family": "iconfont",
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
{
"icon_id": "29742036",
"name": "活动列表",
"font_class": "huodongliebiao-copy",
"unicode": "e600",
"unicode_decimal": 58880
},
{
"icon_id": "8765148",
"name": "公告",
"font_class": "gonggao",
"unicode": "e62a",
"unicode_decimal": 58922
}
]
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -65,7 +65,7 @@ const content = ref('')
const opts = deepMerge( const opts = deepMerge(
{ {
language: 'zh-Hans', language: 'zh-Hans',
height: 480, height: props.height,
branding: false, branding: false,
resize: false, resize: false,
promotion: false, promotion: false,

View File

@ -106,9 +106,6 @@ const handlePreview = async (file) => {
// handleChange // handleChange
const handleChange = ({ file, fileList: updatedList }) => { const handleChange = ({ file, fileList: updatedList }) => {
console.log(111)
console.log(file.status)
console.log(updatedList)
// //
if (file.status === 'done') { if (file.status === 'done') {
const response = file.response; const response = file.response;
@ -145,7 +142,7 @@ const handleCustomRequest = async (options) => {
const formData = new FormData(); const formData = new FormData();
formData.append('file', file); formData.append('file', file);
const { data } = await apis.common.uploadImg(formData); const { data } = await apis.common.uploadFile(formData);
const fullUrl = config('http.apiBasic') + data; const fullUrl = config('http.apiBasic') + data;
// //

View File

@ -19,6 +19,7 @@ import UploadImage from './Upload/UploadImage.vue'
import UploadInput from './Upload/UploadInput.vue' import UploadInput from './Upload/UploadInput.vue'
import Scrollbar from './Scrollbar/Scrollbar.vue' import Scrollbar from './Scrollbar/Scrollbar.vue'
import Cascader from './Cascader/Cascader.vue' import Cascader from './Cascader/Cascader.vue'
import GxUpload from './GxUpload/index.vue'
import { setupLoadingDirective } from './Loading/directive' import { setupLoadingDirective } from './Loading/directive'
const componentList = [ const componentList = [
@ -41,6 +42,7 @@ const componentList = [
UploadInput, UploadInput,
Scrollbar, Scrollbar,
Cascader, Cascader,
GxUpload
] ]
export const loading = Loading export const loading = Loading

38
src/enums/enums.js Normal file
View File

@ -0,0 +1,38 @@
export class EnumManager {
constructor(data) {
this.data = data;
this.valueMap = new Map(data.map(item => [item.value, item.name]));
this.nameMap = new Map(data.map(item => [item.name, item.value]));
this.colorMap=new Map(data.map(item=>[item.value,item.color]))
}
// 获取整个数组
getAll() {
return this.data.map(item=>({label:item.name,value:item.value}))
}
// 根据value获取name
getName(value) {
return this.valueMap.get(value) || '';
}
//根据value获取color
getColor(value){
return this.colorMap.get(value)||''
}
// 根据name获取value可选
getValue(name) {
return this.nameMap.get(name) || '';
}
// 获取所有value的数组
getValues() {
return Array.from(this.valueMap.keys());
}
// 获取所有name的数组
getNames() {
return Array.from(this.valueMap.values());
}
}

15
src/enums/index.js Normal file
View File

@ -0,0 +1,15 @@
import {EnumManager} from './enums'
const activatyStatus = new EnumManager([
{ value: 1, name: '待审核', color: '#faad14' }, // 黄色(警告色)
{ value: 2, name: '进行中', color: '#52c41a' }, // 绿色(进行中)
{ value: 3, name: '已完成', color: '#1890ff' }, // 蓝色(完成色)
{ value: 4, name: '已过期', color: '#bfbfbf' }, // 灰色(失效色)
{ value: 5, name: '审核不通过', color: '#ff4d4f' } // 红色(错误色)
])
const enumsStatus = new EnumManager([
{ value: 0, name: '启用', color: '#52c41a' }, // 绿色(启用)
{ value: 1, name: '停用', color: '#ff4d4f' } // 红色(停用)
])
export {activatyStatus,enumsStatus}

View File

@ -4,3 +4,4 @@ export { default as useMenu } from './useMenu'
export { default as useModal } from './useModal' export { default as useModal } from './useModal'
export { default as useMultiTab } from './useMultiTab' export { default as useMultiTab } from './useMultiTab'
export { default as usePagination } from './usePagination' export { default as usePagination } from './usePagination'
export { default as useSpining } from './useSpining'

15
src/hooks/useSpining.js Normal file
View File

@ -0,0 +1,15 @@
import { ref } from 'vue'
export default () => {
const spining = ref(false) // 直接使用基本类型ref
const showSpining = () => {
spining.value = true
}
const hideSpining = () => {
spining.value = false
}
return {
spining, // 直接暴露ref
showSpining,
hideSpining,
}
}

View File

@ -5,10 +5,8 @@
<h1>{{ title }}</h1> <h1>{{ title }}</h1>
</div> </div>
<div class="aside-body"> <div class="aside-body">
<img <img alt="" :src="assets('logos.png')" />
alt="" <!-- <h3>{{ $t('pages.layouts.userLayout.title') }}</h3> -->
:src="assets('logos.png')" />
<h3>{{ $t('pages.layouts.userLayout.title') }}</h3>
<!-- <p>Vue3 + Ant Design Vue + vite</p>--> <!-- <p>Vue3 + Ant Design Vue + vite</p>-->
</div> </div>
<div class="aside-footer"> <div class="aside-footer">
@ -27,9 +25,7 @@
</div> </div>
</div> </div>
<div <div class="basic-header__right" style="padding: 30px">
class="basic-header__right"
style="padding: 30px">
<a-space :size="16"> <a-space :size="16">
<a-dropdown :trigger="['hover']"> <a-dropdown :trigger="['hover']">
<action-button :style="{ height: '44px' }"> <action-button :style="{ height: '44px' }">
@ -38,10 +34,7 @@
<a-spin /> <a-spin />
<template #overlay> <template #overlay>
<a-menu v-model:selectedKeys="current"> <a-menu v-model:selectedKeys="current">
<a-menu-item <a-menu-item v-for="(item, key) in langData" :key="key" @click="handleLang(key)">
v-for="(item, key) in langData"
:key="key"
@click="handleLang(key)">
{{ item.icon }} {{ item.label }} {{ item.icon }} {{ item.label }}
</a-menu-item> </a-menu-item>
</a-menu> </a-menu>

View File

@ -1,18 +1,11 @@
<template> <template>
<a-layout-header <a-layout-header class="basic-header" :class="cpClassNames" :style="cpStyles">
class="basic-header"
:class="cpClassNames"
:style="cpStyles">
<!-- 左侧 --> <!-- 左侧 -->
<div <div v-if="cpShowLeftSlot" class="basic-header__left">
v-if="cpShowLeftSlot"
class="basic-header__left">
<slot name="left"></slot> <slot name="left"></slot>
</div> </div>
<!-- 中间 --> <!-- 中间 -->
<div <div v-if="cpShowDefaultSlot" class="basic-header__center">
v-if="cpShowDefaultSlot"
class="basic-header__center">
<slot></slot> <slot></slot>
</div> </div>
<!-- 右侧 --> <!-- 右侧 -->
@ -28,10 +21,7 @@
<a-spin /> <a-spin />
<template #overlay> <template #overlay>
<a-menu v-model:selectedKeys="current"> <a-menu v-model:selectedKeys="current">
<a-menu-item <a-menu-item v-for="(item, key) in langData" :key="key" @click="handleLang(key)">
v-for="(item, key) in langData"
:key="key"
@click="handleLang(key)">
{{ item.icon }} {{ item.label }} {{ item.icon }} {{ item.label }}
</a-menu-item> </a-menu-item>
</a-menu> </a-menu>
@ -40,9 +30,7 @@
<a-dropdown :trigger="['click']"> <a-dropdown :trigger="['click']">
<action-button :style="{ height: '44px' }"> <action-button :style="{ height: '44px' }">
<a-avatar <a-avatar class="mr-8-1 display-inline-flex justify-content-center" :size="24"
class="mr-8-1 display-inline-flex justify-content-center"
:size="24"
:src="userInfo?.avatar"> :src="userInfo?.avatar">
</a-avatar> </a-avatar>
<span>{{ userInfo?.name }}</span> <span>{{ userInfo?.name }}</span>
@ -50,15 +38,13 @@
<a-spin /> <a-spin />
<template #overlay> <template #overlay>
<a-menu> <a-menu>
<a-menu-item <!-- <a-menu-item
key="edit" key="edit"
@click="handleOpen"> @click="handleOpen">
<edit-outlined /> <edit-outlined />
{{ $t('component.RightContent.profile') }} {{ $t('component.RightContent.profile') }}
</a-menu-item> </a-menu-item> -->
<a-menu-item <a-menu-item key="logout" @click="handleLogout">
key="logout"
@click="handleLogout">
<login-outlined></login-outlined> <login-outlined></login-outlined>
{{ $t('component.RightContent.logout') }} {{ $t('component.RightContent.logout') }}
</a-menu-item> </a-menu-item>
@ -164,9 +150,7 @@ function handleLogout() {
*/ */
function handleOpen() { function handleOpen() {
router.push({ router.push()
name: 'setting',
})
} }
/** /**

View File

@ -1,17 +1,8 @@
<template> <template>
<div <div class="basic-menu" ref="basicMenuRef">
class="basic-menu" <a-menu v-model:selected-keys="selectedKeys" :get-pop-container="() => basicMenuRef"
ref="basicMenuRef"> :inline-collapsed="collapsed" :mode="mode" :open-keys="cpOpenKeys" :theme="theme" :items="items"
<a-menu @openChange="onOpenChange" @click="handleClick"></a-menu>
v-model:selected-keys="selectedKeys"
:get-pop-container="() => basicMenuRef"
:inline-collapsed="collapsed"
:mode="mode"
:open-keys="cpOpenKeys"
:theme="theme"
:items="items"
@openChange="onOpenChange"
@click="handleClick"></a-menu>
</div> </div>
</template> </template>
@ -79,17 +70,30 @@ watch(
h(Badge, { count: item?.meta?.badge || 0 }), h(Badge, { count: item?.meta?.badge || 0 }),
]), ]),
icon: (item) => { icon: (item) => {
const icon = item?.meta?.icon const iconName = item?.meta?.icon;
if (icon) { if(!iconName) return
return h(icon) // Iconfont ('icon-')
if (typeof (iconName)==='string') {
const iconfontName = iconName;
return h('span', {
class: 'ceshi',
'aria-hidden': true,
innerHTML: `<i class='iconfont ${iconfontName}' style='font-size:14px'></i>`
});
} else {
const icon = item?.meta?.icon
if (icon) {
return h(icon)
}
return ''
} }
return ''
}, },
children: 'children', children: 'children',
}, },
treeFieldName: 'children', treeFieldName: 'children',
keepOtherFields: true, keepOtherFields: true,
}) })
console.log(items)
}, },
{ immediate: true, deep: true } { immediate: true, deep: true }
) )
@ -173,6 +177,7 @@ function onOpenChange(value) {
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
} }
&__name { &__name {
flex: 1; flex: 1;
min-width: 0; min-width: 0;

View File

@ -1,13 +1,6 @@
<template> <template>
<a-layout-sider <a-layout-sider breakpoint="lg" class="basic-side" v-model:collapsed="collapsed" :style="cpStyles"
breakpoint="lg" :collapsible="true" :collapsed-width="config.sideCollapsedWidth" :theme="theme" :width="config.sideWidth">
class="basic-side"
v-model:collapsed="collapsed"
:style="cpStyles"
:collapsible="true"
:collapsed-width="config.sideCollapsedWidth"
:theme="theme"
:width="config.sideWidth">
<template #trigger> <template #trigger>
<div class="basic-side__trigger"> <div class="basic-side__trigger">
<component :is="collapsed ? MenuUnfoldOutlined : MenuFoldOutlined"></component> <component :is="collapsed ? MenuUnfoldOutlined : MenuFoldOutlined"></component>
@ -16,14 +9,10 @@
<div class="basic-side__header"> <div class="basic-side__header">
<slot name="header"></slot> <slot name="header"></slot>
</div> </div>
<x-scrollbar <x-scrollbar v-if="cpShowDefaultSlot" class="basic-side__body">
v-if="cpShowDefaultSlot"
class="basic-side__body">
<slot></slot> <slot></slot>
</x-scrollbar> </x-scrollbar>
<div <div v-if="cpShowFooterSlot" class="basic-side__footer">
v-if="cpShowFooterSlot"
class="basic-side__footer">
<slot name="footer"></slot> <slot name="footer"></slot>
</div> </div>
</a-layout-sider> </a-layout-sider>

View File

@ -32,4 +32,8 @@ export default {
account: '个人页', account: '个人页',
'account.trigger': '触发报错', 'account.trigger': '触发报错',
'account.logout': '退出登录', 'account.logout': '退出登录',
homebanner:'首页轮播图',
neighborhood:'邻里圈轮播图',
announcementList:'社区公告',
activity:'活动列表'
} }

View File

@ -1,8 +1,10 @@
import { createApp } from 'vue' import { createApp } from 'vue'
import App from '@/App.vue' import App from '@/App.vue'
import { useCore } from '@/core'
import { useCore } from '@/core'
import './assets/iconfont/iconfont.css';
const app = createApp(App) const app = createApp(App)
useCore(app) useCore(app)
app.mount('#app') app.mount('#app')

View File

@ -1,11 +1,10 @@
import Mock from 'mockjs' // src/mock/index.js
import userMocks from './modules/user';
import './modules/common.js' export default [
import './modules/system.js' ...userMocks
import './modules/user.js' ];
// export const setupMock = () => {
export const setupMock = () => { // Mock.setup({
Mock.setup({ // timeout: 200,
timeout: 200, // })
}) // }
}

View File

@ -1,124 +0,0 @@
import Mock from 'mockjs'
import { builder, getQueryParams } from '../util'
// 获取欢迎页数据
Mock.mock(new RegExp('/home/getData'), 'get', () => {
return builder(
Mock.mock({
'dynamicRows|5': [
{
id: '@increment',
avatar: '@image(32, @color, @cfirst)',
title: '@cparagraph(1, 2)',
time: '@datetime',
},
],
})
)
})
// 获取分页列表
Mock.mock(new RegExp('/common/getPageList'), 'get', () => {
return builder(
Mock.mock({
'rows|10': [
{
id: '@increment',
avatar: '@image(60, @color)',
userName: '@cname',
'userList|2-4': [
{
id: '@increment',
avatar: '@image(60, @color)',
},
],
title: '@ctitle',
name: '@ctitle',
desc: '@cparagraph(3)',
desc1: '@cparagraph(1)',
'valid|1': true,
keyValue: '@word',
content: '@cparagraph(3)',
'tags|2-3': ['@cword(3,5)'],
url: '@url("https")',
time: '@date(yyyy-MM-dd HH:mm)',
time1: '@date(MM-dd)',
star: '@integer(20, 200)',
like: '@integer(20, 200)',
comment: '@integer(20, 200)',
cover: '@image(532x320)',
activeUsers: '@integer(10, 99)',
newUsers: '@integer(1000, 5000)',
count: '@integer(1, 100)',
'status|1': ['成功', '失败'],
},
],
total: 32,
})
)
})
// 保存/删除
Mock.mock(new RegExp(/(save|delete)/), 'post', () => {
return builder(
Mock.mock({
result: true,
})
)
})
// 文件上传
Mock.mock(new RegExp('/comment/upload'), 'post', () => {
return builder(
Mock.mock({
src: '@image(80, @color)',
})
)
})
// 获取地区列表
Mock.mock(new RegExp('/common/getRegionList'), 'get', (options) => {
const { parentId = 0 } = getQueryParams(options)
const list = {
0: [
{ id: 1, name: '北京' },
{ id: 2, name: '山东省' },
],
1: [{ id: 11, name: '北京市' }],
2: [
{ id: 21, name: '济南市' },
{ id: 22, name: '菏泽市' },
{ id: 23, name: '青岛市' },
],
11: [
{ id: 111, name: '东城区' },
{ id: 112, name: '西城区' },
{ id: 113, name: '海淀区' },
{ id: 114, name: '昌平区' },
{ id: 114, name: '朝阳区' },
],
21: [
{ id: 211, name: '历下区' },
{ id: 212, name: '市中区' },
{ id: 213, name: '槐荫区' },
],
22: [
{ id: 221, name: '牡丹区' },
{ id: 222, name: '定陶区' },
{ id: 223, name: '郓城县' },
],
23: [
{ id: 231, name: '市南区' },
{ id: 232, name: '市北区' },
{ id: 233, name: '黄岛区' },
],
}
return builder(
Mock.mock({
rows: list[parentId],
})
)
})

View File

@ -1,391 +0,0 @@
import Mock from 'mockjs'
import { builder } from '../util'
// 获取角色列表
Mock.mock(new RegExp('/system/getUserRoleList'), 'get', () => {
return builder(
Mock.mock({
rows: [
{
name: '超级管理员',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
{
name: '管理员',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
children: [
{
name: '系统管理员',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
{
name: '业务管理员',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
{
name: '数据管理员',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
],
},
{
name: '操作员',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
children: [
{
name: '公告维护员',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
{
name: '审核员',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
{
name: '复审员',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
],
},
],
})
)
})
// 获取用户分页列表
Mock.mock(new RegExp('/system/getUserPageList'), 'get', () => {
return builder(
Mock.mock({
'rows|10': [
{
id: '@id',
avatar: '@image(60x60, @color, @cfirst)',
userName: '@email',
name: '@cname',
'roleName|+1': ['超级管理员', '业务管理员', '数据管理员'],
date: '@date',
},
],
total: 40,
})
)
})
// 获取菜单列表
Mock.mock(new RegExp('/system/getMenuList'), 'get', () => {
return builder(
Mock.mock({
rows: [
{
name: '欢迎页',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'menu',
},
{
name: '表单页',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'menu',
children: [
{
name: '基础表单',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'menu',
children: [
{
name: '新增',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
{
name: '编辑',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
{
name: '删除',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
],
},
{
name: '分步表单',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'menu',
children: [
{
name: '新增',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
{
name: '编辑',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
{
name: '删除',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
],
},
],
},
{
name: '列表页',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'menu',
children: [
{
name: '基础列表',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'menu',
children: [
{
name: '新增',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
{
name: '编辑',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
{
name: '删除',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
],
},
{
name: '卡片列表',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'menu',
children: [
{
name: '新增',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
{
name: '编辑',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
{
name: '删除',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
],
},
{
name: '搜索列表',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'menu',
children: [
{
name: '新增',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
{
name: '编辑',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
{
name: '删除',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
type: 'button',
},
],
},
],
},
],
})
)
})
// 获取菜单列表
Mock.mock(new RegExp('/system/getNewMenuList'), 'get', () => {
return builder(
Mock.mock({
rows: [
{
name: '欢迎页',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
{
name: '表单页',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
children: [
{
name: '基础表单',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
{
name: '分步表单',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
],
},
{
name: '列表页',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
children: [
{
name: '基础列表',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
{
name: '卡片列表',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
{
name: '搜索列表',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
},
],
},
],
})
)
})
// 获取字典分类列表
Mock.mock(new RegExp('/system/getDictTypeList'), 'get', () => {
return builder(
Mock.mock({
rows: [
{
name: '通知类型',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
code: '@word',
},
{
name: '性别',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
code: '@word',
},
{
name: '菜单类型',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
code: '@word',
},
{
name: '用户类型',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
code: '@word',
children: [
{
name: '移动端',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
code: '@word',
},
{
name: '桌面端',
alias: '@word(2,4)',
sort: '@increment',
key: '@id',
code: '@word',
},
],
},
],
})
)
})

View File

@ -1,22 +1,37 @@
import Mock from 'mockjs' // src/mock/user.js
export default [
// GET 示例
{
url: '/api/user',
method: 'get',
response: () => ({
code: 0,
data: {
'list|5-10': [{
'id|+1': 1,
name: '@cname',
avatar: '@image("100x100")'
}]
}
})
},
import { builder, getBody } from '../util' // POST 示例
{
// 登录 url: '/api/login',
Mock.mock(new RegExp('/user/login'), 'post', (options) => { method: 'post',
const { username, password } = getBody(options) timeout: 1000, // 模拟延迟
response: ({ body }) => {
if ('admin' === username && '123456' === password) { if (body.username === 'admin' && body.password === '123456') {
return builder( return {
Mock.mock({ code: 0,
id: '@increment', token: 'mock_token_123456'
username: username, }
avatar: '@dataImage', }
token: '@guid', return {
email: '@email', code: 401,
}) message: '认证失败'
) }
} else {
return builder({}, '301', '用户名或密码错误')
} }
}) }
]

View File

@ -1,57 +0,0 @@
/**
* 基础数据结构
* @type {{msg: string, code: string, data: null, timestamp: number}}
*/
const responseBody = {
code: 200,
msg: 'success',
timestamp: 0,
data: null,
}
/**
* 构建返回的数据结构
* @param data
* @param code
* @param message
* @returns {{msg: string, code: string, data: null, timestamp: number}}
*/
export const builder = (data = {}, code = 200, message = 'success') => {
responseBody.data = data
if (code !== undefined && code !== 0) {
responseBody.code = code
}
if (message !== undefined && message !== null) {
responseBody.msg = message
}
responseBody.timestamp = new Date().getTime()
return responseBody
}
/**
* 获取地址栏参数
* @param options
* @returns {{}|any}
*/
export const getQueryParams = (options) => {
const url = options.url
const search = url.split('?')[1]
if (!search) {
return {}
}
return JSON.parse(
'{"' + decodeURIComponent(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g, '":"') + '"}'
)
}
/**
* 获取body参数
* @param options
* @returns {*}
*/
export const getBody = (options) => {
return options.body && JSON.parse(options.body)
}

View File

@ -9,7 +9,7 @@ import system from './system'
import link from './link' import link from './link'
import iframe from './iframe' import iframe from './iframe'
import other from './other' import other from './other'
import pages from './pages'
export default [ export default [
...home, ...home,
...form, ...form,
@ -22,4 +22,5 @@ export default [
...link, ...link,
...iframe, ...iframe,
...other, ...other,
...pages
] ]

View File

@ -0,0 +1,52 @@
import { TableOutlined,HomeOutlined } from '@ant-design/icons-vue'
export default [
{
path: 'homebanner/index',
name: 'homebanner',
component: 'pages/homeBanner/index.vue',
meta: {
icon: HomeOutlined,
title: '首页轮播图',
isMenu: true,
keepAlive: true,
permission: '*',
},
},
{
path: 'neighborhood/index',
name: 'neighborhood',
component: 'pages/neighborhood/index.vue',
meta: {
icon: TableOutlined,
title: '邻里圈轮播图',
isMenu: true,
keepAlive: true,
permission: '*',
},
},
{
path: 'announcementList/index',
name: 'announcementList',
component: 'pages/announcementList/index.vue',
meta: {
icon: 'icon-gonggao',
title: '社区公告',
isMenu: true,
keepAlive: true,
permission: '*',
},
},
{
path: 'activity/index',
name: 'activity',
component: 'pages/activity/index.vue',
meta: {
icon: 'icon-huodongliebiao-copy',
title: '热门活动',
isMenu: true,
keepAlive: true,
permission: '*',
},
},
]

View File

@ -2,17 +2,10 @@
<div> <div>
<a-tabs> <a-tabs>
<!-- 账号登录 --> <!-- 账号登录 -->
<a-tab-pane <a-tab-pane key="account" :tab="$t('pages.login.accountLogin.tab')">
key="account" <a-form :model="formData" :rules="formRules" ref="formRef">
:tab="$t('pages.login.accountLogin.tab')">
<a-form
:model="formData"
:rules="formRules"
ref="formRef">
<a-form-item name="username"> <a-form-item name="username">
<a-input <a-input :placeholder="$t('pages.login.username.placeholder')" v-model:value="formData.username"
:placeholder="$t('pages.login.username.placeholder')"
v-model:value="formData.username"
size="large"> size="large">
<template #prefix> <template #prefix>
<user-outlined></user-outlined> <user-outlined></user-outlined>
@ -20,45 +13,28 @@
</a-input> </a-input>
</a-form-item> </a-form-item>
<a-form-item name="password"> <a-form-item name="password">
<a-input <a-input v-model:value="formData.password" size="large" type="password"
v-model:value="formData.password" :placeholder="$t('pages.login.password.placeholder')" @pressEnter="handleLogin">
size="large"
type="password"
:placeholder="$t('pages.login.password.placeholder')"
@pressEnter="handleLogin">
<template #prefix> <template #prefix>
<lock-outlined></lock-outlined> <lock-outlined></lock-outlined>
</template> </template>
</a-input> </a-input>
</a-form-item> </a-form-item>
<a-form-item name="captcha_code"> <!-- <a-form-item name="captcha_code">
<a-space> <a-space>
<a-input <a-input v-model:value="formData.captcha_code" size="large" type="text"
v-model:value="formData.captcha_code" :placeholder="$t('pages.login.captcha.placeholder')" @pressEnter="handleLogin">
size="large"
type="text"
:placeholder="$t('pages.login.captcha.placeholder')"
@pressEnter="handleLogin">
<template #prefix> <template #prefix>
<safety-outlined /> <safety-outlined />
</template> </template>
</a-input> </a-input>
<a-image <a-image @click="getCaptcha" :preview="false" :width="140" :height="42"
@click="getCaptcha"
:preview="false"
:width="140"
:height="42"
:src="captcha_img" /> :src="captcha_img" />
</a-space> </a-space>
</a-form-item> </a-form-item> -->
<a-form-item> <a-form-item>
<a-button <a-button type="primary" size="large" block :loading="loading" @click="handleLogin">{{
type="primary" $t('pages.login.submit') }}
size="large"
block
:loading="loading"
@click="handleLogin"
>{{ $t('pages.login.submit') }}
</a-button> </a-button>
</a-form-item> </a-form-item>
</a-form> </a-form>
@ -125,7 +101,6 @@ async function handleLogin() {
formRef.value.validate().then(async (values) => { formRef.value.validate().then(async (values) => {
values.captcha_id = captcha_id.value values.captcha_id = captcha_id.value
if (values.password === 'abc-123') values.password = md5(values.password) if (values.password === 'abc-123') values.password = md5(values.password)
loading.value = true loading.value = true
const { success } = await userStore const { success } = await userStore
.login({ .login({

View File

@ -0,0 +1,195 @@
<template>
<a-modal :open="modal.open" :title="modal.title" :width="640" :confirm-loading="modal.confirmLoading"
:after-close="onAfterClose" :cancel-text="cancelText" :ok-text="okText" @ok="handleOk" @cancel="handleCancel">
<a-spin :spinning="spining">
<a-form ref="formRef" :model="formData" :rules="formRules">
<a-card class="mb-8-2">
<a-row :gutter="12">
<a-col :span="24">
<a-form-item :label="'活动标题'" name="title">
<a-input :placeholder="'请输入活动标题'" v-model:value="formData.title"></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'活动内容'" name="activityContent">
<x-editor v-model="formData.activityContent"></x-editor>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item :label="'活动时间'" name="activityTime">
<a-input v-model:value="formData.activityTime" placeholder="请输入活动时间" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item :label="'状态'" name="status">
<a-radio-group v-model:value="formData.status" :options="enumsStatus.getAll()"></a-radio-group>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item :label="'活动图片'" name="cover">
<gx-upload v-model="formData.cover" accept-types=".jpg,.png,.webp"
:fileNumber="1" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item :label="'背景图片'" name="backImg">
<gx-upload v-model="formData.backImg" accept-types=".jpg,.png,.webp"
:fileNumber="1" />
</a-form-item>
</a-col>
</a-row>
</a-card>
</a-form>
</a-spin>
</a-modal>
</template>
<script setup>
import { cloneDeep } from 'lodash-es'
import { ref, onBeforeMount } from 'vue'
import { config } from '@/config'
import apis from '@/apis'
import { useForm, useModal, useSpining } from '@/hooks'
import { message } from 'ant-design-vue'
import { useI18n } from 'vue-i18n'
import dayjs from 'dayjs'
import GxUpload from '@/components/GxUpload/index.vue'
import { spliceUrl } from "@/utils/util"
import { enumsStatus } from '@/enums/index'
const emit = defineEmits(['ok'])
const { t } = useI18n() // t
const { modal, showModal, hideModal, showLoading, hideLoading } = useModal()
const { formRecord, formData, formRef, formRules, resetForm } = useForm()
const { spining, showSpining, hideSpining } = useSpining()
const cancelText = ref(t('button.cancel'))
const okText = ref(t('button.confirm'))
const fileList = ref([])
formRules.value = {
title: [{ required: true, message: '请输入活动名称' }],
activityTime: [{ required: true, message: '请输入活动时间' }],
cover: [{required: false, message: '请上传图片', trigger: 'change'}],
backImg: [{ required: false, message: '请上传图片', trigger: 'change' }],
activityContent:[{ required: true, message: '请输入活动内容' }]
}
onBeforeMount(() => {
})
/**
* 新建
*/
function handleCreate() {
showModal({
type: 'create',
title: '新增活动',
})
// initData()
formData.value.status = 'enabled'
}
/**
* 编辑
*/
async function handleEdit(record = {}) {
showModal({
type: 'edit',
title: '编辑活动',
})
try {
showSpining()
const { data, success } = await apis.activity.getItem(record.id).catch()
if (!success) {
hideModal()
return
}
hideSpining()
formData.value = { ...data }
formData.value.startAt = dayjs(data.startAt)
formData.value.endAt = dayjs(data.endAt)
formData.value.endSignupAt = dayjs(data.endSignupAt)
if (data.images && data.images.length > 0) {
formData.value.fileList = data.images.map(item => config('http.apiBasic') + item)
}
} catch (error) {
message.error({ content: error.message })
hideSpining()
}
}
const uploadSuccess = (data) => {
fileList.value.push(data)
}
/**
* 确定
*/
function handleOk() {
formRef.value.validateFields().then(async (values) => {
try {
showLoading()
const params = {
...values,
cover: formData.value.cover?spliceUrl(formData.value.cover[0]):'',
backImg: formData.value.backImg ? formData.value.backImg.map(item => spliceUrl(item)) : ''
}
let result = null
switch (modal.value.type) {
case 'create':
result = await apis.activity.createProject(params).catch((error) => {
throw new Error(error)
})
break
case 'edit':
result = await apis.activity.updateItem(formData.value.id, params).catch(() => {
throw new Error(error)
})
break
}
hideLoading()
if (config('http.code.success') === result?.success) {
hideModal()
emit('ok')
}
} catch (error) {
message.error({ content: error.message })
hideLoading()
}
})
.catch((e) => {
hideLoading()
})
}
/**
* 取消
*/
function handleCancel() {
formData.value.areaId = 1
hideModal()
}
const onRangeChange = (value, dateString) => {
console.log('value', value)
console.log('Formatted Selected Time: ', dateString);
formData.value.startAt = dayjs(dateString[0])
formData.value.endAt = dayjs(dateString[1])
console.log(formData.value)
};
/**
* 关闭后
*/
function onAfterClose() {
resetForm()
hideLoading()
}
defineExpose({
handleCreate,
handleEdit,
})
</script>
<style lang="less" scoped></style>

View File

@ -0,0 +1,212 @@
<template>
<!-- <x-search-bar class="mb-8-2">
<template #default="{ gutter, colSpan }">
<a-form :model="searchFormData" layout="inline">
<a-row :gutter="gutter">
<a-col v-bind="colSpan">
<a-form-item label="姓名" name="name">
<a-input placeholder="请输入姓名" v-model:value="searchFormData.name"></a-input>
</a-form-item>
</a-col>
<a-col v-bind="colSpan">
<a-form-item label="状态" name="status">
<a-select v-model:value="searchFormData.status" allowClear>
<a-select-option value="">全部</a-select-option>
<a-select-option value="enabled">启用</a-select-option>
<a-select-option value="disabled">停用</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col class="align-right" v-bind="colSpan">
<a-space>
<a-button @click="handleResetSearch">{{ $t('button.reset') }}</a-button>
<a-button ghost type="primary" @click="handleSearch">
{{ $t('button.search') }}
</a-button>
</a-space>
</a-col>
</a-row>
</a-form>
</template>
</x-search-bar> -->
<a-row :gutter="8" :wrap="false">
<a-col flex="auto">
<a-card type="flex">
<x-action-bar class="mb-8-2">
<a-button type="primary" @click="$refs.editDialogRef.handleCreate()">
<template #icon>
<plus-outlined></plus-outlined>
</template>
新增活动
</a-button>
</x-action-bar>
<a-table :columns="columns" :data-source="listData" bordered="true" :loading="loading"
:pagination="paginationState" :scroll="{ x: 1000 }" @change="onTableChange">
<template #bodyCell="{ column, record }">
<template v-if="column.dataIndex === 'cover'">
<img :src="config('http.apiConfig')+record.cover" alt="" srcset="">
</template>
<template v-if="column.dataIndex === 'content'">
<span style="cursor: pointer;color:#1677ff;" @click="content = record.content || ''; type = 2; open = true" type="link">点击查看</span>
</template>
<template v-if="'status' === column.dataIndex">
<a-tag :color="enumsStatus.getColor(record.status)">{{enumsStatus.getName(record.status)}}</a-tag>
</template>
<template v-if="'action' === column.key">
<x-action-button @click="$refs.editDialogRef.handleEdit(record)">
<a-tooltip>
<template #title> {{ $t('pages.system.user.edit') }}</template>
<edit-outlined /> </a-tooltip></x-action-button>
<x-action-button @click="handleDelete(record)">
<a-tooltip>
<template #title>{{ $t('pages.system.delete') }}</template>
<delete-outlined style="color: #ff4d4f" /> </a-tooltip></x-action-button>
</template>
</template>
</a-table>
</a-card>
</a-col>
</a-row>
<a-modal v-model:open="open" :title="type === 1 ? '活动图片' : '活动详情'" @ok="open = false">
<template v-if="type === 1">
<a-image v-if="imgList.length > 0" :width="200" v-for="item of imgList"
:src="config('http.apiBasic') + item" />
<span v-else>
暂无图片
</span>
</template>
<template v-else>
<span>{{ content }}</span>
</template>
</a-modal>
<edit-dialog ref="editDialogRef" @ok="onOk"></edit-dialog>
</template>
<script setup>
import { message, Modal } from 'ant-design-vue'
import { ref } from 'vue'
import apis from '@/apis'
import { formatUtcDateTime } from '@/utils/util'
import { config } from '@/config'
import dayjs from 'dayjs'
import { usePagination } from '@/hooks'
import EditDialog from './components/EditDialog.vue'
import { PlusOutlined, EditOutlined, DeleteOutlined, QrcodeOutlined } from '@ant-design/icons-vue'
import { useI18n } from 'vue-i18n'
import { enumsStatus } from '@/enums/index.js'
defineOptions({
name: 'activity',
})
const { t } = useI18n() // t
const open = ref(false)
const imgList = ref([])
const type = ref(1)
const columns = [
{ title: '活动标题', dataIndex: 'title'},
{ title: '活动时间', dataIndex: 'activityTime',align: 'center' },
{ title: '活动内容', dataIndex: 'activityContent',align: 'center' },
{ title: '活动封面', dataIndex: 'cover', align: 'center', width: 100 },
{ title: t('button.action'), key: 'action', fixed: 'right', width: 150, align: 'center' },
]
const { listData, loading, showLoading, hideLoading, paginationState, resetPagination, searchFormData } =
usePagination()
const editDialogRef = ref()
getPageList()
/**
* 获取表格数据
* @returns {Promise<void>}
*/
async function getPageList() {
try {
showLoading()
const { pageSize, current } = paginationState
const { success, data, total } = await apis.activity
.getProjectList({
pageSize,
current: current,
...searchFormData.value,
})
.catch(() => {
throw new Error()
})
hideLoading()
if (config('http.code.success') === success) {
listData.value = data
paginationState.total = total
}
} catch (error) {
hideLoading()
}
}
/**
* 删除
*/
function handleDelete({ id }) {
Modal.confirm({
title: t('pages.system.user.delTip'),
content: t('button.confirm'),
okText: t('button.confirm'),
onOk: () => {
return new Promise((resolve, reject) => {
; (async () => {
try {
const { success } = await apis.activity.delItem(id).catch(() => {
throw new Error()
})
if (config('http.code.success') === success) {
resolve()
message.success(t('component.message.success.delete'))
await getPageList()
}
} catch (error) {
reject()
}
})()
})
},
})
}
/**
* 分页
*/
function onTableChange({ current, pageSize }) {
paginationState.current = current
paginationState.pageSize = pageSize
getPageList()
}
/**
* 搜索
*/
function handleSearch() {
resetPagination()
getPageList()
}
/**
* 重置
*/
function handleResetSearch() {
searchFormData.value = {}
resetPagination()
getPageList()
}
/**
* 编辑完成
*/
async function onOk() {
await getPageList()
}
</script>
<style lang="less" scoped></style>

View File

@ -0,0 +1,206 @@
<template>
<a-modal :open="modal.open" :title="modal.title" :width="640" :confirm-loading="modal.confirmLoading"
:after-close="onAfterClose" :cancel-text="cancelText" :ok-text="okText" @ok="handleOk" @cancel="handleCancel">
<a-spin :spinning="spining">
<a-form ref="formRef" :model="formData" :rules="formRules" :label-col="{ style: { width: '90px' } }">
<a-card class="mb-8-2">
<a-row :gutter="24">
<a-col :span="24">
<a-form-item label="公告标题" name="title">
<a-input placeholder="请输入标题" v-model:value="formData.title"></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item label="创建时间" name="createdAt">
<a-date-picker v-model:value="formData.createdAt" placeholder="请选择发布时间"
style="width: 100%;" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item label="排序" name="sequence">
<a-input-number v-model:value="formData.sequence" style="width: 100%;" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item :label="'状态'" name="status">
<a-radio-group v-model:value="formData.status" :options="enumsStatus.getAll()"></a-radio-group>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'公告内容'" name="desc">
<x-editor v-model="formData.desc" :uploadHandler="uploadHandler" :height="350"></x-editor>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'公告封面'" name="img">
<gx-upload v-model="formData.img" :fileNumber="1"></gx-upload>
</a-form-item>
</a-col>
</a-row>
</a-card>
</a-form>
</a-spin>
</a-modal>
</template>
<script setup>
import { cloneDeep } from 'lodash-es'
import { ref } from 'vue'
import { config } from '@/config'
import apis from '@/apis'
import { useForm, useModal, useSpining } from '@/hooks'
import { message } from 'ant-design-vue'
import { useI18n } from 'vue-i18n'
import dayjs from 'dayjs'
import { enumsStatus } from '@/enums/index'
import {spliceUrl} from '@/utils/util'
const emit = defineEmits(['ok'])
const { t } = useI18n() // t
const { modal, showModal, hideModal, showLoading, hideLoading } = useModal()
const { formRecord, formData, formRef, formRules, resetForm } = useForm()
const cancelText = ref(t('button.cancel'))
const okText = ref(t('button.confirm'))
const rolesValue = ref([])
const roles = ref([])
const { spining, showSpining, hideSpining } = useSpining()
formRules.value = {
title: { required: true, message: '请输入标题' },
desc: { required: true, message: '请输入内容' },
sequence: { required: true, message: '请选择排序' },
status: { required: true, message: '请选择是否启用' },
createdAt: { required: true, message: '请选择创建时间' },
img:{required: false, message: '请上传封面'}
}
/**
* 新建
*/
function handleCreate() {
showModal({
type: 'create',
title: '新增',
})
formData.value.status = 0
}
/**
* 编辑
*/
async function handleEdit(record = {}) {
try {
showModal({ type: 'edit', title: '修改公告信息' })
showSpining()
const { data, success } = await apis.announcement.getNotices(record.id).catch()
if (!success) {
hideModal()
return
}
hideSpining()
formData.value = { ...data }
formData.value.createdAt = dayjs(data.createdAt)
formData.value.img=formData.value.img?[config('http.apiBasic')+formData.value.img]:[]
} catch (error) {
message.error(error.message)
}
}
/**
* 确定
*/
function handleOk() {
console.log(formData.value)
formRef.value
.validateFields()
.then(async (values) => {
console.log(2222)
try {
showLoading()
const params = {
...values,
img:formData.value.img?spliceUrl(formData.value.img[0]):''
}
console.log(params);
let result = null
switch (modal.value.type) {
case 'create':
result = await apis.announcement.createNotices(params).catch(() => {
throw new Error()
})
break
case 'edit':
result = await apis.announcement.updateNotices(formData.value.id, params).catch(() => {
throw new Error()
})
break
}
hideLoading()
if (config('http.code.success') === result?.success) {
hideModal()
emit('ok')
message.success(modal.value.type === 'create' ? '创建成功' : '更新成功')
}
} catch (error) {
hideLoading()
}
})
.catch(() => {
hideLoading()
})
}
/**
* 对权限组 过数据格式
*/
function formatArr(data, type = '') {
const rolesArr = []
data.forEach((item) => {
roles.value.forEach((r) => {
if (type === 'edit') {
if (item.role_id === r.value) {
rolesArr.push({
value: item.role_id,
label: r.label,
})
return
}
} else if (r.value === item) {
rolesArr.push({
role_id: item,
role_name: r.label,
})
return
}
})
})
return rolesArr
}
const uploadHandler = async (file) => {
const formData = new FormData();
formData.append('file', file);
const { data } = await apis.common.uploadImg(formData);
return config('http.apiBasic') + data
}
/**
* 取消
*/
function handleCancel() {
hideModal()
}
/**
* 关闭后
*/
function onAfterClose() {
resetForm()
hideLoading()
}
defineExpose({
handleCreate,
handleEdit,
})
</script>
<style lang="less" scoped></style>

View File

@ -0,0 +1,200 @@
<template>
<x-search-bar class="mb-8-2">
<template #default="{ gutter, colSpan }">
<a-form :model="searchFormData" layout="inline">
<a-row :gutter="gutter">
<a-col v-bind="colSpan">
<a-form-item label="标题" name="title">
<a-input placeholder="请输入标题" v-model:value="searchFormData.title"></a-input>
</a-form-item>
</a-col>
<a-col v-bind="colSpan">
<a-form-item :label="'状态'" name="status">
<a-input :placeholder="'请输入状态'" v-model:value="searchFormData.status"></a-input>
</a-form-item>
</a-col>
<a-col class="align-right" v-bind="colSpan">
<a-space>
<a-button @click="handleResetSearch">{{ $t('button.reset') }}</a-button>
<a-button ghost type="primary" @click="handleSearch">
{{ $t('button.search') }}
</a-button>
</a-space>
</a-col>
</a-row>
</a-form>
</template>
</x-search-bar>
<a-row :gutter="8" :wrap="false">
<a-col flex="auto">
<a-card type="flex">
<x-action-bar class="mb-8-2">
<a-button v-action="'add'" type="primary" @click="$refs.addDialogRef.handleCreate()">
<template #icon>
<plus-outlined></plus-outlined>
</template>
新增
</a-button>
</x-action-bar>
<a-table :columns="columns" :data-source="listData" :loading="loading" bordered="true"
:pagination="paginationState" :scroll="{ x: 1000 }" @change="onTableChange">
<template #bodyCell="{ column, record }">
<template v-if=" column.dataIndex === 'img'">
<a-image :width="60" :src="record.img?config('http.apiBasic')+record.img:errImg" />
</template>
<template v-if="'status' === column.dataIndex">
<a-tag :color="enumsStatus.getColor(record.status)">{{ enumsStatus.getName(record.status) }}</a-tag>
</template>
<template v-if="'createdAt' === column.dataIndex">
{{ dayjs(record.createdAt).format('YYYY-MM-DD') }}
</template>
<template v-if="'desc' === column.dataIndex">
<p v-html="record.desc"></p>
</template>
<template v-if="'action' === column.key">
<x-action-button @click="$refs.addDialogRef.handleEdit(record)">
<a-tooltip>
<template #title> {{ '编辑公告' }}</template>
<edit-outlined />
</a-tooltip>
</x-action-button>
<x-action-button @click="handleRemove(record)">
<a-tooltip>
<template #title> {{ '删除公告' }}</template>
<delete-outlined style="color: #ff4d4f" />
</a-tooltip>
</x-action-button>
</template>
</template>
</a-table>
</a-card>
</a-col>
</a-row>
<add-dialog ref="addDialogRef" @ok="onOk"></add-dialog>
</template>
<script setup>
import { message, Modal } from 'ant-design-vue'
import { ref } from 'vue'
import apis from '@/apis'
import { config } from '@/config'
import { enumsStatus } from '@/enums/index.js'
import { usePagination } from '@/hooks'
import AddDialog from './components/AddDialog.vue'
import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons-vue'
import { useI18n } from 'vue-i18n'
import dayjs from 'dayjs'
import errImg from '@/assets/blankSpace.png'
defineOptions({
name: 'systemRole',
})
const { t } = useI18n() // t
const columns = [
{ title: '封面', dataIndex: 'img', key: 'img',with:60,align:'center'},
{ title: '标题', dataIndex: 'title', key: 'title', ellipsis: true },
{ title: '内容', dataIndex: 'desc', ellipsis: true },
{ title: '排序', dataIndex: 'sequence', width: 80, align: 'center' },
{ title: '状态', key: 'status', dataIndex: 'status', width: 120, align: 'center' },
{ title: '创建时间', dataIndex: 'createdAt', width: 200, align: 'center' },
{ title: t('button.action'), key: 'action', fixed: 'right', width: 100, align: 'center' },
]
const { listData, loading, showLoading, hideLoading, paginationState, searchFormData, resetPagination } =
usePagination()
// const { resetForm } = useForm()
const addDialogRef = ref()
getPageList()
/**
* 获取公公告列表
* @returns {Promise<void>}
*/
async function getPageList() {
try {
showLoading()
const { pageSize, current } = paginationState
const { success, data, total } = await apis.announcement
.getNoticesList({
pageSize,
current: current,
...searchFormData.value,
})
.catch(() => {
throw new Error()
})
hideLoading()
if (config('http.code.success') === success) {
listData.value = data
paginationState.total = total
}
} catch (error) {
hideLoading()
}
}
/**
* 移除
*/
function handleRemove({ id }) {
Modal.confirm({
title: t('pages.system.role.delTip'),
content: t('button.confirm'),
okText: t('button.confirm'),
onOk: () => {
return new Promise((resolve, reject) => {
; (async () => {
try {
const { success } = await apis.announcement.delNotices(id).catch(() => {
throw new Error()
})
if (config('http.code.success') === success) {
resolve()
message.success(t('component.message.success.delete'))
await getPageList()
}
} catch (error) {
reject()
}
})()
})
},
})
}
/**
* 分页
*/
function onTableChange({ current, pageSize }) {
paginationState.current = current
paginationState.pageSize = pageSize
getPageList()
}
/**
* 重置
*/
function handleResetSearch() {
searchFormData.value = {}
resetPagination()
getPageList()
}
/**
* 搜索
*/
function handleSearch() {
resetPagination()
getPageList()
}
/**
* 编辑完成
*/
async function onOk() {
await getPageList()
}
</script>
<style lang="less" scoped></style>

View File

@ -0,0 +1,190 @@
<template>
<a-modal :open="modal.open" :title="modal.title" :width="640" :confirm-loading="modal.confirmLoading"
:after-close="onAfterClose" :cancel-text="cancelText" :ok-text="okText" @ok="handleOk" @cancel="handleCancel">
<a-spin :spinning="spining">
<a-form ref="formRef" :model="formData" :rules="formRules">
<a-card class="mb-8-2">
<a-row :gutter="12">
<a-col :span="24">
<a-form-item :label="'名称'" name="title">
<a-input :placeholder="'请输入名称'" v-model:value="formData.title"></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'顺序'" name="sequence">
<a-input-number :placeholder="'请输入顺序'" v-model:value="formData.sequence" style="width: 100%;"></a-input-number>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'状态'" name="status">
<a-form-item :label="'状态'" name="status">
<a-radio-group v-model:value="formData.status" :options="enumsStatus.getAll()"></a-radio-group>
</a-form-item>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'图片'" name="img">
<gx-upload v-model="formData.img" :fileNumber="1" />
</a-form-item>
</a-col>
</a-row>
</a-card>
</a-form>
</a-spin>
</a-modal>
</template>
<script setup>
import { cloneDeep } from 'lodash-es'
import { ref } from 'vue'
import { config } from '@/config'
import apis from '@/apis'
import { useForm, useModal, useSpining } from '@/hooks'
import { message } from 'ant-design-vue'
import { useI18n } from 'vue-i18n'
import dayjs from 'dayjs'
import { createMenu, getMenu, updateMenu } from '@/apis/modules/imgmgt'
import {spliceUrl} from '@/utils/util'
const emit = defineEmits(['ok'])
const { t } = useI18n() // t
const { modal, showModal, hideModal, showLoading, hideLoading } = useModal()
const { formRecord, formData, formRef, formRules, resetForm } = useForm()
const { spining, showSpining, hideSpining } = useSpining()
const cancelText = ref(t('button.cancel'))
const okText = ref(t('button.confirm'))
const rolesValue = ref([])
const roles = ref([])
const img = ref('')
formRules.value = {
title: { required: true, message: '请输入名称' },
status: [{ required: true, message: '请选择状态', trigger: 'change' }],
sequence: [{ required: true, message: '请选择顺序', trigger: 'change' }],
img: [{ required: true, message: '请上传图片', trigger: 'change' }],
}
/**
* 新建
*/
function handleCreate() {
showModal({
type: 'create',
// 80about
title: '添加',
})
formData.value.status = 0
}
/**
* 编辑
*/
async function handleEdit(record = {}) {
showModal({
type: 'edit',
title: t('pages.system.user.edit'),
})
showSpining()
const { data, success } = await apis.imgmgt.getMenu(record.id).catch()
if (!success) {
hideModal()
return
}
hideSpining()
formData.value = { ...data }
formData.value.img=[config('http.apiBasic')+data.img]
}
/**
* 确定
*/
function handleOk() {
if (!formData.value.img) return message.error('请上传图片');
formRef.value.validateFields().then(async (values) => {
console.log(values)
try {
showLoading()
const params = {
...values,
img: spliceUrl(formData.value?.img[0]),
type: 'homeBanner' ,
}
let result = null
switch (modal.value.type) {
case 'create':
result = await apis.imgmgt.createMenu(params).catch(() => {
throw new Error()
})
break
case 'edit':
// result = await apis.imgmgt.updateMenu(formData.value.id, params).catch(() => {
result = await apis.imgmgt.updateMenu(formData.value.id, params).catch(() => {
throw new Error()
})
break
}
hideLoading()
if (config('http.code.success') === result?.success) {
hideModal()
emit('ok')
}
} catch (error) {
console.log(error)
hideLoading()
}
})
.catch((e) => {
console.log(e)
hideLoading()
})
}
/**
* 对权限组 过数据格式
*/
function formatArr(data, type = '') {
const rolesArr = []
data.forEach((item) => {
roles.value.forEach((r) => {
if (type === 'edit') {
if (item.role_id === r.value) {
rolesArr.push({
value: item.role_id,
label: r.label,
})
return
}
} else if (r.value === item) {
rolesArr.push({
role_id: item,
role_name: r.label,
})
return
}
})
})
return rolesArr
}
/**
* 取消
*/
function handleCancel() {
img.value = ''
hideModal()
}
/**
* 关闭后
*/
function onAfterClose() {
resetForm()
hideLoading()
}
defineExpose({
handleCreate,
handleEdit,
})
</script>
<style lang="less" scoped></style>

View File

@ -0,0 +1,193 @@
<template>
<x-search-bar class="mb-8-2">
<template #default="{ gutter, colSpan }">
<a-form :label-col="{ style: { width: '40px' } }" :model="searchFormData" layout="inline">
<a-row :gutter="gutter">
<a-col v-bind="colSpan">
<a-form-item label="名称" name="name">
<a-input placeholder="请输入图片名称" v-model:value="searchFormData.name"></a-input>
</a-form-item>
</a-col>
<a-col v-bind="colSpan">
<a-form-item label="状态" name="status">
<a-select v-model:value="searchFormData.status" allowClear>
<a-select-option value="">全部</a-select-option>
<a-select-option value="enabled">启用</a-select-option>
<a-select-option value="disabled">停用</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col class="align-right" v-bind="colSpan">
<a-space>
<a-button @click="handleResetSearch">{{ $t('button.reset') }}</a-button>
<a-button ghost type="primary" @click="handleSearch">
{{ $t('button.search') }}
</a-button>
</a-space>
</a-col>
</a-row>
</a-form>
</template>
</x-search-bar>
<a-row :gutter="8" :wrap="false">
<a-col flex="auto">
<a-card type="flex">
<x-action-bar class="mb-8-2">
<a-button type="primary" @click="$refs.editDialogRef.handleCreate()">
<template #icon>
<plus-outlined></plus-outlined>
</template>
新增
</a-button>
</x-action-bar>
<a-table :columns="columns" :data-source="listData" bordered="true" :loading="loading"
:pagination="paginationState" :scroll="{ x: 1000 }" @change="onTableChange">
<template #bodyCell="{ column, record }">
<template v-if="'img' === column.dataIndex">
<a-image :width="60" :src="record.img?config('http.apiBasic')+record.img:errImg" />
</template>
<template v-if="'status' === column.dataIndex">
<a-tag :color="enumsStatus.getColor(record.status)">{{ enumsStatus.getName(record.status) }}</a-tag>
</template>
<template v-if="'action' === column.key">
<x-action-button @click="$refs.editDialogRef.handleEdit(record)">
<a-tooltip>
<template #title> {{ $t('pages.system.user.edit') }}</template>
<edit-outlined /> </a-tooltip></x-action-button>
<x-action-button @click="handleDelete(record)">
<a-tooltip>
<template #title>{{ $t('pages.system.delete') }}</template>
<delete-outlined style="color: #ff4d4f" /> </a-tooltip></x-action-button>
</template>
</template>
</a-table>
</a-card>
</a-col>
</a-row>
<edit-dialog ref="editDialogRef" @ok="onOk"></edit-dialog>
</template>
<script setup>
import { message, Modal } from 'ant-design-vue'
import { ref } from 'vue'
import apis from '@/apis'
import { formatUtcDateTime } from '@/utils/util'
import { config } from '@/config'
import { statusUserTypeEnum } from '@/enums/system'
import { usePagination } from '@/hooks'
import errImg from '@/assets/blankSpace.png'
import EditDialog from './components/EditDialog.vue'
import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons-vue'
import { useI18n } from 'vue-i18n'
import { delMenu, getDataList } from '@/apis/modules/imgmgt'
import { enumsStatus } from '@/enums/index.js'
defineOptions({
name: 'homeBanner',
})
const { t } = useI18n() // t
const columns = [
{ title: '图片', dataIndex: 'img', width: 100, align: 'center' },
{ title: '名称', dataIndex: 'title', key: 'name' },
{ title: '状态', dataIndex: 'status', width: 120, align: 'center' },
{ title: '顺序', dataIndex: 'sequence', width: 100, align: 'center' },
{ title: t('button.action'), key: 'action', fixed: 'right', width: 100, align: 'center' },
]
const { listData, loading, showLoading, hideLoading, paginationState, resetPagination, searchFormData } = usePagination()
const editDialogRef = ref()
getPageList()
/**
* 获取用户列表
* @returns {Promise<void>}
*/
async function getPageList() {
try {
showLoading()
const { pageSize, current } = paginationState
const { success, data, total } = await apis.imgmgt
.getDataList({
pageSize,
current:current,
type: 'homeBanner',
...searchFormData.value,
})
.catch(() => {
throw new Error()
})
hideLoading()
if (config('http.code.success') === success) {
//type80about
listData.value = data
paginationState.total = total
}
} catch (error) {
hideLoading()
}
}
/**
* 删除
*/
function handleDelete({ id }) {
Modal.confirm({
title: t('pages.system.user.delTip'),
content: t('button.confirm'),
okText: t('button.confirm'),
onOk: () => {
return new Promise((resolve, reject) => {
; (async () => {
try {
const { success } = await apis.imgmgt.delMenu(id).catch(() => {
throw new Error()
})
if (config('http.code.success') === success) {
resolve()
message.success(t('component.message.success.delete'))
await getPageList()
}
} catch (error) {
reject()
}
})()
})
},
})
}
/**
* 分页
*/
function onTableChange({ current, pageSize }) {
paginationState.current = current
paginationState.pageSize = pageSize
getPageList()
}
/**
* 搜索
*/
function handleSearch() {
resetPagination()
getPageList()
}
/**
* 重置
*/
function handleResetSearch() {
searchFormData.value = {}
resetPagination()
getPageList()
}
/**
* 编辑完成
*/
async function onOk() {
await getPageList()
}
</script>
<style lang="less" scoped></style>

View File

@ -0,0 +1,163 @@
<template>
<a-modal :open="modal.open" :title="modal.title" :width="640" :confirm-loading="modal.confirmLoading"
:after-close="onAfterClose" :cancel-text="cancelText" :ok-text="okText" @ok="handleOk" @cancel="handleCancel">
<a-spin :spinning="spining">
<a-form ref="formRef" :model="formData" :rules="formRules">
<a-card class="mb-8-2">
<a-row :gutter="12">
<a-col :span="24">
<a-form-item :label="'名称'" name="title">
<a-input :placeholder="'请输入名称'" v-model:value="formData.title"></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'顺序'" name="sequence">
<a-input-number :placeholder="'请输入顺序'" v-model:value="formData.sequence" style="width: 100%;"></a-input-number>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'状态'" name="status">
<a-form-item :label="'状态'" name="status">
<a-radio-group v-model:value="formData.status" :options="enumsStatus.getAll()"></a-radio-group>
</a-form-item>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'图片'" name="img">
<gx-upload v-model="formData.img" :fileNumber="1" />
</a-form-item>
</a-col>
</a-row>
</a-card>
</a-form>
</a-spin>
</a-modal>
</template>
<script setup>
import { cloneDeep } from 'lodash-es'
import { ref } from 'vue'
import { config } from '@/config'
import apis from '@/apis'
import { useForm, useModal, useSpining } from '@/hooks'
import { message } from 'ant-design-vue'
import { useI18n } from 'vue-i18n'
import dayjs from 'dayjs'
import { createMenu, getMenu, updateMenu } from '@/apis/modules/imgmgt'
import {spliceUrl} from '@/utils/util'
const emit = defineEmits(['ok'])
const { t } = useI18n() // t
const { modal, showModal, hideModal, showLoading, hideLoading } = useModal()
const { formRecord, formData, formRef, formRules, resetForm } = useForm()
const { spining, showSpining, hideSpining } = useSpining()
const cancelText = ref(t('button.cancel'))
const okText = ref(t('button.confirm'))
const rolesValue = ref([])
const roles = ref([])
const img = ref('')
formRules.value = {
title: { required: true, message: '请输入名称' },
status: [{ required: true, message: '请选择状态', trigger: 'change' }],
sequence: [{ required: true, message: '请选择顺序', trigger: 'change' }],
img: [{ required: true, message: '请上传图片', trigger: 'change' }],
}
/**
* 新建
*/
function handleCreate() {
showModal({
type: 'create',
// 80about
title: '添加',
})
formData.value.status = 0
}
/**
* 编辑
*/
async function handleEdit(record = {}) {
showModal({
type: 'edit',
title: t('pages.system.user.edit'),
})
showSpining()
const { data, success } = await apis.imgmgt.getMenu(record.id).catch()
if (!success) {
hideModal()
return
}
hideSpining()
formData.value = { ...data }
formData.value.img=[config('http.apiBasic')+data.img]
}
/**
* 确定
*/
function handleOk() {
if (!formData.value.img) return message.error('请上传图片');
formRef.value.validateFields().then(async (values) => {
console.log(values)
try {
showLoading()
const params = {
...values,
img: spliceUrl(formData.value?.img[0]),
type: 'neighborhoodBanner' ,
}
let result = null
switch (modal.value.type) {
case 'create':
result = await apis.imgmgt.createMenu(params).catch(() => {
throw new Error()
})
break
case 'edit':
// result = await apis.imgmgt.updateMenu(formData.value.id, params).catch(() => {
result = await apis.imgmgt.updateMenu(formData.value.id, params).catch(() => {
throw new Error()
})
break
}
hideLoading()
if (config('http.code.success') === result?.success) {
hideModal()
emit('ok')
}
} catch (error) {
console.log(error)
hideLoading()
}
})
.catch((e) => {
console.log(e)
hideLoading()
})
}
/**
* 取消
*/
function handleCancel() {
formData.value.img=['']
hideModal()
}
/**
* 关闭后
*/
function onAfterClose() {
resetForm()
hideLoading()
}
defineExpose({
handleCreate,
handleEdit,
})
</script>
<style lang="less" scoped></style>

View File

@ -0,0 +1,193 @@
<template>
<x-search-bar class="mb-8-2">
<template #default="{ gutter, colSpan }">
<a-form :label-col="{ style: { width: '40px' } }" :model="searchFormData" layout="inline">
<a-row :gutter="gutter">
<a-col v-bind="colSpan">
<a-form-item label="名称" name="name">
<a-input placeholder="请输入图片名称" v-model:value="searchFormData.name"></a-input>
</a-form-item>
</a-col>
<a-col v-bind="colSpan">
<a-form-item label="状态" name="status">
<a-select v-model:value="searchFormData.status" allowClear>
<a-select-option value="">全部</a-select-option>
<a-select-option value="enabled">启用</a-select-option>
<a-select-option value="disabled">停用</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col class="align-right" v-bind="colSpan">
<a-space>
<a-button @click="handleResetSearch">{{ $t('button.reset') }}</a-button>
<a-button ghost type="primary" @click="handleSearch">
{{ $t('button.search') }}
</a-button>
</a-space>
</a-col>
</a-row>
</a-form>
</template>
</x-search-bar>
<a-row :gutter="8" :wrap="false">
<a-col flex="auto">
<a-card type="flex">
<x-action-bar class="mb-8-2">
<a-button type="primary" @click="$refs.editDialogRef.handleCreate()">
<template #icon>
<plus-outlined></plus-outlined>
</template>
新增
</a-button>
</x-action-bar>
<a-table :columns="columns" :data-source="listData" bordered="true" :loading="loading"
:pagination="paginationState" :scroll="{ x: 1000 }" @change="onTableChange">
<template #bodyCell="{ column, record }">
<template v-if="'img' === column.dataIndex">
<a-image :width="60" :src="record.img?config('http.apiBasic')+record.img:errImg" />
</template>
<template v-if="'status' === column.dataIndex">
<a-tag :color="enumsStatus.getColor(record.status)">{{ enumsStatus.getName(record.status) }}</a-tag>
</template>
<template v-if="'action' === column.key">
<x-action-button @click="$refs.editDialogRef.handleEdit(record)">
<a-tooltip>
<template #title> {{ $t('pages.system.user.edit') }}</template>
<edit-outlined /> </a-tooltip></x-action-button>
<x-action-button @click="handleDelete(record)">
<a-tooltip>
<template #title>{{ $t('pages.system.delete') }}</template>
<delete-outlined style="color: #ff4d4f" /> </a-tooltip></x-action-button>
</template>
</template>
</a-table>
</a-card>
</a-col>
</a-row>
<edit-dialog ref="editDialogRef" @ok="onOk"></edit-dialog>
</template>
<script setup>
import { message, Modal } from 'ant-design-vue'
import { ref } from 'vue'
import apis from '@/apis'
import { formatUtcDateTime } from '@/utils/util'
import { config } from '@/config'
import { statusUserTypeEnum } from '@/enums/system'
import { usePagination } from '@/hooks'
import errImg from '@/assets/blankSpace.png'
import EditDialog from './components/EditDialog.vue'
import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons-vue'
import { useI18n } from 'vue-i18n'
import { delMenu, getDataList } from '@/apis/modules/imgmgt'
import { enumsStatus } from '@/enums/index.js'
defineOptions({
name: 'nbdMa',
})
const { t } = useI18n() // t
const columns = [
{ title: '图片', dataIndex: 'img', width: 100, align: 'center' },
{ title: '名称', dataIndex: 'title', key: 'name' },
{ title: '状态', dataIndex: 'status', width: 120, align: 'center' },
{ title: '顺序', dataIndex: 'sequence', width: 100, align: 'center' },
{ title: t('button.action'), key: 'action', fixed: 'right', width: 100, align: 'center' },
]
const { listData, loading, showLoading, hideLoading, paginationState, resetPagination, searchFormData } = usePagination()
const editDialogRef = ref()
getPageList()
/**
* 获取用户列表
* @returns {Promise<void>}
*/
async function getPageList() {
try {
showLoading()
const { pageSize, current } = paginationState
const { success, data, total } = await apis.imgmgt
.getDataList({
pageSize,
current:current,
type: 'neighborhoodBanner',
...searchFormData.value,
})
.catch(() => {
throw new Error()
})
hideLoading()
if (config('http.code.success') === success) {
//type80about
listData.value = data
paginationState.total = total
}
} catch (error) {
hideLoading()
}
}
/**
* 删除
*/
function handleDelete({ id }) {
Modal.confirm({
title: t('pages.system.user.delTip'),
content: t('button.confirm'),
okText: t('button.confirm'),
onOk: () => {
return new Promise((resolve, reject) => {
; (async () => {
try {
const { success } = await apis.imgmgt.delMenu(id).catch(() => {
throw new Error()
})
if (config('http.code.success') === success) {
resolve()
message.success(t('component.message.success.delete'))
await getPageList()
}
} catch (error) {
reject()
}
})()
})
},
})
}
/**
* 分页
*/
function onTableChange({ current, pageSize }) {
paginationState.current = current
paginationState.pageSize = pageSize
getPageList()
}
/**
* 搜索
*/
function handleSearch() {
resetPagination()
getPageList()
}
/**
* 重置
*/
function handleResetSearch() {
searchFormData.value = {}
resetPagination()
getPageList()
}
/**
* 编辑完成
*/
async function onOk() {
await getPageList()
}
</script>
<style lang="less" scoped></style>

View File

@ -0,0 +1,163 @@
<template>
<a-modal :open="modal.open" :title="modal.title" :width="640" :confirm-loading="modal.confirmLoading"
:after-close="onAfterClose" :cancel-text="cancelText" :ok-text="okText" @ok="handleOk" @cancel="handleCancel">
<a-spin :spinning="spining">
<a-form ref="formRef" :model="formData" :rules="formRules">
<a-card class="mb-8-2">
<a-row :gutter="12">
<a-col :span="24">
<a-form-item :label="'名称'" name="title">
<a-input :placeholder="'请输入名称'" v-model:value="formData.title"></a-input>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'顺序'" name="sequence">
<a-input-number :placeholder="'请输入顺序'" v-model:value="formData.sequence" style="width: 100%;"></a-input-number>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'状态'" name="status">
<a-form-item :label="'状态'" name="status">
<a-radio-group v-model:value="formData.status" :options="enumsStatus.getAll()"></a-radio-group>
</a-form-item>
</a-form-item>
</a-col>
<a-col :span="24">
<a-form-item :label="'图片'" name="img">
<gx-upload v-model="formData.img" :fileNumber="1" />
</a-form-item>
</a-col>
</a-row>
</a-card>
</a-form>
</a-spin>
</a-modal>
</template>
<script setup>
import { cloneDeep } from 'lodash-es'
import { ref } from 'vue'
import { config } from '@/config'
import apis from '@/apis'
import { useForm, useModal, useSpining } from '@/hooks'
import { message } from 'ant-design-vue'
import { useI18n } from 'vue-i18n'
import dayjs from 'dayjs'
import { createMenu, getMenu, updateMenu } from '@/apis/modules/imgmgt'
import {spliceUrl} from '@/utils/util'
const emit = defineEmits(['ok'])
const { t } = useI18n() // t
const { modal, showModal, hideModal, showLoading, hideLoading } = useModal()
const { formRecord, formData, formRef, formRules, resetForm } = useForm()
const { spining, showSpining, hideSpining } = useSpining()
const cancelText = ref(t('button.cancel'))
const okText = ref(t('button.confirm'))
const rolesValue = ref([])
const roles = ref([])
const img = ref('')
formRules.value = {
title: { required: true, message: '请输入名称' },
status: [{ required: true, message: '请选择状态', trigger: 'change' }],
sequence: [{ required: true, message: '请选择顺序', trigger: 'change' }],
img: [{ required: true, message: '请上传图片', trigger: 'change' }],
}
/**
* 新建
*/
function handleCreate() {
showModal({
type: 'create',
// 80about
title: '添加',
})
formData.value.status = 0
}
/**
* 编辑
*/
async function handleEdit(record = {}) {
showModal({
type: 'edit',
title: t('pages.system.user.edit'),
})
showSpining()
const { data, success } = await apis.imgmgt.getMenu(record.id).catch()
if (!success) {
hideModal()
return
}
hideSpining()
formData.value = { ...data }
formData.value.img=[config('http.apiBasic')+data.img]
}
/**
* 确定
*/
function handleOk() {
if (!formData.value.img) return message.error('请上传图片');
formRef.value.validateFields().then(async (values) => {
console.log(values)
try {
showLoading()
const params = {
...values,
img: spliceUrl(formData.value?.img[0]),
type: 'neighborhoodBanner' ,
}
let result = null
switch (modal.value.type) {
case 'create':
result = await apis.imgmgt.createMenu(params).catch(() => {
throw new Error()
})
break
case 'edit':
// result = await apis.imgmgt.updateMenu(formData.value.id, params).catch(() => {
result = await apis.imgmgt.updateMenu(formData.value.id, params).catch(() => {
throw new Error()
})
break
}
hideLoading()
if (config('http.code.success') === result?.success) {
hideModal()
emit('ok')
}
} catch (error) {
console.log(error)
hideLoading()
}
})
.catch((e) => {
console.log(e)
hideLoading()
})
}
/**
* 取消
*/
function handleCancel() {
formData.value.img=['']
hideModal()
}
/**
* 关闭后
*/
function onAfterClose() {
resetForm()
hideLoading()
}
defineExpose({
handleCreate,
handleEdit,
})
</script>
<style lang="less" scoped></style>

View File

@ -0,0 +1,193 @@
<template>
<x-search-bar class="mb-8-2">
<template #default="{ gutter, colSpan }">
<a-form :label-col="{ style: { width: '40px' } }" :model="searchFormData" layout="inline">
<a-row :gutter="gutter">
<a-col v-bind="colSpan">
<a-form-item label="名称" name="name">
<a-input placeholder="请输入图片名称" v-model:value="searchFormData.name"></a-input>
</a-form-item>
</a-col>
<a-col v-bind="colSpan">
<a-form-item label="状态" name="status">
<a-select v-model:value="searchFormData.status" allowClear>
<a-select-option value="">全部</a-select-option>
<a-select-option value="enabled">启用</a-select-option>
<a-select-option value="disabled">停用</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col class="align-right" v-bind="colSpan">
<a-space>
<a-button @click="handleResetSearch">{{ $t('button.reset') }}</a-button>
<a-button ghost type="primary" @click="handleSearch">
{{ $t('button.search') }}
</a-button>
</a-space>
</a-col>
</a-row>
</a-form>
</template>
</x-search-bar>
<a-row :gutter="8" :wrap="false">
<a-col flex="auto">
<a-card type="flex">
<x-action-bar class="mb-8-2">
<a-button type="primary" @click="$refs.editDialogRef.handleCreate()">
<template #icon>
<plus-outlined></plus-outlined>
</template>
新增
</a-button>
</x-action-bar>
<a-table :columns="columns" :data-source="listData" bordered="true" :loading="loading"
:pagination="paginationState" :scroll="{ x: 1000 }" @change="onTableChange">
<template #bodyCell="{ column, record }">
<template v-if="'img' === column.dataIndex">
<a-image :width="60" :src="record.img?config('http.apiBasic')+record.img:errImg" />
</template>
<template v-if="'status' === column.dataIndex">
<a-tag :color="enumsStatus.getColor(record.status)">{{ enumsStatus.getName(record.status) }}</a-tag>
</template>
<template v-if="'action' === column.key">
<x-action-button @click="$refs.editDialogRef.handleEdit(record)">
<a-tooltip>
<template #title> {{ $t('pages.system.user.edit') }}</template>
<edit-outlined /> </a-tooltip></x-action-button>
<x-action-button @click="handleDelete(record)">
<a-tooltip>
<template #title>{{ $t('pages.system.delete') }}</template>
<delete-outlined style="color: #ff4d4f" /> </a-tooltip></x-action-button>
</template>
</template>
</a-table>
</a-card>
</a-col>
</a-row>
<edit-dialog ref="editDialogRef" @ok="onOk"></edit-dialog>
</template>
<script setup>
import { message, Modal } from 'ant-design-vue'
import { ref } from 'vue'
import apis from '@/apis'
import { formatUtcDateTime } from '@/utils/util'
import { config } from '@/config'
import { statusUserTypeEnum } from '@/enums/system'
import { usePagination } from '@/hooks'
import errImg from '@/assets/blankSpace.png'
import EditDialog from './components/EditDialog.vue'
import { PlusOutlined, EditOutlined, DeleteOutlined } from '@ant-design/icons-vue'
import { useI18n } from 'vue-i18n'
import { delMenu, getDataList } from '@/apis/modules/imgmgt'
import { enumsStatus } from '@/enums/index.js'
defineOptions({
name: 'homeBanner',
})
const { t } = useI18n() // t
const columns = [
{ title: '图片', dataIndex: 'img', width: 100, align: 'center' },
{ title: '名称', dataIndex: 'title', key: 'name' },
{ title: '状态', dataIndex: 'status', width: 120, align: 'center' },
{ title: '顺序', dataIndex: 'sequence', width: 100, align: 'center' },
{ title: t('button.action'), key: 'action', fixed: 'right', width: 100, align: 'center' },
]
const { listData, loading, showLoading, hideLoading, paginationState, resetPagination, searchFormData } = usePagination()
const editDialogRef = ref()
getPageList()
/**
* 获取用户列表
* @returns {Promise<void>}
*/
async function getPageList() {
try {
showLoading()
const { pageSize, current } = paginationState
const { success, data, total } = await apis.imgmgt
.getDataList({
pageSize,
current:current,
type: 'neighborhoodBanner',
...searchFormData.value,
})
.catch(() => {
throw new Error()
})
hideLoading()
if (config('http.code.success') === success) {
//type80about
listData.value = data
paginationState.total = total
}
} catch (error) {
hideLoading()
}
}
/**
* 删除
*/
function handleDelete({ id }) {
Modal.confirm({
title: t('pages.system.user.delTip'),
content: t('button.confirm'),
okText: t('button.confirm'),
onOk: () => {
return new Promise((resolve, reject) => {
; (async () => {
try {
const { success } = await apis.imgmgt.delMenu(id).catch(() => {
throw new Error()
})
if (config('http.code.success') === success) {
resolve()
message.success(t('component.message.success.delete'))
await getPageList()
}
} catch (error) {
reject()
}
})()
})
},
})
}
/**
* 分页
*/
function onTableChange({ current, pageSize }) {
paginationState.current = current
paginationState.pageSize = pageSize
getPageList()
}
/**
* 搜索
*/
function handleSearch() {
resetPagination()
getPageList()
}
/**
* 重置
*/
function handleResetSearch() {
searchFormData.value = {}
resetPagination()
getPageList()
}
/**
* 编辑完成
*/
async function onOk() {
await getPageList()
}
</script>
<style lang="less" scoped></style>

View File

@ -8,7 +8,7 @@ import useVuePlugin from './config/useVuePlugin'
import useVisualizerPlugin from './config/useVisualizerPlugin' import useVisualizerPlugin from './config/useVisualizerPlugin'
import useServer from './config/useServer' import useServer from './config/useServer'
// import useEslintPlugin from './config/useEslintPlugin' // import useEslintPlugin from './config/useEslintPlugin'
import { viteMockServe } from 'vite-plugin-mock'
export default ({ mode }) => { export default ({ mode }) => {
const env = loadEnv(mode, process.cwd(), '') const env = loadEnv(mode, process.cwd(), '')
return defineConfig({ return defineConfig({
@ -53,7 +53,19 @@ export default ({ mode }) => {
version: pkg.version, version: pkg.version,
}), }),
}, },
plugins: [useVuePlugin(), useProgressPlugin(), useCompressPlugin(), useVisualizerPlugin()], plugins: [
useVuePlugin(),
useProgressPlugin(),
useCompressPlugin(),
useVisualizerPlugin(),
viteMockServe({
mockPath: 'src/mock', // mock 文件目录
configPath:'src/mock/index.js',
localEnabled: true, // 开发环境启用
prodEnabled: false, // 生产环境禁用
logger: true, // 控制台日志
}),
],
server: useServer(), server: useServer(),
resolve: { resolve: {
alias: { alias: {

192
yarn.lock
View File

@ -629,6 +629,14 @@ ant-design-vue@^4.0.1:
vue-types "^3.0.0" vue-types "^3.0.0"
warning "^4.0.0" warning "^4.0.0"
anymatch@~3.1.2:
version "3.1.3"
resolved "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz"
integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
dependencies:
normalize-path "^3.0.0"
picomatch "^2.0.4"
argparse@^2.0.1: argparse@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz" resolved "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz"
@ -673,6 +681,11 @@ bignumber.js@^9.0.0:
resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz" resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz"
integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==
binary-extensions@^2.0.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz"
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
body-scroll-lock@4.0.0-beta.0: body-scroll-lock@4.0.0-beta.0:
version "4.0.0-beta.0" version "4.0.0-beta.0"
resolved "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz" resolved "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz"
@ -698,7 +711,7 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0" balanced-match "^1.0.0"
concat-map "0.0.1" concat-map "0.0.1"
braces@^3.0.2: braces@^3.0.2, braces@~3.0.2:
version "3.0.2" version "3.0.2"
resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
@ -712,6 +725,13 @@ bundle-name@^3.0.0:
dependencies: dependencies:
run-applescript "^5.0.0" run-applescript "^5.0.0"
bundle-require@^4.0.1:
version "4.2.1"
resolved "https://registry.npmmirror.com/bundle-require/-/bundle-require-4.2.1.tgz"
integrity sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==
dependencies:
load-tsconfig "^0.2.3"
callsites@^3.0.0: callsites@^3.0.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz" resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz"
@ -735,6 +755,21 @@ chalk@5.3.0:
resolved "https://registry.npmmirror.com/chalk/-/chalk-5.3.0.tgz" resolved "https://registry.npmmirror.com/chalk/-/chalk-5.3.0.tgz"
integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==
chokidar@^3.5.3:
version "3.6.0"
resolved "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz"
integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
dependencies:
anymatch "~3.1.2"
braces "~3.0.2"
glob-parent "~5.1.2"
is-binary-path "~2.1.0"
is-glob "~4.0.1"
normalize-path "~3.0.0"
readdirp "~3.6.0"
optionalDependencies:
fsevents "~2.3.2"
cli-cursor@^4.0.0: cli-cursor@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-4.0.0.tgz" resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-4.0.0.tgz"
@ -801,7 +836,7 @@ combined-stream@^1.0.8:
dependencies: dependencies:
delayed-stream "~1.0.0" delayed-stream "~1.0.0"
commander@11.0.0: commander@*, commander@11.0.0:
version "11.0.0" version "11.0.0"
resolved "https://registry.npmmirror.com/commander/-/commander-11.0.0.tgz" resolved "https://registry.npmmirror.com/commander/-/commander-11.0.0.tgz"
integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ== integrity sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==
@ -816,6 +851,16 @@ concat-map@0.0.1:
resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
connect@^3.7.0:
version "3.7.0"
resolved "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz"
integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==
dependencies:
debug "2.6.9"
finalhandler "1.1.2"
parseurl "~1.3.3"
utils-merge "1.0.1"
copy-anything@^2.0.1: copy-anything@^2.0.1:
version "2.0.6" version "2.0.6"
resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz" resolved "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz"
@ -886,11 +931,18 @@ debug@^4.3.3:
ms "2.1.2" ms "2.1.2"
debug@^4.3.4: debug@^4.3.4:
version "4.3.4" version "4.4.1"
resolved "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz" resolved "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==
dependencies: dependencies:
ms "2.1.2" ms "^2.1.3"
debug@2.6.9:
version "2.6.9"
resolved "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
dependencies:
ms "2.0.0"
debug@4.3.4: debug@4.3.4:
version "4.3.4" version "4.3.4"
@ -982,6 +1034,11 @@ echarts@^5.4.3:
tslib "2.3.0" tslib "2.3.0"
zrender "5.4.4" zrender "5.4.4"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz"
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
emoji-regex@^8.0.0: emoji-regex@^8.0.0:
version "8.0.0" version "8.0.0"
resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz"
@ -997,6 +1054,11 @@ encode-utf8@^1.0.3:
resolved "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz" resolved "https://registry.npmjs.org/encode-utf8/-/encode-utf8-1.0.3.tgz"
integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw== integrity sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
errno@^0.1.1: errno@^0.1.1:
version "0.1.8" version "0.1.8"
resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz" resolved "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz"
@ -1004,7 +1066,7 @@ errno@^0.1.1:
dependencies: dependencies:
prr "~1.0.1" prr "~1.0.1"
esbuild@^0.18.10: esbuild@^0.18.10, esbuild@>=0.17:
version "0.18.20" version "0.18.20"
resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz" resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz"
integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==
@ -1037,6 +1099,11 @@ escalade@^3.1.1:
resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
escape-html@~1.0.3:
version "1.0.3"
resolved "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz"
integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
escape-string-regexp@^4.0.0: escape-string-regexp@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
@ -1207,7 +1274,7 @@ fast-diff@^1.1.2:
resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz" resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz"
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
fast-glob@^3.3.0: fast-glob@^3.2.12, fast-glob@^3.3.0:
version "3.3.1" version "3.3.1"
resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz" resolved "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz"
integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==
@ -1259,6 +1326,19 @@ fill-range@^7.0.1:
dependencies: dependencies:
to-regex-range "^5.0.1" to-regex-range "^5.0.1"
finalhandler@1.1.2:
version "1.1.2"
resolved "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz"
integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
dependencies:
debug "2.6.9"
encodeurl "~1.0.2"
escape-html "~1.0.3"
on-finished "~2.3.0"
parseurl "~1.3.3"
statuses "~1.5.0"
unpipe "~1.0.0"
find-up@^4.1.0: find-up@^4.1.0:
version "4.1.0" version "4.1.0"
resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
@ -1347,6 +1427,13 @@ glob-parent@^6.0.2:
dependencies: dependencies:
is-glob "^4.0.3" is-glob "^4.0.3"
glob-parent@~5.1.2:
version "5.1.2"
resolved "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
glob@^7.1.3: glob@^7.1.3:
version "7.2.3" version "7.2.3"
resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
@ -1446,6 +1533,13 @@ inherits@2:
resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
is-binary-path@~2.1.0:
version "2.1.0"
resolved "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz"
integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
dependencies:
binary-extensions "^2.0.0"
is-docker@^2.0.0, is-docker@^2.1.1: is-docker@^2.0.0, is-docker@^2.1.1:
version "2.2.1" version "2.2.1"
resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz"
@ -1471,7 +1565,7 @@ is-fullwidth-code-point@^4.0.0:
resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz"
integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
version "4.0.3" version "4.0.3"
resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
@ -1643,6 +1737,11 @@ listr2@6.6.1:
rfdc "^1.3.0" rfdc "^1.3.0"
wrap-ansi "^8.1.0" wrap-ansi "^8.1.0"
load-tsconfig@^0.2.3:
version "0.2.5"
resolved "https://registry.npmmirror.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz"
integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==
locate-path@^5.0.0: locate-path@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz"
@ -1774,11 +1873,23 @@ minisearch@^6.1.0:
resolved "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz" resolved "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz"
integrity sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg== integrity sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==
ms@^2.1.1: mockjs@^1.1.0, mockjs@>=1.1.0:
version "1.1.0"
resolved "https://registry.npmmirror.com/mockjs/-/mockjs-1.1.0.tgz"
integrity sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==
dependencies:
commander "*"
ms@^2.1.1, ms@^2.1.3:
version "2.1.3" version "2.1.3"
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
ms@2.0.0:
version "2.0.0"
resolved "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
ms@2.1.2: ms@2.1.2:
version "2.1.2" version "2.1.2"
resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz" resolved "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz"
@ -1813,6 +1924,11 @@ needle@^3.1.0:
iconv-lite "^0.6.3" iconv-lite "^0.6.3"
sax "^1.2.4" sax "^1.2.4"
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz"
integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
npm-run-path@^4.0.1: npm-run-path@^4.0.1:
version "4.0.1" version "4.0.1"
resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz" resolved "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz"
@ -1839,6 +1955,13 @@ nth-check@^2.1.1:
dependencies: dependencies:
boolbase "^1.0.0" boolbase "^1.0.0"
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz"
integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==
dependencies:
ee-first "1.1.1"
once@^1.3.0: once@^1.3.0:
version "1.4.0" version "1.4.0"
resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
@ -1953,6 +2076,11 @@ parse-node-version@^1.0.1:
resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz" resolved "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz"
integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
parseurl@~1.3.3:
version "1.3.3"
resolved "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
path-exists@^4.0.0: path-exists@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
@ -1973,12 +2101,17 @@ path-key@^4.0.0:
resolved "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz" resolved "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz"
integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==
path-to-regexp@^6.2.1:
version "6.3.0"
resolved "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-6.3.0.tgz"
integrity sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==
picocolors@^1.0.0: picocolors@^1.0.0:
version "1.0.0" version "1.0.0"
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
picomatch@^2.2.2, picomatch@^2.3.1: picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.3.1:
version "2.3.1" version "2.3.1"
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@ -2087,6 +2220,13 @@ rd@^2.0.1:
dependencies: dependencies:
"@types/node" "^10.3.6" "@types/node" "^10.3.6"
readdirp@~3.6.0:
version "3.6.0"
resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz"
integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
dependencies:
picomatch "^2.2.1"
regenerator-runtime@^0.13.4: regenerator-runtime@^0.13.4:
version "0.13.9" version "0.13.9"
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz"
@ -2286,6 +2426,11 @@ source-map@~0.6.0:
resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
statuses@~1.5.0:
version "1.5.0"
resolved "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz"
integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
string-argv@0.3.2: string-argv@0.3.2:
version "0.3.2" version "0.3.2"
resolved "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz" resolved "https://registry.npmmirror.com/string-argv/-/string-argv-0.3.2.tgz"
@ -2446,6 +2591,11 @@ universalify@^2.0.0:
resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
unpipe@~1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
untildify@^4.0.0: untildify@^4.0.0:
version "4.0.0" version "4.0.0"
resolved "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz" resolved "https://registry.npmmirror.com/untildify/-/untildify-4.0.0.tgz"
@ -2463,6 +2613,11 @@ util-deprecate@^1.0.2:
resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz" resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
utils-merge@1.0.1:
version "1.0.1"
resolved "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz"
integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
vite-plugin-compression@^0.5.1: vite-plugin-compression@^0.5.1:
version "0.5.1" version "0.5.1"
resolved "https://registry.npmjs.org/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz" resolved "https://registry.npmjs.org/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz"
@ -2481,6 +2636,19 @@ vite-plugin-eslint@^1.8.1:
"@types/eslint" "^8.4.5" "@types/eslint" "^8.4.5"
rollup "^2.77.2" rollup "^2.77.2"
vite-plugin-mock@^3.0.2:
version "3.0.2"
resolved "https://registry.npmmirror.com/vite-plugin-mock/-/vite-plugin-mock-3.0.2.tgz"
integrity sha512-bD//HvkTygGmk+LsIAdf0jGNlCv4iWv0kZlH9UEgWT6QYoUwfjQAE4SKxHRw2tfLgVhbPQVv/+X3YlNWvueGUA==
dependencies:
bundle-require "^4.0.1"
chokidar "^3.5.3"
connect "^3.7.0"
debug "^4.3.4"
fast-glob "^3.2.12"
path-to-regexp "^6.2.1"
picocolors "^1.0.0"
vite-plugin-progress@^0.0.7: vite-plugin-progress@^0.0.7:
version "0.0.7" version "0.0.7"
resolved "https://registry.npmjs.org/vite-plugin-progress/-/vite-plugin-progress-0.0.7.tgz" resolved "https://registry.npmjs.org/vite-plugin-progress/-/vite-plugin-progress-0.0.7.tgz"
@ -2490,7 +2658,7 @@ vite-plugin-progress@^0.0.7:
progress "^2.0.3" progress "^2.0.3"
rd "^2.0.1" rd "^2.0.1"
vite@^4.0.0, vite@^4.4.7, vite@^4.4.9, vite@>=2, vite@>=2.0.0, vite@>2.0.0-0: vite@^4.0.0, vite@^4.4.7, vite@^4.4.9, vite@>=2, vite@>=2.0.0, vite@>=4.0.0, vite@>2.0.0-0:
version "4.4.9" version "4.4.9"
resolved "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz" resolved "https://registry.npmmirror.com/vite/-/vite-4.4.9.tgz"
integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA== integrity sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==