Browse Source

feat: 将地区选择改为级联下拉框

feat:添加地区映射
zhangrenyuan/feature-20250728113353-金币前端三期
lihui 3 weeks ago
parent
commit
083b74675c
  1. 32
      src/utils/marketMap.js
  2. 34
      src/utils/menuUtils.js
  3. 33
      src/views/audit/audit.vue
  4. 106
      src/views/audit/rechargeAudit.vue
  5. 109
      src/views/audit/refundAudit.vue
  6. 106
      src/views/consume/coinConsumeDetail.vue
  7. 4
      src/views/login.vue
  8. 27
      src/views/recharge/coinRechargeDetail.vue
  9. 109
      src/views/refund/coinRefundDetail.vue
  10. 110
      src/views/usergold/clientCountBalance.vue
  11. 7
      src/views/usergold/clientCountDetail.vue
  12. 49
      src/views/workspace/index.vue

32
src/utils/marketMap.js

@ -0,0 +1,32 @@
// 地区映射表
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:"---"
};
// 反向映射
export const reverseMarketMapping = Object.entries(marketMapping).reduce((acc, [key, value]) => {
acc[value] = key;
return acc;
}, {});

34
src/utils/menuUtils.js

@ -72,37 +72,3 @@ export const getRoutePath = (menu) => {
return routeMap[menu.menuName] || '/noPermission' return routeMap[menu.menuName] || '/noPermission'
} }
// 路由映射(获取第一个菜单)
export const getFirstRoutePath = (menu) => {
// 路由映射表:key为接口menuName,value为对应路由路径
const routeMap = {
'工作台展示': '/workspace',
'金币审核': '/audit',
'金豆审核': '/beanAudit',
'汇率管理': '/rate',
'金币充值': '/coinRecharge',
'金豆充值': '/beanRecharge',
'金币消耗': '/coinConsume',
'金豆消耗': '/beanConsume',
'金币退款': '/coinRefund',
// '金豆退款': '/beanRefund',
'权限管理': '/permissions',
'金币客户账户明细': '/usergold',
'金豆客户账户明细': '/userbean',
};
// 未匹配的菜单默认使用id作为路由(可根据实际需求调整)
return routeMap[menu.menuName] || '/noPermission'
}

33
src/views/audit/audit.vue

@ -4,12 +4,14 @@
<el-button <el-button
:type="activeTab === 'rechargeAudit' ? 'primary' : 'default'" :type="activeTab === 'rechargeAudit' ? 'primary' : 'default'"
@click="navigateTo('rechargeAudit')" @click="navigateTo('rechargeAudit')"
:disabled="!hasRecharge"
> >
充值审核 充值审核
</el-button> </el-button>
<el-button <el-button
:type="activeTab === 'refundAudit' ? 'primary' : 'default'" :type="activeTab === 'refundAudit' ? 'primary' : 'default'"
@click="navigateTo('refundAudit')" @click="navigateTo('refundAudit')"
:disabled="!hasRefund"
> >
退款审核 退款审核
</el-button> </el-button>
@ -23,6 +25,7 @@ import {ref, watch, onMounted} from 'vue';
import {useRouter, useRoute} from 'vue-router'; import {useRouter, useRoute} from 'vue-router';
import {storeToRefs} from 'pinia'; import {storeToRefs} from 'pinia';
import {useAdminStore} from '@/store/index.js'; import {useAdminStore} from '@/store/index.js';
import {permissionMapping} from "@/utils/menuTreePermission.js";
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@ -30,29 +33,40 @@ const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore); const {menuTree} = storeToRefs(adminStore);
const activeTab = ref(''); const activeTab = ref('');
const hasRecharge = ref(false);
const hasRefund = ref(false);
// //
const navigateTo = (name) => { const navigateTo = (name) => {
activeTab.value = name; activeTab.value = name;
router.push({name}); router.push({name});
}; };
// menuName
const hasMenuPermission = (tree, targetName) => {
// menuId
const hasMenuPermission = (tree, targetId) => {
for (const node of tree) { for (const node of tree) {
if (node.menuName === targetName) return true;
if (node.children && hasMenuPermission(node.children, targetName)) return true;
console.log(node.id)
if (node.id === targetId) return true;
if (node.children && hasMenuPermission(node.children, targetId)) return true;
} }
return false; return false;
}; };
//
// - 使 ID
const getDefaultAuditRoute = () => { const getDefaultAuditRoute = () => {
if (!menuTree.value) return 'rechargeAudit';
if (!menuTree.value || !menuTree.value.length) return 'rechargeAudit';
// 使 ID
hasRecharge.value = hasMenuPermission(menuTree.value, permissionMapping.Recharge_Audit);
hasRefund.value = hasMenuPermission(menuTree.value, permissionMapping.Refund_Audit);
const hasRecharge = hasMenuPermission(menuTree.value, '充值审核');
return hasRecharge ? 'rechargeAudit' : 'refundAudit';
// 退
if (hasRecharge) return 'rechargeAudit';
if (hasRefund) return 'refundAudit';
return 'rechargeAudit'; // 退
}; };
// //
watch(() => route.name, (newName) => { watch(() => route.name, (newName) => {
if (newName === 'rechargeAudit' || newName === 'refundAudit') { if (newName === 'rechargeAudit' || newName === 'refundAudit') {
@ -64,7 +78,6 @@ watch(() => route.name, (newName) => {
} }
}); });
// //
onMounted(() => { onMounted(() => {
if (route.name === 'audit') { if (route.name === 'audit') {

106
src/views/audit/rechargeAudit.vue

@ -21,12 +21,15 @@
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div class="head-card-element">
<el-text size="large">所属地区</el-text>
<el-select v-model="rechargeAudit.market" placeholder="请选择所属地区" style="width: 240px" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item"/>
</el-select>
</div>
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
@ -85,7 +88,11 @@
</el-table-column> </el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150px"/> <el-table-column fixed="left" prop="name" label="姓名" width="150px"/>
<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">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip/> <el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip/>
<el-table-column prop="money" label="充值金额" sortable="custom" width="110px"> <el-table-column prop="money" label="充值金额" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template> <template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
@ -176,13 +183,15 @@
</template> </template>
<script setup> <script setup>
import {computed, onMounted, reactive, ref} from 'vue'
import {onMounted, reactive, ref} from 'vue'
import {marketMapping, reverseMarketMapping} from '@/utils/marketMap.js'
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import request from '@/util/http' import request from '@/util/http'
import moment from 'moment'
import API from '@/util/http' import API from '@/util/http'
import moment from 'moment'
import {useAdminStore} from "@/store/index.js"; import {useAdminStore} from "@/store/index.js";
import {storeToRefs} from "pinia"; import {storeToRefs} from "pinia";
import {findMenuById, permissionMapping} from "@/utils/menuTreePermission.js"
// //
const trimJwCode = () => { const trimJwCode = () => {
if (rechargeAudit.value.jwcode) { if (rechargeAudit.value.jwcode) {
@ -365,8 +374,10 @@ const resetSearch = function () {
startTime: "", startTime: "",
endTime: "", endTime: "",
market: "", market: "",
auditStatus: rechargeAudit.value.auditStatus
auditStatus: rechargeAudit.value.auditStatus,
} }
selectedMarketPath.value = []
getTime.value = [] getTime.value = []
activeTimeRange.value = '' // activeTimeRange.value = '' //
getRecharge() getRecharge()
@ -485,21 +496,6 @@ const getActivity = async function () {
} }
} }
//
const getMarket = async function () {
try {
const result = await request({
url: '/general/adminMarkets',
data: {
account: adminData.value.account
}
})
market.value = result.data
console.log('地区', market.value)
} catch (error) {
console.log('请求失败', error)
}
}
const handlePagination = (type, val) => { const handlePagination = (type, val) => {
if (type === 'size') { if (type === 'size') {
@ -513,7 +509,6 @@ const handlePagination = (type, val) => {
const adminStore = useAdminStore(); const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore); const {menuTree} = storeToRefs(adminStore);
import {permissionMapping, findMenuById} from "@/utils/menuTreePermission.js"
// //
@ -624,6 +619,65 @@ const previewImage = (imageUrl) => {
}); });
}; };
//
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
rechargeAudit.value.market = reverseMarketMapping[selectedName] || '';
} else {
rechargeAudit.value.market = '';
}
};
//
const getMarket = async function () {
console.log('获取地区adminid', adminData.value)
try {
// POST
const result = await API({
url: '/market/selectMarket',
data: {account: adminData.value.account}
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
: null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
}
return {
value: node.name, //使
label: node.name, //
children
};
});
}
//
market.value = transformTree(result.data)
console.log('转换后的地区树', market.value)
} catch (error) {
console.log('请求失败', error)
}
}
// //
onMounted(async function () { onMounted(async function () {
await getAdminData() await getAdminData()

109
src/views/audit/refundAudit.vue

@ -22,10 +22,15 @@
</el-select> </el-select>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-text size="large">所属地区</el-text>
<el-select v-model="searchForm.market" placeholder="请选择" style="width: 240px" clearable>
<el-option v-for="item in marketOptions" :key="item" :label="item" :value="item" />
</el-select>
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
@ -33,11 +38,18 @@
<div class="time-controls"> <div class="time-controls">
<div class="time-group"> <div class="time-group">
<el-text size="large" style="width: 80px">提交时间</el-text> <el-text size="large" style="width: 80px">提交时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间"
<el-date-picker v-model="dateRange" type="datetimerange" range-separator=""
start-placeholder="开始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/> end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
<el-button @click="getToday()" style="margin-left: 10px" :type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
<el-button @click="getYesterday()" style="margin-left: 10px" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"> </el-button>
<el-button @click="get7Days()" style="margin-left: 10px" :type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天</el-button>
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<el-button type="success" @click="resetSearch">重置</el-button> <el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button> <el-button type="primary" @click="handleSearch">查询</el-button>
</div> </div>
@ -68,7 +80,11 @@
<el-table-column type="index" label="序号" width="60"/> <el-table-column type="index" label="序号" width="60"/>
<el-table-column prop="name" label="姓名" width="120"/> <el-table-column prop="name" label="姓名" width="120"/>
<el-table-column prop="jwcode" label="精网号" width="120"/> <el-table-column prop="jwcode" label="精网号" width="120"/>
<el-table-column prop="market" label="所属地区" width="120" />
<el-table-column prop="market" label="所属地区" width="120">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="refundType" label="退款类型" width="120"/> <el-table-column prop="refundType" label="退款类型" width="120"/>
<el-table-column prop="refundModel" label="退款方式" width="120"> <el-table-column prop="refundModel" label="退款方式" width="120">
<template #default="{ row }"> <template #default="{ row }">
@ -98,7 +114,8 @@
</el-table-column> </el-table-column>
<el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip/><!-- 当内容过长被隐藏时显示 tooltip --> <el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip/><!-- 当内容过长被隐藏时显示 tooltip -->
<el-table-column prop="adminName" label="提交人" width="120"/> <el-table-column prop="adminName" label="提交人" width="120"/>
<el-table-column v-if="checkTab === 'reject'" prop="rejectReason" label="驳回理由" width="150" show-overflow-tooltip />
<el-table-column v-if="checkTab === 'reject'" prop="rejectReason" label="驳回理由" width="150"
show-overflow-tooltip/>
<el-table-column v-if="checkTab !== 'pending'" prop="auditName" label="审核人" width="120"/> <el-table-column v-if="checkTab !== 'pending'" prop="auditName" label="审核人" width="120"/>
<el-table-column prop="createTime" label="提交时间" width="180" sortable="custom"> <el-table-column prop="createTime" label="提交时间" width="180" sortable="custom">
<template #default="{ row }"> <template #default="{ row }">
@ -129,14 +146,16 @@
</el-table-column> </el-table-column>
</el-table> </el-table>
<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" @size-change="handlePageSizeChange"
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination> @current-change="handleCurrentChange"></el-pagination>
</el-card> </el-card>
<el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px"> <el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
<el-form> <el-form>
<el-form-item label="驳回理由" required> <el-form-item label="驳回理由" required>
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200" show-word-limit/>
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
show-word-limit/>
</el-form-item> </el-form-item>
</el-form> </el-form>
<template #footer> <template #footer>
@ -153,6 +172,7 @@ import { onMounted, reactive, ref } from 'vue'
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import API from '@/util/http' import API from '@/util/http'
import moment from 'moment' import moment from 'moment'
import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
// //
const activeTimeRange = ref('') const activeTimeRange = ref('')
@ -266,14 +286,46 @@ const showRejectDialog = (row) => {
rejectDialogVisible.value = true rejectDialogVisible.value = true
} }
// //
const getmarkets = async () => {
const market = ref([])
//
const getMarket = async function () {
console.log('获取地区adminid', adminInfo.value)
try { try {
const result = await API({ url: '/general/adminMarkets', data: {
account: adminInfo.value.account,
} })
marketOptions.value = result.data || []
// POST
const result = await API({
url: '/market/selectMarket',
data: {account: adminInfo.value.account}
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
: null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
}
return {
value: node.name, //使
label: node.name, //
children
};
});
}
//
market.value = transformTree(result.data)
console.log('转换后的地区树', market.value)
} catch (error) { } catch (error) {
console.error('获取地区列表失败', error)
console.log('请求失败', error)
} }
} }
// //
@ -410,6 +462,7 @@ const resetSearch = function () {
} }
dateRange.value = [] dateRange.value = []
activeTimeRange.value = '' // activeTimeRange.value = '' //
selectedMarketPath.value = []
} }
// //
@ -512,10 +565,28 @@ const adminReject = async function () {
console.log('aaaaaaaaaaaaaaaaaa看看checkTab,这是点击已驳回调用', checkTab.value) console.log('aaaaaaaaaaaaaaaaaa看看checkTab,这是点击已驳回调用', checkTab.value)
} }
//
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
searchForm.value.market = reverseMarketMapping[selectedName] || '';
} else {
searchForm.value.market = '';
}
};
onMounted(async () => { onMounted(async () => {
await getAdminData() await getAdminData()
getRefundGoods() getRefundGoods()
getmarkets()
await getMarket()
await get() await get()
await getStats() await getStats()
console.log('aaaaaaaaaa这是挂载后调用') console.log('aaaaaaaaaa这是挂载后调用')

106
src/views/consume/coinConsumeDetail.vue

@ -4,6 +4,7 @@ import { dayjs, ElMessage } from 'element-plus'
import request from '@/util/http' import request from '@/util/http'
import API from '@/util/http' import API from '@/util/http'
import moment from 'moment' import moment from 'moment'
import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
// //
/* /*
@ -277,6 +278,7 @@ const reset = function () {
sortOrder.value = '' sortOrder.value = ''
getTime.value = {} getTime.value = {}
activeTimeRange.value = '' // activeTimeRange.value = '' //
selectedMarketPath.value = []
// //
@ -361,28 +363,50 @@ const getGoods = async function () {
} }
// //
//
const getMarket = async function () { const getMarket = async function () {
console.log('获取地区adminid', adminData.value)
try { try {
//
const result = await request({
// url: '/general/market',
// POST
const result = await API({
url: '/general/adminMarkets', // todo
url: '/market/selectMarket',
data: {account: adminData.value.account} data: {account: adminData.value.account}
})
console.log('请求地区列表成功', result)
//
market.value = result.data
console.log('地区数据', market.value)
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
: null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
}
return {
value: node.name, //使
label: node.name, //
children
};
});
}
//
market.value = transformTree(result.data)
console.log('转换后的地区树', market.value)
} catch (error) { } catch (error) {
console.log('请求地区列表失败', error)
ElMessage({
type: 'error',
message: '获取地区列表失败,请稍后重试'
})
console.log('请求失败', error)
} }
} }
// //
const handleSortChange = (column) => { const handleSortChange = (column) => {
console.log('排序字段:', column.prop) console.log('排序字段:', column.prop)
@ -525,6 +549,24 @@ const getTagText = (state) => {
return '未知状态'; return '未知状态';
} }
} }
//
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
consumeUser.value.market = reverseMarketMapping[selectedName] || '';
} else {
consumeUser.value.market = '';
}
};
</script> </script>
<template> <template>
@ -541,7 +583,7 @@ const getTagText = (state) => {
<el-col :span="6"> <el-col :span="6">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">商品名称</el-text> <el-text class="mx-1" size="large">商品名称</el-text>
<el-select v-model="consumeUser.goodsName" placeholder="请选择商品名称" size="large" style="width: 180px"
<el-select v-model="consumeUser.goodsName" placeholder="请选择商品名称" style="width: 180px"
clearable> clearable>
<!-- 修改 v-for 绑定逻辑 --> <!-- 修改 v-for 绑定逻辑 -->
<el-option v-for="(item, index) in goods" :key="index" :label="item" :value="item"/> <el-option v-for="(item, index) in goods" :key="index" :label="item" :value="item"/>
@ -549,17 +591,21 @@ const getTagText = (state) => {
</div> </div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text> <el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="consumeUser.market" placeholder="请选择所属地区" size="large" style="width: 180px" clearable>
<el-option v-for="(item, index) in market" :key="index" :label="item" :value="item" />
</el-select>
</div>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">消耗平台</el-text> <el-text class="mx-1" size="large">消耗平台</el-text>
<el-select v-model="consumeUser.payPlatform" placeholder="请选择消耗平台" size="large" style="width: 180px"
<el-select v-model="consumeUser.payPlatform" placeholder="请选择消耗平台"
style="width: 180px"
clearable> clearable>
<el-option v-for="item in consumePlatform" :key="item.value" :label="item.label" :value="item.value"/> <el-option v-for="item in consumePlatform" :key="item.value" :label="item.label" :value="item.value"/>
</el-select> </el-select>
@ -573,11 +619,14 @@ const getTagText = (state) => {
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间" <el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/> end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
<el-button @click="getToday()" style="margin-left: 10px" <el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px" <el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''"> </el-button>
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px" <el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天</el-button>
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<!-- </div> <!-- </div>
</el-col> </el-col>
<el-col :span="3"> <el-col :span="3">
@ -614,7 +663,11 @@ const getTagText = (state) => {
<el-table-column prop="name" label="姓名" width="150px" fixed="left"/> <el-table-column prop="name" label="姓名" width="150px" fixed="left"/>
<!-- 固定精网号列 --> <!-- 固定精网号列 -->
<el-table-column prop="jwcode" label="精网号" width="110px" fixed="left"/> <el-table-column prop="jwcode" label="精网号" width="110px" fixed="left"/>
<el-table-column prop="market" label="所属地区" width="110px" />
<el-table-column prop="market" label="所属地区" width="110px">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="goodsName" label="商品" width="160px" show-overflow-tooltip/> <el-table-column prop="goodsName" label="商品" width="160px" show-overflow-tooltip/>
<el-table-column prop="payPlatform" label="消耗平台" width="120px"> <el-table-column prop="payPlatform" label="消耗平台" width="120px">
<template #default="scope"> <template #default="scope">
@ -664,7 +717,8 @@ const getTagText = (state) => {
<!-- 分页 --> <!-- 分页 -->
<div class="pagination"> <div class="pagination">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]" <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination> @current-change="handleCurrentChange"></el-pagination>
</div> </div>
</el-card> </el-card>

4
src/views/login.vue

@ -6,7 +6,7 @@ import {useRouter} from 'vue-router'
import API from "@/util/http.js"; import API from "@/util/http.js";
import {useAdminStore} from '@/store' import {useAdminStore} from '@/store'
// //
import {filterFirstMenu, findFirstThirdLevelMenu, getFirstRoutePath,} from "../utils/menuUtils.js"
import {filterFirstMenu, findFirstThirdLevelMenu, getRoutePath,} from "../utils/menuUtils.js"
const router = useRouter() // const router = useRouter() //
// //
@ -69,7 +69,7 @@ const login = async function () {
console.log('获取到的第一个可访问的菜单', firstMenu) console.log('获取到的第一个可访问的菜单', firstMenu)
// 访 path // 访 path
const redirectPath = firstMenu ? getFirstRoutePath(firstMenu) : '/noPermission'
const redirectPath = firstMenu ? getRoutePath(firstMenu) : '/noPermission'
// //
router.push(redirectPath) router.push(redirectPath)

27
src/views/recharge/coinRechargeDetail.vue

@ -6,6 +6,7 @@ import {AiFillRead} from 'vue-icons-plus/ai'
import axios from 'axios' import axios from 'axios'
import moment from 'moment' import moment from 'moment'
import API from '@/util/http' import API from '@/util/http'
import {marketMapping, reverseMarketMapping} from '@/utils/marketMap.js';
// //
const adminData = ref({}) const adminData = ref({})
const getAdminData = async function () { const getAdminData = async function () {
@ -41,17 +42,17 @@ const selectedMarketPath = ref([])
const handleMarketChange = (value) => { const handleMarketChange = (value) => {
if (value && value.length > 0) { if (value && value.length > 0) {
const lastValue = value[value.length - 1]; const lastValue = value[value.length - 1];
if (lastValue.endsWith('_all')) {
//
rechargeUser.value.market = lastValue.replace('_all', '');
} else {
//
rechargeUser.value.market = lastValue;
}
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
rechargeUser.value.market = reverseMarketMapping[selectedName] || '';
} else { } else {
rechargeUser.value.market = ''
}
rechargeUser.value.market = '';
} }
};
// //
const getObj = ref({ const getObj = ref({
@ -507,6 +508,8 @@ const getTagText = (state) => {
return '未知状态'; return '未知状态';
} }
} }
</script> </script>
<template> <template>
@ -604,7 +607,11 @@ const getTagText = (state) => {
</el-table-column> </el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150px"/> <el-table-column fixed="left" prop="name" label="姓名" width="150px"/>
<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">
<span>{{ marketMapping[scope.row.market] || scope.row.market}}</span>
</template>
</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/>
<el-table-column prop="rateName" label="货币名称" width="110px"/> <el-table-column prop="rateName" label="货币名称" width="110px"/>
<el-table-column prop="money" sortable="custom" label="充值金额" width="110px"/> <el-table-column prop="money" sortable="custom" label="充值金额" width="110px"/>

109
src/views/refund/coinRefundDetail.vue

@ -1,13 +1,11 @@
<script setup> <script setup>
// 退 // 退
import {ref, onMounted, reactive, computed} from 'vue'
import ElementPlus from 'element-plus'
import {AiFillRead} from 'vue-icons-plus/ai'
import {ElMessage, ElMessageBox} from 'element-plus'
import axios from 'axios'
import {computed, onMounted, ref} from 'vue'
import {ElMessage} from 'element-plus'
import moment from 'moment' import moment from 'moment'
import API from '@/util/http' import API from '@/util/http'
import request from '@/util/http' import request from '@/util/http'
import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
// //
const trimJwCode = () => { const trimJwCode = () => {
@ -83,7 +81,8 @@ const getRefundTypes = async function () {
// 退 // 退
const result = await API({ const result = await API({
url: '/refund/refundType', //退 url: '/refund/refundType', //退
data: {} })
data: {}
})
console.log('退款类型请求成功', result) console.log('退款类型请求成功', result)
// //
if (Array.isArray(result.data)) { if (Array.isArray(result.data)) {
@ -189,7 +188,7 @@ const reset = function () {
sortOrder.value = '' sortOrder.value = ''
getTime.value = {} getTime.value = {}
activeTimeRange.value = '' // activeTimeRange.value = '' //
selectedMarketPath.value = []
getSelectBy() getSelectBy()
} }
// //
@ -266,18 +265,43 @@ const handleClick = function (tab, event) {
} }
} }
//
//
const getMarket = async function () { const getMarket = async function () {
console.log('获取地区adminid', adminData.value)
try { try {
// POST // POST
const result = await API({ url: '/general/adminMarkets', data: {
account:adminData.value.account,
} })
const result = await API({
url: '/market/selectMarket',
data: {account: adminData.value.account}
});
// //
console.log('请求成功', result) console.log('请求成功', result)
//
const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
: null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
}
return {
value: node.name, //使
label: node.name, //
children
};
});
}
// //
market.value = result.data
console.log('地区', market.value)
market.value = transformTree(result.data)
console.log('转换后的地区', market.value)
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
} }
@ -474,6 +498,24 @@ const getTagText = (state) => {
return '未知状态'; return '未知状态';
} }
} }
//
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
//
refundUser.value.market = reverseMarketMapping[selectedName] || '';
} else {
refundUser.value.market = '';
}
};
</script> </script>
<template> <template>
@ -514,23 +556,15 @@ const getTagText = (state) => {
</div> </div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" >所属地区</el-text>
<el-select
v-model="refundUser.market"
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区" placeholder="请选择所属地区"
style="width: 180px"
clearable clearable
>
<el-option
v-for="item in market"
:key="item"
:label="item"
:value="item"
style="width:180px"
@change="handleMarketChange"
/> />
</el-select>
</div>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<div class="head-card-element"> <div class="head-card-element">
@ -557,10 +591,17 @@ const getTagText = (state) => {
<el-col :span="24"> <el-col :span="24">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1">退款时间</el-text> <el-text class="mx-1">退款时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间" end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
<el-button @click="getToday()" style="margin-left: 10px" :type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
<el-button @click="getYesterday()" style="margin-left: 10px" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"> </el-button>
<el-button @click="get7Days()" style="margin-left: 10px" :type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天</el-button>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<el-button type="success" @click="reset()">重置</el-button> <el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button> <el-button type="primary" @click="search()">查询</el-button>
@ -615,7 +656,11 @@ const getTagText = (state) => {
fixed="left" fixed="left"
width="110px" width="110px"
/> />
<el-table-column prop="market" label="所属地区" width="110px" />
<el-table-column prop="market" label="所属地区" width="110px">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="goodsName" label="商品名称" width="110px" show-overflow-tooltip/> <el-table-column prop="goodsName" label="商品名称" width="110px" show-overflow-tooltip/>
<el-table-column prop="refundType" label="退款类型" width="100px"/> <el-table-column prop="refundType" label="退款类型" width="100px"/>

110
src/views/usergold/clientCountBalance.vue

@ -7,6 +7,7 @@ import axios from 'axios'
import moment from 'moment' import moment from 'moment'
import {ta} from 'element-plus/es/locales.mjs' import {ta} from 'element-plus/es/locales.mjs'
import API from '@/util/http' import API from '@/util/http'
import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
// //
// //
@ -26,32 +27,47 @@ const getAdminData = async function () {
// //
const isLoadingmarket = ref(false); const isLoadingmarket = ref(false);
const market = ref([]) const market = ref([])
const getmarket = async () => {
isLoadingmarket.value = true;
//
const getMarket = async function () {
console.log('获取地区adminid', adminData.value)
try { try {
// POST
const result = await API({ const result = await API({
url: '/general/adminMarkets',
url: '/market/selectMarket',
data: {account: adminData.value.account} data: {account: adminData.value.account}
}); });
console.log('获取地区数据成功', result)
// { value, label }
if (Array.isArray(result.data) && typeof result.data[0] === 'string') {
market.value = result.data
.filter(item => item !== null && item !== undefined && item.trim() !== '') //
.map(item => ({ value: item, label: item }));
} else {
market.value = result.data;
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
return nodes.map(node => {
const children = node.children && node.children.length
? transformTree(node.children)
: null;
//
if (children) {
children.unshift({
value: `${node.name}_all`, //
label: '全部',
children: null
});
} }
return {
value: node.name, //使
label: node.name, //
children
};
});
}
//
market.value = transformTree(result.data)
console.log('转换后的地区树', market.value)
} catch (error) { } catch (error) {
console.error('获取地区数据失败:', error);
ElMessage.error('获取地区数据失败,请稍后重试');
//
market.value = [];
} finally {
isLoadingmarket.value = false;
console.log('请求失败', error)
}
} }
};
// //
const tableData = ref([]) const tableData = ref([])
@ -193,6 +209,7 @@ const reset = function () {
sortField.value = '' sortField.value = ''
sortOrder.value = '' sortOrder.value = ''
get() get()
selectedMarketPath.value = []
} }
const cellClick = function (row, column) { const cellClick = function (row, column) {
console.log('cellClick', column.label) console.log('cellClick', column.label)
@ -223,7 +240,7 @@ const handleSortChange = (column) => {
onMounted(async function () { onMounted(async function () {
await getAdminData() await getAdminData()
await get() await get()
await getmarket()
await getMarket()
await getExportList() await getExportList()
}) })
const handlePageSizeChange = function (val) { const handlePageSizeChange = function (val) {
@ -320,24 +337,22 @@ const getTagText = (state) => {
return '未知状态'; return '未知状态';
} }
} }
const handleMarketChange = (val) => {
if (!Array.isArray(val)) return
const hasHeadquarters = val.includes('总部')
const hasOther = val.some(item => item !== '总部')
//
const selectedMarketPath = ref([])
//
const handleMarketChange = (value) => {
if (value && value.length > 0) {
const lastValue = value[value.length - 1];
let selectedName = lastValue.endsWith('_all')
? lastValue.replace('_all', '')
: lastValue;
if (hasHeadquarters && hasOther) {
if (val[val.length - 1] === '总部') {
//
user.value.markets = ['总部']
ElMessage.warning('“总部”与其他地区不可同时选择,系统已为您保留“总部”')
//
rechargeUser.value.market = reverseMarketMapping[selectedName] || '';
} else { } else {
//
user.value.markets = val.filter(item => item !== '总部')
ElMessage.warning('“总部”与其他地区不可同时选择,系统已为您去除“总部”')
}
}
rechargeUser.value.market = '';
} }
};
</script> </script>
<template> <template>
@ -351,9 +366,14 @@ const handleMarketChange = (val) => {
</div> </div>
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text> <el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="user.markets" placeholder="请选择所属地区" style="width: 180px" clearable multiple @change="handleMarketChange">
<el-option v-for="item in market" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</div> </div>
<el-button type="primary" @click="search()">查询</el-button> <el-button type="primary" @click="search()">查询</el-button>
<el-button @click="reset" type="success">重置</el-button> <el-button @click="reset" type="success">重置</el-button>
@ -387,7 +407,11 @@ const handleMarketChange = (val) => {
</el-table-column> </el-table-column>
<el-table-column prop="name" label="姓名" width="120"/> <el-table-column prop="name" label="姓名" width="120"/>
<el-table-column prop="jwcode" label="精网号" width="120"/> <el-table-column prop="jwcode" label="精网号" width="120"/>
<el-table-column prop="market" label="所属地区" width="120" />
<el-table-column prop="market" label="所属地区" width="120">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="allJb" label="金币总数" width="120" aligh="center"> <el-table-column prop="allJb" label="金币总数" width="120" aligh="center">
<template #default="scope"> <template #default="scope">
<span>{{ <span>{{
@ -447,7 +471,10 @@ const handleMarketChange = (val) => {
<template #default> <template #default>
<div> <div>
<div>永久金币{{ (scope.row.sumConsumeGold || 0) / 100 }}</div> <div>永久金币{{ (scope.row.sumConsumeGold || 0) / 100 }}</div>
<div>免费金币{{ ((scope.row.sumConsumeJune || 0) + (scope.row.sumConsumeDecember || 0)) / 100 }}</div>
<div>免费金币{{
((scope.row.sumConsumeJune || 0) + (scope.row.sumConsumeDecember || 0)) / 100
}}
</div>
<div>任务金币{{ (scope.row.sumConsumeJune || 0) / 100 }}</div> <div>任务金币{{ (scope.row.sumConsumeJune || 0) / 100 }}</div>
</div> </div>
</template> </template>
@ -470,7 +497,8 @@ const handleMarketChange = (val) => {
<!-- 分页 --> <!-- 分页 -->
<div class="pagination" style="margin-top: 20px"> <div class="pagination" style="margin-top: 20px">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]" <el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination> @current-change="handleCurrentChange"></el-pagination>
</div> </div>
</el-card> </el-card>

7
src/views/usergold/clientCountDetail.vue

@ -7,6 +7,7 @@ import moment from 'moment'
import API from '@/util/http' import API from '@/util/http'
import {writeFile, utils} from 'xlsx' import {writeFile, utils} from 'xlsx'
import request from "@/util/request.js"; import request from "@/util/request.js";
import {marketMapping} from "../../utils/marketMap.js";
// //
const activeTimeRange = ref('') const activeTimeRange = ref('')
@ -553,7 +554,11 @@ const handleMarketChange = (val) => {
</el-table-column> </el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150"/> <el-table-column fixed="left" prop="name" label="姓名" width="150"/>
<el-table-column fixed="left" prop="jwcode" label="精网号" width="120"/> <el-table-column fixed="left" prop="jwcode" label="精网号" width="120"/>
<el-table-column prop="market" label="所属地区" width="120"/>
<el-table-column prop="market" label="所属地区" width="120">
<template #default="scope">
{{ marketMapping[scope.row.market] || scope.row.market }}
</template>
</el-table-column>
<el-table-column prop="payPlatform" label="平台信息" width="140"> <el-table-column prop="payPlatform" label="平台信息" width="140">
</el-table-column> </el-table-column>

49
src/views/workspace/index.vue

@ -6,7 +6,9 @@
</el-col> </el-col>
<!-- 最后更新时间 --> <!-- 最后更新时间 -->
<el-col :span="18" style="display: flex; align-items: center; font-size: 18px"> <el-col :span="18" style="display: flex; align-items: center; font-size: 18px">
最后更新时间{{ workDataUpdateTime && workDataUpdateTime !== '1970-01-01 08:00:00' ? workDataUpdateTime : '该地区暂无数据' }}
最后更新时间{{
workDataUpdateTime && workDataUpdateTime !== '1970-01-01 08:00:00' ? workDataUpdateTime : '该地区暂无数据'
}}
</el-col> </el-col>
@ -21,8 +23,10 @@
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<div class="card-title">当前金币余量</div> <div class="card-title">当前金币余量</div>
<div>{{ currentGold / 100 }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;较前一日 {{
dailyChange / 100 }}
<div>{{ currentGold / 100 }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;较前一日
{{
dailyChange / 100
}}
<template v-if="dailyChange > 0"> <template v-if="dailyChange > 0">
<el-icon style="color:red"> <el-icon style="color:red">
<ArrowUpBold/> <ArrowUpBold/>
@ -46,7 +50,9 @@
<div class="margin-bottom">免费金币{{ currentFree / 100 }}</div> <div class="margin-bottom">免费金币{{ currentFree / 100 }}</div>
<div class="margin-bottom">[六月到期|{{ currentFreeJune / 100 }}]&nbsp;&nbsp;&nbsp;&nbsp;[12月到期|{{ <div class="margin-bottom">[六月到期|{{ currentFreeJune / 100 }}]&nbsp;&nbsp;&nbsp;&nbsp;[12月到期|{{
currentFreeDecember / currentFreeDecember /
100 }}]</div>
100
}}]
</div>
<div>任务金币{{ currentTask / 100 }}</div> <div>任务金币{{ currentTask / 100 }}</div>
</div> </div>
</el-card> </el-card>
@ -143,21 +149,30 @@
<el-col :span="24"> <el-col :span="24">
<el-row> <el-row>
<div style="margin-top:5px">合计&nbsp;&nbsp;&nbsp;&nbsp; <div style="margin-top:5px">合计&nbsp;&nbsp;&nbsp;&nbsp;
永久金币 {{ activeTab === 'recharge' ? sumRechargePermanent / 100 : sumConsumePermanent / 100
永久金币 {{
activeTab === 'recharge' ? sumRechargePermanent / 100 : sumConsumePermanent / 100
}}&nbsp;&nbsp;&nbsp;&nbsp; }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币 {{ activeTab === 'recharge' ? sumRechargeFree / 100 : sumConsumeFree / 100
免费金币 {{
activeTab === 'recharge' ? sumRechargeFree / 100 : sumConsumeFree / 100
}}&nbsp;&nbsp;&nbsp;&nbsp; }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币 {{ activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100
任务金币 {{
activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100
}}&nbsp;&nbsp;&nbsp;&nbsp; }}&nbsp;&nbsp;&nbsp;&nbsp;
</div> </div>
<div @change="handleDatePickerChange"> <div @change="handleDatePickerChange">
<el-button @click="getToday()" label="day" style="margin-left:250px" :type="activeTimeRange === 'today' ? 'primary' : ''">今日</el-button>
<el-button @click="getWeek()" label="week" :type="activeTimeRange === 'week' ? 'primary' : ''">本周</el-button>
<el-button @click="getMonth()" label="month" :type="activeTimeRange === 'month' ? 'primary' : ''">本月</el-button>
<el-button @click="getYear()" label="year" :type="activeTimeRange === 'year' ? 'primary' : ''">本年</el-button>
<el-button @click="getToday()" label="day" style="margin-left:250px"
:type="activeTimeRange === 'today' ? 'primary' : ''">今日
</el-button>
<el-button @click="getWeek()" label="week" :type="activeTimeRange === 'week' ? 'primary' : ''">本周
</el-button>
<el-button @click="getMonth()" label="month" :type="activeTimeRange === 'month' ? 'primary' : ''">本月
</el-button>
<el-button @click="getYear()" label="year" :type="activeTimeRange === 'year' ? 'primary' : ''">本年
</el-button>
</div> </div>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间" <el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" style="margin-left:10px" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" />
end-placeholder="结束时间" style="margin-left:10px" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"/>
<el-button type="primary" style="margin-left: 5px" @click="getChartData">查询</el-button> <el-button type="primary" style="margin-left: 5px" @click="getChartData">查询</el-button>
</el-row> </el-row>
</el-col> </el-col>
@ -185,7 +200,11 @@
</el-select> </el-select>
<el-table :data="tableData" height="320px"> <el-table :data="tableData" height="320px">
<el-table-column prop="rank" label="排名" width="60" align="center"></el-table-column> <el-table-column prop="rank" label="排名" width="60" align="center"></el-table-column>
<el-table-column prop="market" label="地区" align="center"></el-table-column>
<el-table-column prop="market" label="地区" align="center">
<template #default="scope">
<span>{{ marketMapping[scope.row.market] || scope.row.market }}</span>
</template>
</el-table-column>
<el-table-column prop="coinAmount" label="金币数量" align="center"> <el-table-column prop="coinAmount" label="金币数量" align="center">
<template #default="{ row }"> <template #default="{ row }">
{{ row.coinAmount.toLocaleString() }} {{ row.coinAmount.toLocaleString() }}
@ -207,8 +226,10 @@ import API from '@/util/http'
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import utc from 'dayjs-plugin-utc' 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";
// //
const markets = ref([]) const markets = ref([])
// //
@ -678,7 +699,7 @@ const updateChart = (chartData) => {
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
data: markets.value,
data: markets.value.map(m => marketMapping[m] || m),
axisLabel: { axisLabel: {
interval: 0, interval: 0,
rotate: 30 rotate: 30

Loading…
Cancel
Save