Browse Source

金豆任务

lhlcode
lhl 1 month ago
parent
commit
24098e1d33
  1. 734
      0414/package-lock.json
  2. 8
      0414/package.json
  3. 31
      0414/src/App.vue
  4. 16
      0414/src/api/goldBeanDetail.ts
  5. 27
      0414/src/components/DetailTable.vue
  6. 10
      0414/src/components/Home.vue
  7. 62
      0414/src/components/Navbar.vue
  8. 73
      0414/src/components/SearchForm.vue
  9. 9
      0414/src/main.ts
  10. 17
      0414/src/router/index.js
  11. 12
      0414/src/style.css
  12. 24
      0414/src/styles/main.css
  13. 30
      0414/src/types/system.d.ts
  14. 58
      0414/src/views/GoldBeanDetail.vue
  15. 15
      0414/src/vite-env.d.ts
  16. 2
      0414/tsconfig.app.json
  17. 30
      0414task/.gitignore
  18. 3
      0414task/.vscode/extensions.json
  19. 33
      0414task/README.md
  20. 16
      0414task/env.d.ts
  21. 13
      0414task/index.html
  22. 3667
      0414task/package-lock.json
  23. 30
      0414task/package.json
  24. BIN
      0414task/public/favicon.ico
  25. 17
      0414task/src/App.vue
  26. 86
      0414task/src/assets/base.css
  27. 1
      0414task/src/assets/logo.svg
  28. 35
      0414task/src/assets/main.css
  29. 87
      0414task/src/components/Sidebar.vue
  30. 100
      0414task/src/cs.vue
  31. 13
      0414task/src/main.ts
  32. 35
      0414task/src/router/index.js
  33. 22
      0414task/src/views/HomeView.vue
  34. 230
      0414task/src/views/Recharge.vue
  35. 19
      0414task/src/views/RechargeAudit.vue
  36. 195
      0414task/src/views/Refund.vue
  37. 14
      0414task/src/views/RefundAudit.vue
  38. 12
      0414task/tsconfig.app.json
  39. 11
      0414task/tsconfig.json
  40. 19
      0414task/tsconfig.node.json
  41. 18
      0414task/vite.config.ts

734
0414/package-lock.json

@ -8,11 +8,17 @@
"name": "0414",
"version": "0.0.0",
"dependencies": {
"vue": "^3.5.13"
"axios": "^1.8.4",
"element-plus": "^2.9.7",
"vue": "^3.5.13",
"vue-router": "^4.5.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.2.1",
"@vue/tsconfig": "^0.7.0",
"autoprefixer": "^10.4.21",
"postcss": "^8.5.3",
"tailwindcss": "^4.1.3",
"typescript": "~5.7.2",
"vite": "^6.2.0",
"vue-tsc": "^2.2.4"
@ -64,6 +70,24 @@
"node": ">=6.9.0"
}
},
"node_modules/@ctrl/tinycolor": {
"version": "3.6.1",
"resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
"integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/@element-plus/icons-vue": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
"integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
"license": "MIT",
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/@esbuild/aix-ppc64": {
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz",
@ -489,12 +513,48 @@
"node": ">=18"
}
},
"node_modules/@floating-ui/core": {
"version": "1.6.9",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz",
"integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
"license": "MIT",
"dependencies": {
"@floating-ui/utils": "^0.2.9"
}
},
"node_modules/@floating-ui/dom": {
"version": "1.6.13",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz",
"integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
"license": "MIT",
"dependencies": {
"@floating-ui/core": "^1.6.0",
"@floating-ui/utils": "^0.2.9"
}
},
"node_modules/@floating-ui/utils": {
"version": "0.2.9",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
"integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
"license": "MIT"
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
"integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
"license": "MIT"
},
"node_modules/@popperjs/core": {
"name": "@sxzz/popperjs-es",
"version": "2.11.7",
"resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
"integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==",
"license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
"version": "4.40.0",
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz",
@ -782,6 +842,27 @@
"dev": true,
"license": "MIT"
},
"node_modules/@types/lodash": {
"version": "4.17.16",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz",
"integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==",
"license": "MIT"
},
"node_modules/@types/lodash-es": {
"version": "4.17.12",
"resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
"integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
"license": "MIT",
"dependencies": {
"@types/lodash": "*"
}
},
"node_modules/@types/web-bluetooth": {
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
"integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==",
"license": "MIT"
},
"node_modules/@vitejs/plugin-vue": {
"version": "5.2.3",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.3.tgz",
@ -886,6 +967,12 @@
"he": "^1.2.0"
}
},
"node_modules/@vue/devtools-api": {
"version": "6.6.4",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
},
"node_modules/@vue/language-core": {
"version": "2.2.8",
"resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.8.tgz",
@ -980,6 +1067,94 @@
}
}
},
"node_modules/@vueuse/core": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.13.0.tgz",
"integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
"license": "MIT",
"dependencies": {
"@types/web-bluetooth": "^0.0.16",
"@vueuse/metadata": "9.13.0",
"@vueuse/shared": "9.13.0",
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/core/node_modules/vue-demi": {
"version": "0.14.10",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/@vueuse/metadata": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.13.0.tgz",
"integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared": {
"version": "9.13.0",
"resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.13.0.tgz",
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
"license": "MIT",
"dependencies": {
"vue-demi": "*"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
}
},
"node_modules/@vueuse/shared/node_modules/vue-demi": {
"version": "0.14.10",
"resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"hasInstallScript": true,
"license": "MIT",
"bin": {
"vue-demi-fix": "bin/vue-demi-fix.js",
"vue-demi-switch": "bin/vue-demi-switch.js"
},
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": {
"@vue/composition-api": "^1.0.0-rc.1",
"vue": "^3.0.0-0 || ^2.6.0"
},
"peerDependenciesMeta": {
"@vue/composition-api": {
"optional": true
}
}
},
"node_modules/alien-signals": {
"version": "1.0.13",
"resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz",
@ -987,6 +1162,67 @@
"dev": true,
"license": "MIT"
},
"node_modules/async-validator": {
"version": "4.2.5",
"resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==",
"license": "MIT"
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
"node_modules/autoprefixer": {
"version": "10.4.21",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
"integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/autoprefixer"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"browserslist": "^4.24.4",
"caniuse-lite": "^1.0.30001702",
"fraction.js": "^4.3.7",
"normalize-range": "^0.1.2",
"picocolors": "^1.1.1",
"postcss-value-parser": "^4.2.0"
},
"bin": {
"autoprefixer": "bin/autoprefixer"
},
"engines": {
"node": "^10 || ^12 || >=14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/axios": {
"version": "1.8.4",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
"integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@ -1004,12 +1240,97 @@
"balanced-match": "^1.0.0"
}
},
"node_modules/browserslist": {
"version": "4.24.4",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"caniuse-lite": "^1.0.30001688",
"electron-to-chromium": "^1.5.73",
"node-releases": "^2.0.19",
"update-browserslist-db": "^1.1.1"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001713",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001713.tgz",
"integrity": "sha512-wCIWIg+A4Xr7NfhTuHdX+/FKh3+Op3LBbSp2N5Pfx6T/LhdQy3GTyoTg48BReaW/MyMNZAkTadsBtai3ldWK0Q==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "CC-BY-4.0"
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
"license": "MIT"
},
"node_modules/dayjs": {
"version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
"license": "MIT"
},
"node_modules/de-indent": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
@ -1017,6 +1338,62 @@
"dev": true,
"license": "MIT"
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.136",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.136.tgz",
"integrity": "sha512-kL4+wUTD7RSA5FHx5YwWtjDnEEkIIikFgWHR4P6fqjw1PPLlqYkxeOb++wAauAssat0YClCy8Y3C5SxgSkjibQ==",
"dev": true,
"license": "ISC"
},
"node_modules/element-plus": {
"version": "2.9.7",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.9.7.tgz",
"integrity": "sha512-6vjZh5SXBncLhUwJGTVKS5oDljfgGMh6J4zVTeAZK3YdMUN76FgpvHkwwFXocpJpMbii6rDYU3sgie64FyPerQ==",
"license": "MIT",
"dependencies": {
"@ctrl/tinycolor": "^3.4.1",
"@element-plus/icons-vue": "^2.3.1",
"@floating-ui/dom": "^1.0.1",
"@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
"@types/lodash": "^4.14.182",
"@types/lodash-es": "^4.17.6",
"@vueuse/core": "^9.1.0",
"async-validator": "^4.2.5",
"dayjs": "^1.11.13",
"escape-html": "^1.0.3",
"lodash": "^4.17.21",
"lodash-es": "^4.17.21",
"lodash-unified": "^1.0.2",
"memoize-one": "^6.0.0",
"normalize-wheel-es": "^1.2.0"
},
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/entities": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
@ -1029,6 +1406,51 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-errors": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/esbuild": {
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz",
@ -1070,12 +1492,77 @@
"@esbuild/win32-x64": "0.25.2"
}
},
"node_modules/escalade": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"license": "MIT"
},
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT"
},
"node_modules/follow-redirects": {
"version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
"integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/fraction.js": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
"dev": true,
"license": "MIT",
"engines": {
"node": "*"
},
"funding": {
"type": "patreon",
"url": "https://github.com/sponsors/rawify"
}
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@ -1091,6 +1578,103 @@
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
@ -1101,6 +1685,29 @@
"he": "bin/he"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
"node_modules/lodash-es": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
"license": "MIT"
},
"node_modules/lodash-unified": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
"integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
"license": "MIT",
"peerDependencies": {
"@types/lodash-es": "*",
"lodash": "*",
"lodash-es": "*"
}
},
"node_modules/magic-string": {
"version": "0.30.17",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
@ -1110,6 +1717,42 @@
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/memoize-one": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
"integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==",
"license": "MIT"
},
"node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@ -1151,6 +1794,29 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/node-releases": {
"version": "2.0.19",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
"dev": true,
"license": "MIT"
},
"node_modules/normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/normalize-wheel-es": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==",
"license": "BSD-3-Clause"
},
"node_modules/path-browserify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz",
@ -1192,6 +1858,19 @@
"node": "^10 || ^12 || >=14"
}
},
"node_modules/postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true,
"license": "MIT"
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/rollup": {
"version": "4.40.0",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz",
@ -1241,6 +1920,13 @@
"node": ">=0.10.0"
}
},
"node_modules/tailwindcss": {
"version": "4.1.3",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.3.tgz",
"integrity": "sha512-2Q+rw9vy1WFXu5cIxlvsabCwhU2qUwodGq03ODhLJ0jW4ek5BUtoCsnLB0qG+m8AHgEsSJcJGDSDe06FXlP74g==",
"dev": true,
"license": "MIT"
},
"node_modules/typescript": {
"version": "5.7.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
@ -1255,6 +1941,37 @@
"node": ">=14.17"
}
},
"node_modules/update-browserslist-db": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
"integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"license": "MIT",
"dependencies": {
"escalade": "^3.2.0",
"picocolors": "^1.1.1"
},
"bin": {
"update-browserslist-db": "cli.js"
},
"peerDependencies": {
"browserslist": ">= 4.21.0"
}
},
"node_modules/vite": {
"version": "6.2.6",
"resolved": "https://registry.npmjs.org/vite/-/vite-6.2.6.tgz",
@ -1355,6 +2072,21 @@
}
}
},
"node_modules/vue-router": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz",
"integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==",
"license": "MIT",
"dependencies": {
"@vue/devtools-api": "^6.6.4"
},
"funding": {
"url": "https://github.com/sponsors/posva"
},
"peerDependencies": {
"vue": "^3.2.0"
}
},
"node_modules/vue-tsc": {
"version": "2.2.8",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.8.tgz",

8
0414/package.json

@ -9,11 +9,17 @@
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.5.13"
"axios": "^1.8.4",
"element-plus": "^2.9.7",
"vue": "^3.5.13",
"vue-router": "^4.5.0"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.2.1",
"@vue/tsconfig": "^0.7.0",
"autoprefixer": "^10.4.21",
"postcss": "^8.5.3",
"tailwindcss": "^4.1.3",
"typescript": "~5.7.2",
"vite": "^6.2.0",
"vue-tsc": "^2.2.4"

31
0414/src/App.vue

@ -1,11 +1,30 @@
<script setup lang="ts" name="App">
</script>
<template>
<div id="app" class="app-container">
<NavBar />
<div class="content-container">
<router-view></router-view>
</div>
</div>
</template>
<script>
import NavBar from './components/NavBar.vue'
export default {
components: {
NavBar
}
}
</script>
<style scoped>
.app-container {
display: flex;
min-height: 100vh;
}
</style>
.content-container {
flex: 1;
padding: 2rem;
}
</style>

16
0414/src/api/goldBeanDetail.ts

@ -0,0 +1,16 @@
import axios from 'axios';
// 后端接口地址
const API_BASE_URL = '';
// 获取金豆明细数据
export const getGoldBeanDetail = async (params: any) => {
try {
const response = await axios.get(``, { params });
return response.data;
} catch (error) {
console.error('获取金豆明细数据失败', error);
throw error;
}
};

27
0414/src/components/DetailTable.vue

@ -0,0 +1,27 @@
<template>
<el-table :data="tableData">
<el-table-column prop="name" label="姓名"></el-table-column>
<el-table-column prop="fineNetNumber" label="精网号"></el-table-column>
<el-table-column prop="region" label="所属地区"></el-table-column>
<el-table-column prop="type" label="类型"></el-table-column>
<el-table-column prop="orderNumber" label="订单号"></el-table-column>
<el-table-column prop="goldBeanQuantity" label="金豆数量"></el-table-column>
<el-table-column prop="paidGoldBean" label="付费金豆"></el-table-column>
<el-table-column prop="freeGoldBean" label="免费金豆"></el-table-column>
<el-table-column prop="amount" label="金额"></el-table-column>
<el-table-column prop="rechargePlatform" label="充值平台"></el-table-column>
<el-table-column prop="remark" label="备注"></el-table-column>
<el-table-column prop="rechargeTime" label="充值时间"></el-table-column>
</el-table>
</template>
<script>
export default {
props: {
tableData: {
type: Array,
default: () => []
}
}
};
</script>

10
0414/src/components/Home.vue

@ -1,10 +0,0 @@
<script setup lang="ts">
</script>
<template>
</template>
<style scoped>
</style>

62
0414/src/components/Navbar.vue

@ -0,0 +1,62 @@
<template>
<el-menu
:default-active="activeIndex"
class="el-menu-vertical-demo"
@select="handleSelect"
background-color="#545c64"
text-color="#fff"
>
<!-- element写的菜单随便生成的背景色和文字颜色 -->
<!-- AI生成的表单 -->
<el-menu-item index="0">首页</el-menu-item>
<el-menu-item index="1">工作台</el-menu-item>
<el-menu-item index="2">财务审核</el-menu-item>
<el-sub-menu index="3">
<template #title>充值管理</template>
<el-menu-item index="3-1">金币充值</el-menu-item>
<el-menu-item index="3-2">金币消费</el-menu-item>
<el-menu-item index="3-3">金币退款</el-menu-item>
</el-sub-menu>
<el-sub-menu index="4">
<template #title>金豆模块</template>
<el-menu-item index="4-1">金豆充值</el-menu-item>
<el-menu-item index="4-2" @click="goToDetail">金豆充值明细</el-menu-item>
<el-menu-item index="4-3">金豆消费明细</el-menu-item>
<el-menu-item index="4-4">客户金豆余额</el-menu-item>
</el-sub-menu>
<el-menu-item index="5">客户所有明细</el-menu-item>
<el-menu-item index="6">客户金币余额</el-menu-item>
<el-menu-item index="7">权限管理</el-menu-item>
</el-menu>
</template>
<script>
export default {
data() {
// activeIndex
return {
activeIndex: '1'
}
},
methods: {
// keykeyPath
// keykeyPath
handleSelect(key, keyPath) {
console.log(key, keyPath)
},
//
goToDetail() {
this.$router.push('/gold-bean-detail')
}
}
}
</script>
<style scoped>
.el-menu-vertical-demo {
/*
一个vue三种注释方式 */
width: 200px;
}
</style>

73
0414/src/components/SearchForm.vue

@ -0,0 +1,73 @@
<template>
<el-form
:inline="true"
:model="form"
label-width="80px"
>
<!-- AI生成的表单 -->
<!-- 通过设置 inline 属性为 true 可以让表单域变为行内的表单域 -->
<el-form-item label="精网号">
<el-input v-model="form.fineNetNumber" placeholder="请输入精网号"></el-input>
</el-form-item>
<el-form-item label="地区">
<el-select v-model="form.region" placeholder="请选择地区">
<el-option label="白山市" value="option1"></el-option>
<el-option label="扬州市" value="option2"></el-option>
</el-select>
<!-- select-option是下拉框选择 -->
</el-form-item>
<el-form-item label="订单号">
<el-input v-model="form.orderNumber" placeholder="请输入订单号"></el-input>
</el-form-item>
<el-form-item label="类型">
<el-select v-model="form.type" placeholder="请选择类型">
<el-option label="购买金豆" value="option1"></el-option>
<el-option label="金币换金豆" value="option2"></el-option>
</el-select>
</el-form-item>
<el-form-item label="充值平台">
<el-select v-model="form.rechargePlatform" placeholder="请选择充值平台">
<el-option label="system" value="option1"></el-option>
<el-option label="ios" value="option2"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">查询</el-button>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
form: {
fineNetNumber: '',
region: '',
orderNumber: '',
type: '',
rechargePlatform: ''
}
};
},
methods: {
// search
handleSearch() {
this.$emit('search', this.form);
},
//
handleReset() {
this.form = {
fineNetNumber: '',
region: '',
orderNumber: '',
type: '',
rechargePlatform: ''
};
this.$emit('search', this.form);
}
}
};
</script>

9
0414/src/main.ts

@ -1,5 +1,10 @@
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import router from './router/index.js'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
createApp(App).mount('#app')
const app = createApp(App)
app.use(ElementPlus)
app.use(router)
app.mount('#app')

17
0414/src/router/index.js

@ -0,0 +1,17 @@
import { createRouter, createWebHistory } from 'vue-router'
import GoldBeanDetail from '../views/GoldBeanDetail.vue'
const routes = [
{
path: '/gold-bean-detail',
name: 'GoldBeanDetail',
component: GoldBeanDetail
}
]
const router = createRouter({
history: createWebHistory(),
routes
})
export default router

12
0414/src/style.css

@ -77,3 +77,15 @@ button:focus-visible {
background-color: #f9f9f9;
}
}
/* 其他已有样式... */
#app {
max-width: 100%; /* 调整最大宽度以适应新布局 */
margin: 0;
padding: 0;
display: flex;
}
.el-menu-vertical-demo {
width: 200px; /* 保持导航栏宽度 */
}

24
0414/src/styles/main.css

@ -0,0 +1,24 @@
/* 全局样式 */
body {
margin: 0;
padding: 0;
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB',
'Microsoft YaHei', Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* 表格样式优化 */
.el-table .cell {
white-space: nowrap;
}
/* 分页样式优化 */
.el-pagination {
padding: 10px 0;
}
/* 表单元素间距 */
.el-form-item {
margin-bottom: 16px;
}

30
0414/src/types/system.d.ts

@ -0,0 +1,30 @@
// 数据行类型
export interface DataRow {
id: number
name: string
recruitNo: string
region: string
type: '购买金证' | '全币换金证' | '客服操作'
orderNo: string
currencyAmount: number
paidAmount: number
freeAmount: number
amount: number
rechargePlatform: string
remark: string
rechargeTime: string
}
// 搜索表单类型
export interface SearchParams {
name?: string
recruitNo?: string
region?: string
type?: DataRow['type']
}
// 分页参数类型
export interface Pagination {
page: number
size: number
}

58
0414/src/views/GoldBeanDetail.vue

@ -0,0 +1,58 @@
<template>
<div class="detail-container">
<div class="search-form-container">
<!-- 搜索表单组件监听search事件 -->
<SearchForm @search="handleSearch" />
</div>
<div class="detail-table-container">
<DetailTable :tableData="tableData" />
</div>
</div>
</template>
<script>
import SearchForm from '../components/SearchForm.vue';
import DetailTable from '../components/DetailTable.vue';
import { getGoldBeanDetail } from '../api/goldBeanDetail';
export default {
components: {
SearchForm,
DetailTable
},
data() {
return {
tableData: []
};
},
//
async created() {
await this.handleSearch({});
},
methods: {
// API
async handleSearch(params) {
try {
const data = await getGoldBeanDetail(params);
this.tableData = data;
} catch (error) {
console.error('查询失败', error);
}
}
}
};
</script>
<style scoped>
.detail-container {
display: flex;
flex-direction: column; /* 修改为垂直布局 */
}
.search-form-container {
width: 100%; /* 搜索表单宽度占满父容器 */
}
.detail-table-container {
width: 100%; /* 详情表格宽度占满父容器 */
margin-top: 20px; /* 为表格添加顶部间距 */
}
</style>

15
0414/src/vite-env.d.ts

@ -1 +1,16 @@
/// <reference types="vite/client" />
declare module "*.vue" {
import Vue from 'vue';
export default Vue;
}
declare module '*.js';
// declare module './router' {
// import { Router } from 'vue-router';
// const router: Router;
// export default router;
// }

2
0414/tsconfig.app.json

@ -10,5 +10,5 @@
"noFallthroughCasesInSwitch": true,
"noUncheckedSideEffectImports": true
},
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"]
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue", "src/router/index.ts"]
}

30
0414task/.gitignore

@ -0,0 +1,30 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
dist-ssr
coverage
*.local
/cypress/videos/
/cypress/screenshots/
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
*.tsbuildinfo

3
0414task/.vscode/extensions.json

@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar"]
}

33
0414task/README.md

@ -0,0 +1,33 @@
# 0414task
This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
## Type Support for `.vue` Imports in TS
TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types.
## Customize configuration
See [Vite Configuration Reference](https://vite.dev/config/).
## Project Setup
```sh
npm install
```
### Compile and Hot-Reload for Development
```sh
npm run dev
```
### Type-Check, Compile and Minify for Production
```sh
npm run build
```

16
0414task/env.d.ts

@ -0,0 +1,16 @@
/// <reference types="vite/client" />
declare module "*.vue" {
import Vue from 'vue';
export default Vue;
}
declare module '*.js';
declare module './router' {
import { Router } from 'vue-router';
const router: Router;
export default router;
}

13
0414task/index.html

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

3667
0414task/package-lock.json
File diff suppressed because it is too large
View File

30
0414task/package.json

@ -0,0 +1,30 @@
{
"name": "0414task",
"version": "0.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "run-p type-check \"build-only {@}\" --",
"preview": "vite preview",
"build-only": "vite build",
"type-check": "vue-tsc --build"
},
"dependencies": {
"axios": "^1.8.4",
"element-plus": "^2.9.7",
"vue": "^3.5.13",
"vue-router": "^4.5.0"
},
"devDependencies": {
"@tsconfig/node22": "^22.0.1",
"@types/node": "^22.14.0",
"@vitejs/plugin-vue": "^5.2.3",
"@vue/tsconfig": "^0.7.0",
"npm-run-all2": "^7.0.2",
"typescript": "~5.8.0",
"vite": "^6.2.4",
"vite-plugin-vue-devtools": "^7.7.2",
"vue-tsc": "^2.2.8"
}
}

BIN
0414task/public/favicon.ico

17
0414task/src/App.vue

@ -0,0 +1,17 @@
<template>
<div id="app">
<div style="display: flex;">
<Sidebar />
<router-view />
</div>
</div>
</template>
<script setup>
import Sidebar from './components/Sidebar.vue'
// import Sidebar from './cs.vue'
</script>
<style scoped>
/* 这里可以添加全局样式 */
</style>

86
0414task/src/assets/base.css

@ -0,0 +1,86 @@
/* color palette from <https://github.com/vuejs/theme> */
:root {
--vt-c-white: #ffffff;
--vt-c-white-soft: #f8f8f8;
--vt-c-white-mute: #f2f2f2;
--vt-c-black: #181818;
--vt-c-black-soft: #222222;
--vt-c-black-mute: #282828;
--vt-c-indigo: #2c3e50;
--vt-c-divider-light-1: rgba(60, 60, 60, 0.29);
--vt-c-divider-light-2: rgba(60, 60, 60, 0.12);
--vt-c-divider-dark-1: rgba(84, 84, 84, 0.65);
--vt-c-divider-dark-2: rgba(84, 84, 84, 0.48);
--vt-c-text-light-1: var(--vt-c-indigo);
--vt-c-text-light-2: rgba(60, 60, 60, 0.66);
--vt-c-text-dark-1: var(--vt-c-white);
--vt-c-text-dark-2: rgba(235, 235, 235, 0.64);
}
/* semantic color variables for this project */
:root {
--color-background: var(--vt-c-white);
--color-background-soft: var(--vt-c-white-soft);
--color-background-mute: var(--vt-c-white-mute);
--color-border: var(--vt-c-divider-light-2);
--color-border-hover: var(--vt-c-divider-light-1);
--color-heading: var(--vt-c-text-light-1);
--color-text: var(--vt-c-text-light-1);
--section-gap: 160px;
}
@media (prefers-color-scheme: dark) {
:root {
--color-background: var(--vt-c-black);
--color-background-soft: var(--vt-c-black-soft);
--color-background-mute: var(--vt-c-black-mute);
--color-border: var(--vt-c-divider-dark-2);
--color-border-hover: var(--vt-c-divider-dark-1);
--color-heading: var(--vt-c-text-dark-1);
--color-text: var(--vt-c-text-dark-2);
}
}
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
font-weight: normal;
}
body {
min-height: 100vh;
color: var(--color-text);
background: var(--color-background);
transition:
color 0.5s,
background-color 0.5s;
line-height: 1.6;
font-family:
Inter,
-apple-system,
BlinkMacSystemFont,
'Segoe UI',
Roboto,
Oxygen,
Ubuntu,
Cantarell,
'Fira Sans',
'Droid Sans',
'Helvetica Neue',
sans-serif;
font-size: 15px;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}

1
0414task/src/assets/logo.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>

35
0414task/src/assets/main.css

@ -0,0 +1,35 @@
@import './base.css';
#app {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
font-weight: normal;
}
a,
.green {
text-decoration: none;
color: hsla(160, 100%, 37%, 1);
transition: 0.4s;
padding: 3px;
}
@media (hover: hover) {
a:hover {
background-color: hsla(160, 100%, 37%, 0.2);
}
}
@media (min-width: 1024px) {
body {
display: flex;
place-items: center;
}
#app {
display: grid;
grid-template-columns: 1fr 1fr;
padding: 0 2rem;
}
}

87
0414task/src/components/Sidebar.vue

@ -0,0 +1,87 @@
<template>
<!-- 使用 el-menu 直接包裹菜单项 -->
<el-menu
default-active="1"
class="el-menu-vertical-demo custom-sidebar-menu"
@open="handleOpen"
@close="handleClose"
>
<div class="menu-container">
<el-menu-item index="1" @click="navigateTo('recharge')">充值</el-menu-item>
<el-menu-item index="2" @click="navigateTo('refund')">退款</el-menu-item>
<el-menu-item index="3" @click="navigateTo('recharge-audit')">充值审核</el-menu-item>
<el-menu-item index="4" @click="navigateTo('refund-audit')">退款审核</el-menu-item>
</div>
</el-menu>
</template>
<script setup>
/* 保持原有脚本部分不变 */
import { useRouter } from 'vue-router'
const router = useRouter()
const navigateTo = (path) => {
router.push({ name: path })
}
const handleOpen = (key, keyPath) => {
console.log(key, keyPath)
}
const handleClose = (key, keyPath) => {
console.log(key, keyPath)
}
</script>
<style scoped>
/* 保持原有基础样式 */
.el-menu-vertical-demo:not(.el-menu--collapse) {
width: 180px;
}
.custom-sidebar-menu {
border-right: none;
box-shadow: 2px 0 5px rgba(179, 140, 140, 0.1);
/* 将导航栏样式转移到菜单容器 */
background-color: #cccdfca8;
color: #f5f7f6;
min-height: 600px;
/* 设置宽度为百分比,使其随窗口大小变化 */
width: 20%;
/* 设置最小宽度,防止窗口缩小时侧边栏过小 */
/* min-width: 150px; */
}
/* 菜单项容器样式 */
.menu-container {
padding: 10px;
margin-top: 30px;
text-align: center;
color: #000;
}
/* 调整菜单项样式 */
.custom-sidebar-menu .el-menu-item {
transition: all 0.3s ease;
cursor: pointer;
padding: 15px 20px;
font-size: 16px;
margin: 20px 10px; /* 用 margin 实现间距 */
border-radius: 4px; /* 添加圆角 */
width: calc(100% - 20px); /* 自适应宽度 */
/* 使用 Flexbox 布局 */
/* display: flex;
justify-content: flex-end; */
}
/* 悬停效果 */
.custom-sidebar-menu .el-menu-item:hover {
background-color: #ececfc !important;
}
/* 激活状态样式 */
.custom-sidebar-menu .el-menu-item.is-active {
background-color: #faf9fc !important;
}
</style>

100
0414task/src/cs.vue

@ -0,0 +1,100 @@
<template>
<el-row class="tac">
<el-col :span="12">
<h5 class="mb-2">Default colors</h5>
<el-menu
default-active="2"
class="el-menu-vertical-demo"
@open="handleOpen"
@close="handleClose"
>
<el-sub-menu index="1">
<template #title>
<el-icon><location /></el-icon>
<span>Navigator One</span>
</template>
<el-menu-item-group title="Group One">
<el-menu-item index="1-1">item one</el-menu-item>
<el-menu-item index="1-2">item two</el-menu-item>
</el-menu-item-group>
<el-menu-item-group title="Group Two">
<el-menu-item index="1-3">item three</el-menu-item>
</el-menu-item-group>
<el-sub-menu index="1-4">
<template #title>item four</template>
<el-menu-item index="1-4-1">item one</el-menu-item>
</el-sub-menu>
</el-sub-menu>
<el-menu-item index="2">
<el-icon><icon-menu /></el-icon>
<span>Navigator Two</span>
</el-menu-item>
<el-menu-item index="3" disabled>
<el-icon><document /></el-icon>
<span>Navigator Three</span>
</el-menu-item>
<el-menu-item index="4">
<el-icon><setting /></el-icon>
<span>Navigator Four</span>
</el-menu-item>
</el-menu>
</el-col>
<el-col :span="12">
<h5 class="mb-2">Custom colors</h5>
<el-menu
active-text-color="#ffd04b"
background-color="#545c64"
class="el-menu-vertical-demo"
default-active="2"
text-color="#fff"
@open="handleOpen"
@close="handleClose"
>
<el-sub-menu index="1">
<template #title>
<el-icon><location /></el-icon>
<span>Navigator One</span>
</template>
<el-menu-item-group title="Group One">
<el-menu-item index="1-1">item one</el-menu-item>
<el-menu-item index="1-2">item two</el-menu-item>
</el-menu-item-group>
<el-menu-item-group title="Group Two">
<el-menu-item index="1-3">item three</el-menu-item>
</el-menu-item-group>
<el-sub-menu index="1-4">
<template #title>item four</template>
<el-menu-item index="1-4-1">item one</el-menu-item>
</el-sub-menu>
</el-sub-menu>
<el-menu-item index="2">
<el-icon><icon-menu /></el-icon>
<span>Navigator Two</span>
</el-menu-item>
<el-menu-item index="3" disabled>
<el-icon><document /></el-icon>
<span>Navigator Three</span>
</el-menu-item>
<el-menu-item index="4">
<el-icon><setting /></el-icon>
<span>Navigator Four</span>
</el-menu-item>
</el-menu>
</el-col>
</el-row>
</template>
<script lang="ts" setup>
import {
Document,
Menu as IconMenu,
Location,
Setting,
} from '@element-plus/icons-vue'
const handleOpen = (key: string, keyPath: string[]) => {
console.log(key, keyPath)
}
const handleClose = (key: string, keyPath: string[]) => {
console.log(key, keyPath)
}
</script>

13
0414task/src/main.ts

@ -0,0 +1,13 @@
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
import router from './router/index.js' // 引入路由
const app = createApp(App)
app.use(ElementPlus)
app.use(router) // 挂载路由
app.mount('#app')

35
0414task/src/router/index.js

@ -0,0 +1,35 @@
import { createRouter, createWebHistory } from 'vue-router'
import Recharge from '../views/Recharge.vue'
import Refund from '../views/Refund.vue'
import RechargeAudit from '../views/RechargeAudit.vue'
import RefundAudit from '../views/RefundAudit.vue'
const routes = [
{
path: '/recharge',
name: 'recharge',
component: Recharge
},
{
path: '/refund',
name: 'refund',
component: Refund
},
{
path: '/recharge-audit',
name: 'recharge-audit',
component: RechargeAudit
},
{
path: '/refund-audit',
name: 'refund-audit',
component: RefundAudit
}
]
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes
})
export default router

22
0414task/src/views/HomeView.vue

@ -0,0 +1,22 @@
<script setup>
</script>
<template>
<!-- 使用一个根元素包裹所有内容 -->
<div>
<div>HomeView</div>
<div>
<el-button>Default</el-button>
<el-button type="primary">Primary</el-button>
<el-button type="success">Success</el-button>
<el-button type="info">Info</el-button>
<el-button type="warning">Warning</el-button>
<el-button type="danger">Danger</el-button>
</div>
</div>
</template>
<style scoped>
</style>

230
0414task/src/views/Recharge.vue

@ -0,0 +1,230 @@
<template>
<div class="recharge-form">
<h2 class="form-title">后台充值</h2>
<form @submit.prevent="submitForm">
<!-- 精网号输入组 -->
<div class="form-group">
<label for="jwcode">精网号</label>
<!-- 添加 @blur 事件监听器 -->
<input
type="text"
id="jwcode"
v-model="formData.jwcode"
placeholder="请输入精网号"
required
@blur="checkJwcodeExists"
/>
</div>
<!-- 充值金额输入组 -->
<div class="form-group">
<label for="amount">充值金额</label>
<!-- 充值金额输入框使用 v-model.number 绑定到 formData.amount确保输入为数字 -->
<input
type="number"
id="amount"
v-model.number="formData.amount"
placeholder="请输入充值金额"
required
min="0"
/>
</div>
<!-- 支付方式选择组 -->
<div class="form-group">
<label for="payment-method">支付方式</label>
<!-- 支付方式选择框使用 v-model 绑定到 formData.paymentMethod -->
<select id="payment-method" v-model="formData.paymentMethod" required>
<!-- 默认选项 -->
<option value="">请选择支付方式</option>
<!-- 微信支付选项 -->
<option value="WECHAT">微信</option>
<!-- 支付宝支付选项 -->
<option value="ALIPAY">支付宝</option>
<!-- 银行卡支付选项 -->
<option value="BANK">银行卡</option>
</select>
</div>
<!-- 备注输入组 -->
<div class="form-group">
<label for="notes">备注</label>
<!-- 修正为绑定到 formData.notes -->
<textarea
id="notes"
v-model="formData.notes"
rows="4"
placeholder="请输入备注(非必填)"
></textarea>
</div>
<!-- 提交按钮组 -->
<div class="form-group">
<!-- 修改按钮根据 isLoading 状态显示不同文字和禁用状态 -->
<button type="submit" :disabled="isLoading">
{{ isLoading ? '提交中...' : '提交' }}
</button>
</div>
</form>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
formData: {
jwcode: '',
amount: null,
paymentMethod: '',
notes: ''
},
isLoading: false,
jwcodeExists: true //
};
},
methods: {
/**
* 检查精网号是否存在于数据库
*/
async checkJwcodeExists() {
if (!this.formData.jwcode) {
this.jwcodeExists = true;
return;
}
try {
const response = await axios.get(`http://192.168.8.94:8080/recharges/checkJwcode/${this.formData.jwcode}`);
if (response.data && typeof response.data.exists === 'boolean') {
this.jwcodeExists = response.data.exists;
} else {
console.error('后端返回的数据格式不正确,缺少 exists 属性或属性类型错误');
//
this.jwcodeExists = true;
}
if (!this.jwcodeExists) {
alert('用户不存在1,请检查精网号。');
}
} catch (error) {
console.error('检查精网号失败:', error);
alert('检查精网号时出错,请稍后再试。');
//
this.formData.jwcode = '';
}
},
/**
* 提交表单的方法
* 发送表单数据到后端并处理响应
*/
async submitForm() {
//
if (!this.formData.jwcode) {
alert("精网号不能为空!");
return;
}
//
if (!this.jwcodeExists) {
alert('用户不存在2,请检查精网号。');
return;
}
try {
// true
this.isLoading = true;
const response = await axios.post('http://192.168.8.94:8080/recharges/add/addRecharges', this.formData);
if (response.data.code === "200") {
console.log('后端响应:', response.data.code === "200");
alert('提交成功!');
} else {
alert('提交失败:' + (response.data.message || '未知错误'));
}
} catch (error) {
console.error('提交表单失败:', error);
alert('提交失败,请稍后再试。');
} finally {
//
this.formData = {
jwcode: '',
amount: null,
paymentMethod: '',
notes: ''
};
this.isLoading = false;
}
}
}
};
</script>
<style scoped>
/* 充值表单样式 */
.recharge-form {
min-width: 600px;
margin-left: 8px;
margin-top: 2px;
padding: 20px;
/* border: 10px solid #ccc; */
border-radius: 8px;
background-color: #f9f9f9;
}
/* 表单标题样式 */
.form-title {
text-align: center;
margin-bottom: 20px;
}
/* 表单组样式 */
.form-group {
margin-bottom: 15px;
}
/* 表单组标签样式 */
.form-group label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
/* 表单组输入框、选择框和文本框样式 */
.form-group input[type="text"],
.form-group input[type="number"],
.form-group select,
.form-group textarea {
width: 98%;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
}
/* 表单组文本框样式 */
.form-group textarea {
resize: vertical;
}
/* 表单组按钮样式 */
.form-group button {
width: 100%;
padding: 10px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
/* 表单组按钮悬停样式 */
.form-group button:hover {
background-color: #0056b3;
}
</style>

19
0414task/src/views/RechargeAudit.vue

@ -0,0 +1,19 @@
<template>
<div>
<h1>充值审核页面</h1>
<!-- 这里可以添加充值审核列表等内容 -->
</div>
</template>
<script setup>
import { ref } from 'vue'
const form = ref({
amount: '',
paymentMethod: ''
})
</script>
<style scoped>
/* 这里可以添加样式 */
</style>

195
0414task/src/views/Refund.vue

@ -0,0 +1,195 @@
<template>
<div class="refund-page">
<h2 class="page-title">退款操作</h2>
<form @submit.prevent="refund">
<div class="form-group">
<label for="jwcode">精网号</label>
<input
type="text"
id="jwcode"
v-model="jwcode"
placeholder="请输入精网号"
required
/>
</div>
<div class="form-group">
<label for="order-select">订单</label>
<select id="order-select" v-model="selectedOrder" required>
<option value="">请选择订单</option>
<option v-for="record in rechargeRecords" :key="record.id" :value="record.id">
{{ record.id }}
<!-- - {{ record.amount }} - {{ record.paymentMethod }} -->
</option>
</select>
</div>
<div class="form-group">
<label for="refundnotes">备注</label>
<textarea
id="notes"
v-model="refundnotes"
rows="4"
placeholder="请输入备注(非必填)"
></textarea>
</div>
<div class="form-group">
<button type="submit" :disabled="isLoading">
{{ isLoading ? '查询中...' : '退款' }}
</button>
</div>
</form>
</div>
</template>
<script>
export default {
data() {
return {
jwcode: '', //
selectedOrder: '', // ID(orderId)
refundnotes: '', // 退
rechargeRecords: [], //
isLoading: false //
};
},
methods: {
async fetchRechargeRecords() {
if (this.jwcode.length !== 6) {
this.rechargeRecords = []; // 6
return;
}
this.isLoading = true;
const REFUND_API_URL = 'http://192.168.8.94:8080/refunds/add/getOrderIds';
try {
const response = await fetch(`${REFUND_API_URL}?jwcode=${this.jwcode}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
// ["123456"]
this.rechargeRecords = data.map(record => ({
id: record, // ID
// amount: "", //
// paymentMethod: "" //
}));
} catch (error) {
console.error('查询充值记录失败:', error);
alert(`查询充值记录失败:${error.message}`);
} finally {
this.isLoading = false;
}
},
async refund() {
if (!this.selectedOrder) {
alert('请选择一个订单!');
return;
}
if (!confirm('确定要退款吗?')) {
return;
}
this.isLoading = true;
// 退
try {
const response = await fetch(`http://192.168.8.94:8080/refunds/add/addRefunds`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jwcode: this.jwcode,
orderId: this.selectedOrder,//orderId
notes: this.refundnotes
})
});
const result = await response.json();
console.log('后端返回结果:', result); //
if (result.code=== "200") {
alert('退款提交成功!');
this.selectedOrder = ''; //
this.refundnotes = ''; //
this.fetchRechargeRecords(); //
} else {
alert('退款失败:' + ('该订单已存在退款待审核或退款成功的记录,无法重复添加退款申请' || '未知错误'));
}
} catch (error) {
console.error('退款失败:', error);
alert('退款失败,请稍后再试。出现异常');
} finally {
this.isLoading = false;
}
}
},
watch: {
jwcode(newValue) {
if (newValue.length === 6) {
this.fetchRechargeRecords();
} else {
this.rechargeRecords = []; // 6
}
}
}
};
</script>
<style scoped>
.refund-page {
min-width: 600px;
margin-left: 8px;
margin-top: 10px;
padding: 20px;
/* border: 10px solid #ccc; */
border-radius: 8px;
background-color: #f9f9f9;
}
.page-title {
text-align: center;
margin-bottom: 20px;
}
.form-group {
margin-bottom: 15px;
}
.form-group label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
.form-group input[type="text"],
.form-group select,
.form-group textarea {
width: 98%;
padding: 8px;
border: 1px solid #ccc;
border-radius: 4px;
}
.form-group textarea {
resize: vertical;
}
.form-group button {
width: 100%;
padding: 10px;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.form-group button:disabled {
background-color: #ccc;
cursor: not-allowed;
}
.form-group button:hover {
background-color: #0056b3;
}
</style>

14
0414task/src/views/RefundAudit.vue

@ -0,0 +1,14 @@
<template>
<div>
<h1>退款审核页面</h1>
<!-- 这里可以添加退款审核列表等内容 -->
</div>
</template>
<script setup>
//
</script>
<style scoped>
/* 这里可以添加样式 */
</style>

12
0414task/tsconfig.app.json

@ -0,0 +1,12 @@
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"paths": {
"@/*": ["./src/*"]
}
}
}

11
0414task/tsconfig.json

@ -0,0 +1,11 @@
{
"files": [],
"references": [
{
"path": "./tsconfig.node.json"
},
{
"path": "./tsconfig.app.json"
}
]
}

19
0414task/tsconfig.node.json

@ -0,0 +1,19 @@
{
"extends": "@tsconfig/node22/tsconfig.json",
"include": [
"vite.config.*",
"vitest.config.*",
"cypress.config.*",
"nightwatch.conf.*",
"playwright.config.*",
"eslint.config.*"
],
"compilerOptions": {
"noEmit": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"module": "ESNext",
"moduleResolution": "Bundler",
"types": ["node"]
}
}

18
0414task/vite.config.ts

@ -0,0 +1,18 @@
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'
// https://vite.dev/config/
export default defineConfig({
plugins: [
vue(),
vueDevTools(),
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
},
},
})
Loading…
Cancel
Save