Browse Source

feat(recharge):级联 改了充值的,优化映射为动态映射

zhangrenyuan/feature-20250728113353-金币前端三期
lihui 3 weeks ago
parent
commit
a0aa79dde6
  1. 18
      src/store/index.js
  2. 36
      src/utils/marketMap.js
  3. 42
      src/views/login.vue
  4. 112
      src/views/recharge/coinRechargeDetail.vue
  5. 5
      src/views/workspace/index.vue

18
src/store/index.js

@ -1,10 +1,11 @@
// src/store/index.js // src/store/index.js
import { defineStore } from 'pinia'
import {defineStore} from 'pinia'
export const useAdminStore = defineStore('admin', { export const useAdminStore = defineStore('admin', {
state: () => ({ state: () => ({
adminData: null, // 用户信息 adminData: null, // 用户信息
menuTree: null, // 菜单权限树
menuTree: [], // 菜单权限树
marketList: {}, // 市场列表
}), }),
actions: { actions: {
// 设置用户信息并同步到localStorage // 设置用户信息并同步到localStorage
@ -18,11 +19,16 @@ export const useAdminStore = defineStore('admin', {
this.menuTree = tree this.menuTree = tree
localStorage.setItem('menuTree', JSON.stringify(tree)) localStorage.setItem('menuTree', JSON.stringify(tree))
}, },
setMarketList(list) {
this.marketList = list
localStorage.setItem('marketList', JSON.stringify(list))
},
// 从localStorage初始化数据 // 从localStorage初始化数据
initFromLocalStorage() { initFromLocalStorage() {
const adminData = localStorage.getItem('adminData') const adminData = localStorage.getItem('adminData')
const menuTree = localStorage.getItem('menuTree') const menuTree = localStorage.getItem('menuTree')
const marketList = localStorage.getItem('marketList')
if (adminData) { if (adminData) {
this.adminData = JSON.parse(adminData) this.adminData = JSON.parse(adminData)
@ -31,14 +37,20 @@ export const useAdminStore = defineStore('admin', {
if (menuTree) { if (menuTree) {
this.menuTree = JSON.parse(menuTree) this.menuTree = JSON.parse(menuTree)
} }
if (marketList) {
this.marketList = JSON.parse(marketList)
}
}, },
// 清空状态并移除localStorage数据 // 清空状态并移除localStorage数据
clearState() { clearState() {
this.adminData = null this.adminData = null
this.menuTree = null
this.menuTree = []
this.marketList = {}
localStorage.removeItem('adminData') localStorage.removeItem('adminData')
localStorage.removeItem('menuTree') localStorage.removeItem('menuTree')
localStorage.removeItem('marketList')
// localStorage.removeItem('token') // localStorage.removeItem('token')
} }
} }

36
src/utils/marketMap.js

@ -1,30 +1,12 @@
// 地区映射表
export const marketMapping = {
1: "Capt",
2: "公司",
3: "市场部",
4: "新加坡",
5: "马来西亚",
6: "Marymount",
7: "City Hall",
8: "Jurong",
9: "研发部",
10: "Tampines",
11: "吉隆坡",
13: "香港",
14: "湾仔",
24016: "加拿大",
24018: "泰国",
24019: "Asoke",
24020: "槟城",
24021: "新山",
24022: "越南HCM",
24027: "韩国",
24028: "深圳运营",
24029: "深圳",
24030: "未知",
null:"---"
};
import {storeToRefs} from 'pinia';
import {useAdminStore} from '@/store/index.js';
const adminStore = useAdminStore();
const {marketList} = storeToRefs(adminStore);
// 地区映射
export const marketMapping = marketList.value;
console.log('marketList:', marketList)
// 反向映射 // 反向映射
export const reverseMarketMapping = Object.entries(marketMapping).reduce((acc, [key, value]) => { export const reverseMarketMapping = Object.entries(marketMapping).reduce((acc, [key, value]) => {
acc[value] = key; acc[value] = key;

42
src/views/login.vue

@ -7,6 +7,7 @@ import API from "@/util/http.js";
import {useAdminStore} from '@/store' import {useAdminStore} from '@/store'
// //
import {filterFirstMenu, findFirstThirdLevelMenu, getRoutePath,} from "../utils/menuUtils.js" import {filterFirstMenu, findFirstThirdLevelMenu, getRoutePath,} from "../utils/menuUtils.js"
import {storeToRefs} from "pinia";
const router = useRouter() // const router = useRouter() //
// //
@ -74,6 +75,10 @@ const login = async function () {
router.push(redirectPath) router.push(redirectPath)
ElMessage.success('登录成功') ElMessage.success('登录成功')
//
await selectMarket()
console.log('请求成功', result) console.log('请求成功', result)
} else { } else {
form.value.password = '' form.value.password = ''
@ -100,6 +105,43 @@ const getMenuTree = async function () {
} }
} }
//
const selectMarket = async function () {
try {
const selectMarketResult = await API({ url: '/market/selectMarket' });
const marketList = {};
//
const traverseTree = (nodes) => {
nodes.forEach(node => {
// id name
marketList[node.id] = node.name;
//
if (node.children && node.children.length > 0) {
traverseTree(node.children);
}
});
};
//
// selectMarketResult.data
selectMarketResult.data.forEach(rootNode => {
//
if (rootNode.children && rootNode.children.length > 0) {
traverseTree(rootNode.children);
}
});
console.log('排除第一级后的地区列表:', marketList);
adminStore.setMarketList(marketList);
// return marketList;
} catch (error) {
console.error('获取地区树失败:', error);
return {};
}
};
onMounted(() => { onMounted(() => {
getMachineId() getMachineId()

112
src/views/recharge/coinRechargeDetail.vue

@ -33,26 +33,66 @@ const handleDatePickerChange = () => {
// =========================================== // ===========================================
// recharge // recharge
const rechargeUser = ref({ const rechargeUser = ref({
adminId: adminData.value.id
adminId: adminData.value.id,
markets: [],
}) })
// //
const selectedMarketPath = ref([]) const selectedMarketPath = ref([])
// //
const handleMarketChange = (value) => { const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
rechargeUser.value.market = reverseMarketMapping[selectedName] || '';
if (Array.isArray(value) && value.length > 0) {
const ids = new Set();
value.forEach(path => {
const lastName = path[path.length - 1];
const id = reverseMarketMapping[lastName];
if (id) ids.add(Number(id));
});
//
const getAllLeafNames = (nodes) => {
const leafNames = [];
const traverse = (node, parentName = null) => {
if (!node.children || node.children.length === 0) {
leafNames.push({ name: node.label, parent: parentName });
} else { } else {
rechargeUser.value.market = '';
node.children.forEach(child => traverse(child, node.label));
} }
};
};
nodes.forEach(node => traverse(node));
return leafNames;
};
const leafNameMap = getAllLeafNames(markets.value); //
// { parentName: [childName1, childName2, ...] }
const parentToChildren = {};
leafNameMap.forEach(({ name, parent }) => {
if (!parentToChildren[parent]) parentToChildren[parent] = [];
parentToChildren[parent].push(name);
});
//
const selectedLeafNames = value.map(path => path[path.length - 1]);
// parent parent
Object.entries(parentToChildren).forEach(([parent, children]) => {
const allChildrenSelected = children.every(child => selectedLeafNames.includes(child));
if (allChildrenSelected && reverseMarketMapping[parent]) {
ids.add(Number(reverseMarketMapping[parent]));
}
});
rechargeUser.value.markets = Array.from(ids);
} else {
rechargeUser.value.markets = [];
}
console.log('最终映射后的 market IDs:', rechargeUser.value.markets);
};
// //
const getObj = ref({ const getObj = ref({
@ -68,7 +108,7 @@ const activity = ref([])
// //
const allData = ref([]) const allData = ref([])
// //
const market = ref([])
const markets = ref([])
// //
const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : '' const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
// money permanentGold freeGold // money permanentGold freeGold
@ -136,7 +176,7 @@ const getActivity = async function () {
// //
} }
} }
const marketsTree = ref("")
// //
const getArea = async function () { const getArea = async function () {
console.log('获取地区adminid', adminData.value) console.log('获取地区adminid', adminData.value)
@ -150,30 +190,26 @@ const getArea = async function () {
// //
console.log('请求成功', result) console.log('请求成功', result)
//
//
const transformTree = (nodes) => { const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
//
const allChildren = nodes.flatMap(node => node.children || []);
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null; : null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
}
return { return {
value: node.name, //使
label: node.name, //
children
value: child.name,
label: child.name,
children: grandchildren
}; };
}); });
}
};
// //
market.value = transformTree(result.data)
console.log('转换后的地区树', market.value)
markets.value = transformTree(result.data)
console.log('转换后的地区树==============', markets.value)
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
} }
@ -239,7 +275,7 @@ const get = async function (val) {
}) })
// rechargeUser.value // rechargeUser.value
const detailWithoutSort = ref({ const detailWithoutSort = ref({
market: rechargeUser.value.market,
markets: rechargeUser.value.markets,
activity: rechargeUser.value.activity, activity: rechargeUser.value.activity,
adminId: rechargeUser.value.adminId, adminId: rechargeUser.value.adminId,
startTime: rechargeUser.value.startTime, startTime: rechargeUser.value.startTime,
@ -297,8 +333,8 @@ const reset = function () {
delete rechargeUser.value.jwcode delete rechargeUser.value.jwcode
delete rechargeUser.value.activity delete rechargeUser.value.activity
delete rechargeUser.value.payPlatform delete rechargeUser.value.payPlatform
delete rechargeUser.value.market
selectedMarketPath .value = [] //
rechargeUser.value.markets = []
selectedMarketPath.value = [] //
delete rechargeUser.value.startTime delete rechargeUser.value.startTime
delete rechargeUser.value.endTime delete rechargeUser.value.endTime
delete sortField.value delete sortField.value
@ -508,6 +544,7 @@ const getTagText = (state) => {
return '未知状态'; return '未知状态';
} }
} }
const props = {multiple: true}
</script> </script>
@ -544,11 +581,14 @@ const getTagText = (state) => {
<el-text class="mx-1" size="large">所属地区</el-text> <el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader <el-cascader
v-model="selectedMarketPath" v-model="selectedMarketPath"
:options="market"
:options="markets"
placeholder="请选择所属地区" placeholder="请选择所属地区"
clearable clearable
collapse-tags
collapse-tags-tooltip
style="width:180px" style="width:180px"
@change="handleMarketChange" @change="handleMarketChange"
:props="props"
/> />
</div> </div>
</el-col> </el-col>
@ -609,7 +649,7 @@ const getTagText = (state) => {
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/> <el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/>
<el-table-column prop="market" label="所属地区" width="100px"> <el-table-column prop="market" label="所属地区" width="100px">
<template #default="scope"> <template #default="scope">
<span>{{ marketMapping[scope.row.market] || scope.row.market}}</span>
<span>{{ marketMapping[scope.row.market] || scope.row.market }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="activity" label="活动名称" width="110px" show-overflow-tooltip/> <el-table-column prop="activity" label="活动名称" width="110px" show-overflow-tooltip/>

5
src/views/workspace/index.vue

@ -230,6 +230,9 @@ import utc from 'dayjs-plugin-utc'
dayjs.extend(utc) dayjs.extend(utc)
import {ArrowUpBold, ArrowDownBold, SemiSelect} from '@element-plus/icons-vue' import {ArrowUpBold, ArrowDownBold, SemiSelect} from '@element-plus/icons-vue'
import {marketMapping} from "@/utils/marketMap.js"; import {marketMapping} from "@/utils/marketMap.js";
// //
const markets = ref([]) const markets = ref([])
// //
@ -454,7 +457,7 @@ const getMarkets = async () => {
} }
}) })
if (Array.isArray(response.data)) { if (Array.isArray(response.data)) {
markets.value = response.data
markets.value = response.data.filter(data => data !== "1")
console.log('市场列表获取成功:', markets.value) console.log('市场列表获取成功:', markets.value)
} else { } else {
console.error('获取市场列表失败', response) console.error('获取市场列表失败', response)

Loading…
Cancel
Save