Browse Source

完工

lihuilin/feature-20250718094329-25周年庆后台
lihuilin 4 weeks ago
parent
commit
7f3a18f532
  1. 670
      activitylink/package-lock.json
  2. 2
      activitylink/package.json
  3. 80
      activitylink/src/api/manage/activity.js
  4. 16
      activitylink/src/api/manage/gift.js
  5. 30
      activitylink/src/api/manage/level.js
  6. 34
      activitylink/src/api/manage/win.js
  7. 2
      activitylink/src/main.js
  8. 74
      activitylink/src/stone/activityStone.js
  9. 48
      activitylink/src/stone/winStone.js
  10. 446
      activitylink/src/views/zhongchou/activity/detail/index.vue
  11. 137
      activitylink/src/views/zhongchou/activity/index.vue
  12. 396
      activitylink/src/views/zhongchou/activity/set/index.vue
  13. 385
      activitylink/src/views/zhongchou/winning/index.vue
  14. 17
      activitylink/vite.config.js

670
activitylink/package-lock.json

@ -12,7 +12,9 @@
"axios": "^1.10.0",
"element-plus": "^2.10.4",
"file-saver": "^2.0.5",
"localforage": "^1.10.0",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.4.1",
"vite": "^4.5.3",
"vue": "^3.5.17",
"vue-router": "^4.5.1"
@ -815,6 +817,18 @@
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
"license": "MIT"
},
"node_modules/deep-pick-omit": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz",
"integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==",
"license": "MIT"
},
"node_modules/defu": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
"license": "MIT"
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@ -824,6 +838,12 @@
"node": ">=0.4.0"
}
},
"node_modules/destr": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
"integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
"license": "MIT"
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@ -1129,6 +1149,12 @@
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==",
"license": "MIT"
},
"node_modules/immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
"integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
"license": "MIT"
},
"node_modules/is-what": {
"version": "4.1.16",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
@ -1141,6 +1167,24 @@
"url": "https://github.com/sponsors/mesqueeb"
}
},
"node_modules/lie": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
"integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==",
"license": "MIT",
"dependencies": {
"immediate": "~3.0.5"
}
},
"node_modules/localforage": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz",
"integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==",
"license": "Apache-2.0",
"dependencies": {
"lie": "3.1.1"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
@ -1272,6 +1316,45 @@
}
}
},
<<<<<<< HEAD
=======
"node_modules/pinia-plugin-persistedstate": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.4.1.tgz",
"integrity": "sha512-lmuMPpXla2zJKjxEq34e1E9P9jxkWEhcVwwioCCE0izG45kkTOvQfCzvwhW3i38cvnaWC7T1eRdkd15Re59ldw==",
"license": "MIT",
"dependencies": {
"deep-pick-omit": "^1.2.1",
"defu": "^6.1.4",
"destr": "^2.0.5"
},
"peerDependencies": {
"@nuxt/kit": ">=3.0.0",
"@pinia/nuxt": ">=0.10.0",
"pinia": ">=3.0.0"
},
"peerDependenciesMeta": {
"@nuxt/kit": {
"optional": true
},
"@pinia/nuxt": {
"optional": true
},
"pinia": {
"optional": true
}
}
},
"node_modules/pinia/node_modules/@vue/devtools-api": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz",
"integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==",
"license": "MIT",
"dependencies": {
"@vue/devtools-kit": "^7.7.7"
}
},
>>>>>>> wangxiangwen/feature-20250716103042-+
"node_modules/postcss": {
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
@ -1451,9 +1534,596 @@
},
"node_modules/vue-router/node_modules/@vue/devtools-api": {
"version": "6.6.4",
<<<<<<< HEAD
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
"license": "MIT"
=======
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
"integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="
},
"@vue/devtools-kit": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz",
"integrity": "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==",
"requires": {
"@vue/devtools-shared": "^7.7.7",
"birpc": "^2.3.0",
"hookable": "^5.5.3",
"mitt": "^3.0.1",
"perfect-debounce": "^1.0.0",
"speakingurl": "^14.0.1",
"superjson": "^2.2.2"
}
},
"@vue/devtools-shared": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz",
"integrity": "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==",
"requires": {
"rfdc": "^1.4.1"
}
},
"@vue/reactivity": {
"version": "3.5.17",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/reactivity/-/reactivity-3.5.17.tgz",
"integrity": "sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==",
"requires": {
"@vue/shared": "3.5.17"
}
},
"@vue/runtime-core": {
"version": "3.5.17",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/runtime-core/-/runtime-core-3.5.17.tgz",
"integrity": "sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==",
"requires": {
"@vue/reactivity": "3.5.17",
"@vue/shared": "3.5.17"
}
},
"@vue/runtime-dom": {
"version": "3.5.17",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/runtime-dom/-/runtime-dom-3.5.17.tgz",
"integrity": "sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==",
"requires": {
"@vue/reactivity": "3.5.17",
"@vue/runtime-core": "3.5.17",
"@vue/shared": "3.5.17",
"csstype": "^3.1.3"
}
},
"@vue/server-renderer": {
"version": "3.5.17",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/server-renderer/-/server-renderer-3.5.17.tgz",
"integrity": "sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==",
"requires": {
"@vue/compiler-ssr": "3.5.17",
"@vue/shared": "3.5.17"
}
},
"@vue/shared": {
"version": "3.5.17",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vue/shared/-/shared-3.5.17.tgz",
"integrity": "sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg=="
},
"@vueuse/core": {
"version": "9.13.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vueuse/core/-/core-9.13.0.tgz",
"integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==",
"requires": {
"@types/web-bluetooth": "^0.0.16",
"@vueuse/metadata": "9.13.0",
"@vueuse/shared": "9.13.0",
"vue-demi": "*"
},
"dependencies": {
"vue-demi": {
"version": "0.14.10",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"requires": {}
}
}
},
"@vueuse/metadata": {
"version": "9.13.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vueuse/metadata/-/metadata-9.13.0.tgz",
"integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ=="
},
"@vueuse/shared": {
"version": "9.13.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/@vueuse/shared/-/shared-9.13.0.tgz",
"integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==",
"requires": {
"vue-demi": "*"
},
"dependencies": {
"vue-demi": {
"version": "0.14.10",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/vue-demi/-/vue-demi-0.14.10.tgz",
"integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
"requires": {}
}
}
},
"async-validator": {
"version": "4.2.5",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/async-validator/-/async-validator-4.2.5.tgz",
"integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
},
"asynckit": {
"version": "0.4.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
},
"axios": {
"version": "1.10.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/axios/-/axios-1.10.0.tgz",
"integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
"requires": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.0",
"proxy-from-env": "^1.1.0"
}
},
"birpc": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/birpc/-/birpc-2.5.0.tgz",
"integrity": "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ=="
},
"call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"requires": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
}
},
"combined-stream": {
"version": "1.0.8",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
"delayed-stream": "~1.0.0"
}
},
"copy-anything": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
"integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
"requires": {
"is-what": "^4.1.8"
}
},
"csstype": {
"version": "3.1.3",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"dayjs": {
"version": "1.11.13",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/dayjs/-/dayjs-1.11.13.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg=="
},
"deep-pick-omit": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz",
"integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw=="
},
"defu": {
"version": "6.1.4",
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg=="
},
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
},
"destr": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
"integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="
},
"dunder-proto": {
"version": "1.0.1",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"requires": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
}
},
"element-plus": {
"version": "2.10.4",
"resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.10.4.tgz",
"integrity": "sha512-UD4elWHrCnp1xlPhbXmVcaKFLCRaRAY6WWRwemGfGW3ceIjXm9fSYc9RNH3AiOEA6Ds1p9ZvhCs76CR9J8Vd+A==",
"requires": {
"@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"
}
},
"entities": {
"version": "4.5.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
},
"es-define-property": {
"version": "1.0.1",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="
},
"es-errors": {
"version": "1.3.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/es-errors/-/es-errors-1.3.0.tgz",
"integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="
},
"es-object-atoms": {
"version": "1.1.1",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"requires": {
"es-errors": "^1.3.0"
}
},
"es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"requires": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
}
},
"esbuild": {
"version": "0.18.20",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/esbuild/-/esbuild-0.18.20.tgz",
"integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
"requires": {
"@esbuild/android-arm": "0.18.20",
"@esbuild/android-arm64": "0.18.20",
"@esbuild/android-x64": "0.18.20",
"@esbuild/darwin-arm64": "0.18.20",
"@esbuild/darwin-x64": "0.18.20",
"@esbuild/freebsd-arm64": "0.18.20",
"@esbuild/freebsd-x64": "0.18.20",
"@esbuild/linux-arm": "0.18.20",
"@esbuild/linux-arm64": "0.18.20",
"@esbuild/linux-ia32": "0.18.20",
"@esbuild/linux-loong64": "0.18.20",
"@esbuild/linux-mips64el": "0.18.20",
"@esbuild/linux-ppc64": "0.18.20",
"@esbuild/linux-riscv64": "0.18.20",
"@esbuild/linux-s390x": "0.18.20",
"@esbuild/linux-x64": "0.18.20",
"@esbuild/netbsd-x64": "0.18.20",
"@esbuild/openbsd-x64": "0.18.20",
"@esbuild/sunos-x64": "0.18.20",
"@esbuild/win32-arm64": "0.18.20",
"@esbuild/win32-ia32": "0.18.20",
"@esbuild/win32-x64": "0.18.20"
}
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
},
"estree-walker": {
"version": "2.0.2",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
},
"file-saver": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
},
"follow-redirects": {
"version": "1.15.9",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/follow-redirects/-/follow-redirects-1.15.9.tgz",
"integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="
},
"form-data": {
"version": "4.0.3",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/form-data/-/form-data-4.0.3.tgz",
"integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==",
"requires": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
}
},
"fsevents": {
"version": "2.3.3",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/fsevents/-/fsevents-2.3.3.tgz",
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"optional": true
},
"function-bind": {
"version": "1.1.2",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/function-bind/-/function-bind-1.1.2.tgz",
"integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="
},
"get-intrinsic": {
"version": "1.3.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"requires": {
"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"
}
},
"get-proto": {
"version": "1.0.1",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"requires": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
}
},
"gopd": {
"version": "1.2.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="
},
"has-symbols": {
"version": "1.1.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="
},
"has-tostringtag": {
"version": "1.0.2",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"requires": {
"has-symbols": "^1.0.3"
}
},
"hasown": {
"version": "2.0.2",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/hasown/-/hasown-2.0.2.tgz",
"integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"requires": {
"function-bind": "^1.1.2"
}
},
"hookable": {
"version": "5.5.3",
"resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz",
"integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="
},
"immediate": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
"integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="
},
"is-what": {
"version": "4.1.16",
"resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
"integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="
},
"lie": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
"integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==",
"requires": {
"immediate": "~3.0.5"
}
},
"localforage": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz",
"integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==",
"requires": {
"lie": "3.1.1"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"lodash-es": {
"version": "4.17.21",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/lodash-es/-/lodash-es-4.17.21.tgz",
"integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
},
"lodash-unified": {
"version": "1.0.3",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/lodash-unified/-/lodash-unified-1.0.3.tgz",
"integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
"requires": {}
},
"magic-string": {
"version": "0.30.17",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/magic-string/-/magic-string-0.30.17.tgz",
"integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
"requires": {
"@jridgewell/sourcemap-codec": "^1.5.0"
}
},
"math-intrinsics": {
"version": "1.1.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="
},
"memoize-one": {
"version": "6.0.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/memoize-one/-/memoize-one-6.0.0.tgz",
"integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
},
"mime-db": {
"version": "1.52.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.35",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"requires": {
"mime-db": "1.52.0"
}
},
"mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
"integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
},
"nanoid": {
"version": "3.3.11",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="
},
"normalize-wheel-es": {
"version": "1.2.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
"integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
},
"perfect-debounce": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
"integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="
},
"picocolors": {
"version": "1.1.1",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
},
"pinia": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.3.tgz",
"integrity": "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA==",
"requires": {
"@vue/devtools-api": "^7.7.2"
},
"dependencies": {
"@vue/devtools-api": {
"version": "7.7.7",
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.7.tgz",
"integrity": "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==",
"requires": {
"@vue/devtools-kit": "^7.7.7"
}
}
}
},
"pinia-plugin-persistedstate": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.4.1.tgz",
"integrity": "sha512-lmuMPpXla2zJKjxEq34e1E9P9jxkWEhcVwwioCCE0izG45kkTOvQfCzvwhW3i38cvnaWC7T1eRdkd15Re59ldw==",
"requires": {
"deep-pick-omit": "^1.2.1",
"defu": "^6.1.4",
"destr": "^2.0.5"
}
},
"postcss": {
"version": "8.5.6",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/postcss/-/postcss-8.5.6.tgz",
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"requires": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
}
},
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"rfdc": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
"integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="
},
"rollup": {
"version": "3.29.5",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/rollup/-/rollup-3.29.5.tgz",
"integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==",
"requires": {
"fsevents": "~2.3.2"
}
},
"source-map-js": {
"version": "1.2.1",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
},
"speakingurl": {
"version": "14.0.1",
"resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz",
"integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="
},
"superjson": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz",
"integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==",
"requires": {
"copy-anything": "^3.0.2"
}
},
"vite": {
"version": "4.5.3",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/vite/-/vite-4.5.3.tgz",
"integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==",
"requires": {
"esbuild": "^0.18.10",
"fsevents": "~2.3.2",
"postcss": "^8.4.27",
"rollup": "^3.27.1"
}
},
"vue": {
"version": "3.5.17",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/vue/-/vue-3.5.17.tgz",
"integrity": "sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==",
"requires": {
"@vue/compiler-dom": "3.5.17",
"@vue/compiler-sfc": "3.5.17",
"@vue/runtime-dom": "3.5.17",
"@vue/server-renderer": "3.5.17",
"@vue/shared": "3.5.17"
}
},
"vue-router": {
"version": "4.5.1",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/vue-router/-/vue-router-4.5.1.tgz",
"integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==",
"requires": {
"@vue/devtools-api": "^6.6.4"
}
>>>>>>> wangxiangwen/feature-20250716103042-+
}
}
}

2
activitylink/package.json

@ -13,7 +13,9 @@
"axios": "^1.10.0",
"element-plus": "^2.10.4",
"file-saver": "^2.0.5",
"localforage": "^1.10.0",
"pinia": "^3.0.3",
"pinia-plugin-persistedstate": "^4.4.1",
"vite": "^4.5.3",
"vue": "^3.5.17",
"vue-router": "^4.5.1"

80
activitylink/src/api/manage/activity.js

@ -34,7 +34,85 @@ export function getDetailList() {
return request({
url: '/admin/funding/getActivityDetail',
method: 'post',
})
}
export function getDetailListbyActivityId(data) {
return request({
url: '/admin/funding/getActivityDetail',
method: 'post',
data
})
}
export function getDetailMessage(activityId){
return request({
url: '/admin/funding/getActivityDate',
method: 'post',
params: { activityId }
})
}
export function showsetDetail(activityId){
return request({
url: '/admin/funding/getDate',
method: 'post',
params: { activityId }
})
}
// export function showaddDetail(activityId,stock,addTotal){
// return request({
// url: '/admin/funding/addDateVirtual',
// method: 'post',
// params: { activityId,stock,addTotal }
// })
// }
export function showaddDetail(data){
return request({
url: '/admin/funding/addDateVirtual',
method: 'post',
data
})
}
export function setTime(activityId,time){
return request({
url: '/admin/funding/setActivityTime',
method: 'post',
params: { activityId,time }
})
}
export function getMarket(){
return request({
url: '/admin/funding/getMarketList',
method: 'get',
})
}
export function deleteActivityById(activityId)
{
return request({
url: '/admin/funding/deleteActivity',
method: 'post',
params: { activityId }
})
}
export function exportActivityDataExcel(data)
{
return request({
url: '/admin/funding/exportActivityData',
method: 'post',
data,
responseType: 'blob'
})
}

16
activitylink/src/api/manage/gift.js

@ -1,5 +1,6 @@
import request from '@/utils/request'
<<<<<<< HEAD
//奖品新增
export function addPrize(data) {
return request({
@ -16,8 +17,21 @@ export function addPrize(data) {
export function deletePrize(id) {
return request({
url: '/admin/prize/delete',
=======
// export function deleteUser(id) {
// return request({
// url: '/admin/prize/update',
// method: 'post',
// params: { id }
// })
// }
export function getGiftList(pageNum,pageSize) {
return request({
url: '/admin/prize/list',
>>>>>>> wangxiangwen/feature-20250716103042-周年活动+众筹前台页面
method: 'post',
params: { id }
params: { pageNum,pageSize }
})
}
//奖品分页查询

30
activitylink/src/api/manage/level.js

@ -1,5 +1,6 @@
import request from '@/utils/request'
<<<<<<< HEAD
// 等级查询
export function getLevelList(params) {
return request({
@ -9,10 +10,34 @@ export function getLevelList(params) {
})
}
// 等级新增
=======
export function deleteLevel() {
return request({
url: '/admin/grade/delete',
method: 'post',
})
}
export function getLevelList(pageNum,pageSize){
return request({
url: '/admin/grade/list',
method: 'post',
params: {
pageNum,
pageSize
}
})
}
>>>>>>> wangxiangwen/feature-20250716103042-周年活动+众筹前台页面
export function addLevel(data) {
return request({
url: '/admin/grade/add',
method: 'post',
<<<<<<< HEAD
data,
headers: {
'Content-Type': 'application/json'
@ -58,3 +83,8 @@ export function getGradeNameList() {
}
=======
data
})
}
>>>>>>> wangxiangwen/feature-20250716103042-周年活动+众筹前台页面

34
activitylink/src/api/manage/win.js

@ -1,9 +1,37 @@
import request from '@/utils/request'
export function deleteUser(id) {
// export function getWinList(pageNum,pageSize,data) {
// return request({
// url: '/admin/win/list',
// method: 'post',
// params: { pageNum,pageSize },
// data
// })
// }
export function getWinList(data) {
  return request({
    url: '/admin/win/list',
    method: 'post',
    data
  })
}
export function getWinLevelList(){
return request({
url: '/admin/grade/allGradeName',
method: 'post',
})
}
export function exportWinExcel(data)
{
return request({
url: '/admin/user/delete',
url: '/admin/win/export',
method: 'post',
params: { id }
data,
responseType: 'blob'
})
}

2
activitylink/src/main.js

@ -6,10 +6,12 @@ import App from './App.vue'
import router from './router'
import { createPinia } from 'pinia'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'
import axios from 'axios'
// createApp(App).use(router).mount('#app')
const app = createApp(App)
const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)
window.axios = axios
// axios.defaults.baseURL = 'http://47.92.148.30:3003/mock/3267'
app.use(router)

74
activitylink/src/stone/activityStone.js

@ -1,21 +1,69 @@
// src/stone/giftFixedListStone.js
// src/stone/activityStone.js
import { defineStore } from "pinia";
import { ref } from 'vue';
import localforage from 'localforage';
export const useactivitytone = defineStore('activityStone', () => {
// 响应式属性
const selectactivityId = ref(0);
// 创建本地存储实例
const activityStorage = localforage.createInstance({
name: 'activityStore',
storeName: 'activityData'
});
// 方法
const setselectedactivityId = (name) => {
selectactivityId.value = name;
};
export const useactivityStone = defineStore('activityStone', () => {
// 原有字段
const selectactivityId = ref(localStorage.getItem('selectactivityId') || '');
const setselectedactivityId = (id) => {
selectactivityId.value = id;
localStorage.setItem('selectactivityId', id);
};
// 新增:持久化搜索用户名
const searchUsername = ref(localStorage.getItem('searchUsername') || '');
const setSearchUsername = (value) => {
searchUsername.value = value;
localStorage.setItem('searchUsername', value);
activityStorage.setItem('searchUsername', value).catch((err) => {
console.error('保存 searchUsername 到 localforage 失败:', err);
});
};
// 新增:持久化搜索精网号
const searchJwcode = ref(localStorage.getItem('searchJwcode') || '');
const setSearchJwcode = (value) => {
searchJwcode.value = value;
localStorage.setItem('searchJwcode', value);
activityStorage.setItem('searchJwcode', value).catch((err) => {
console.error('保存 searchJwcode 到 localforage 失败:', err);
});
};
// 暴露出去
return {
selectactivityId,
setselectedactivityId,
};
// 初始化恢复
const initialize = async () => {
try {
const storedUsername = await activityStorage.getItem('searchUsername');
if (storedUsername !== null) searchUsername.value = storedUsername;
const storedJwcode = await activityStorage.getItem('searchJwcode');
if (storedJwcode !== null) searchJwcode.value = storedJwcode;
const storedId = await activityStorage.getItem('selectactivityId');
if (storedId !== null) selectactivityId.value = storedId;
} catch (error) {
console.warn('从 localforage 恢复失败,尝试从 localStorage 恢复');
searchUsername.value = localStorage.getItem('searchUsername') || '';
searchJwcode.value = localStorage.getItem('searchJwcode') || '';
selectactivityId.value = localStorage.getItem('selectactivityId') || '';
}
};
initialize();
return {
selectactivityId,
searchUsername,
searchJwcode,
setselectedactivityId,
setSearchUsername,
setSearchJwcode
};
});

48
activitylink/src/stone/winStone.js

@ -0,0 +1,48 @@
import { defineStore } from "pinia";
import { ref } from 'vue';
import localforage from 'localforage';
// 创建本地存储实例
const winStorage = localforage.createInstance({
name: 'winStore',
storeName: 'winData'
});
export const useWinStone = defineStore('winStone', () => {
// 持久化参数:searchgradeId
const searchgradeId = ref(localStorage.getItem('searchgradeId') || '');
// 设置 searchgradeId 并持久化
const setSearchgradeId = (value) => {
searchgradeId.value = value;
localStorage.setItem('searchgradeId', value);
winStorage.setItem('searchgradeId', value).catch((err) => {
console.error('保存 searchgradeId 到 localforage 失败:', err);
});
};
// 初始化恢复数据
const initialize = async () => {
try {
const storedgradeId = await winStorage.getItem('searchgradeId');
if (storedgradeId !== null) {
searchgradeId.value = storedgradeId;
}
} catch (error) {
console.warn('从 localforage 恢复失败,尝试从 localStorage 恢复');
const localStoragegradeId = localStorage.getItem('searchgradeId');
if (localStoragegradeId !== null) {
searchgradeId.value = localStoragegradeId;
}
}
};
// 初始化时恢复数据
initialize();
// 暴露出去
return {
searchgradeId,
setSearchgradeId,
};
});

446
activitylink/src/views/zhongchou/activity/detail/index.vue

@ -1,63 +1,58 @@
<!-- 美股是0 港股是1 精网号现在用的是字符串类型-->
<template>
<el-card style="margin-top:50px ; min-height: 90vh; max-height: 90vh;">
<div class="gray-container">
<el-button type="primary" @click="goBack">
<i class="el-icon-back"></i> 返回
<i class="el-icon-back"></i> 返回
</el-button>
<!-- 顶部信息栏 -->
<div class="info-bar">
当前总参与人数{{ totalParticipants }} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
参与美股总人数{{ usParticipants }} &nbsp;&nbsp;&nbsp;&nbsp; 美股助力总次数{{ usAssists }} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
参与港股总人数{{ hkParticipants }} &nbsp;&nbsp;&nbsp;&nbsp; 港股助力总次数{{ hkAssists }} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</div>
<!-- 顶部信息栏 -->
<div class="info-bar">
当前总参与人数{{ totalParticipants }} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
参与{{marketOneLabel}}总人数{{ usParticipants }} &nbsp;&nbsp;&nbsp;&nbsp; {{marketOneLabel}}助力总次数{{ usAssists }} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
参与{{marketTwoLabel}}总人数{{ hkParticipants }} &nbsp;&nbsp;&nbsp;&nbsp; {{marketTwoLabel}}助力总次数{{ hkAssists }} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
当前活动id{{ activityStone.selectactivityId }}
</div>
<!-- 搜索栏 -->
<el-form :inline="true" class="search-bar">
<el-form-item label="姓名">
<el-input v-model="searchdata.name" placeholder="请输入姓名"></el-input>
</el-form-item>
<el-form-item label="精网号">
<el-input v-model="searchdata.jingwangId" placeholder="请输入精网号" @input="handleJingwangIdInput"></el-input>
</el-form-item>
<el-form-item label="市场" class="market-item">
<el-select v-model="searchdata.market" placeholder="请选择" class="market-select">
<el-option label="全部" value="0"></el-option>
<el-option label="美股" value="1"></el-option>
<el-option label="港股" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">搜索</el-button>
</el-form-item>
<el-form-item>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleExport">导出数据</el-button>
</el-form-item>
</el-form>
<!-- 表格 -->
<div class="table-container">
<el-table :data="currentPageData" style="width: 100%" :row-style="{ height: '55px' }">
<el-table-column prop="id" label="ID" width="100" align="center"></el-table-column>
<el-table-column prop="name" label="姓名" width="300" align="center"></el-table-column>
<el-table-column prop="jingwangId" label="精网号" width="300" align="center"></el-table-column>
<el-table-column prop="market" label="参与市场" width="300" align="center">
<template #default="scope">
<span v-if="scope.row.market == '0' ">美股</span>
<span v-if="scope.row.market == '1' ">港股</span>
</template>
</el-table-column>
<el-table-column prop="participationTime" label="参与时间" align="center"></el-table-column>
</el-table>
</div>
<!-- 搜索栏 -->
<el-form :inline="true" class="search-bar">
<el-form-item label="姓名">
<el-input v-model="searchdata.username" placeholder="请输入姓名"></el-input>
</el-form-item>
<el-form-item label="精网号">
<el-input v-model="searchdata.jwcode" placeholder="请输入精网号" @input="handleJwcodeInput"></el-input>
</el-form-item>
<el-form-item label="市场" class="market-item">
<el-select v-model="searchdata.marketSign" placeholder="请选择" style="width: 100%" class="market-select">
<el-option
v-for="market in marketList"
:key="market.id"
:label="market.market"
:value="market.id"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleSearch">搜索</el-button>
</el-form-item>
<el-form-item>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleExport">导出数据</el-button>
</el-form-item>
</el-form>
<!-- 表格 -->
<div class="table-container">
<el-table :data="tableData" style="width: 100%" :row-style="{ height: '55px' }">
<el-table-column prop="id" label="ID" width="100" align="center"></el-table-column>
<el-table-column prop="username" label="姓名" width="300" align="center"></el-table-column>
<el-table-column prop="jwcode" label="精网号" width="300" align="center"></el-table-column>
<el-table-column prop="text" label="参与市场" width="300" align="center"></el-table-column>
<el-table-column prop="joinTime" label="参与时间" align="center"></el-table-column>
</el-table>
</div>
</div>
<!-- 返回按钮 -->
<!-- 分页 -->
<el-pagination
@ -67,189 +62,242 @@
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="tableData.length"
:total="total"
>
</el-pagination>
</el-card>
</el-card>
</template>
<script setup>
import { ref, computed } from 'vue'
import { useRouter } from 'vue-router'
import { ref, onMounted } from 'vue'
import { useRouter , onBeforeRouteLeave} from 'vue-router'
import { useactivityStone } from '@/stone/activityStone'
import { getDetailListbyActivityId, getDetailMessage, getMarket, exportActivityDataExcel } from '@/api/manage/activity'
import { ElMessage } from 'element-plus'
const activityStone = useactivityStone()
const router = useRouter()
//
const totalParticipants = ref(156)
const usParticipants = ref(78)
const usAssists = ref(345)
const hkParticipants = ref(78)
const hkAssists = ref(234)
const totalParticipants = ref(0)
const usParticipants = ref(0)
const usAssists = ref(0)
const hkParticipants = ref(0)
const hkAssists = ref(0)
const marketOneLabel = ref('')
const marketTwoLabel = ref('')
const marketList = ref([])
//
const fetchMarketList = async () => {
try {
const response = await getMarket()
if (response.code === 200) {
marketList.value = response.data
} else {
console.error('获取市场列表失败:', response.message)
}
} catch (error) {
console.error('请求市场列表失败:', error)
}
}
// 使
const searchdata = ref({
name: '',
jingwangId: '',
market: ''
username: '',
jwcode: '',
marketSign: ''
})
const tableData = ref([
{
id: 1,
name: '张家伟',
jingwangId: '90047666',
market: '0',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
},
{
id: 2,
name: '张三',
jingwangId: '90047666',
market: '1',
participationTime: '2025年7月11日 09:46'
}
])
const tableData = ref([])
const total = ref(0)
const currentPage = ref(1)
const pageSize = ref(10)
//
const currentPageData = computed(() => {
const start = (currentPage.value - 1) * pageSize.value
const end = start + pageSize.value
return tableData.value.slice(start, end)
})
//
const goBack = () => {
router.back()
}
//
const handleSearch = () => {
console.log('Search:', searchdata.value)
currentPage.value = 1
//
activityStone.setSearchUsername(searchdata.value.username)
activityStone.setSearchJwcode(searchdata.value.jwcode)
getDetailData()
//
searchdata.value = {
username: '',
jwcode: '',
marketSign: ''
}
}
//
const handleReset = () => {
searchdata.value = {
name: '',
jingwangId: '',
market: ''
username: '',
jwcode: '',
marketSign: ''
}
//
activityStone.setSearchUsername('')
activityStone.setSearchJwcode('')
getDetailData()
}
//
const handleExport = () => {
console.log('Export Data')
}
//
const handleExport = async () => {
try {
const activityId = activityStone.selectactivityId;
const username = activityStone.searchUsername;
const jwcode = activityStone.searchJwcode;
if (!activityId) {
ElMessage.warning('活动ID为空,无法导出数据');
return;
}
//
const exportData = {
activityId,
username,
jwcode
};
// blob
const response = await exportActivityDataExcel(exportData);
// Blob
const blob = new Blob([response], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
//
const downloadUrl = window.URL.createObjectURL(blob);
// <a>
const link = document.createElement('a');
link.href = downloadUrl;
link.setAttribute('download', '周年庆活动.xlsx'); // .xlsx
document.body.appendChild(link);
link.click();
//
link.remove();
window.URL.revokeObjectURL(downloadUrl);
} catch (error) {
console.error('导出数据失败:', error);
ElMessage.error('导出数据失败');
}
};
// size
const handleSizeChange = (val) => {
pageSize.value = val
currentPage.value = 1
getDetailData()
}
//
const handleCurrentChange = (val) => {
currentPage.value = val
getDetailData()
}
//
const handleJingwangIdInput = (value) => {
searchdata.value.jingwangId = value.replace(/\D/g, '')
const handleJwcodeInput = (value) => {
searchdata.value.jwcode = value.replace(/\D/g, '')
}
//
onMounted(async () => {
getDetailData()
fetchDetailMessage()
fetchMarketList()
})
onBeforeRouteLeave((to, from, next) => {
// activity/index
if (to.name !== 'activityDetail') {
// activityStone
activityStone.setSearchUsername('')
activityStone.setSearchJwcode('')
}
next() // next()
})
//
const getDetailData = async () => {
try {
const activityId = activityStone.selectactivityId
// 使
const username = activityStone.searchUsername
const jwcode = activityStone.searchJwcode
const marketSign = searchdata.value.marketSign
if (!activityId) {
console.warn('未获取到 activityId')
return
}
const response = await getDetailListbyActivityId({
activityId,
username,
jwcode,
marketSign,
page: currentPage.value,
pagesize: pageSize.value
})
if (response.code === 200) {
tableData.value = response.data.list
total.value = response.data.total || 0
} else {
console.error('获取数据失败:', response.message)
ElMessage.error(response.message || '获取数据失败')
}
} catch (error) {
console.error('请求失败:', error)
ElMessage.error('请求失败,请重试')
}
}
//
const fetchDetailMessage = async () => {
try {
const activityId = activityStone.selectactivityId
if (!activityId) {
console.warn('未获取到 activityId')
return
}
const response = await getDetailMessage(activityId)
if (response.code === 200) {
const data = response.data
totalParticipants.value = data.people_total
usParticipants.value = data.marketOnePeople
usAssists.value = data.marketOneTotal
hkParticipants.value = data.marketTwoPeople
hkAssists.value = data.marketTwoTotal
marketOneLabel.value = data.marketOneName
marketTwoLabel.value = data.marketTwoName
} else {
console.error('获取顶部信息失败:', response.message)
ElMessage.error(response.message || '获取顶部信息失败')
}
} catch (error) {
console.error('请求顶部信息失败:', error)
ElMessage.error('请求失败,请重试')
}
}
</script>
@ -260,11 +308,11 @@ const handleJingwangIdInput = (value) => {
}
.gray-container {
width: 100%; /* 宽度自适应 */
background-color: #ffffff; /* 浅灰色背景 */
padding: 20px; /* 内边距 */
box-sizing: border-box; /* 包含内边距在总宽度内 */
min-height: 80vh; /* 设置最小高度 */
width: 100%;
background-color: #ffffff;
padding: 20px;
box-sizing: border-box;
min-height: 80vh;
overflow-x: hidden;
}
@ -273,15 +321,15 @@ const handleJingwangIdInput = (value) => {
}
.market-item {
width: 200px; /* 根据需要调整宽度 */
width: 200px;
}
.market-select {
width: 100%; /* 确保 select 宽度与 form-item 一致 */
width: 100%;
}
.table-container {
height: 600px; /* 根据需要调整高度 */
overflow-y: auto; /* 启用垂直滚动条 */
height: 600px;
overflow-y: auto;
}
</style>

137
activitylink/src/views/zhongchou/activity/index.vue

@ -12,10 +12,11 @@
</div>
<!-- 其他内容区域 -->
<div class="content-area">
<el-table :data="currentPageData" style="width: auto" :row-style="{ height: '60px' }">
<div class="table-container">
<el-table :data="currentPageData" style="width: auto" :row-style="{ height: '60px' } ">
<el-table-column prop="activityName" label="活动名称"></el-table-column>
<el-table-column prop="marketOne" label="股票一"></el-table-column>
<el-table-column prop="marketTwo" label="股票二"></el-table-column>
<el-table-column prop="marketOne" label="市场一"></el-table-column>
<el-table-column prop="marketTwo" label="市场二"></el-table-column>
<!-- 新增两列 -->
<el-table-column prop="startTime" label="开始时间"></el-table-column>
@ -28,8 +29,8 @@
</el-table-column>
<el-table-column label="设置数据">
<template #default="{ $index }">
<a href="#" style="color: red;" @click.prevent="goToSet">设置</a>
<template #default="scope">
<a href="#" style="color: red;" @click.prevent="goToSet(scope.row)">设置</a>
</template>
</el-table-column>
@ -45,7 +46,29 @@
/>
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button size="small" type="danger" @click="openDeleteDialog(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 删除确认对话框 -->
<el-dialog v-model="deleteConfirmVisible" title="提示" width="30%">
<span>您确定删除该活动吗</span>
<template #footer>
<span class="dialog-footer">
<el-button @click="deleteConfirmVisible = false"> </el-button>
<el-button type="primary" @click="confirmDelete"> </el-button>
</span>
</template>
</el-dialog>
<el-dialog
v-model="centerDialogVisible"
@ -59,10 +82,25 @@
<el-input v-model="activity.activityName" placeholder="请输入活动名称" />
</el-form-item>
<el-form-item label="股票一" prop="marketOne">
<el-input v-model="activity.marketOne" placeholder="请输入股票一" />
<el-select v-model="activity.marketOne" placeholder="请选择市场一" style="width: 100%">
<el-option
v-for="market in marketList"
:key="market.id"
:label="market.market"
:value="market.id"
/>
</el-select>
</el-form-item>
<el-form-item label="股票二" prop="marketTwo">
<el-input v-model="activity.marketTwo" placeholder="请输入股票二" />
<el-select v-model="activity.marketTwo" placeholder="请选择市场二" style="width: 100%">
<el-option
v-for="market in marketList"
:key="market.id"
:label="market.market"
:value="market.id"
/>
</el-select>
</el-form-item>
<el-form-item label="活动状态" prop="status">
<el-select v-model="activity.status" placeholder="请选择活动状态">
@ -125,15 +163,44 @@
<script setup>
import { ref, computed, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { getActivityList , changeStatusbyId ,addActivityandtime} from '@/api/manage/activity';
import { ElMessage } from 'element-plus';
import { useactivitytone } from '@/stone/activityStone';
import { getActivityList , changeStatusbyId ,addActivityandtime ,getMarket , deleteActivityById} from '@/api/manage/activity';
import { ElButton, ElMessage } from 'element-plus';
import { useactivityStone } from '@/stone/activityStone';
const router = useRouter();
const centerDialogVisible = ref(false);
// 使 ref
const tableData = ref([]);
const activityStone = useactivitytone();
const activityStone = useactivityStone();
//
const marketList = ref([])
// ID
const setActivityId = (id) => {
activityStone.setselectedactivityId(id)
}
// ID
const getActivityId = () => {
return activityStone.selectactivityId
}
//
const fetchMarketList = async () => {
try {
const response = await getMarket()
if (response.code === 200) {
marketList.value = response.data
} else {
console.error('获取市场列表失败:', response.message)
}
} catch (error) {
console.error('请求市场列表失败:', error)
}
}
//
const cancel = () => {
centerDialogVisible.value = false;
@ -181,6 +248,41 @@ const addActivity = async () => {
}
}
//
const deleteConfirmVisible = ref(false)
const activityToDelete = ref(null)
//
const openDeleteDialog = (row) => {
activityToDelete.value = row.id
deleteConfirmVisible.value = true
}
//
const confirmDelete = async () => {
if (!activityToDelete.value) {
ElMessage.warning('未获取到活动ID')
return
}
try {
const response = await deleteActivityById(activityToDelete.value)
if (response.code === 200) {
ElMessage.success('活动删除成功')
fetchActivityList() //
} else {
ElMessage.error(response.message || '删除失败')
}
} catch (error) {
console.error('删除活动失败:', error)
ElMessage.error('请求失败,请重试')
} finally {
deleteConfirmVisible.value = false
activityToDelete.value = null
}
}
const activity = ref({
activityName: '',
marketOne: '',
@ -212,11 +314,11 @@ const handleCurrentChange = (val) => {
//
const goToDetail = (row) => {
activityStone.setselectedactivity(row.id);
router.push({ name: 'activityDetail' });
};
const goToSet = () => {
const goToSet = (row) => {
activityStone.setselectedactivityId(row.id);
router.push({ name: 'activitySet' });
};
@ -265,6 +367,7 @@ const updateStatus = async (row) => {
//
onMounted(() => {
fetchActivityList();
fetchMarketList();
});
</script>
@ -275,7 +378,8 @@ onMounted(() => {
padding: 20px; /* 内边距 */
box-sizing: border-box; /* 包含内边距在总宽度内 */
min-height: 80vh; /* 设置最小高度 */
overflow-x: hidden;
/* overflow-x: hidden; */
overflow-y: auto;
}
.activity-header {
@ -319,4 +423,9 @@ th {
margin-top: 20px;
text-align: center;
}
.table-container {
height: 650px; /* 根据需要调整高度 */
overflow-y: auto; /* 启用垂直滚动条 */
}
</style>

396
activitylink/src/views/zhongchou/activity/set/index.vue

@ -1,93 +1,142 @@
<template>
<el-card style="margin-top:50px; min-height: 90vh; max-height: 90vh;">
<div class="data-settings">
<br><br><br><br><br>
<el-button type="primary" @click="goBack">
<i class="el-icon-back"></i> 返回
</el-button>
<el-card style="margin-top:50px; min-height: 90vh; max-height: 90vh;">
<div class="data-settings">
<!-- 返回按钮 -->
<h3>数据设置</h3>
<br><br><br><br><br>
<el-button type="primary" @click="goBack">
<i class="el-icon-back"></i> 返回
</el-button>
<div class="setting-item">
<label>设置初始数据</label>
<el-input-number :precision="0" :min="0" v-model="setinitiaData" placeholder="分钟" size="large"></el-input-number>
&nbsp;&nbsp;分钟
&nbsp;&nbsp;&nbsp;&nbsp;
<el-button type="primary" @click="openInitialConfirmDialog">确认</el-button>
</div>
<h3>数据设置</h3>
<!-- 市场一 -->
<div class="setting-item">
<label>当前{{ marketOneName }}市场助力次数{{ markerOneTotal }} </label>
<el-input-number :precision="0" :min="0" v-model="addCountOne" placeholder="设置添加次数" size="large"></el-input-number>
&nbsp;&nbsp;&nbsp;&nbsp;
<el-button type="primary" @click="openConfirmDialog('one')">确认</el-button>
&nbsp;&nbsp;&nbsp;&nbsp;
<label>前端展示次数{{ showOne }} </label>
</div>
<div class="setting-item">
<label>设置初始数据</label>
<el-input-number :precision="0" :min="0" v-model="initialData" placeholder="分钟" size="large"></el-input-number>
&nbsp;&nbsp;分钟
&nbsp;&nbsp;&nbsp;&nbsp;
<el-button type="primary" @click="openInitialConfirmDialog">确认</el-button>
</div>
<!-- 市场二 -->
<div class="setting-item">
<label>当前{{ marketTwoName }}市场助力次数{{ markerTwoTotal }} </label>
<el-input-number :precision="0" :min="0" v-model="addCountTwo" placeholder="设置添加次数" size="large"></el-input-number>
&nbsp;&nbsp;&nbsp;&nbsp;
<el-button type="primary" @click="openConfirmDialog('two')">确认</el-button>
&nbsp;&nbsp;&nbsp;&nbsp;
<label>前端展示次数{{ showTwo }} </label>
</div>
<div class="setting-item">
<label>当前美股助力次数{{ usStockBoostCount }} </label>
<el-input-number :precision="0" :min="0" v-model="usStockAddCount" placeholder="设置添加次数" size="large"></el-input-number>
&nbsp;&nbsp;&nbsp;&nbsp;
<el-button type="primary" @click="openConfirmDialog('us')">确认</el-button>
&nbsp;&nbsp;&nbsp;&nbsp;
<label>前端展示次数{{ usStockDisplayCount }} </label>
</div>
<!-- 时间数据 -->
<div class="setting-item">
<label>当前初始数据为{{ initialData }} 分钟</label>
</div>
<div class="setting-item">
<label>当前港股助力次数{{ hkStockBoostCount }} </label>
<el-input-number :precision="0" :min="0" v-model="hkStockAddCount" placeholder="设置添加次数" size="large"></el-input-number>
&nbsp;&nbsp;&nbsp;&nbsp;
<el-button type="primary" @click="openConfirmDialog('hk')">确认</el-button>
&nbsp;&nbsp;&nbsp;&nbsp;
<label>前端展示次数{{ hkStockDisplayCount }} </label>
</div>
<!-- 确认对话框 -->
<el-dialog v-model="showConfirmDialog" title="确认添加" width="30%">
<span>您确定要添加这些次数吗</span>
<template #footer>
<span class="dialog-footer">
<el-button @click="showConfirmDialog = false"> </el-button>
<el-button type="primary" @click="confirmAdd"> </el-button>
</span>
</template>
</el-dialog>
<!-- 确认对话框 -->
<el-dialog v-model="showConfirmDialog" title="确认添加" width="30%">
<span>您确定要添加这些次数吗</span>
<template #footer>
<span class="dialog-footer">
<el-button @click="showConfirmDialog = false"> </el-button>
<el-button type="primary" @click="confirmAdd"> </el-button>
</span>
</template>
</el-dialog>
<!-- 初始数据确认对话框 -->
<el-dialog v-model="showInitialConfirmDialog" title="确认设置初始数据" width="30%">
<span>您确定要设置初始数据为 {{ initialData }} 分钟吗</span>
<template #footer>
<span class="dialog-footer">
<el-button @click="showInitialConfirmDialog = false"> </el-button>
<el-button type="primary" @click="confirmInitialData"> </el-button>
</span>
</template>
</el-dialog>
</div>
</el-card>
<!-- 初始数据确认对话框 -->
<el-dialog v-model="showInitialConfirmDialog" title="确认设置初始数据" width="30%" @closed="cancelset">
<span>您确定要设置初始数据为 {{ setinitiaData }} 分钟吗</span>
<template #footer>
<span class="dialog-footer">
<el-button @click="cancelset"> </el-button>
<el-button type="primary" @click="confirmInitialData"> </el-button>
</span>
</template>
</el-dialog>
</div>
</el-card>
</template>
<script setup>
import { ref } from 'vue';
import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { showsetDetail , showaddDetail , setTime } from '@/api/manage/activity'
import { useactivityStone } from '@/stone/activityStone'
import { ElMessage } from 'element-plus';
const router = useRouter();
const activityStone = useactivityStone()
//
const initialData = ref(0);
const setinitiaData = ref(0);
const addCountOne = ref(null);
const addCountTwo = ref(null);
const showConfirmDialog = ref(false);
const showInitialConfirmDialog = ref(false);
const pendingAction = ref(null); // ('one' or 'two')
//
const initialData = ref(null);
const usStockBoostCount = ref(234);
const usStockAddCount = ref(null);
const usStockDisplayCount = ref(345);
// API
const marketOne = ref(''); //
const marketTwo = ref(''); //
const markerOneTotal = ref(0); //
const markerTwoTotal = ref(0); //
const showOne = ref(0); //
const showTwo = ref(0); //
const marketOneId = ref('');
const marketTwoId = ref('');
//
// const marketNames = {
// 'usa': '',
// 'hk': ''
// };
const hkStockBoostCount = ref(164);
const hkStockAddCount = ref(null);
const hkStockDisplayCount = ref(355);
//
const marketOneName = ref('');
const marketTwoName = ref('');
//
const showConfirmDialog = ref(false);
//
const fetchData = async () => {
try {
const response = await showsetDetail(activityStone.selectactivityId);
const data = response.data;
console.log(data);
//
marketOne.value = data.marketOne;
marketTwo.value = data.marketTwo;
markerOneTotal.value = data.markerOneTotal;
markerTwoTotal.value = data.markerTwoTotal;
showOne.value = data.showOne;
showTwo.value = data.showTwo;
initialData.value = data.time;
marketOneId.value = data.marketOneId;
marketTwoId.value = data.marketTwoId;
//
marketOneName.value = data.marketOne;
marketTwoName.value = data.marketTwo;
} catch (error) {
console.error('获取数据失败:', error);
//
}
};
const showInitialConfirmDialog = ref(false);
const pendingInitialData = ref('');
let pendingAction = ref(null); // ('us' or 'hk')
//
onMounted(() => {
fetchData();
});
//
const openConfirmDialog = (type) => {
if ((type === 'us' && usStockAddCount.value) || (type === 'hk' && hkStockAddCount.value)) {
if ((type === 'one' && addCountOne.value !== null) ||
(type === 'two' && addCountTwo.value !== null)) {
pendingAction.value = type;
showConfirmDialog.value = true;
}
@ -95,38 +144,123 @@ const openConfirmDialog = (type) => {
//
const openInitialConfirmDialog = () => {
if (initialData.value) {
pendingInitialData.value = initialData.value;
if (initialData.value !== null) {
showInitialConfirmDialog.value = true;
}
};
const cancelset = () => {
showInitialConfirmDialog.value = false
setinitiaData.value = 0
};
//
//
const confirmInitialData = () => {
//
console.log('已设置初始数据:', pendingInitialData.value);
const confirmInitialData = async () => {
try {
const id = activityStone.selectactivityId
const time = setinitiaData.value
//
initialData.value = null;
showInitialConfirmDialog.value = false;
};
if (!id) {
ElMessage.warning('未获取到活动ID')
return
}
if (time === null || time <= 0) {
ElMessage.warning('请输入有效的分钟数')
return
}
const response = await setTime(
id,
time
)
if (response.code === 200) {
await fetchData()
showInitialConfirmDialog.value = false
setinitiaData.value=0
ElMessage.success('设置成功')
} else {
ElMessage.error(response.message || '设置失败')
}
} catch (error) {
console.error('设置初始数据失败:', error)
ElMessage.error('请求失败,请重试')
}
}
//
const confirmAdd = () => {
const confirmAdd = async () => {
const type = pendingAction.value;
if (type === 'us') {
usStockBoostCount.value += parseInt(usStockAddCount.value);
usStockDisplayCount.value = usStockBoostCount.value;
usStockAddCount.value = null;
} else if (type === 'hk') {
hkStockBoostCount.value += parseInt(hkStockAddCount.value);
hkStockDisplayCount.value = hkStockBoostCount.value;
hkStockAddCount.value = null;
if (type === 'one' && addCountOne.value !== null && addCountOne.value > 0) {
markerOneTotal.value += parseInt(addCountOne.value);
showOne.value = markerOneTotal.value;
//
try {
console.log(marketOne.value)
const response = await showaddDetail({
activityId: activityStone.selectactivityId,
stock: marketOneId.value,
addTotal: addCountOne.value
});
if (response.code === 200) {
fetchData();
ElMessage.success('助力次数添加成功');
} else {
ElMessage.error(response.message || '添加失败');
//
markerOneTotal.value -= parseInt(addCountOne.value);
showOne.value = markerOneTotal.value;
}
} catch (error) {
console.error('添加助力次数失败:', error);
ElMessage.error('请求失败,请重试');
//
markerOneTotal.value -= parseInt(addCountOne.value);
showOne.value = markerOneTotal.value;
}
addCountOne.value = null;
} else if (type === 'two' && addCountTwo.value !== null && addCountTwo.value > 0) {
markerTwoTotal.value += parseInt(addCountTwo.value);
showTwo.value = markerTwoTotal.value;
//
try {
const response = await showaddDetail({
activityId: activityStone.selectactivityId,
stock: marketTwoId.value,
addTotal: addCountTwo.value
});
if (response.code === 200) {
fetchData();
ElMessage.success('助力次数添加成功');
} else {
ElMessage.error(response.message || '添加失败');
//
markerTwoTotal.value -= parseInt(addCountTwo.value);
showTwo.value = markerTwoTotal.value;
}
} catch (error) {
console.error('添加助力次数失败:', error);
ElMessage.error('请求失败,请重试');
//
markerTwoTotal.value -= parseInt(addCountTwo.value);
showTwo.value = markerTwoTotal.value;
}
addCountTwo.value = null;
}
//
pendingAction.value = null;
showConfirmDialog.value = false;
pendingAction.value = null;
};
//
@ -135,45 +269,43 @@ const goBack = () => {
};
</script>
<style scoped>
.data-settings {
background-color: #ffffff;
padding: 40px;
border-radius: 16px;
width: 100%;
max-width: 800px;
margin: 0 auto;
font-size: 1.2rem;
}
.setting-item {
margin-bottom: 25px;
display: flex;
align-items: center;
justify-content: flex-start;
}
.setting-item label {
margin-right: 20px;
font-size: 1.1rem;
}
.setting-item input {
width: 150px;
height: 40px;
font-size: 1.1rem;
text-align: center;
margin-right: 20px;
}
.el-button {
height: 40px;
font-size: 1.1rem;
padding: 0 20px;
}
h3 {
font-size: 1.8rem;
margin-bottom: 20px;
}
</style>
<style scoped>
.data-settings {
background-color: #ffffff;
padding: 40px;
border-radius: 16px;
width: 100%;
max-width: 800px;
margin: 0 auto;
font-size: 1.2rem;
}
.setting-item {
margin-bottom: 25px;
display: flex;
align-items: center;
justify-content: flex-start;
flex-wrap: wrap;
}
.setting-item label {
margin-right: 20px;
font-size: 1.1rem;
min-width: 200px;
}
.el-input-number {
width: 180px;
}
.el-button {
height: 40px;
font-size: 1.1rem;
padding: 0 20px;
}
h3 {
font-size: 1.8rem;
margin-bottom: 20px;
}
</style>

385
activitylink/src/views/zhongchou/winning/index.vue

@ -1,33 +1,38 @@
<!-- 0特等奖 1一等奖 以此类推 -->
<template>
<el-card style="margin-top: 50px ; min-height: 90vh; max-height: 90vh;">
<!-- 返回按钮 -->
<!-- 搜索栏 -->
<div class="gray-container">
<h2>中奖管理</h2>
<el-form :inline="true" class="search-bar">
<el-card style="margin-top: 50px; min-height: 90vh; max-height: 90vh;">
<!-- 搜索栏 -->
<div class="gray-container">
<h2>中奖管理</h2>
<el-form :inline="true" class="search-bar">
<el-form-item label="姓名">
<el-input v-model="searchData.name" placeholder="请输入姓名"></el-input>
<el-input v-model="searchParams.username" placeholder="请输入姓名"></el-input>
</el-form-item>
<el-form-item label="精网号">
<el-input
v-model="searchData.jingwangId"
placeholder="请输入精网号"
<el-input
v-model="searchParams.jwcode"
placeholder="请输入精网号"
@input="handleJingwangIdInput"
></el-input>
</el-form-item>
<el-form-item label="中奖等级">
<el-select v-model="searchData.prizeLevel" placeholder="请选择" class="prize-level-select">
<el-select
v-model="searchParams.gradeId"
placeholder="请选择"
class="prize-level-select"
style="width: 220px"
>
<el-option label="全部" value=""></el-option>
<el-option label="特等奖" value="0"></el-option>
<el-option label="一等奖" value="1"></el-option>
<!-- 其他选项... -->
<el-option
v-for="item in gradeOptions"
:key="item.id"
:label="item.gradeName"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary">搜索</el-button>
<el-button type="primary" @click="handleSearch">搜索</el-button>
</el-form-item>
<el-form-item>
<el-button @click="handleReset">重置</el-button>
@ -39,196 +44,197 @@
<!-- 表格 -->
<div class="table-container">
<el-table :data="currentPageData" style="width: 100%" :row-style="{ height: '55px' }">
<el-table-column prop="id" label="ID" width="100" align="center"></el-table-column>
<el-table-column prop="name" label="姓名" width="180" align="center"></el-table-column>
<el-table-column prop="jingwangId" label="精网号" width="250" align="center"></el-table-column>
<!-- <el-table-column prop="prizeLevel" label="中奖等级" width="200" align="center"></el-table-column> -->
<el-table-column label="中奖等级" width="200" align="center">
<template #default="scope">
<span v-if="scope.row.prizeLevel == '0' ">特等奖</span>
<span v-if="scope.row.prizeLevel == '1' ">一等奖</span>
<span v-if="scope.row.prizeLevel == '2' ">二等奖</span>
<span v-if="scope.row.prizeLevel == '3' ">三等奖</span>
</template>
</el-table-column>
<el-table-column prop="prizeItem" label="所中礼品" width="300" align="center"></el-table-column>
<el-table-column prop="prizeTime" label="中奖时间" align="center"></el-table-column>
<el-table :data="tableData" style="width: 100%" :row-style="{ height: '55px' }">
<el-table-column prop="username" label="姓名" width="180" align="center"></el-table-column>
<el-table-column prop="jwcode" label="精网号" width="250" align="center"></el-table-column>
<el-table-column prop="gradeName" label="中奖等级" width="200" align="center"></el-table-column>
<el-table-column prop="prizeName" label="所中礼品" width="300" align="center"></el-table-column>
<el-table-column prop="winTime" label="中奖时间" align="center"></el-table-column>
</el-table>
</div>
</div>
<!-- 分页 -->
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="tableData.length"
>
</el-pagination>
</div>
<!-- 分页组件 -->
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="searchParams.pageNum"
:page-sizes="[10, 20, 50, 100]"
:page-size="searchParams.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
>
</el-pagination>
</el-card>
</template>
<script setup>
import { ref, computed } from 'vue'
import { useRouter } from 'vue-router'
const router = useRouter()
//
const searchData = ref({
name: '',
jingwangId: '',
prizeLevel: ''
})
const tableData = ref([
{
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
}, {
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
}, {
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
}, {
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
}, {
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
}, {
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
}, {
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
}, {
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
}, {
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
}, {
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
}, {
id: 1,
name: '张家伟',
jingwangId: '90047666',
prizeLevel: '0',
prizeItem: 'zimomo',
prizeTime: '2025-07-12 14:05:30'
},
// ...
])
const currentPage = ref(1)
const pageSize = ref(10)
//
const currentPageData = computed(() => {
const start = (currentPage.value - 1) * pageSize.value
const end = start + pageSize.value
return tableData.value.slice(start, end)
import { ref, onMounted } from 'vue'
import { useactivityStone } from '@/stone/activityStone'
import { useWinStone } from '@/stone/winStone'
import { getWinList, getWinLevelList ,exportWinExcel} from '@/api/manage/win'
import { onBeforeRouteLeave } from 'vue-router'
import { ElMessage } from 'element-plus'
const activityStone = useactivityStone()
const winStone = useWinStone()
// 使
const searchParams = ref({
pageNum: 1,
pageSize: 10,
username: "",
gradeId: "",
jwcode: ""
})
//
const gradeOptions = ref([])
//
const tableData = ref([])
const total = ref(0)
//
const fetchWinLevelList = async () => {
try {
const res = await getWinLevelList()
if (res.code === 200) {
gradeOptions.value = res.data
}
} catch (error) {
console.error('获取中奖等级列表失败:', error)
}
}
// const currentPageData = computed(() => {
// const start = (currentPage.value - 1) * pageSize.value
// const end = start + pageSize.value
// return tableData.value.slice(start, end)
// })
//
const fetchWinList = async () => {
try {
const requestData = {
username: activityStone.searchUsername,
gradeId: winStone.searchgradeId,
jwcode: activityStone.searchJwcode,
pageNum: searchParams.value.pageNum,
pageSize: searchParams.value.pageSize
}
console.log('请求参数:', requestData)
const res = await getWinList(requestData)
if (res.code === 200) {
tableData.value = res.data.list
console.log('获取中奖列表成功:', tableData.value)
total.value = res.data.total
}
} catch (error) {
console.error('获取中奖列表失败:', error)
}
}
//
const handleSearch = () => {
searchParams.value.pageNum = 1
//
activityStone.setSearchUsername(searchParams.value.username)
activityStone.setSearchJwcode(searchParams.value.jwcode)
winStone.setSearchgradeId(searchParams.value.gradeId)
//
const goBack = () => {
router.back()
fetchWinList()
}
//
const handleExport = () => {
console.log('Export Data')
}
const handleExport = async () => {
try {
const username = activityStone.searchUsername;
const jwcode = activityStone.searchJwcode;
const gradeId = winStone.searchgradeId;
//
const exportData = {
gradeId,
username,
jwcode
};
// blob
const response = await exportWinExcel(exportData);
// Blob
const blob = new Blob([response], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
});
//
const downloadUrl = window.URL.createObjectURL(blob);
// <a>
const link = document.createElement('a');
link.href = downloadUrl;
link.setAttribute('download', '中奖用户.xlsx'); // .xlsx
document.body.appendChild(link);
link.click();
//
link.remove();
window.URL.revokeObjectURL(downloadUrl);
} catch (error) {
console.error('导出数据失败:', error);
ElMessage.error('导出数据失败');
}
};
// size
const handleSizeChange = (val) => {
pageSize.value = val
currentPage.value = 1
}
//
const handleCurrentChange = (val) => {
currentPage.value = val
//
const handleReset = () => {
searchParams.value = {
pageNum: 1,
pageSize: 10,
username: '',
gradeId: '',
jwcode: ''
}
//
activityStone.setSearchUsername('')
activityStone.setSearchJwcode('')
winStone.setSearchgradeId('')
fetchWinList()
}
//
//
const handleJingwangIdInput = (value) => {
searchData.value.jingwangId = value.replace(/\D/g, '')
searchParams.value.jwcode = value.replace(/\D/g, '')
}
//
const handleReset = () => {
searchData.value = {
name: '',
jingwangId: '',
prizeLevel: ''
//
onMounted(() => {
fetchWinLevelList()
fetchWinList()
})
onBeforeRouteLeave((to, from, next) => {
// activity/index
if (to.name !== 'zhongchouwinning') {
// winStone gradeId
winStone.setSearchgradeId('')
// activityStone
activityStone.setSearchUsername('')
activityStone.setSearchJwcode('')
}
}
next() // next()
})
</script>
<style scoped>
.info-bar {
margin: 10px 0;
font-size: 16px;
.gray-container {
width: 100%;
background-color: #ffffff;
padding: 20px;
box-sizing: border-box;
min-height: 80vh;
overflow-x: hidden;
}
.search-bar {
@ -236,20 +242,11 @@ const handleReset = () => {
}
.prize-level-select {
width: 200px; /* 调整中奖等级选择框的宽度 */
width: 220px;
}
.table-container {
height: 600px; /* 根据需要调整高度 */
overflow-y: auto; /* 启用垂直滚动条 */
}
.gray-container {
width: 100%; /* 宽度自适应 */
background-color: #ffffff; /* 浅灰色背景 */
padding: 20px; /* 内边距 */
box-sizing: border-box; /* 包含内边距在总宽度内 */
min-height: 80vh; /* 设置最小高度 */
overflow-x: hidden;
height: 600px;
overflow-y: auto;
}
</style>

17
activitylink/vite.config.js

@ -11,13 +11,16 @@ export default defineConfig({
'@': path.resolve(__dirname, './src')
}
},
server: {
proxy: {
'/admin': {
target: 'https://dbqb.nfdxy.net/devLotApi',
changeOrigin: true,
rewrite: (path) => path
server: {
proxy: {
'/api': {
target: 'https://dbqb.nfdxy.net/devLotApi', // 后端基础地址
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ''), // 移除 /api 前缀
// 或者更精确的重写(根据后端路径调整):
// rewrite: (path) => path.replace(/^\/api\/admin/, '/admin'),
},
},
},
},
});
);
Loading…
Cancel
Save