Browse Source

内定两个删除

lihuilin/feature-20250718094329-25周年庆后台
lihuilin 4 weeks ago
parent
commit
cccd2566d1
  1. 40
      activitylink/src/api/manage/gift.js
  2. 173
      activitylink/src/views/zhongchou/gift/importFixedList/index.vue
  3. 175
      activitylink/src/views/zhongchou/gift/importuser/index.vue
  4. 9
      activitylink/src/views/zhongchou/gift/index.vue

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

@ -120,4 +120,42 @@ export function addFixUser(data) {
'Content-Type': 'application/json'
}
})
}
}
// 内定用户批量删除
export function deleteFixUsers(ids) {
return request({
url: '/admin/user/delete/fix/batch',
method: 'post',
params: { ids },
headers: {
'Content-Type': 'application/json'
}
})
}
// 导入用户
export const importUsers = (file) => {
const formData = new FormData();
formData.append('file', file);
return request({
url: '/admin/user/import',
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
}
});
};
// 导入内定用户
export const importFixUsers = (file,gradeId) => {
const formData = new FormData();
formData.append('file', file);
formData.append('gradeId',gradeId);
return request({
url: '/admin/user/import/fix',
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
}
});
};

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

@ -1,53 +1,56 @@
<template>
<div style="margin-bottom:30px">
<div style="margin-bottom:30px">
<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;">导入内定用户--{{ prizeName }}</span>
</div>
<el-card style="min-height: 90vh; max-height: 90vh;">
<div style="margin-bottom: 20px; display: flex; justify-content: space-between; 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.jwcode" placeholder="请输入精网号" style="width: 180px;" clearable @input="trimJwcode"></el-input>
精网号<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 180px;" clearable
@input="trimJwcode"></el-input>
<el-button type="primary" @click="getFixUsers" style="margin-left: 10px;">搜索</el-button>
</div>
<div style="display: flex; gap: 10px;">
<el-button type="primary" @click="openAdd">添加用户</el-button>
<el-button type="success" @click="importExcel">导入Excel</el-button>
<el-button type="success" @click="handleImportClick">导入Excel</el-button>
<input type="file" ref="fileInput" style="display: none" accept=".xlsx,.xls" @change="handleFileChange" />
</div>
</div>
<!-- 用户表格 -->
<el-table :data="tableData" style="width: 100%;" :row-style="{ height: '60px' }">
<el-table :data="tableData" style="width: 100%;" :row-style="{ height: '60px' }"
@selection-change="handleSelectionChange">
<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">
<template #default="scope">
{{ pagination.pageSize * (pagination.pageNum - 1) + scope.$index + 1 }}
</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 label="操作">
<template #default="scope">
<el-button size="small" type="danger" @click="delUser(scope.row)">删除</el-button>
<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;">
<el-button type="danger" @click="batchDelete">批量删除</el-button>
<!-- 分页 -->
<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]"
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
</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="pagination.total" :page-sizes="[10, 20, 50, 100]" @size-change="handleSizeChange"
@current-change="handleCurrentChange" />
</div>
</el-card>
<el-dialog v-model="addVisible" title="添加用户" width="500" align-center>
<el-form ref="addObj" :model="addObj" label-width="80px">
<el-form :model="addObj" label-width="80px">
<el-form-item label="姓名" prop="username">
<el-input v-model="addObj.username" placeholder="请输入用户姓名" />z
<el-input v-model="addObj.username" placeholder="请输入用户姓名" />
</el-form-item>
<el-form-item label="精网号" prop="jwcode">
<el-input v-model="addObj.jwcode" placeholder="请输入精网号" @input="trimJwcode" />
<el-input v-model="addObj.jwcode" placeholder="请输入精网号" @input="trimAddJwcode" />
</el-form-item>
</el-form>
<template #footer>
@ -60,46 +63,82 @@
</template>
</el-dialog>
</template>
<script setup>
import { ref, computed, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { ref, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { usegiftFixedListStone } from '@/stone/giftFixedListStone';
import { getFixUserList, addFixUser, deleteFixUser } from '@/api/manage/gift'
import { getFixUserList, addFixUser, deleteFixUser, deleteFixUsers } from '@/api/manage/gift'
//
import { importFixUsers } from '@/api/manage/gift'
import { ElMessage, ElMessageBox } from 'element-plus'
const giftStore = usegiftFixedListStone();
const router = useRouter()
const route = useRoute()
const prizeName = ref(route.query.prizeName || '未知奖品')
const gradeId = ref(route.query.gradeId || '')
const selectedIds = ref([])
const addObj = ref({
username:'',
jwcode:'',
gradeId:''
username: '',
jwcode: '',
gradeId: gradeId.value
})
const addVisible = ref(false)
const tableData = ref([])
const pagination = ref({
pageNum: 1,
pageSize: 10,
total:0
total: 0
})
//
const searchObj = ref({
username: '',
jwcode: '',
})
const openAdd = () => {
addObj.value = {}
addVisible.value = true
const fileInput = ref(null)
const handleImportClick = () => {
if (!gradeId.value) {
ElMessage.error('获取等级信息失败,无法导入')//
return
}
fileInput.value.click()
}
//
const handleFileChange = async (e) => {
const file = e.target.files[0]
if (!file) return
const fileName = file.name
if (!fileName.endsWith('.xlsx') && !fileName.endsWith('.xls')) {
ElMessage.error('仅支持Excel文件(.xlsx, .xls)')
e.target.value = ''
return
}
try {
const res = await importFixUsers(file, gradeId.value)
if (res.code === 200) {
ElMessage.success(res.data || '导入成功')
getFixUsers()
} else {
ElMessage.error(res.message || '导入失败')
}
} catch (error) {
console.error('导入请求失败:', error)
ElMessage.error('网络错误,导入失败请重试')
}
e.target.value = ''
}
//
const getFixUsers = async () => {
try {
const res = await getFixUserList({
username: searchObj.value.username,
password: searchObj.value.jwcode,
jwcode: searchObj.value.jwcode,
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize
pageSize: pagination.value.pageSize,
gradeId: gradeId.value
})
if (res.code === 200) {
tableData.value = res.data.list
pagination.value.total = res.data.total
@ -111,20 +150,24 @@ const getFixUsers = async () => {
ElMessage.error('请求失败,请重试')
}
}
//
//
const openAdd = () => {
addObj.value = {
username: '',
jwcode: '',
gradeId: gradeId.value
}
addVisible.value = true
}
//
const submitAdd = async () => {
if (!addObj.value.username || addObj.value.jwcode === '') {
if (!addObj.value.username || !addObj.value.jwcode) {
ElMessage.error('请填写完整信息')
return
}
try {
const data = {
username: addObj.value.username,
jwcode: addObj.value.jwcode,
gradeId: addObj.value.gradeId
}
console.log('看看添加参数',data)
const response = await addFixUser(data)
const response = await addFixUser(addObj.value)
if (response.code === 200) {
ElMessage.success('添加成功')
addVisible.value = false
@ -133,11 +176,12 @@ const submitAdd = async () => {
ElMessage.error(response.message || '添加失败')
}
} catch (error) {
console.error('添加等级失败:', error)
console.error('添加失败:', error)
ElMessage.error('添加失败,请重试')
}
}
//
//
const delUser = (row) => {
ElMessageBox.confirm('确定要删除该用户吗?', '提示', {
confirmButtonText: '确定',
@ -145,9 +189,7 @@ const delUser = (row) => {
type: 'warning'
}).then(async () => {
try {
const id = String(row.id)
console.log('删除等级的id是:', id)
const response = await deleteFixUser(id)
const response = await deleteFixUser(row.id)
if (response.code === 200) {
ElMessage.success('删除成功')
getFixUsers()
@ -162,9 +204,47 @@ const delUser = (row) => {
ElMessage.info('已取消删除')
})
}
//
const batchDelete = async () => {
if (selectedIds.value.length === 0) {
ElMessage.warning('请先选择需要删除的用户')
return
}
ElMessageBox.confirm(`确定要删除选中的${selectedIds.value.length}条数据吗?`,
'删除确认',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(async () => {
try {
const response = await deleteFixUsers(selectedIds.value.join(','))
if (response.code === 200) {
ElMessage.success('批量删除成功')
getFixUsers()
selectedIds.value = []
} else {
ElMessage.error(response.message || '批量删除失败')
}
} catch (error) {
console.error('批量删除请求失败:', error)
ElMessage.error('网络错误,批量删除失败')
}
}).catch(() => {
ElMessage.info('已取消批量删除')
})
}
const handleSelectionChange = (selection) => {
selectedIds.value = selection.map(row => row.id)
}
const trimJwcode = (value) => {
searchObj.value.jwcode = value.replace(/\D/g, '')
}
const trimAddJwcode = (value) => {
addObj.value.jwcode = value.replace(/\D/g, '')
}
const handleSizeChange = (val) => {
pagination.value.pageSize = val
pagination.value.pageNum = 1
@ -182,7 +262,6 @@ onMounted(() => {
getFixUsers()
})
</script>
<style scoped>
.el-card {
border-radius: 8px;

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

@ -3,59 +3,54 @@
<el-button type="primary" @click="goBack" style="margin-right:20px">返回</el-button>
<span style="font-size: 1.5em; font-weight: bold;">导入抽奖用户</span>
</div>
<el-card>
<el-card style="min-height: 90vh; max-height: 90vh;">
<div style="margin-bottom: 20px; display: flex; justify-content: space-between; align-items: center;">
<div>
姓名<el-input v-model="searchObj.username" placeholder="请输入姓名" style="width: 150px;margin-right:10px" clearable></el-input>
精网号<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 180px;" clearable @input="trimJwcode"></el-input>
<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.jwcode" placeholder="请输入精网号" style="width: 180px;" clearable
@input="trimJwcode"></el-input>
<el-button type="primary" @click="getUsers" style="margin-left: 10px;">搜索</el-button>
</div>
<div style="display: flex; gap: 10px;" fixed:right>
<div style="display: flex; gap: 10px;">
<el-button type="primary" @click="openAdd">添加用户</el-button>
<el-button type="success" @click="importExcel">导入Excel</el-button>
<el-button type="success" @click="handleImportClick">导入Excel</el-button>
<input type="file" ref="fileInput" style="display: none" accept=".xlsx,.xls" @change="handleFileChange" />
</div>
</div>
<!-- 用户表格 -->
<el-table :data="tableData" style="width: 100%;" :row-style="{ height: '60px' }" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="70" />
<el-table-column type="index" label="ID" width="200">
<el-table :data="tableData" style="width: 100%;" :row-style="{ height: '60px' }"
@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="200" />
<el-table-column prop="jwcode" label="精网号" width="200" />
<el-table-column label="操作" fixed="right">
</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 type="danger" @click="delUser(scope.row)">删除</el-button>
<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;">
<el-button text type="danger" @click="batchDelete">批量删除</el-button>
<div style="display: flex; align-items: center;">
<span style="margin-right: 15px;">{{ pagination.total }}</span>
<el-select v-model="pagination.pageSize" style="width: 120px; margin-right: 15px;">
<el-option label="10条/页" :value="10" />
<el-option label="20条/页" :value="20" />
<el-option label="50条/页" :value="50" />
</el-select>
<!-- 分页 -->
<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]"
@size-change="handleSizeChange" @current-change="handleCurrentChange" />
</div>
<el-button type="danger" @click="batchDelete">批量删除</el-button>
<!-- 分页 -->
<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]" @size-change="handleSizeChange"
@current-change="handleCurrentChange" />
</div>
</el-card>
<el-dialog v-model="addVisible" title="添加用户" width="500" align-center>
<el-form ref="addForm" :model="addObj" label-width="80px">
<el-form :model="addObj" label-width="80px">
<el-form-item label="姓名" prop="username">
<el-input v-model="addObj.username" placeholder="请输入用户姓名" />
</el-form-item>
<el-form-item label="精网号" prop="jwcode">
<el-input v-model="addObj.jwcode" placeholder="请输入用户精网号" @input="trimJwcode" />
<el-input v-model="addObj.jwcode" placeholder="请输入精网号" @input="trimAddJwcode" />
</el-form-item>
</el-form>
<template #footer>
@ -68,34 +63,63 @@
</template>
<script setup>
import { ref, computed, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { getUserList, addUser, deleteUser, deleteUsers } from '@/api/manage/gift';
import { ref, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { getUserList, addUser, deleteUser, deleteUsers } from '@/api/manage/gift'
//
import { importUsers } from '@/api/manage/gift'
import { ElMessage, ElMessageBox } from 'element-plus'
import { pa } from 'element-plus/es/locales.mjs';
const router = useRouter()
const addVisible = ref(false)
const tableData = ref([])
// id
// id
const selectedIds = ref([])
//
const searchObj = ref({
username: '',
jwcode: '',
})
const addObj = ref({
username: '',
jwcode: '',
jwcode: ''
})
const openAdd = () => {
addObj.value = {}
addVisible.value = true
}
const addVisible = ref(false)
const tableData = ref([])
const pagination = ref({
pageNum: 1,
pageSize: 10,
total:0
total: 0
})
const openAdd = () => {
addObj.value = {}
addVisible.value = true
const searchObj = ref({
username: '',
jwcode: '',
})
const fileInput = ref(null)
const handleImportClick = () => {
fileInput.value.click()
}
const handleFileChange = async (e) => {
const file = e.target.files[0] //
if (!file) return
const fileName = file.name
if (!fileName.endsWith('.xlsx') && !fileName.endsWith('.xls')) {
ElMessage.error('仅支持Excel文件(.xlsx, .xls)')
e.target.value = ''
return
}
try {
const res = await importUsers(file)
if (res.code === 200) {
ElMessage.success(res.data || '导入成功')
getUsers()
} else {
ElMessage.error(res.message || '导入失败')
}
} catch (error) {
console.error('导入失败:', error)
ElMessage.error('导入失败,请重试')
}
e.target.value = ''
}
//
const getUsers = async () => {
try {
@ -105,7 +129,7 @@ const getUsers = async () => {
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize
})
if (res.code === 200) {
tableData.value = res.data.list
pagination.value.total = res.data.total
@ -117,19 +141,14 @@ const getUsers = async () => {
ElMessage.error('请求失败,请重试')
}
}
//
//
const submitAdd = async () => {
if (!addObj.value.username || addObj.value.jwcode === '') {
if (!addObj.value.username || !addObj.value.jwcode) {
ElMessage.error('请填写完整信息')
return
}
try {
const data = {
username: addObj.value.username,
jwcode: addObj.value.jwcode
}
console.log('看看添加参数',data)
const response = await addUser(data)
const response = await addUser(addObj.value)
if (response.code === 200) {
ElMessage.success('添加成功')
addVisible.value = false
@ -138,11 +157,12 @@ const submitAdd = async () => {
ElMessage.error(response.message || '添加失败')
}
} catch (error) {
console.error('添加等级失败:', error)
console.error('添加失败:', error)
ElMessage.error('添加失败,请重试')
}
}
//
//
const delUser = (row) => {
ElMessageBox.confirm('确定要删除该用户吗?', '提示', {
confirmButtonText: '确定',
@ -150,9 +170,7 @@ const delUser = (row) => {
type: 'warning'
}).then(async () => {
try {
const id = String(row.id)
console.log('删除等级的id是:', id)
const response = await deleteUser(id)
const response = await deleteUser(row.id)
if (response.code === 200) {
ElMessage.success('删除成功')
getUsers()
@ -167,24 +185,20 @@ const delUser = (row) => {
ElMessage.info('已取消删除')
})
}
//
const batchDelete = async () => {
if (selectedIds.value.length === 0) {
ElMessage.warning('请先选择需要删除的用户')
return
}
ElMessageBox.confirm(`确定要删除选中的${selectedIds.value.length}条数据吗?`,// $??
'删除确认',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}
).then(async () => {
ElMessageBox.confirm(`确定要删除选中的${selectedIds.value.length}条数据吗?`, '删除确认', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
try {
const response = await deleteUsers(selectedIds.value.join(','))
console.log(selectedIds.value.join(','))
if (response.code === 200) {
ElMessage.success('批量删除成功')
getUsers()
@ -193,21 +207,23 @@ const batchDelete = async () => {
ElMessage.error(response.message || '批量删除失败')
}
} catch (error) {
console.error('批量删除请求失败:', error)
console.error('批量删除失败:', error)
ElMessage.error('网络错误,批量删除失败')
}
}).catch(() => {
ElMessage.info('已取消批量删除')
})
}
const goBack = () => {
router.back()
}
//
const handleSelectionChange = (selection) => {
// id
selectedIds.value = selection.map(row => row.id)
console.log('选中的id们是:', selectedIds.value)
}
const trimJwcode = (value) => {
searchObj.value.jwcode = value.replace(/\D/g, '')
}
const trimAddJwcode = (value) => {
addObj.value.jwcode = value.replace(/\D/g, '')
}
const handleSizeChange = (val) => {
pagination.value.pageSize = val
@ -218,8 +234,9 @@ const handleCurrentChange = (val) => {
pagination.value.pageNum = val
getUsers()
}
const trimJwcode = (value) => {
searchObj.value.jwcode = value.replace(/\D/g, '')
//
const goBack = () => {
router.back()
}
onMounted(() => {
getUsers()

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

@ -309,7 +309,14 @@ const submitEdit = async () => {
}
const goToimportFixedList = (row) => {
giftStore.setFixedGiftName(row.name);
router.push({ name: 'importFixedList' });
router.push({
name: 'importFixedList',
query: {
prizeName: row.prizeName,
gradeName: row.gradeName,
gradeId: row.id //
}
});
}
const goToimportUsers = () => {

Loading…
Cancel
Save