Browse Source

持久化活动管理数据+众筹导出

lihuilin/feature-20250718094329-25周年庆后台
wangxiangwen4 4 weeks ago
parent
commit
06a8fddd4d
  1. 10
      activitylink/src/api/manage/activity.js
  2. 25
      activitylink/src/api/manage/win.js
  3. 56
      activitylink/src/stone/activityStone.js
  4. 76
      activitylink/src/views/zhongchou/activity/detail/index.vue
  5. 6
      activitylink/src/views/zhongchou/activity/index.vue
  6. 14
      activitylink/src/views/zhongchou/activity/set/index.vue
  7. 73
      activitylink/src/views/zhongchou/winning/index.vue

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

@ -105,4 +105,14 @@ export function deleteActivityById(activityId)
params: { activityId }
})
}
export function exportActivityDataExcel(data)
{
return request({
url: '/admin/funding/exportActivityData',
method: 'post',
data,
responseType: 'blob'
})
}

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

@ -1,13 +1,22 @@
import request from '@/utils/request'
export function getWinList(pageNum,pageSize,data) {
return request({
url: '/admin/win/list',
method: 'post',
params: { pageNum,pageSize },
data
})
}
// 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(){

56
activitylink/src/stone/activityStone.js

@ -9,39 +9,61 @@ const activityStorage = localforage.createInstance({
storeName: 'activityData'
});
export const useactivitytone = defineStore('activityStone', () => {
// 尝试从本地存储恢复初始值,否则使用默认值
const selectactivityId = ref(localStorage.getItem('selectactivityId') || 0);
// 方法
export const useactivityStone = defineStore('activityStone', () => {
// 原有字段
const selectactivityId = ref(localStorage.getItem('selectactivityId') || '');
const setselectedactivityId = (id) => {
selectactivityId.value = id;
// 同时保存到 localStorage 作为备份
localStorage.setItem('selectactivityId', id);
};
// 在 store 初始化时从持久化存储恢复数据
// 新增:持久化搜索用户名
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);
});
};
// 初始化恢复
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;
}
if (storedId !== null) selectactivityId.value = storedId;
} catch (error) {
console.warn('从 localforage 恢复数据失败,尝试从 localStorage 恢复');
const localStorageId = localStorage.getItem('selectactivityId');
if (localStorageId !== null) {
selectactivityId.value = localStorageId;
}
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
};
});

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

@ -71,11 +71,11 @@
<script setup>
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { useactivitytone } from '@/stone/activityStone'
import { getDetailListbyActivityId, getDetailMessage, getMarket } from '@/api/manage/activity'
import { useactivityStone } from '@/stone/activityStone'
import { getDetailListbyActivityId, getDetailMessage, getMarket, exportActivityDataExcel } from '@/api/manage/activity'
import { ElMessage } from 'element-plus'
const activityStone = useactivitytone()
const activityStone = useactivityStone()
const router = useRouter()
//
@ -102,6 +102,7 @@ const fetchMarketList = async () => {
}
}
// 使
const searchdata = ref({
username: '',
jwcode: '',
@ -109,8 +110,7 @@ const searchdata = ref({
})
const tableData = ref([])
const total = ref(0) // total
const total = ref(0)
const currentPage = ref(1)
const pageSize = ref(10)
@ -122,7 +122,11 @@ const goBack = () => {
//
const handleSearch = () => {
currentPage.value = 1
//
activityStone.setSearchUsername(searchdata.value.username)
activityStone.setSearchJwcode(searchdata.value.jwcode)
getDetailData()
//
searchdata.value = {
username: '',
jwcode: '',
@ -137,13 +141,58 @@ const handleReset = () => {
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) => {
@ -170,11 +219,14 @@ onMounted(async () => {
fetchMarketList()
})
//
//
const getDetailData = async () => {
try {
const activityId = activityStone.selectactivityId
const { username, jwcode, marketSign } = searchdata.value
// 使
const username = activityStone.searchUsername
const jwcode = activityStone.searchJwcode
const marketSign = searchdata.value.marketSign
if (!activityId) {
console.warn('未获取到 activityId')
@ -223,8 +275,8 @@ const fetchDetailMessage = async () => {
hkParticipants.value = data.marketTwoPeople
hkAssists.value = data.marketTwoTotal
marketOneLabel.value = data.market_one
marketTwoLabel.value = data.market_two
marketOneLabel.value = data.marketOneName
marketTwoLabel.value = data.marketTwoName
} else {
console.error('获取顶部信息失败:', response.message)
ElMessage.error(response.message || '获取顶部信息失败')

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

@ -165,13 +165,13 @@ import { ref, computed, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { getActivityList , changeStatusbyId ,addActivityandtime ,getMarket , deleteActivityById} from '@/api/manage/activity';
import { ElButton, ElMessage } from 'element-plus';
import { useactivitytone } from '@/stone/activityStone';
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([])
@ -315,6 +315,8 @@ const handleCurrentChange = (val) => {
//
const goToDetail = (row) => {
activityStone.setselectedactivityId(row.id);
activityStone.setSearchUsername("");
activityStone.setSearchJwcode("");
router.push({ name: 'activityDetail' });
};

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

@ -70,10 +70,10 @@
import { ref, onMounted } from 'vue';
import { useRouter } from 'vue-router';
import { showsetDetail , showaddDetail , setTime } from '@/api/manage/activity'
import { useactivitytone } from '@/stone/activityStone'
import { useactivityStone } from '@/stone/activityStone'
import { ElMessage } from 'element-plus';
const router = useRouter();
const activityStone = useactivitytone()
const activityStone = useactivityStone()
//
const initialData = ref(0);
const setinitiaData = ref(0);
@ -90,7 +90,8 @@ 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': '',
@ -115,7 +116,8 @@ const fetchData = async () => {
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;
@ -202,7 +204,7 @@ const confirmAdd = async () => {
console.log(marketOne.value)
const response = await showaddDetail({
activityId: activityStone.selectactivityId,
stock: marketOne.value,
stock: marketOneId.value,
addTotal: addCountOne.value
});
@ -233,7 +235,7 @@ const confirmAdd = async () => {
try {
const response = await showaddDetail({
activityId: activityStone.selectactivityId,
stock: marketTwo.value,
stock: marketTwoId.value,
addTotal: addCountTwo.value
});

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

@ -15,17 +15,20 @@
></el-input>
</el-form-item>
<el-form-item label="中奖等级">
<!-- 增加下拉框宽度 -->
<el-select
v-model="searchParams.gradeName"
placeholder="请选择"
<el-select
v-model="searchParams.gradeId"
placeholder="请选择"
class="prize-level-select"
style="width: 220px"> <!-- 增加宽度到220px -->
style="width: 220px"
>
<el-option label="全部" value=""></el-option>
<el-option label="特等奖" value="特等奖"></el-option>
<el-option label="一等奖" value="一等奖"></el-option>
<el-option label="二等奖" value="二等奖"></el-option>
<el-option label="三等奖" value="三等奖"></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>
@ -51,7 +54,7 @@
</div>
</div>
<!-- 修改后的分页组件 -->
<!-- 分页组件 -->
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
@ -59,7 +62,8 @@
:page-sizes="[10, 20, 50, 100]"
:page-size="searchParams.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
:total="total"
>
</el-pagination>
</el-card>
</template>
@ -73,33 +77,44 @@ const searchParams = ref({
pageNum: 1,
pageSize: 10,
username: '',
gradeName: '',
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 fetchWinList = async () => {
try {
//
const requestData = {
username: searchParams.value.username,
gradeName: searchParams.value.gradeName,
jwcode: searchParams.value.jwcode
gradeId: searchParams.value.gradeId,
jwcode: searchParams.value.jwcode,
pageNum: searchParams.value.pageNum,
pageSize: searchParams.value.pageSize
}
// APIpageNum, pageSize
const res = await getWinList(
searchParams.value.pageNum,
searchParams.value.pageSize,
requestData
)
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) {
@ -109,14 +124,14 @@ const fetchWinList = async () => {
//
const handleSearch = () => {
searchParams.value.pageNum = 1 //
searchParams.value.pageNum = 1
fetchWinList()
}
//
const handleReset = () => {
searchParams.value = {
pageNum: 1, //
pageNum: 1,
pageSize: 10,
username: '',
gradeName: '',
@ -133,7 +148,7 @@ const handleExport = () => {
//
const handleSizeChange = (val) => {
searchParams.value.pageSize = val
searchParams.value.pageNum = 1 //
searchParams.value.pageNum = 1
fetchWinList()
}
@ -150,6 +165,7 @@ const handleJingwangIdInput = (value) => {
//
onMounted(() => {
fetchWinLevelList()
fetchWinList()
})
</script>
@ -168,9 +184,8 @@ onMounted(() => {
margin-bottom: 20px;
}
/* 添加下拉框样式 */
.prize-level-select {
width: 220px; /* 设置下拉框宽度 */
width: 220px;
}
.table-container {

Loading…
Cancel
Save