You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
7.5 KiB
252 lines
7.5 KiB
<template> |
|
<div class="system-edit-post-container"> |
|
<el-form size="default" label-width="80px"> |
|
<el-card shadow="hover" header="战令历史"> |
|
<template #header> |
|
战令历史 |
|
<el-button v-show="item.show === false" @click="item.show = true" class="button-caret" type="text"> |
|
<el-icon> |
|
<ele-CaretBottom /> |
|
</el-icon> |
|
</el-button> |
|
<el-button v-show="item.show === true" @click="item.show = false" class="button-caret" type="text"> |
|
<el-icon> |
|
<ele-CaretTop /> |
|
</el-icon> |
|
</el-button> |
|
</template> |
|
<div v-show="item.show"> |
|
<div class="flex-warp"> |
|
<el-form :inline="true"> |
|
<!-- <el-form-item label="服务器">--> |
|
<!-- <el-select v-model="serverSwitch" class="m-2" placeholder="选择服务器" size="large" style="width: 80px">--> |
|
<!-- <el-option v-for="item in serverCategorize" :key="item.value" :label="item.label" :value="item.value" />--> |
|
<!-- </el-select>--> |
|
<!-- <el-select v-model="query.serverId" placeholder="选择服务器" @change="getProp" filterable>--> |
|
<!-- <el-option v-for="item in switchServer()" :key="item.id" :label="item.name" :value="item.id" />--> |
|
<!-- </el-select>--> |
|
<!-- </el-form-item>--> |
|
<el-form-item prop="periodId" label="显示期数"> |
|
<el-select size="default" placeholder="请选择显示期数" filterable v-model="query.periodId"> |
|
<el-option v-for="item in unique()" :key="item.PeriodId" :label="item.PeriodId + '期'" :value="item.PeriodId" /> |
|
</el-select> |
|
</el-form-item> |
|
|
|
<el-form-item> |
|
<el-button type="primary" @click="getProp">确认</el-button> |
|
</el-form-item> |
|
</el-form> |
|
</div> |
|
<div class="flex-warp"> |
|
<el-form :inline="true"> |
|
<el-form-item prop="total" label="总数:">{{ tableData.total }}</el-form-item> |
|
<el-form-item prop="total" label="总比例:"> |
|
<div v-if="tableData.total && tableData.rechargeTotal">{{ (tableData.total / tableData.rechargeTotal).toFixed(4) * 100 }}%</div> |
|
<div v-else>0%</div> |
|
</el-form-item> |
|
</el-form> |
|
</div> |
|
<div class="flex-warp"> |
|
<el-table :data="tableData.list" style="width: 100%" :span-method="objectSpanMethod" border> |
|
<el-table-column prop="platform" label="渠道" width="80"> |
|
<template #default="scope"> |
|
<div v-if="scope.row.sort == 0">其他</div> |
|
<div v-else-if="scope.row.sort == 1">ios</div> |
|
<div v-else-if="scope.row.sort == 2">官服</div> |
|
<div v-else-if="scope.row.sort == 3">渠道</div> |
|
<div v-else>其他</div> |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="area" label="区服编号" width="85"> |
|
<template #default="scope"> {{ scope.row.area }}区</template> |
|
</el-table-column> |
|
<el-table-column prop="name" label="服务器名称" width="200"> |
|
<template #default="scope"> |
|
{{ scope.row.name }} |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="State" label="购买数量" width="100"> |
|
<template #default="scope"> |
|
{{ scope.row.num }} |
|
</template> |
|
</el-table-column> |
|
<el-table-column prop="State" label="购买比例" width="100"> |
|
<template #default="scope"> |
|
{{ (scope.row.num / tableData.total * 100).toFixed(2) }} % |
|
</template> |
|
</el-table-column> |
|
</el-table> |
|
</div> |
|
</div> |
|
</el-card> |
|
</el-form> |
|
</div> |
|
</template> |
|
<script lang="ts"> |
|
import { defineComponent, onMounted, reactive, ref, toRefs } from 'vue'; |
|
import { gameGMGetBattlePassLog } from '/@/api/game/gameConfig'; |
|
import BattlePassConfigCategory from '/@/api/config/BattlePassConfigCategory.json'; |
|
import { ElLoading } from 'element-plus'; |
|
import { ServerCategorize, serverList } from '/@/utils/game'; |
|
import { gSwitchServer, uniquePeriodId } from '/@/utils/utils'; |
|
|
|
interface TableDataState { |
|
query: object; |
|
tableData: { list: object[]; total: number; rechargeTotal: number }; |
|
battlePassConfig: object; |
|
servers: object; |
|
serverCategorize: object[]; |
|
serverSwitch: number; |
|
} |
|
|
|
interface SpanMethodProps { |
|
row: object; |
|
column: object; |
|
rowIndex: number; |
|
columnIndex: number; |
|
} |
|
|
|
export default defineComponent({ |
|
name: 'apiV1ServerBattlePassShopLog', |
|
setup: function () { |
|
const tableRef = ref(); |
|
const state = reactive<TableDataState>({ |
|
item: { topShow: true, show: true }, |
|
query: { |
|
periodId: BattlePassConfigCategory[0].PeriodId, |
|
}, |
|
tableData: { list: [], total: 0 }, |
|
battlePassConfig: BattlePassConfigCategory, |
|
servers: [], |
|
serverCategorize: ServerCategorize, |
|
serverSwitch: 0, |
|
}); |
|
|
|
onMounted(() => { |
|
serverList().then((res) => { |
|
state.servers = res; |
|
}); |
|
}); |
|
const getProp = () => { |
|
const loading = ElLoading.service({ |
|
lock: true, |
|
text: 'Loading', |
|
background: 'rgba(0, 0, 0, 0.7)', |
|
}); |
|
state.tableData.list = []; |
|
gameGMGetBattlePassLog(state.query) |
|
.then((res) => { |
|
console.log('gameGMGetBattlePass: ', res); |
|
if (res.code != 0 || !res.data || !res.data.list) { |
|
return; |
|
} |
|
state.tableData.total = res.data.total; |
|
state.tableData.rechargeTotal = res.data.rechargeTotal; |
|
for (let i in state.servers) { |
|
let data = { |
|
id: state.servers[i].id, |
|
name: state.servers[i].name, |
|
area: state.servers[i].area, |
|
sort: state.servers[i].sort, |
|
num: 0, |
|
}; |
|
let battlePass = res.data.list.find((r) => r.server == state.servers[i].id); |
|
if (battlePass) { |
|
data.num = battlePass.uid; |
|
} |
|
state.tableData.list.push(data); |
|
} |
|
|
|
state.tableData.list.sort((a, b) => a.sort * 100000 + a.id - (b.sort * 100000 + b.id)); |
|
state.rows = {}; |
|
for (let i in state.tableData.list) { |
|
let server = state.tableData.list[i]; |
|
if (!state.rows[server.sort]) { |
|
state.rows[server.sort] = { num: 0, id: server.id }; |
|
} |
|
state.rows[server.sort].num++; |
|
if (state.rows[server.sort].id > server.id) { |
|
state.rows[server.sort].id = server.id; |
|
} |
|
} |
|
|
|
console.log('gameGMGetBattlePass: state.tableData.list', state.tableData.list); |
|
}) |
|
.finally(() => { |
|
loading.close(); |
|
}); |
|
}; |
|
|
|
const unique = () => { |
|
return uniquePeriodId(BattlePassConfigCategory); |
|
}; |
|
const switchServer = () => { |
|
return gSwitchServer(state.serverSwitch, state.servers); |
|
}; |
|
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: SpanMethodProps) => { |
|
if (columnIndex === 0) { |
|
if (state.rows[row.sort].id == row.id) { |
|
return { |
|
rowspan: state.rows[row.sort].num, |
|
colspan: 1, |
|
}; |
|
} else { |
|
return { |
|
rowspan: 0, |
|
colspan: 0, |
|
}; |
|
} |
|
} |
|
}; |
|
return { |
|
objectSpanMethod, |
|
unique, |
|
switchServer, |
|
tableRef, |
|
getProp, |
|
...toRefs(state), |
|
}; |
|
}, |
|
}); |
|
</script> |
|
|
|
<style scoped lang="scss"> |
|
.el-table { |
|
--el-table-border-color: var(--el-border-color-lighter); |
|
--el-table-border: 2px solid var(--el-table-border-color); |
|
} |
|
|
|
.table-item { |
|
margin-top: 10px; |
|
margin-bottom: -10px; |
|
} |
|
|
|
.box-card .el-card__header { |
|
background-color: #062ce6; |
|
color: #fff; |
|
} |
|
|
|
::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td { |
|
background: #f0ffd5; |
|
} |
|
|
|
.warning-row { |
|
background: #f0ffd5ff; |
|
} |
|
|
|
.white-row { |
|
background: #ffffff; |
|
} |
|
|
|
::v-deep .warning-row .el-table__body tr { |
|
background-color: #f0ffd5ff; |
|
} |
|
|
|
::v-deep .warning-row .el-table--enable-row-hover .el-table__body tr:hover > td { |
|
background-color: inherit; |
|
} |
|
|
|
::v-deep .warning-row .el-table__cell { |
|
background-color: #f0ffd5ff; |
|
} |
|
</style>
|
|
|