15 Commits

Author SHA1 Message Date
wangxiangwen 11397c6703 Merge branch 'milestone0718-2025周年庆后台' of http://39.101.133.168:8807/lihuilin/AnniversaryBackstage into milestone0718-2025周年庆后台 3 weeks ago
wangxiangwen 885ead2d70 去掉选择状态+对添加内定抽奖的精网号和姓名限制 3 weeks ago
lihuilin f1b24fbe8c 导入用户表单高度 4 weeks ago
lihuilin 36210dcb05 Merge branch 'milestone0718-2025周年庆后台' of http://39.101.133.168:8807/lihuilin/AnniversaryBackstage into milestone0718-2025周年庆后台 4 weeks ago
lihuilin cb92088357 show-overflow-tooltip 4 weeks ago
wangxiangwen d96e658496 防抖+过长名字隐 4 weeks ago
wangxiangwen da3c102e0a 添加活动名称不能有空格 4 weeks ago
wangxiangwen fa7096fe8f Merge branch 'milestone0718-2025周年庆后台' of http://39.101.133.168:8807/lihuilin/AnniversaryBackstage into milestone0718-2025周年庆后台 4 weeks ago
wangxiangwen 4d0bec1451 Merge branch 'wangxiangwen/feature-20250716103042-周年活动+众筹前台页面' into milestone0718-2025周年庆后台 4 weeks ago
lihuilin 0bce54a038 内定表格高度 4 weeks ago
lihuilin 9d7b302980 Merge branch 'lihuilin/feature-20250718094329-25周年庆后台' into milestone0718-2025周年庆后台 4 weeks ago
lihuilin d55cbe0779 Merge branch 'milestone0718-2025周年庆后台' of http://39.101.133.168:8807/lihuilin/AnniversaryBackstage into milestone0718-2025周年庆后台 4 weeks ago
lihuilin e36f961c6e 这是一次拉取 4 weeks ago
lihuilin 7037bb0039 导入用户高度 4 weeks ago
lihuilin 441f235135 gradeId传参解决 4 weeks ago
  1. 28
      activitylink/src/views/zhongchou/activity/index.vue
  2. 50
      activitylink/src/views/zhongchou/gift/importFixedList/index.vue
  3. 102
      activitylink/src/views/zhongchou/gift/importuser/index.vue
  4. 6
      activitylink/src/views/zhongchou/gift/index.vue
  5. 15
      activitylink/src/views/zhongchou/level/index.vue

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

@ -14,7 +14,7 @@
<div class="content-area"> <div class="content-area">
<div class="table-container"> <div class="table-container">
<el-table :data="currentPageData" style="width: auto" :row-style="{ height: '60px' } "> <el-table :data="currentPageData" style="width: auto" :row-style="{ height: '60px' } ">
<el-table-column prop="activityName" label="活动名称"></el-table-column>
<el-table-column prop="activityName" label="活动名称" show-overflow-tooltip></el-table-column>
<el-table-column prop="marketOne" 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="marketTwo" label="市场二"></el-table-column>
@ -106,12 +106,12 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="活动状态" prop="status">
<!-- <el-form-item label="活动状态" prop="status">
<el-select v-model="activity.status" placeholder="请选择活动状态"> <el-select v-model="activity.status" placeholder="请选择活动状态">
<el-option label="启用" value="1" /> <el-option label="启用" value="1" />
<el-option label="禁用" value="0" /> <el-option label="禁用" value="0" />
</el-select> </el-select>
</el-form-item>
</el-form-item> -->
<!-- 新增开始时间 --> <!-- 新增开始时间 -->
<el-form-item label="开始时间" prop="startTime"> <el-form-item label="开始时间" prop="startTime">
@ -204,9 +204,9 @@ const fetchMarketList = async () => {
} catch (error) { } catch (error) {
console.error('请求市场列表失败:', error) console.error('请求市场列表失败:', error)
} }
}
}//
const isSubmitting = ref(false);
// //
const cancel = () => { const cancel = () => {
centerDialogVisible.value = false; centerDialogVisible.value = false;
@ -232,7 +232,15 @@ const addActivityShow = () => {
const addForm = ref(); // addForm ref const addForm = ref(); // addForm ref
const addActivity = async () => { const addActivity = async () => {
//
if (isSubmitting.value) {
ElMessage.warning('操作过于频繁,请稍后再试');
return;
}
try { try {
isSubmitting.value = true; //
const valid = await new Promise((resolve, reject) => { const valid = await new Promise((resolve, reject) => {
addForm.value.validate(valid => { addForm.value.validate(valid => {
if (valid) { if (valid) {
@ -244,12 +252,14 @@ const addActivity = async () => {
}); });
if (!valid) { if (!valid) {
isSubmitting.value = false; //
return; return;
} }
// //
if (!activity.value.activityName || activity.value.activityName.trim() === '') { if (!activity.value.activityName || activity.value.activityName.trim() === '') {
ElMessage.error('活动名称不能为空'); ElMessage.error('活动名称不能为空');
isSubmitting.value = false; //
return; return;
} }
@ -257,6 +267,7 @@ const addActivity = async () => {
const cleanedActivityName = activity.value.activityName.replace(/\s/g, ''); const cleanedActivityName = activity.value.activityName.replace(/\s/g, '');
if (cleanedActivityName !== activity.value.activityName) { if (cleanedActivityName !== activity.value.activityName) {
ElMessage.error('活动名称中不能包含空格'); ElMessage.error('活动名称中不能包含空格');
isSubmitting.value = false; //
return; return;
} }
@ -265,7 +276,7 @@ const addActivity = async () => {
activityName: activity.value.activityName, activityName: activity.value.activityName,
marketOne: activity.value.marketOne, marketOne: activity.value.marketOne,
marketTwo: activity.value.marketTwo, marketTwo: activity.value.marketTwo,
status: Number(activity.value.status),
status: 0,
startTime: activity.value.startTime, startTime: activity.value.startTime,
endTime: activity.value.endTime endTime: activity.value.endTime
} }
@ -283,6 +294,11 @@ const addActivity = async () => {
} catch (error) { } catch (error) {
console.error('添加活动失败:', error); console.error('添加活动失败:', error);
ElMessage.error('请求失败,请重试'); ElMessage.error('请求失败,请重试');
} finally {
// 3
setTimeout(() => {
isSubmitting.value = false;
}, 3000);
} }
}; };

50
activitylink/src/views/zhongchou/gift/importFixedList/index.vue

@ -18,16 +18,17 @@
</div> </div>
</div> </div>
<!-- 用户表格 --> <!-- 用户表格 -->
<el-table :data="tableData" style="width: 100%;" :row-style="{ height: '60px' }"
<div class="table-container">
<el-table :data="tableData" style="width: 100%;height:640px" :row-style="{ height: '60px' }"
@selection-change="handleSelectionChange"> @selection-change="handleSelectionChange">
<el-table-column type="selection" width="200" /> <el-table-column type="selection" width="200" />
<el-table-column type="index" label="ID" width="250">
<el-table-column type="index" label="ID" width="250" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ pagination.pageSize * (pagination.pageNum - 1) + scope.$index + 1 }} {{ pagination.pageSize * (pagination.pageNum - 1) + scope.$index + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="username" label="姓名" width="250" />
<el-table-column prop="jwcode" label="精网号" width="300" />
<el-table-column prop="username" label="姓名" width="250" show-overflow-tooltip />
<el-table-column prop="jwcode" label="精网号" width="300" show-overflow-tooltip />
<el-table-column label="操作"> <el-table-column label="操作">
<template #default="scope"> <template #default="scope">
<el-button text size="small" type="danger" @click="delUser(scope.row)">删除</el-button> <el-button text size="small" type="danger" @click="delUser(scope.row)">删除</el-button>
@ -43,11 +44,12 @@
:total="pagination.total" :page-sizes="[10, 20, 50, 100]" @size-change="handleSizeChange" :total="pagination.total" :page-sizes="[10, 20, 50, 100]" @size-change="handleSizeChange"
@current-change="handleCurrentChange" /> @current-change="handleCurrentChange" />
</div> </div>
</div>
</el-card> </el-card>
<el-dialog v-model="addVisible" title="添加用户" width="500" align-center> <el-dialog v-model="addVisible" title="添加用户" width="500" align-center>
<el-form :model="addObj" label-width="80px"> <el-form :model="addObj" label-width="80px">
<el-form-item label="姓名" prop="username"> <el-form-item label="姓名" prop="username">
<el-input v-model="addObj.username" placeholder="请输入用户姓名" />
<el-input v-model="addObj.username" placeholder="请输入用户姓名" @input="trimUsername"/>
</el-form-item> </el-form-item>
<el-form-item label="精网号" prop="jwcode"> <el-form-item label="精网号" prop="jwcode">
<el-input v-model="addObj.jwcode" placeholder="请输入精网号" @input="trimAddJwcode" /> <el-input v-model="addObj.jwcode" placeholder="请输入精网号" @input="trimAddJwcode" />
@ -166,6 +168,19 @@ const submitAdd = async () => {
ElMessage.error('请填写完整信息') ElMessage.error('请填写完整信息')
return return
} }
//
if (addObj.value.username.length > 30) {
ElMessage.error('姓名最长为30个字符')
return
}
// 5-12
if (addObj.value.jwcode.length < 5 || addObj.value.jwcode.length > 12) {
ElMessage.error('精网号必须为5-12位数字')
return
}
try { try {
const response = await addFixUser(addObj.value) const response = await addFixUser(addObj.value)
if (response.code === 200) { if (response.code === 200) {
@ -243,7 +258,17 @@ const trimJwcode = (value) => {
searchObj.value.jwcode = value.replace(/\D/g, '') searchObj.value.jwcode = value.replace(/\D/g, '')
} }
const trimAddJwcode = (value) => { const trimAddJwcode = (value) => {
addObj.value.jwcode = value.replace(/\D/g, '')
// 5-12
const numericValue = value.replace(/\D/g, '');
addObj.value.jwcode = numericValue.slice(0, 12); // 12
}
//
const trimUsername = (value) => {
//
const filteredValue = value.replace(/[^\u4e00-\u9fa5a-zA-Z]/g, '');
// 30
addObj.value.username = filteredValue.slice(0, 30);
} }
const handleSizeChange = (val) => { const handleSizeChange = (val) => {
pagination.value.pageSize = val pagination.value.pageSize = val
@ -263,16 +288,7 @@ onMounted(() => {
}) })
</script> </script>
<style scoped> <style scoped>
.el-card {
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.el-table {
margin-top: 10px;
}
.el-pagination {
margin: 0;
.table-container {
overflow-y: auto;
} }
</style> </style>

102
activitylink/src/views/zhongchou/gift/importuser/index.vue

@ -3,7 +3,7 @@
<el-button type="primary" @click="goBack" style="margin-right:20px">返回</el-button> <el-button type="primary" @click="goBack" style="margin-right:20px">返回</el-button>
<span style="font-size: 1.5em; font-weight: bold;">导入抽奖用户</span> <span style="font-size: 1.5em; font-weight: bold;">导入抽奖用户</span>
</div> </div>
<el-card style="min-height: 85vh; max-height: 85vh;">
<el-card style="height:87vh">
<div style="margin-bottom: 20px; display: flex; justify-content: space-between; align-items: center;"> <div style="margin-bottom: 20px; display: flex; justify-content: space-between; align-items: center;">
<div style="display: flex; gap: 10px; align-items: center;"> <div style="display: flex; gap: 10px; align-items: center;">
姓名<el-input v-model="searchObj.username" placeholder="请输入姓名" style="width: 150px;" clearable></el-input> 姓名<el-input v-model="searchObj.username" placeholder="请输入姓名" style="width: 150px;" clearable></el-input>
@ -17,25 +17,24 @@
<input type="file" ref="fileInput" style="display: none" accept=".xlsx,.xls" @change="handleFileChange" /> <input type="file" ref="fileInput" style="display: none" accept=".xlsx,.xls" @change="handleFileChange" />
</div> </div>
</div> </div>
<!-- 用户表格 -->
<div class="table-container"> <div class="table-container">
<el-table :data="tableData" style="width: 100%;" :row-style="{ height: '58px' }"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="200" />
<el-table-column type="index" label="ID" width="250">
<template #default="scope">
{{ pagination.pageSize * (pagination.pageNum - 1) + scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="username" label="姓名" width="250" />
<el-table-column prop="jwcode" label="精网号" width="300" />
<el-table-column label="操作">
<template #default="scope">
<el-button text size="small" type="danger" @click="delUser(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 用户表格 -->
<el-table :data="tableData" style="width: 100%;height:640px" :row-style="{ height: '60px' }"
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="200" />
<el-table-column type="index" label="ID" width="250" show-overflow-tooltip>
<template #default="scope">
{{ pagination.pageSize * (pagination.pageNum - 1) + scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="username" label="姓名" width="250" show-overflow-tooltip />
<el-table-column prop="jwcode" label="精网号" width="300" show-overflow-tooltip />
<el-table-column label="操作">
<template #default="scope">
<el-button text size="small" type="danger" @click="delUser(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 底部操作区域 --> <!-- 底部操作区域 -->
<div style="margin-top: 20px; display: flex; justify-content: space-between; align-items: center;"> <div style="margin-top: 20px; display: flex; justify-content: space-between; align-items: center;">
<el-button type="danger" @click="batchDelete">批量删除</el-button> <el-button type="danger" @click="batchDelete">批量删除</el-button>
@ -45,11 +44,13 @@
:total="pagination.total" :page-sizes="[10, 20, 50, 100]" @size-change="handleSizeChange" :total="pagination.total" :page-sizes="[10, 20, 50, 100]" @size-change="handleSizeChange"
@current-change="handleCurrentChange" /> @current-change="handleCurrentChange" />
</div> </div>
</div>
</el-card> </el-card>
<el-dialog v-model="addVisible" title="添加用户" width="500" align-center> <el-dialog v-model="addVisible" title="添加用户" width="500" align-center>
<el-form :model="addObj" label-width="80px"> <el-form :model="addObj" label-width="80px">
<el-form-item label="姓名" prop="username"> <el-form-item label="姓名" prop="username">
<el-input v-model="addObj.username" placeholder="请输入用户姓名" />
<el-input v-model="addObj.username" placeholder="请输入用户姓名" @input="trimUsername" />
</el-form-item> </el-form-item>
<el-form-item label="精网号" prop="jwcode"> <el-form-item label="精网号" prop="jwcode">
<el-input v-model="addObj.jwcode" placeholder="请输入精网号" @input="trimAddJwcode" /> <el-input v-model="addObj.jwcode" placeholder="请输入精网号" @input="trimAddJwcode" />
@ -144,11 +145,25 @@ const getUsers = async () => {
} }
} }
// //
// submitAdd
const submitAdd = async () => { const submitAdd = async () => {
if (!addObj.value.username || !addObj.value.jwcode) { if (!addObj.value.username || !addObj.value.jwcode) {
ElMessage.error('请填写完整信息') ElMessage.error('请填写完整信息')
return return
} }
//
if (addObj.value.username.length > 30) {
ElMessage.error('姓名最长为30个字符')
return
}
// 5-12
if (addObj.value.jwcode.length < 5 || addObj.value.jwcode.length > 12) {
ElMessage.error('精网号必须为5-12位数字')
return
}
try { try {
const response = await addUser(addObj.value) const response = await addUser(addObj.value)
if (response.code === 200) { if (response.code === 200) {
@ -225,7 +240,17 @@ const trimJwcode = (value) => {
searchObj.value.jwcode = value.replace(/\D/g, '') searchObj.value.jwcode = value.replace(/\D/g, '')
} }
const trimAddJwcode = (value) => { const trimAddJwcode = (value) => {
addObj.value.jwcode = value.replace(/\D/g, '')
// 5-12
const numericValue = value.replace(/\D/g, '');
addObj.value.jwcode = numericValue.slice(0, 12); // 12
}
//
const trimUsername = (value) => {
//
const filteredValue = value.replace(/[^\u4e00-\u9fa5a-zA-Z]/g, '');
// 30
addObj.value.username = filteredValue.slice(0, 30);
} }
const handleSizeChange = (val) => { const handleSizeChange = (val) => {
pagination.value.pageSize = val pagination.value.pageSize = val
@ -246,43 +271,10 @@ onMounted(() => {
</script> </script>
<style scoped> <style scoped>
.el-card {
border-radius: 8px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
}
.el-table {
margin-top: 10px;
}
.el-pagination {
margin: 0;
}
.table-container { .table-container {
height: 650px; /* 设置固定高度 */
overflow-y: auto; /* 启用垂直滚动条 */
overflow-x: hidden; /* 隐藏水平滚动条(如果不需要的话) */
border: 1px solid #ebeef5; /* 可选:添加边框 */
border-radius: 4px; /* 可选:添加圆角 */
}
/* 可选:自定义滚动条样式 */
.table-container::-webkit-scrollbar {
width: 8px;
overflow-y: auto;
} }
.table-container::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 4px;
}
.table-container::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 4px;
}
.table-container::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
</style> </style>

6
activitylink/src/views/zhongchou/gift/index.vue

@ -20,8 +20,8 @@
</el-icon> </el-icon>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="prizeName" label="名称" width="300" 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" show-overflow-tooltip></el-table-column>
<el-table-column prop="gradeName" label="等级" width="200" align="center" show-overflow-tooltip></el-table-column>
<el-table-column label="操作" align="center"> <el-table-column label="操作" align="center">
<template #default="scope"> <template #default="scope">
<el-button type="primary" text @click="goToimportFixedList(scope.row)">导入内定名单</el-button> <el-button type="primary" text @click="goToimportFixedList(scope.row)">导入内定名单</el-button>
@ -319,7 +319,7 @@ const goToimportFixedList = (row) => {
query: { query: {
prizeName: row.prizeName, prizeName: row.prizeName,
gradeName: row.gradeName, gradeName: row.gradeName,
gradeId: row.id //
gradeId: row.gradeId //
} }
}); });
} }

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

@ -10,15 +10,15 @@
<!-- 等级表格 --> <!-- 等级表格 -->
<div class="table-container"> <div class="table-container">
<el-table :data="tableData" style="width: 100%" :row-style="{ height: '60px' }"> <el-table :data="tableData" style="width: 100%" :row-style="{ height: '60px' }">
<el-table-column type="index" label="ID" width="120px" fixed="left">
<el-table-column type="index" label="ID" width="120px" fixed="left" show-overflow-tooltip>
<template #default="scope"> <template #default="scope">
{{ pagination.pageSize * (pagination.pageNum - 1) + scope.$index + 1 }} {{ pagination.pageSize * (pagination.pageNum - 1) + scope.$index + 1 }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="gradeName" label="等级名称" width="240" 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="240" align="center" />
<el-table-column prop="gradeName" label="等级名称" width="240" align="center" show-overflow-tooltip />
<el-table-column prop="amount" label="数量" width="250" align="center" show-overflow-tooltip />
<el-table-column prop="perWin" label="每轮抽取人数" width="300" align="center" show-overflow-tooltip />
<el-table-column prop="sort" label="排序" width="240" align="center" show-overflow-tooltip />
<el-table-column prop="operation" fixed="right" width="240" label="操作" align="center"> <el-table-column prop="operation" fixed="right" width="240" label="操作" align="center">
<template #default="scope"> <template #default="scope">
<div style="display: flex; gap: 10px; justify-content: center;"> <div style="display: flex; gap: 10px; justify-content: center;">
@ -29,12 +29,11 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
</div>
<!-- 分页 -->
<!-- 分页 -->
<el-pagination class="pagination" v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize" <el-pagination class="pagination" v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total" :page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper" :total="pagination.total" :page-sizes="[10, 20, 50, 100]"
@size-change="handleSizeChange" @current-change="handleCurrentChange" /> @size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
<!-- 添加 --> <!-- 添加 -->
<el-dialog v-model="addVisible" :title="dialogTitle" width=400px @closed="resetForm"> <el-dialog v-model="addVisible" :title="dialogTitle" width=400px @closed="resetForm">

Loading…
Cancel
Save