Browse Source

数据持久化处理+等级管理测试

lihuilin/feature-20250718094329-25周年庆后台
wangxiangwen4 4 weeks ago
parent
commit
503299616e
  1. 117
      activitylink/package-lock.json
  2. 2
      activitylink/package.json
  3. 12
      activitylink/src/api/manage/activity.js
  4. 14
      activitylink/src/api/manage/gift.js
  5. 26
      activitylink/src/api/manage/level.js
  6. 8
      activitylink/src/api/manage/win.js
  7. 2
      activitylink/src/main.js
  8. 50
      activitylink/src/stone/activityStone.js
  9. 10
      activitylink/src/views/zhongchou/activity/index.vue
  10. 21
      activitylink/src/views/zhongchou/activity/set/index.vue
  11. 521
      activitylink/src/views/zhongchou/level/index.vue
  12. 2
      activitylink/src/views/zhongchou/winning/index.vue
  13. 9
      activitylink/vite.config.js

117
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"
@ -812,6 +814,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://mirrors.huaweicloud.com/repository/npm/delayed-stream/-/delayed-stream-1.0.0.tgz",
@ -821,6 +835,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://mirrors.huaweicloud.com/repository/npm/dunder-proto/-/dunder-proto-1.0.1.tgz",
@ -1126,6 +1146,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",
@ -1138,6 +1164,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://mirrors.huaweicloud.com/repository/npm/lodash/-/lodash-4.17.21.tgz",
@ -1269,6 +1313,33 @@
}
}
},
"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",
@ -1898,11 +1969,26 @@
"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",
@ -2098,11 +2184,32 @@
"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",
@ -2193,6 +2300,16 @@
}
}
},
"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",

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"

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

@ -65,11 +65,19 @@ export function showsetDetail(activityId){
})
}
export function showaddDetail(activityId,stock,addTotal){
// 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',
params: { activityId,stock,addTotal }
data
})
}

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

@ -1,9 +1,17 @@
import request from '@/utils/request'
export function deleteUser(id) {
// export function deleteUser(id) {
// return request({
// url: '/admin/prize/update',
// method: 'post',
// params: { id }
// })
// }
export function getGiftList(pageNum,pageSize) {
return request({
url: '/admin/prize/update',
url: '/admin/prize/list',
method: 'post',
params: { id }
params: { pageNum,pageSize }
})
}

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

@ -1,10 +1,30 @@
import request from '@/utils/request'
export function deleteUser() {
export function deleteLevel() {
return request({
url: '/admin/funding/getActivity',
method: 'get',
url: '/admin/grade/delete',
method: 'post',
})
}
export function getLevelList(pageNum,pageSize){
return request({
url: '/admin/grade/list',
method: 'post',
params: {
pageNum,
pageSize
}
})
}
export function addLevel(data) {
return request({
url: '/admin/grade/add',
method: 'post',
data
})
}

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

@ -7,4 +7,12 @@ export function getWinList(pageNum,pageSize,data) {
params: { pageNum,pageSize },
data
})
}
export function getWinLevelList(){
return request({
url: '/admin/grade/allGradeName',
method: 'post',
})
}

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)

50
activitylink/src/stone/activityStone.js

@ -1,21 +1,47 @@
// src/stone/giftFixedListStone.js
// src/stone/activityStone.js
import { defineStore } from "pinia";
import { ref } from 'vue';
import localforage from 'localforage';
// 创建本地存储实例
const activityStorage = localforage.createInstance({
name: 'activityStore',
storeName: 'activityData'
});
export const useactivitytone = defineStore('activityStone', () => {
// 响应式属性
const selectactivityId = ref(0);
// 尝试从本地存储恢复初始值,否则使用默认值
const selectactivityId = ref(localStorage.getItem('selectactivityId') || 0);
// 方法
const setselectedactivityId = (name) => {
selectactivityId.value = name;
};
// 方法
const setselectedactivityId = (id) => {
selectactivityId.value = id;
// 同时保存到 localStorage 作为备份
localStorage.setItem('selectactivityId', id);
};
// 在 store 初始化时从持久化存储恢复数据
const initialize = async () => {
try {
const storedId = await activityStorage.getItem('selectactivityId');
if (storedId !== null) {
selectactivityId.value = storedId;
}
} catch (error) {
console.warn('从 localforage 恢复数据失败,尝试从 localStorage 恢复');
const localStorageId = localStorage.getItem('selectactivityId');
if (localStorageId !== null) {
selectactivityId.value = localStorageId;
}
}
};
// 立即初始化
initialize();
// 暴露出去
return {
selectactivityId,
setselectedactivityId,
};
// 暴露出去
return {
selectactivityId,
setselectedactivityId,
};
});

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

@ -176,6 +176,16 @@ const activityStone = useactivitytone();
//
const marketList = ref([])
// ID
const setActivityId = (id) => {
activityStone.setselectedactivityId(id)
}
// ID
const getActivityId = () => {
return activityStone.selectactivityId
}
//
const fetchMarketList = async () => {
try {

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

@ -199,11 +199,12 @@ const confirmAdd = async () => {
//
try {
const response = await showaddDetail(
activityStone.selectactivityId,
marketOne.value,
addCountOne.value
);
console.log(marketOne.value)
const response = await showaddDetail({
activityId: activityStone.selectactivityId,
stock: marketOne.value,
addTotal: addCountOne.value
});
if (response.code === 200) {
fetchData();
@ -230,11 +231,11 @@ const confirmAdd = async () => {
//
try {
const response = await showaddDetail(
activityStone.selectactivityId,
marketTwo.value,
addCountTwo.value
);
const response = await showaddDetail({
activityId: activityStone.selectactivityId,
stock: marketTwo.value,
addTotal: addCountTwo.value
});
if (response.code === 200) {
fetchData();

521
activitylink/src/views/zhongchou/level/index.vue

@ -1,337 +1,242 @@
<template>
<el-card style="margin-top: 50px; min-height: 90vh; max-height: 90vh; display: flex; flex-direction: column;">
<div class="level-management-container" style="flex: 1; overflow-y: auto;">
<h2>等级管理</h2>
<!-- 添加等级按钮 -->
<div class="action-buttons">
<el-button type="primary" @click="showAddDialog">添加等级</el-button>
</div>
<!-- 等级表格 -->
<div class="table-container">
<el-table :data="currentPageData" style="width: 100%" :row-style="{ height: '55px' }">
<el-table-column type="index" label="ID" width="150" align="center" />
<el-table-column prop="gradeName" label="等级名称" width="200" align="center" />
<el-table-column prop="num" label="数量" width="250" align="center" />
<el-table-column prop="numPeople" label="每轮抽取人数" width="300" align="center" />
<el-table-column prop="sort" label="排序" width="200" align="center" />
<el-table-column fixed="right" label="操作" align="center">
<template #default="scope">
<div style="display: flex; gap: 10px; justify-content: center;">
<el-button size="default" @click="editLevel(scope.row)">编辑</el-button>
<el-button size="default" @click=setmor>设置多个</el-button>
<el-button size="default" type="danger" @click="deleteLevel(scope.row)">删除</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
<el-card style="margin-top: 50px; min-height: 90vh; max-height: 90vh; display: flex; flex-direction: column;">
<div class="level-management-container" style="flex: 1; overflow-y: auto;">
<h2>等级管理</h2>
<!-- 添加等级按钮 -->
<div class="action-buttons">
<el-button type="primary" @click="showAddDialog">添加等级</el-button>
</div>
<!-- 分页 -->
<el-pagination
class="pagination"
v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="tableData.length"
:page-sizes="[10, 20, 50, 100]"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
<!-- 添加/编辑等级对话框 -->
<el-dialog v-model="dialogVisible" :title="dialogTitle" width=400px @closed="resetForm">
<el-form :model="form" label-width="120px">
<el-form-item label="等级名称" align="center">
<el-input v-model="form.gradeName" placeholder="请输入等级名称"></el-input>
</el-form-item>
<el-form-item label="数量" align="center">
<el-input-number v-model="form.num" :precision="0" :min="0" placeholder="请输入数量" style="width: 100%;"></el-input-number>
</el-form-item>
<el-form-item label="每轮抽取人数" align="center">
<el-input-number v-model="form.numPeople" :precision="0" :min="0" placeholder="请输入抽取人数" style="width: 100%;"></el-input-number>
</el-form-item>
<el-form-item label="排序" align="center">
<el-input-number v-model="form.sort" :precision="0" :min="0" placeholder="请输入排序等级" style="width: 100%;"></el-input-number>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</span>
</template>
</el-dialog>
<!-- 设置多个对话框 -->
<!-- 添加/编辑等级对话框 -->
<el-dialog v-model="setmore" :title="setTitle" width=400px @closed="resetForm">
<el-form :model="form" label-width="120px">
<el-form-item label="等级名称" align="center">
<el-input v-model="form.gradeName" placeholder="请输入等级名称"></el-input>
</el-form-item>
<el-form-item label="数量" align="center">
<el-input-number v-model="form.num" :precision="0" :min="0" placeholder="请输入数量" style="width: 100%;"></el-input-number>
</el-form-item>
<el-form-item label="每轮抽取人数" align="center">
<el-input-number v-model="form.numPeople" :precision="0" :min="0" placeholder="请输入抽取人数" style="width: 100%;"></el-input-number>
</el-form-item>
<el-form-item label="排序" align="center">
<el-input-number v-model="form.sort" :precision="0" :min="0" placeholder="请输入排序等级" style="width: 100%;"></el-input-number>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="setmore = false">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</span>
</template>
</el-dialog>
</el-card>
</template>
<script setup>
import { ref, computed,onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
// import { deleteUser } from '@/api/manage/level'
import { deleteUser } from '@/api/manage/level'
// import axios from 'axios';
//
const tableData = ref([
{
id: 1,
gradeName: '等级一',
num: 100,
numPeople: 10,
sort: 1
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
},
{
id: 2,
gradeName: '等级二',
num: 200,
numPeople: 20,
sort: 2
}
])
<!-- 等级表格 -->
<div class="table-container">
<el-table :data="tableData" style="width: 100%" :row-style="{ height: '55px' }">
<el-table-column type="index" label="ID" width="150" align="center">
<template #default="scope">
{{ (pagination.pageNum - 1) * pagination.pageSize + scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="gradeName" label="等级名称" width="200" align="center" />
<el-table-column prop="amount" label="数量" width="250" align="center" />
<el-table-column prop="perWin" label="每轮抽取人数" width="300" align="center" />
<el-table-column prop="sort" label="排序" width="200" align="center" />
<el-table-column fixed="right" label="操作" align="center">
<template #default="scope">
<div style="display: flex; gap: 10px; justify-content: center;">
<el-button size="default" @click="editLevel(scope.row)">编辑</el-button>
<!-- <el-button size="default" @click="setmor">设置多个</el-button> -->
<el-button size="default" type="danger" @click="deleteLevel(scope.row)">删除</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
const setmore=ref(false)
//
const pagination = ref({
pageNum: 1,
pageSize: 10
})
const currentPageData = computed(() => {
const start = (pagination.value.pageNum - 1) * pagination.value.pageSize
const end = start + pagination.value.pageSize
return tableData.value.slice(start, end)
})
const handleSizeChange = (val) => {
pagination.value.pageSize = val
pagination.value.pageNum = 1
}
onMounted(() => {
//
<!-- 分页 -->
<el-pagination
class="pagination"
v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
:page-sizes="[10, 20, 50, 100]"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
<!-- 添加/编辑等级对话框 -->
<el-dialog v-model="dialogVisible" :title="dialogTitle" width="400px" @closed="resetForm">
<el-form :model="form" label-width="120px">
<el-form-item label="等级名称" align="center">
<el-input v-model="form.gradeName" placeholder="请输入等级名称"></el-input>
</el-form-item>
<el-form-item label="数量" align="center">
<el-input-number v-model="form.amount" :precision="0" :min="0" placeholder="请输入数量" style="width: 100%;"></el-input-number>
</el-form-item>
<el-form-item label="每轮抽取人数" align="center">
<el-input-number v-model="form.perWin" :precision="0" :min="0" placeholder="请输入抽取人数" style="width: 100%;"></el-input-number>
</el-form-item>
<el-form-item label="排序" align="center">
<el-input-number v-model="form.sort" :precision="0" :min="0" placeholder="请输入排序等级" style="width: 100%;"></el-input-number>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确认</el-button>
</span>
</template>
</el-dialog>
</el-card>
</template>
deleteUser().then(response => {
console.log('删除成功:', response)
}).catch(error => {
console.error('删除失败:', error)
})
})
<script setup>
import { ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { getLevelList } from '@/api/manage/level'
//
const tableData = ref([])
const handleCurrentChange = (val) => {
pagination.value.pageNum = val
}
//
const setTitle = ref('设置多个')
const setmor=()=>{
setmore.value=true
//
const pagination = ref({
pageNum: 1,
pageSize: 10
})
//
const total = ref(0)
//
const fetchLevelList = async () => {
try {
const response = await getLevelList(
pagination.value.pageNum,
pagination.value.pageSize
)
if (response.code === 200) {
tableData.value = response.data.list
total.value = response.data.total
} else {
ElMessage.error(response.message || '获取等级列表失败')
}
} catch (error) {
console.error('获取等级列表失败:', error)
ElMessage.error('请求失败,请重试')
}
}
//
const handleSizeChange = (val) => {
pagination.value.pageSize = val
pagination.value.pageNum = 1
fetchLevelList()
}
const handleCurrentChange = (val) => {
pagination.value.pageNum = val
fetchLevelList()
}
//
const setmore = ref(false)
const dialogVisible = ref(false)
const dialogTitle = ref('添加等级')
const form = ref({
const setmor = () => {
setmore.value = true
}
const dialogVisible = ref(false)
const dialogTitle = ref('添加等级')
const form = ref({
id: null,
gradeName: '',
amount: null,
perWin: null,
sort: null
})
//
const showAddDialog = () => {
dialogTitle.value = '添加等级'
form.value = {
id: null,
gradeName: '',
num: null,
numPeople: null,
amount: null,
perWin: null,
sort: null
})
//
const showAddDialog = () => {
dialogTitle.value = '添加等级'
form.value = {
id: null,
gradeName: '',
num: null,
numPeople: null,
sort: null
}
dialogVisible.value = true
}
//
const editLevel = (row) => {
dialogTitle.value = '编辑等级'
form.value = { ...row }
dialogVisible.value = true
dialogVisible.value = true
}
//
const editLevel = (row) => {
dialogTitle.value = '编辑等级'
form.value = { ...row }
dialogVisible.value = true
}
//
const submitForm = () => {
if (!form.value.gradeName || form.value.amount === null || form.value.sort === null) {
ElMessage.error('请填写完整信息')
return
}
//
const submitForm = () => {
if (!form.value.gradeName || form.value.num === null || form.value.sort === null) {
ElMessage.error('请填写完整信息')
return
if (form.value.id) {
//
// API
const index = tableData.value.findIndex(item => item.id === form.value.id)
if (index !== -1) {
tableData.value[index] = { ...form.value }
}
if (form.value.id) {
//
const index = tableData.value.findIndex(item => item.id === form.value.id)
if (index !== -1) {
tableData.value[index] = { ...form.value }
}
} else {
//
const newId = tableData.value.length > 0 ? Math.max(...tableData.value.map(item => item.id)) + 1 : 1
tableData.value.push({
id: newId,
...form.value
})
}
dialogVisible.value = false
ElMessage.success('操作成功')
}
//
const deleteLevel = (row) => {
ElMessageBox.confirm('确定要删除该等级吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
tableData.value = tableData.value.filter(item => item.id !== row.id)
ElMessage.success('删除成功')
}).catch(() => {
ElMessage.info('已取消删除')
} else {
//
// API
const newId = tableData.value.length > 0 ? Math.max(...tableData.value.map(item => item.id)) + 1 : 1
tableData.value.push({
id: newId,
...form.value
})
}
//
const resetForm = () => {
form.value = {
id: null,
gradeName: '',
num: null,
numPeople: null,
sort: null
}
}
</script>
<style scoped>
.level-management-container {
padding: 20px;
width: 100%;
box-sizing: border-box;
min-height: 80vh;
dialogVisible.value = false
ElMessage.success('操作成功')
}
//
const deleteLevel = (row) => {
// API
ElMessageBox.confirm('确定要删除该等级吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
tableData.value = tableData.value.filter(item => item.id !== row.id)
ElMessage.success('删除成功')
}).catch(() => {
ElMessage.info('已取消删除')
})
}
//
const resetForm = () => {
form.value = {
id: null,
gradeName: '',
amount: null,
perWin: null,
sort: null
}
.pagination {
}
//
fetchLevelList()
</script>
<style scoped>
.level-management-container {
padding: 20px;
width: 100%;
box-sizing: border-box;
min-height: 80vh;
}
.pagination {
padding: 10px 20px;
background-color: #fff;
border-top: 1px solid #ebeef5;
display: flex;
justify-content: flex-start; /* 改为左对齐 */
}
.action-buttons {
margin-bottom: 20px;
}
.table-container {
max-height: 600px;
overflow-y: auto;
}
</style>
.action-buttons {
margin-bottom: 20px;
}
.table-container {
max-height: 600px;
overflow-y: auto;
}
</style>

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

@ -66,7 +66,7 @@
<script setup>
import { ref, onMounted } from 'vue'
import { getWinList } from '@/api/manage/win'
import { getWinList, getWinLevelList } from '@/api/manage/win'
//
const searchParams = ref({

9
activitylink/vite.config.js

@ -9,15 +9,6 @@ export default defineConfig({
'@': path.resolve(__dirname, './src')
}
},
// server: {
// proxy: {
// '/api': {
// target: 'http://39.98.127.73',
// changeOrigin: true,
// rewrite: (path) => path.replace(/^\/api/, '/price/admin'),
// },
// },
// },
server: {
proxy: {
'/api': {

Loading…
Cancel
Save