Browse Source

改了域名,导出好了

zhangrenyuan/feature-20250623164058-金币前端
lihuilin 1 day ago
parent
commit
585e96770d
  1. 1
      .env.development
  2. 5
      .env.test
  3. 55
      src/views/audit/rechargeAudit.vue
  4. 8
      src/views/audit/refundAudit.vue
  5. 274
      src/views/consume/coinConsumeDetail.vue
  6. 287
      src/views/home.vue
  7. 332
      src/views/index.vue
  8. 38
      src/views/refund/coinRefundDetail.vue
  9. 197
      src/views/usergold/clientCountBalance.vue
  10. 443
      src/views/usergold/clientCountDetail.vue
  11. 42
      src/views/workspace/index.vue
  12. 2
      stats.html

1
.env.development

@ -1,6 +1,5 @@
VITE_API_BASE='http://192.168.8.220:8081/'
# VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_dev'
# VITE_API_BASE='http://54.251.137.151:10704/'
# VITE_API_BASE='http://192.168.9.28:8081/'
# VITE_API_BASE='http://18.143.76.3:10704/'

5
.env.test

@ -1,6 +1,5 @@
# VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_prod'
#VITE_API_BASE='http://54.251.137.151:10704/'
VITE_API_BASE='http://192.168.8.94:8080/'
VITE_API_BASE='http://192.168.8.220:8081/'
#VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_dev'
# VITE_API_BASE='http://192.168.8.225:8080/'
# VITE_API_BASE='http://18.143.76.3:10704/'

55
src/views/audit/rechargeAudit.vue

@ -61,10 +61,10 @@
<div>
总条数{{ stats.totalNum }}&nbsp;&nbsp;&nbsp;&nbsp;
退款总金币数{{ stats.permanentGolds + stats.freeGolds + stats.taskGolds }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ stats.permanentGolds }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ stats.freeGolds }}金币&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ stats.taskGolds }}金币
退款总金币数{{ (stats.permanentGolds + stats.freeGolds + stats.taskGolds).toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ stats.permanentGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ stats.freeGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ stats.taskGolds.toFixed(2) }}金币
</div>
</el-tabs>
@ -221,11 +221,52 @@ const activeName = ref('wait')
//
const payModel = [
{
value: '微信',
label: '微信'
value: '微信支付',
label: '微信支付'
},
{
value: '.....................................' //
value: '支付宝',
label: '支付宝'
},
{
value: 'IOS内购',
label: 'IOS内购'
},
{
value: 'PayPal',
label: 'PayPal'
},
{
value: 'Stripe',
label: 'Stripe'
},
{
value: 'PaymentAsia',
label: 'PaymentAsia'
},
{
value: 'iPay88',
label: 'iPay88'
},
{
value: '当午券',
label: '当午券'
},
{
value: 'FirstData(SGD)',
label: 'FirstData(SGD)'
},
{
value: 'PaySolutions',
label: 'PaySolutions'
},
{
value: '银盛支付',
label: '银盛支付'
},
{
value: '银联支付',
label: '银联支付'
}
]
// ref

8
src/views/audit/refundAudit.vue

@ -60,10 +60,10 @@
<div>
总条数{{ stats.totalNum }}&nbsp;&nbsp;&nbsp;&nbsp;
退款总金币数{{ stats.permanentGolds + stats.freeGolds + stats.taskGolds }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ stats.permanentGolds }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ stats.freeGolds }}金币&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ stats.taskGolds }}金币
退款总金币数{{ (stats.permanentGolds + stats.freeGolds + stats.taskGolds).toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ stats.permanentGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ stats.freeGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ stats.taskGolds.toFixed(2) }}金币
</div>
<el-table :data="tableData" height="540px">

274
src/views/consume/coinConsumeDetail.vue

@ -1,8 +1,8 @@
<script setup>
import {computed, onMounted, ref} from 'vue'
import {dayjs, ElMessage} from 'element-plus'
import { computed, onMounted, ref } from 'vue'
import { dayjs, ElMessage } from 'element-plus'
import request from '@/util/http'
import API from '@/util/http'
//
/*
@ -166,7 +166,7 @@ const ConsumeSelectBy = async function (val) {
//
// detail.value
const detailWithoutSort = {...consumeUser.value}
const detailWithoutSort = { ...consumeUser.value }
delete detailWithoutSort.sortField
delete detailWithoutSort.sortOrder
@ -177,7 +177,7 @@ const ConsumeSelectBy = async function (val) {
totalGoldSearch.value.payPlatform = consumeUser.value.payPlatform
totalGoldSearch.value.market = consumeUser.value.market
totalGoldSearch.value.goodsName = consumeUser.value.goodsName
//
//
const resultTotalGold = await request({
// url: '/consume/statsGold',
url: '/consume/statsGold',
@ -268,14 +268,14 @@ const reset = function () {
const getToday = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
@ -286,14 +286,14 @@ const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
@ -303,14 +303,14 @@ const getYesterday = function () {
const get7Days = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
@ -373,7 +373,20 @@ const handleSortChange = (column) => {
sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
ConsumeSelectBy()
}
const exportExcel = async function () {
const params = {
text:'',
deptid:'',
sort:1,
field:'',
page:getObj.pageNum,
size:getObj.pageSize
}
const res = await API({ url: '/export/exportConsume', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
}
}
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
ConsumeSelectBy()
@ -383,33 +396,6 @@ const handleCurrentChange = function (val) {
getObj.value.pageNum = val
ConsumeSelectBy()
}
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize))
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
getObj.value.pageNum = parseInt(getObj.value.pageNum)
console.log('输入的数字合法')
ConsumeSelectBy()
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
}
/*
====================计算属性=================================
*/
@ -445,96 +431,39 @@ onMounted(async function () {
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">商品名称</el-text>
<el-select
v-model="consumeUser.goodsName"
placeholder="请选择商品名称"
size="large"
style="width: 180px"
clearable
>
<el-select v-model="consumeUser.goodsName" placeholder="请选择商品名称" size="large" style="width: 180px"
clearable>
<!-- 修改 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" />
</el-select>
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<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 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-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">消耗平台</el-text>
<el-select
v-model="consumeUser.payPlatform"
placeholder="请选择消耗平台"
size="large"
style="width: 180px"
clearable
>
<el-option
v-for="item in consumePlatform"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-select v-model="consumeUser.payPlatform" placeholder="请选择消耗平台" size="large" style="width: 180px"
clearable>
<el-option v-for="item in consumePlatform" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col>
<!-- <el-col :span="8">
<div class="head-card-element">
<el-text class="mx-1" size="large">消费类型</el-text>
<el-select
v-model="consumeUser.consumeType"
placeholder="请选择消费类型"
size="large"
style="width: 240px"
clearable
>
<el-option
v-for="item in consumeType"
:key="item"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</el-col> -->
</el-row>
<el-row>
<el-col :span="21">
<div class="head-card-element">
<el-text class="mx-1" size="large">消费时间</el-text>
<el-date-picker
v-model="getTime"
type="datetimerange"
range-separator="至"
start-placeholder="起始时间"
end-placeholder="结束时间"
/>
<el-button style="margin-left: 10px" @click="getToday()"
>
</el-button
>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" />
<el-button style="margin-left: 10px" @click="getToday()">
</el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
<!-- </div>
@ -555,51 +484,27 @@ onMounted(async function () {
<el-col>
<el-card>
<div>
消耗金额{{ Math.abs(sumGold) / 100 }}新币永久金币{{ Math.abs(permanentGolds) / 100 }}免费金币{{
消耗金额{{ Math.abs(sumGold) / 100 }}新币永久金币{{ Math.abs(permanentGolds) / 100 }}免费金币{{
Math.abs(freeGolds) / 100
}}任务金币{{ Math.abs(taskGolds) / 100 }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 576px; overflow-y: auto">
<el-table
:data="tableData"
style="width: 100%"
height="576px"
@sort-change="handleSortChange"
>
<el-table-column
type="index"
label="序号"
width="100px"
fixed="left"
>
<el-table :data="tableData" style="width: 100%" height="576px" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<!-- 固定姓名列 -->
<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="market" label="所属地区" width="110px"/>
<el-table-column prop="goodsName" label="商品" width="160px" show-overflow-tooltip/>
<el-table-column
prop="payPlatform"
label="消费平台"
width="120px"
>
<el-table-column prop="jwcode" label="精网号" width="110px" fixed="left" />
<el-table-column prop="market" label="所属地区" width="110px" />
<el-table-column prop="goodsName" label="商品" width="160px" show-overflow-tooltip />
<el-table-column prop="payPlatform" label="消费平台" width="120px">
<template #default="scope">
<!-- 使用非严格相等比较 -->
{{ scope.row.payPlatform }}
@ -612,78 +517,43 @@ onMounted(async function () {
label="消费类型"
width="120px"
/> -->
<el-table-column
prop="sumGold"
label="消费金币总数"
width="120px"
>
<el-table-column prop="sumGold" label="消费金币总数" width="120px">
<template #default="scope">
{{
(scope.row.taskGold +
scope.row.freeGold +
scope.row.permanentGold) / 100
scope.row.freeGold +
scope.row.permanentGold) / 100
}}
</template>
</el-table-column>
<el-table-column
prop="permanentGold"
label="永久金币"
sortable="“custom”"
width="110px"
>
<el-table-column prop="permanentGold" label="永久金币" sortable="“custom”" width="110px">
<template #default="scope">
{{ scope.row.permanentGold / 100 }}
</template>
</el-table-column>
<el-table-column
prop="freeGold"
label="免费金币"
sortable="“custom”"
width="110px"
>
<el-table-column prop="freeGold" label="免费金币" sortable="“custom”" width="110px">
<template #default="scope">
{{ scope.row.freeGold / 100 }}
{{ scope.row.freeGold / 100 }}
</template>
</el-table-column>
<el-table-column
prop="taskGold"
label="任务金币"
sortable="“custom”"
width="110px"
>
<el-table-column prop="taskGold" label="任务金币" sortable="“custom”" width="110px">
<template #default="scope">
{{ scope.row.taskGold / 100 }}
</template>
</el-table-column>
<el-table-column
prop="remark"
label="备注"
width="200px"
show-overflow-tooltip
/>
<el-table-column prop="adminName" label="提交人" width="110px"/>
<el-table-column
prop="createTime"
label="消费时间"
sortable="“custom”"
width="180px"
/>
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="adminName" label="提交人" width="110px" />
<el-table-column prop="createTime" label="消费时间" sortable="custom" width="180px" />
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<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"
@current-change="handleCurrentChange"
></el-pagination>
<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"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>

287
src/views/home.vue

@ -1,14 +1,15 @@
<script setup>
//
import { ref, onMounted, reactive, computed, watch } from 'vue'
import { ref, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import ElementPlus from 'element-plus'
import { VscGlobe } from 'vue-icons-plus/vsc'
import { ElMessage, ElMessageBox } from 'element-plus'
import { ElMessage } from 'element-plus'
import axios from 'axios'
import API from '@/util/http'
import dmmn from '../assets/blue.png'
import { useRoute } from 'vue-router'
import moment from 'moment'
const router = useRouter()
const imgrule1 = dmmn
@ -54,31 +55,53 @@ const message = function () {
openMessage()
}
// machineId
//
const exportList = ref([])
//
const exportListLoading = ref(false)
// function logout() {
// const machineId = localStorage.getItem('machineId')
// console.log('machineId:', machineId)
// localStorage.removeItem('token')
// // localStorage.clear();
// router.push('/login?machineId=' + machineId)
// //
// // window.location.reload();
// ElMessage.success('退')
// }
//
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({ url: '/export/export' })
if (result.code === 200) {
exportList.value = result.data
} else {
ElMessage.error(result.msg || '获取导出列表失败')
}
} catch (error) {
console.error('获取导出列表出错:', error)
ElMessage.error('获取导出列表失败,请稍后重试')
} finally {
exportListLoading.value = false
}
}
//
const downloadExportFile = (item) => {
if (item.state === 2) {
const link = document.createElement('a')
link.href = item.url
link.download = item.fileName
link.click()
} else {
ElMessage.warning('文件还在导出中,请稍后再试')
}
}
//
onMounted(async function () {
//
//getAdminData()
//
//getAreas()
getAdminData()
//
await getExportList()
})
//
const changeDataByArea = (item) => {
currentArea.value = item
}
//
//
const isCollapse = ref(false)
const handleOpen = (key, keyPath) => {
console.log(key, keyPath)
@ -86,6 +109,15 @@ const handleOpen = (key, keyPath) => {
const handleClose = (key, keyPath) => {
console.log(key, keyPath)
}
//
const exportListVisible = ref(false)
//
const openExportList = () => {
getExportList()
exportListVisible.value = true
}
</script>
<template>
@ -105,81 +137,80 @@ const handleClose = (key, keyPath) => {
<!-- <div style="font-size: 16px; font-weight: bold; color: black; text-align: center;" ><h1>海外金币管理系统</h1></div> -->
</div>
<el-card style="min-height: 90%;">
<el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
<el-radio-button :value="false">扩展</el-radio-button>
<el-radio-button :value="true">收缩</el-radio-button>
</el-radio-group>
<el-menu :router="true" class="el-menu-vertical-demo" :collapse="isCollapse" @open="handleOpen" @close="handleClose">
<!-- 移除 v-if 权限验证 -->
<el-menu-item index="/workspace">
<el-icon><Folder /></el-icon>
<span>工作台</span>
</el-menu-item>
<!-- 移除 v-if 权限验证 -->
<el-sub-menu index="2">
<template #title>
<el-icon><Folder /></el-icon>
<span>财务审核</span>
</template>
<el-menu-item index="/rechargeAudit">充值审核</el-menu-item>
<el-menu-item index="/refundAudit">退款审核</el-menu-item>
</el-sub-menu>
<!-- 移除 v-if 权限验证 -->
<el-menu-item index="/rate">
<el-icon><Folder /></el-icon>
<span>汇率管理</span>
</el-menu-item>
<el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
<el-radio-button :value="false">扩展</el-radio-button>
<el-radio-button :value="true">收缩</el-radio-button>
</el-radio-group>
<!-- 移除 v-if 权限验证 -->
<el-sub-menu index="4">
<template #title>
<el-icon><Folder /></el-icon>
<span>充值管理</span>
</template>
<el-menu-item index="/coinRecharge">金币充值</el-menu-item>
<el-menu-item index="/beanRecharge">金豆充值</el-menu-item>
</el-sub-menu>
<!-- 移除 v-if 权限验证 -->
<el-sub-menu index="6">
<template #title>
<el-menu :router="true" class="el-menu-vertical-demo" :collapse="isCollapse" @open="handleOpen"
@close="handleClose">
<el-menu-item index="/workspace">
<el-icon>
<Folder />
</el-icon>
<span>消耗管理</span>
</template>
<el-menu-item index="/coinConsume">金币消耗</el-menu-item>
<el-menu-item index="/beanConsume">金豆消耗</el-menu-item>
</el-sub-menu>
<span>工作台</span>
</el-menu-item>
<!-- 移除 v-if 权限验证 -->
<el-sub-menu index="8">
<template #title>
<el-sub-menu index="2">
<template #title>
<el-icon>
<Folder />
</el-icon>
<span>财务审核</span>
</template>
<el-menu-item index="/rechargeAudit">充值审核</el-menu-item>
<el-menu-item index="/refundAudit">退款审核</el-menu-item>
</el-sub-menu>
<el-menu-item index="/rate">
<el-icon>
<Folder />
</el-icon>
<span>退款管理</span>
</template>
<span>汇率管理</span>
</el-menu-item>
<el-sub-menu index="4">
<template #title>
<el-icon>
<Folder />
</el-icon>
<span>充值管理</span>
</template>
<el-menu-item index="/coinRecharge">金币充值</el-menu-item>
<el-menu-item index="/beanRecharge">金豆充值</el-menu-item>
</el-sub-menu>
<el-sub-menu index="6">
<template #title>
<el-icon>
<Folder />
</el-icon>
<span>消耗管理</span>
</template>
<el-menu-item index="/coinConsume">金币消耗</el-menu-item>
<el-menu-item index="/beanConsume">金豆消耗</el-menu-item>
</el-sub-menu>
<el-sub-menu index="8">
<template #title>
<el-icon>
<Folder />
</el-icon>
<span>退款管理</span>
</template>
<el-menu-item index="/coinRefund">金币退款</el-menu-item>
<el-menu-item index="/beanRefund">金豆退款</el-menu-item>
</el-sub-menu>
<!-- 移除 v-if 权限验证 -->
<el-menu-item index="/usergold">
<el-icon><Folder /></el-icon>
<span>客户账户明细</span>
</el-menu-item>
<!-- 移除 v-if 权限验证 -->
<el-menu-item index="/permissions">
<el-icon><Folder /></el-icon>
<span>权限管理</span>
</el-menu-item>
</el-menu>
</el-card>
</el-sub-menu>
<el-menu-item index="/usergold">
<el-icon>
<Folder />
</el-icon>
<span>客户账户明细</span>
</el-menu-item>
<el-menu-item index="/permissions">
<el-icon>
<Folder />
</el-icon>
<span>权限管理</span>
</el-menu-item>
</el-menu>
</el-card>
</el-aside>
<el-container style="margin-left: 15%; min-width: 180px">
<!-- 修改 el-header 样式 -->
@ -199,40 +230,72 @@ const handleClose = (key, keyPath) => {
<span style="margin-left: 10px">{{ adminData.name }}</span>
</template>
<el-menu-item @click="message()">查看个人信息</el-menu-item>
<el-menu-item index="1-2" >退出登录</el-menu-item>
<el-menu-item index="1-2">退出登录</el-menu-item>
<el-menu-item index="1-3" @click="openExportList">查看下载列表</el-menu-item>
</el-sub-menu>
</el-menu>
</el-header>
<!-- 修改 el-main 样式 -->
<el-main style="margin-top: 60px">
<!-- 60px el-header 的大致高度可根据实际情况调整 -->
<router-view></router-view>
</el-main>
</el-container>
</el-container>
<!-- 查看个人信息 -->
<el-dialog v-model="messageVisible" title="查看个人信息" width="500px">
<el-form :model="adminData">
<el-form-item label="用户姓名" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.adminName }}</span>
</el-form-item>
<el-form-item label="精网号" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.account }}</span>
</el-form-item>
<el-form-item label="地区" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.market }}</span>
</el-form-item>
<el-form-item label="注册时间" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.createTime }}</span>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button text @click="closeMessage()">关闭</el-button>
</div>
</template>
</el-dialog>
<!-- 导出列表弹窗 -->
<el-dialog v-model="exportListVisible" title="导出列表" width="80%">
<el-table :data="exportList" style="width: 100%" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<template #default="scope">
<el-tag :type="scope.row.state === 2 ? 'success' : 'warning'">
{{ scope.row.state === 2 ? '已完成' : '处理中' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>
</el-table-column>
</el-table>
<template #footer>
<div class="dialog-footer">
<el-button text @click="exportListVisible = false">关闭</el-button>
</div>
</template>
</el-dialog>
</div>
<!-- 查看个人信息 -->
<el-dialog v-model="messageVisible" title="查看个人信息" width="500px">
<el-form :model="adminData">
<el-form-item label="用户姓名" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.name }}</span>
</el-form-item>
<el-form-item label="精网号" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.jwcode }}</span>
</el-form-item>
<el-form-item label="地区" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.area }}</span>
</el-form-item>
<el-form-item label="注册时间" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.createTime }}</span>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button text @click="closeMessage()">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>
@ -249,6 +312,7 @@ const handleClose = (key, keyPath) => {
min-height: 100vh;
width: 200px;
}
/* background-color: #BFD8D2; */
.logo {
margin: 20px 0px 20px 20px;
@ -256,15 +320,18 @@ const handleClose = (key, keyPath) => {
}
.el-menu-demo {
border: none; /* 去除边框 */
padding: 0; /* 去除内边距 */
border: none;
/* 去除边框 */
padding: 0;
/* 去除内边距 */
float: right;
/* 将菜单向右浮动 */
}
.el-menu-vertical-demo:not(.el-menu--collapse) {
width: 240px;
min-height: 400px;
border: none; /* 去除边框 */
border: none;
/* 去除边框 */
}
</style>

332
src/views/index.vue

@ -1,296 +1,44 @@
<script setup>
//
import { ref, onMounted, reactive, computed, watch } from 'vue'
import { useRouter } from 'vue-router'
import ElementPlus from 'element-plus'
import { VscGlobe } from 'vue-icons-plus/vsc'
import { ElMessage, ElMessageBox } from 'element-plus'
import axios from 'axios'
import API from '@/util/http'
import dmmn from '../assets/blue.png'
import { useRoute } from 'vue-router'
const router = useRouter()
const imgrule1 = dmmn
const messageVisible = ref(false)
//
const adminData = ref({
name: ''
})
const getAdminData = async function () {
try {
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
console.log('请求成功', result)
console.log('用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
//
const areas = ref([])
//
const currentArea = ref('全部')
const getAreas = async function () {
try {
const result = await API({ url: '/general/market', data: {} })
areas.value = result.data
console.log('请求成功', result)
} catch (error) {
console.log('请求失败', error)
}
}
//
const openMessage = function () {
messageVisible.value = true
}
const closeMessage = function () {
messageVisible.value = false
}
const message = function () {
openMessage()
}
// machineId
// function logout() {
// const machineId = localStorage.getItem('machineId')
// console.log('machineId:', machineId)
// localStorage.removeItem('token')
// // localStorage.clear();
// router.push('/login?machineId=' + machineId)
// //
// // window.location.reload();
// ElMessage.success('退')
// }
//
onMounted(async function () {
//
getAdminData()
//
getAreas()
})
//
const changeDataByArea = (item) => {
currentArea.value = item
}
//
const isCollapse = ref(false)
const handleOpen = (key, keyPath) => {
console.log(key, keyPath)
}
const handleClose = (key, keyPath) => {
console.log(key, keyPath)
}
</script>
<template>
<div class="common-layout">
<el-container>
<el-aside style="
width: 15%;
min-width: 180px;
position: fixed; /* 固定位置 */
top: 0;
left: 0;
height: 100vh; /* 高度占满视口 */
z-index: 100; /* 确保侧边栏在其他元素之上 */
">
<div class="logo">
<img src="../assets/新logo.png" alt="logo" style="width: 80px; height: 80px" />
<!-- <div style="font-size: 16px; font-weight: bold; color: black; text-align: center;" ><h1>海外金币管理系统</h1></div> -->
<!-- ... 已有代码 ... -->
<el-row>
<el-col>
<el-card style="margin-top: 20px">
<template #header>
<div class="card-header">
<div class="card-title">导出列表</div>
</div>
</template>
<div style="height: 300px; overflow-y: auto">
<el-table :data="exportList" style="width: 100%" :loading="isExportListLoading">
<el-table-column prop="fileName" label="文件名" width="200" />
<el-table-column prop="createTime" label="导出时间" width="200">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="status" label="状态" width="100">
<template #default="scope">
<span v-if="scope.row.status === 'processing'">处理中</span>
<span v-if="scope.row.status === 'completed'">已完成</span>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template #default="scope">
<el-button
size="small"
type="primary"
@click="downloadExportFile(scope.row)"
:disabled="scope.row.status !== 'completed'"
>
下载
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<el-card style="min-height: 90%;">
<el-radio-group v-model="isCollapse" style="margin-bottom: 20px">
<el-radio-button :value="false">扩展</el-radio-button>
<el-radio-button :value="true">收缩</el-radio-button>
</el-radio-group>
<el-menu :router="true" class="el-menu-vertical-demo" :collapse="isCollapse" @open="handleOpen" @close="handleClose">
<el-menu-item
index="/workspace"
v-if="
adminData.permission == 1 ||
adminData.permission == 2 ||
adminData.permission == 3 ||
adminData.permission == 5
">
<el-icon><Folder /></el-icon>
<span>工作台</span>
</el-menu-item>
<el-sub-menu index="2" v-if="
adminData.permission == 1 ||
adminData.permission == 3 ||
adminData.permission == 5
">
<template #title>
<el-icon><Folder /></el-icon>
<span>财务审核</span>
</template>
<el-menu-item index="/rechargeAudit">充值审核</el-menu-item>
<el-menu-item index="/refundAudit">退款审核</el-menu-item>
</el-sub-menu>
<el-menu-item
index="/rate"
v-if="
adminData.permission == 1 ||
adminData.permission == 2 ||
adminData.permission == 3 ||
adminData.permission == 5
">
<el-icon><Folder /></el-icon>
<span>汇率管理</span>
</el-menu-item>
<el-sub-menu index="4" v-if="
adminData.permission == 1 ||
adminData.permission == 2 ||
adminData.permission == 5
">
<template #title>
<el-icon><Folder /></el-icon>
<span>充值管理</span>
</template>
<el-menu-item index="/coinRecharge">金币充值</el-menu-item>
<el-menu-item index="/beanRecharge">金豆充值</el-menu-item>
</el-sub-menu>
<el-sub-menu index="6" v-if="
adminData.permission == 1 ||
adminData.permission == 2 ||
adminData.permission == 5
">
<template #title>
<el-icon>
<Folder />
</el-icon>
<span>消耗管理</span>
</template>
<el-menu-item index="/coinConsume">金币消耗</el-menu-item>
<el-menu-item index="/beanConsume">金豆消耗</el-menu-item>
</el-sub-menu>
<el-sub-menu index="8" v-if="
adminData.permission == 1 ||
adminData.permission == 2 ||
adminData.permission == 5
">
<template #title>
<el-icon>
<Folder />
</el-icon>
<span>退款管理</span>
</template>
<el-menu-item index="/coinRefund">金币退款</el-menu-item>
<el-menu-item index="/beanRefund">金豆退款</el-menu-item>
</el-sub-menu>
<el-menu-item index="/usergold" v-if="
adminData.permission == 1 ||
adminData.permission == 2 ||
adminData.permission == 3 ||
adminData.permission == 5
">
<el-icon><Folder /></el-icon>
<span>客户账户明细</span>
</el-menu-item>
<el-menu-item index="/permissions" v-if="adminData.permission == 1">
<el-icon><Folder /></el-icon>
<span>权限管理</span>
</el-menu-item>
</el-menu>
</el-card>
</el-aside>
<el-container style="margin-left: 15%; min-width: 180px">
<!-- 修改 el-header 样式 -->
<el-header style="
position: fixed;
top: 0;
left: 15%;
right: 0;
z-index: 80;
background: white;
">
<el-menu class="el-menu-demo" mode="horizontal" :ellipsis="false">
<el-sub-menu index="1" class="admin">
<template #title>
<el-image :src="imgrule1" alt="错误" style="width: 50px; height: 50px" />
<span style="margin-left: 10px">{{ adminData.name }}</span>
</template>
<el-menu-item @click="message()">查看个人信息</el-menu-item>
<el-menu-item index="1-2" @click="logout">退出登录</el-menu-item>
</el-sub-menu>
</el-menu>
</el-header>
<!-- 修改 el-main 样式 -->
<el-main style="margin-top: 60px">
<!-- 60px el-header 的大致高度可根据实际情况调整 -->
<router-view></router-view>
</el-main>
</el-container>
</el-container>
</div>
<!-- 查看个人信息 -->
<el-dialog v-model="messageVisible" title="查看个人信息" width="500px">
<el-form :model="adminData">
<el-form-item label="用户姓名" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.name }}</span>
</el-form-item>
<el-form-item label="精网号" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.jwcode }}</span>
</el-form-item>
<el-form-item label="地区" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.area }}</span>
</el-form-item>
<el-form-item label="注册时间" label-width="100px" label-position="left">
<span class="message-font">{{ adminData.createTime }}</span>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button text @click="closeMessage()">关闭</el-button>
</div>
</template>
</el-dialog>
</el-col>
</el-row>
</template>
<style scoped>
.message-font {
font-size: 16px;
font-weight: bold;
}
.admin {
margin-left: auto;
}
.el-aside {
min-height: 100vh;
width: 200px;
}
/* background-color: #BFD8D2; */
.logo {
margin: 20px 0px 20px 20px;
display: flex;
}
.el-menu-demo {
border: none; /* 去除边框 */
padding: 0; /* 去除内边距 */
float: right;
/* 将菜单向右浮动 */
}
.el-menu-vertical-demo:not(.el-menu--collapse) {
width: 240px;
min-height: 400px;
border: none; /* 去除边框 */
}
</style>
<script></script>

38
src/views/refund/coinRefundDetail.vue

@ -316,32 +316,18 @@ const getGoods = async function () {
//
}
}
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize))
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
getObj.value.pageNum = parseInt(getObj.value.pageNum)
console.log('输入的数字合法')
getSelectBy()
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
const exportExcel = async function () {
const params = {
text:'',
deptid:'',
sort:1,
field:'',
page:getObj.pageNum,
size:getObj.pageSize
}
const res = await API({ url: '/export/exportRefund', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
}
}
//

197
src/views/usergold/clientCountBalance.vue

@ -32,7 +32,7 @@ const getmarket = async () => {
const result = await API({
url: '/general/market'
});
console.log('获取地区数据成功',result)
console.log('获取地区数据成功', result)
// { value, label }
if (Array.isArray(result.data) && typeof result.data[0] === 'string') {
market.value = result.data.map(item => ({ value: item, label: item }));
@ -43,7 +43,7 @@ const getmarket = async () => {
console.error('获取地区数据失败:', error);
ElMessage.error('获取地区数据失败,请稍后重试');
//
market.value = [];
market.value = [];
} finally {
isLoadingmarket.value = false;
}
@ -65,14 +65,10 @@ const freeDecemberGold = ref(0) // 修改为 currentFreeDecember 对应字段
const taskGold = ref(0) // currentTaskGold
const freeGold = ref(0) //
//
const tableCountData = ref([])
const userInfo = ref({})
// ===========================================
//
const total = ref(100)
@ -91,10 +87,6 @@ const getObj = ref({
const sortField = ref('')
const sortOrder = ref('')
//
// ===========================================================================
//
@ -104,12 +96,12 @@ const get = async function (val) {
if (typeof val === 'number') {
getObj.value.pageNum = val
}
//
user.value.sortField = sortField.value
user.value.sortOrder = sortOrder.value
console.log('搜索参数', getObj.value)
// POST
const requestData = { ...getObj.value, user: { ...user.value } };//
@ -126,7 +118,7 @@ const get = async function (val) {
tableData.value = result.data.list
total.value = result.data.total
//
const resultGoldTotal = await API({
url: '/goldDetail/goldTotal',
@ -158,7 +150,7 @@ const get = async function (val) {
//
tableData.value = result.data.list
console.log('tableData', tableData.value)
//
if (resultGoldTotal.data) {
permanentGold.value = parseFloat(resultGoldTotal.data.permanentGold.toFixed(2))
@ -181,7 +173,7 @@ const get = async function (val) {
// user putExcel jwcode
const trimJwCode = () => {
if (user.value.jwcode) {
user.value.jwcode = user.value.jwcode.replace(/\s/g, '');
user.value.jwcode = user.value.jwcode.replace(/\s/g, '');
}
}
@ -202,38 +194,10 @@ const cellClick = function (row, column) {
console.log('cellClick', column.label)
if (column.label === '姓名') {
dialogVisible.value = true
userInfo.value = row
}
}
//
const checkNumber = function () {
if (typeof parseInt(getObj.value.pageNum) === 'number') {
console.log('总共有多少页' + Math.ceil(total.value / getObj.value.pageSize))
if (
getObj.value.pageNum > 0 &&
getObj.value.pageNum <= Math.ceil(total.value / getObj.value.pageSize)
) {
getObj.value.pageNum = parseInt(getObj.value.pageNum)
console.log('输入的数字合法')
get()
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
} else {
//
ElMessage({
type: 'error',
message: '请检查输入内容'
})
}
}
//
const handleSortChange = (column) => {
console.log('排序字段:', column.prop)
@ -250,8 +214,6 @@ const handleSortChange = (column) => {
sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
get()
}
//
onMounted(async function () {
await getAdminData()
@ -266,6 +228,20 @@ const handleCurrentChange = function (val) {
getObj.value.pageNum = val
get()
}
const exportExcel = async function () {
const params = {
text:'',
deptid:'',
sort:1,
field:'',
page:getObj.pageNum,
size:getObj.pageSize
}
const res = await API({ url: '/goldDetail/exportGold', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
}
}
</script>
<template>
@ -275,34 +251,17 @@ const handleCurrentChange = function (val) {
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input
v-model="user.jwcode"
style="width: 160px"
placeholder="请输入精网号"
clearable
/>
<el-input v-model="user.jwcode" style="width: 160px" placeholder="请输入精网号" clearable />
</div>
<div
class="head-card-element"
>
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select
v-model="user.market"
placeholder="请选择所属地区"
style="width: 180px"
clearable
>
<el-option
v-for="item in market"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-select v-model="user.market" placeholder="请选择所属地区" style="width: 180px" clearable>
<el-option v-for="item in market" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="exportExcel()">导出Excel</el-button>
</div>
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="exportExcel()">导出Excel</el-button>
</div>
<!-- </div> -->
</el-card>
</el-col>
@ -311,26 +270,16 @@ const handleCurrentChange = function (val) {
<el-col>
<el-card>
<div>
金币总数{{ Math.abs(goldtotal) /100}}
永久金币{{ Math.abs(permanentGold) /100}}
免费金币{{ Math.abs(freeGold) /100}}
任务金币{{ Math.abs(taskGold) /100}}
金币总数{{ Math.abs(goldtotal) / 100 }}
永久金币{{ Math.abs(permanentGold) / 100 }}
免费金币{{ Math.abs(freeGold) / 100 }}
任务金币{{ Math.abs(taskGold) / 100 }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 626px; overflow-y: auto">
<el-table
:data="tableData"
@cellClick="cellClick"
style="width: 100%"
height="626px"
@sort-change="handleSortChange"
>
<el-table-column
type="index"
label="序号"
width="100px"
fixed="left"
>
<el-table :data="tableData" @cellClick="cellClick" style="width: 100%" height="626px"
@sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
@ -340,75 +289,50 @@ const handleCurrentChange = function (val) {
<el-table-column prop="name" label="姓名" width="120" />
<el-table-column prop="jwcode" label="精网号" width="120" />
<el-table-column prop="market" label="所属地区" width="120" />
<el-table-column
prop="allJb"
label="金币总数"
width="120"
aligh="center"
>
<el-table-column prop="allJb" label="金币总数" width="120" aligh="center">
<template #default="scope">
<span>{{
(scope.row.currentPermanentGold +
scope.row.currentFreeJune +
scope.row.currentFreeDecember +
scope.row.currentTaskGold) /100
scope.row.currentTaskGold) / 100
}}</span>
</template>
</el-table-column>
<el-table-column
prop="currentPermanentGold"
label="永久金币"
sortable="custom"
width="110"
>
<el-table-column prop="currentPermanentGold" label="永久金币" sortable="custom" width="110">
<template #default="scope">
<span>{{ Math.abs(scope.row.currentPermanentGold) /100 }}</span>
<span>{{ Math.abs(scope.row.currentPermanentGold) / 100 }}</span>
</template>
</el-table-column>
<el-table-column
prop="currentFreeJune"
label="6月份到期免费金币"
sortable="custom"
width="110"
>
<el-table-column prop="currentFreeJune" label="6月份到期免费金币" sortable="custom" width="110">
<template #default="scope">
<span>{{ scope.row.currentFreeJune /100 }}</span>
<span>{{ scope.row.currentFreeJune / 100 }}</span>
</template>
</el-table-column>
<el-table-column
prop="currentFreeDecember"
label="12月份到期免费金币"
sortable="custom"
width="110"
>
<el-table-column prop="currentFreeDecember" label="12月份到期免费金币" sortable="custom" width="110">
<template #default="scope">
<span>{{ scope.row.currentFreeDecember /100 }}</span>
<span>{{ scope.row.currentFreeDecember / 100 }}</span>
</template>
</el-table-column>
<el-table-column
prop="currentTaskGold"
label="任务金币"
sortable="custom"
width="130"
>
<el-table-column prop="currentTaskGold" label="任务金币" sortable="custom" width="130">
<template #default="scope">
<span>{{ Math.abs(scope.row.currentTaskGold) /100 }}</span>
<span>{{ Math.abs(scope.row.currentTaskGold) / 100 }}</span>
</template>
</el-table-column>
<el-table-column prop="rcoin" label="历史金币" width="150">
<template #default="scope">
<!-- 计算四个字段的和并显示 -->
<span>{{
(scope.row.sumPermanentGold || 0) +
(scope.row.sumFreeJune || 0) +
(scope.row.sumFreeDecember || 0) +
(scope.row.sumTaskGold || 0) /100
<span>{{
(scope.row.sumPermanentGold || 0) +
(scope.row.sumFreeJune || 0) +
(scope.row.sumFreeDecember || 0) +
(scope.row.sumTaskGold || 0) / 100
}}</span>
</template>
</el-table-column>
<el-table-column prop="sumConsume" label="历史消费" width="150">
<template #default="scope">
<span>{{ Math.abs(scope.row.sumConsume) /100 }}</span>
<span>{{ Math.abs(scope.row.sumConsume) / 100 }}</span>
</template>
</el-table-column>
</el-table>
@ -416,20 +340,14 @@ const handleCurrentChange = function (val) {
<!-- 分页 -->
<div class="pagination" style="margin-top: 20px">
<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"
@current-change="handleCurrentChange"
></el-pagination>
<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"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>
</el-row>
</template>
<style scoped lang="scss">
@ -452,13 +370,16 @@ const handleCurrentChange = function (val) {
.head-card-btn {
margin-left: auto;
}
.custom-box {
display: flex;
flex-wrap: wrap;
row-gap: 5px;
div:nth-child(1) {
flex: 1 0 100%;
}
div {
margin-right: 20px;
}

443
src/views/usergold/clientCountDetail.vue

@ -1,6 +1,5 @@
<script setup>
import { ref, onMounted, computed ,nextTick} from 'vue'
import { ref, onMounted, computed, nextTick } from 'vue'
import { ElMessage } from 'element-plus'
import axios from 'axios'
@ -24,11 +23,24 @@ const getAdminData = async function () {
console.log('管理员用户信息请求失败', error)
}
}
const exportExcel = async function () {
const params = {
text:'',
deptid:'',
sort:1,
field:'',
page:getObj.pageNum,
size:getObj.pageSize
}
const res = await API({ url: '/goldDetail/export', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
}
}
// goldDetail jwcode
const trimJwCode = () => {
if (goldDetail.value.jwcode) {
goldDetail.value.jwcode = goldDetail.value.jwcode.replace(/\s/g, '');
goldDetail.value.jwcode = goldDetail.value.jwcode.replace(/\s/g, '');
}
}
@ -47,16 +59,16 @@ const getPlatform = async () => {
data: {}//
})
// { value, label }
if(Array.isArray(result.data)) {
if (Array.isArray(result.data)) {
platform.value = result.data.map(item => ({ value: item, label: item }));
} else {
console.error('平台信息格式错误',result)
console.error('平台信息格式错误', result)
ElMessage.error('平台信息格式错误,请联系管理员')
}
}
} catch (error) {
console.error('获取平台信息失败:', error);
ElMessage.error('获取平台信息失败,请稍后重试');
} finally {
} finally {
isLoadingPlatform.value = false
}
}
@ -97,7 +109,7 @@ const getArea = async () => {
console.error('获取地区数据失败:', error);
ElMessage.error('获取地区数据失败,请稍后重试');
//
market.value = [];
market.value = [];
} finally {
isLoadingArea.value = false;
}
@ -107,7 +119,7 @@ const getArea = async () => {
const tableData = ref([])
//
// const sumGoldTotal = ref(0)
const permanentGold = ref(0)
const permanentGold = ref(0)
//const freeGold = ref(0)
const taskGold = ref(0)
// ===========================================
@ -132,41 +144,26 @@ const getObj = ref({
//
const get = async function (val) {
try {
//
// if (adminData.value.market === '') {
// goldDetail.value.markets = ['', '']
// } else if (adminData.value.market !== '') {
// goldDetail.value.market = adminData.value.market
// }
//
if (typeof val === 'number') {
getObj.value.pageNum = val
}
if (getTime.value.length === 2) {//
// 使 YYYY-MM-DD HH:mm:ss
goldDetail.value.startTime = moment(getTime.value[0]).format('YYYY-MM-DD HH:mm:ss');
goldDetail.value.endTime = moment(getTime.value[1]).format('YYYY-MM-DD HH:mm:ss');
} else {
goldDetail.value.startTime = ''
goldDetail.value.endTime = ''
}
// console.log('moment :', moment);
//
goldDetail.value.sortField = sortField.value
goldDetail.value.sortOrder = sortOrder.value
console.log('搜索参数', getObj.value)
// POST
// jwcode
console.log('jwcode 类型:', typeof goldDetail.value.jwcode);
console.log('jwcode 值:', goldDetail.value.jwcode);
const requestData = { ...getObj.value, goldDetail: { ...goldDetail.value } };
console.log('最终请求参数', JSON.stringify(requestData, null, 2)); //
//console.log('', requestData);
const result = await API({
url: '/goldDetail/getGoldDetail',
method: 'post',
@ -176,19 +173,15 @@ const get = async function (val) {
tableData.value = result.data.list
total.value = result.data.total
//
permanentGold.value = tableData.value.reduce((total, row) => {
return total + (Number(row. permanentGold) || 0);
permanentGold.value = tableData.value.reduce((total, row) => {
return total + (Number(row.permanentGold) || 0);
}, 0);
taskGold.value = tableData.value.reduce((total, row) => {
return total + (Number(row.taskGold) || 0);
}, 0);
//6+12
} catch (error) {
console.log('请求失败', error)
}
@ -238,7 +231,7 @@ const getYesterday = function () {
// 7
const get7Days = function () {
const startTime = moment().subtract(6, 'day').startOf('day').toDate()
const endTime = moment().add(1,'days').startOf('day').toDate()
const endTime = moment().add(1, 'days').startOf('day').toDate()
getTime.value = [startTime, endTime]
search()
}
@ -255,7 +248,7 @@ const sumGoldTotal = computed(() => {
const calculateFreeGold = (row) => {
const freeJune = row.freeJune || 0;
const freeDecember = row.freeDecember || 0;
return (freeJune + freeDecember) ;
return (freeJune + freeDecember);
};
//
@ -292,9 +285,6 @@ const checkNumber = function () {
}
}
//
const sortField = ref('')
const sortOrder = ref('')
@ -302,7 +292,7 @@ const sortOrder = ref('')
const handleSortChange = (column) => {
if (column.prop === 'sumGold') {//
sortField.value = 'sum_gold'
} else if(column.prop === ' permanentGold') {
} else if (column.prop === ' permanentGold') {
sortField.value = 'permanent_gold'
} else if (column.prop === 'taskGold') {
sortField.value = 'task_gold'
@ -329,257 +319,153 @@ const handleCurrentChange = function (val) {
getObj.value.pageNum = val
get()
}
//
onMounted(async function () {
await get()
await getArea()
await getAdminData()
await getPlatform() //
})
</script>
<template>
<div>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px;margin-top: 10px;">
<el-row style="margin-bottom: 10px">
<el-col :span="5">
<div class="head-card-element">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input v-model="goldDetail.jwcode" style="width: 150px" placeholder="请输入精网号" clearable />
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">平台信息</el-text>
<el-select v-model="goldDetail.payPlatform" placeholder="请选择平台信息" style="width: 160px" clearable
:loading="isLoadingPlatform">
<el-option v-for="item in platform" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col>
<el-col :span="7">
<div class="head-card-element">
<el-text class="mx-1" size="large">数量更新类型</el-text>
<el-select v-model="goldDetail.type" placeholder="请选择更新类型" style="width: 160px" clearable>
<el-option v-for="item in type" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select v-model="goldDetail.market" placeholder="请选择所属地区" style="width: 180px" clearable
:loading="isLoadingArea">
<el-option v-for="item in market" :key="item.value || item" :label="item.label || item"
:value="item.value || item" />
</el-select>
</div>
</el-col>
</el-row>
<div class="head-card-element">
<el-text class="mx-1" size="large">更新时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="margin-right: 50px" />
<el-button @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="exportExcel">导出Excel表格</el-button>
</div>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<div>
金币总数{{ Math.abs(sumGoldTotal) / 100 }}
永久金币{{ Math.abs(permanentGold) / 100 }}
免费金币{{ Math.abs(totalFreeGold) / 100 }}
任务金币{{ Math.abs(taskGold) / 100 }}
</div>
<div style="height: 584px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" @sort-change="handleSortChange" height="584px">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150" />
<el-table-column fixed="left" prop="jwcode" label="精网号" width="120" />
<el-table-column prop="market" label="所属地区" width="120" />
<el-table-column prop="payPlatform" label="平台信息" width="140">
</el-table-column>
<el-table-column prop="type" label="更新类型" width="110">
<template #default="scope">
<span v-if="scope.row.type === 0">充值</span>
<span v-if="scope.row.type === 1">消耗</span>
<span v-if="scope.row.type === 2">退款</span>
</template>
</el-table-column>
<el-table-column prop="sumGold" sortable="custom" label="金币数量" width="110">
<template #default="scope">
<span>
{{
scope.row.type === 1 //
? - scope.row.sumGold / 100
: scope.row.sumGold / 100
}}
</span>
</template>
</el-table-column>
<el-table-column prop=" permanentGold" sortable="custom" label="永久金币" width="110">
<template #default="scope">
<span>{{ scope.row.permanentGold / 100 }}</span>
</template>
</el-table-column>
<el-table-column sortable="custom" label="免费金币" width="110">
<template #default="scope">
<span>{{ calculateFreeGold(scope.row) / 100 }}</span>
</template>
</el-table-column>
<el-table-column prop="taskGold" sortable="custom" label="任务金币" width="110">
<template #default="scope">
<span>{{ scope.row.taskGold / 100 }}</span>
</template>
</el-table-column>
<el-table-column prop="adminName" label="提交人" width="110" />
<el-table-column prop="auditTime" sortable="custom" label="更新时间" width="210" show-overflow-tooltip>
<template #default="scope">
<span>{{
moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss')
}}</span>
</template>
</el-table-column>
</el-table>
</div>
<!-- 此处分页 -->
<div class="pagination" style="margin-top: 20px">
<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"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<div>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px;margin-top: 10px;">
<el-row style="margin-bottom: 10px">
<el-col :span="5">
<div class="head-card-element">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input
v-model="goldDetail.jwcode"
style="width: 150px"
placeholder="请输入精网号"
clearable
/>
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">平台信息</el-text>
<el-select
v-model="goldDetail.payPlatform"
placeholder="请选择平台信息"
style="width: 160px"
clearable
:loading="isLoadingPlatform"
>
<el-option
v-for="item in platform"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</el-col>
<el-col :span="7">
<div class="head-card-element">
<el-text class="mx-1" size="large">数量更新类型</el-text>
<el-select
v-model="goldDetail.type"
placeholder="请选择更新类型"
style="width: 160px"
clearable
>
<el-option
v-for="item in type"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select
v-model="goldDetail.market"
placeholder="请选择所属地区"
style="width: 180px"
clearable
:loading="isLoadingArea"
>
<el-option
v-for="item in market"
:key="item.value || item"
:label="item.label || item"
:value="item.value || item"
/>
</el-select>
</div>
</el-col>
</el-row>
<div class="head-card-element">
<el-text class="mx-1" size="large">更新时间</el-text>
<el-date-picker
v-model="getTime"
type="datetimerange"
range-separator="至"
start-placeholder="起始时间"
end-placeholder="结束时间"
style="margin-right: 50px"
/>
<el-button @click="getToday()"></el-button>
<el-button @click="getYesterday()"></el-button>
<el-button @click="get7Days()">近7天</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="exportExcel">导出Excel表格</el-button>
</div>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<div>
金币总数{{ Math.abs(sumGoldTotal) / 100}}
永久金币{{ Math.abs( permanentGold) / 100}}
免费金币{{ Math.abs(totalFreeGold) / 100}}
任务金币{{ Math.abs(taskGold) / 100}}
</div>
<div style="height: 584px; overflow-y: auto">
<el-table
:data="tableData"
style="width: 100%"
@sort-change="handleSortChange"
height="584px"
>
<el-table-column
type="index"
label="序号"
width="100px"
fixed="left"
>
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column
fixed="left"
prop="name"
label="姓名"
width="150"
/>
<el-table-column
fixed="left"
prop="jwcode"
label="精网号"
width="120"
/>
<el-table-column prop="market" label="所属地区" width="120" />
<el-table-column
prop="payPlatform"
label="平台信息"
width="140"
>
</el-table-column>
<el-table-column prop="type" label="更新类型" width="110">
<template #default="scope">
<span v-if="scope.row.type === 0">充值</span>
<span v-if="scope.row.type === 1">消耗</span>
<span v-if="scope.row.type === 2">退款</span>
</template>
</el-table-column>
<el-table-column
prop="sumGold"
sortable="custom"
label="金币数量"
width="110"
>
<template #default="scope">
<span>
{{
scope.row.type === 1 //
? - scope.row.sumGold /100
: scope.row.sumGold /100
}}
</span>
</template>
</el-table-column>
<el-table-column
prop=" permanentGold"
sortable="custom"
label="永久金币"
width="110"
>
<template #default="scope">
<span>{{ scope.row. permanentGold /100 }}</span>
</template>
</el-table-column>
<el-table-column
sortable="custom"
label="免费金币"
width="110"
>
<template #default="scope">
<span>{{ calculateFreeGold(scope.row) /100}}</span>
</template>
</el-table-column>
<el-table-column
prop="taskGold"
sortable="custom"
label="任务金币"
width="110"
>
<template #default="scope">
<span>{{ scope.row.taskGold /100}}</span>
</template>
</el-table-column>
<el-table-column prop="adminName" label="提交人" width="110" />
<el-table-column
prop="auditTime"
sortable="custom"
label="更新时间"
width="210"
show-overflow-tooltip
>
<template #default="scope">
<span>{{
moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss')
}}</span>
</template>
</el-table-column>
</el-table>
</div>
<!-- 此处分页 -->
<div class="pagination" style="margin-top: 20px">
<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"
@current-change="handleCurrentChange"
></el-pagination>
</div>
</el-card>
</el-col>
</el-row>
</div>
</template>
@ -615,5 +501,4 @@ onMounted(async function () {
.el-progress-bar__inner {
transition: width 0.5s ease;
}
</style>

42
src/views/workspace/index.vue

@ -9,7 +9,14 @@
<template #header>
<div class="card-header">
<div class="card-title">当前金币余量</div>
<div>{{ currentGold }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;较前一日 {{ dailyChange }}</div>
<div>{{ currentGold }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;较前一日 {{ dailyChange }}
<template v-if="dailyChange > 0">
<el-icon style="color:forestgreen"><SemiSelect /></el-icon>
</template>
<template v-else-if="dailyChange < 0">
<el-icon style="color:red"><Bottom /></el-icon>
</template>
</div>
</div>
</template>
<div>
@ -93,7 +100,7 @@
@change="handleDateRangeChange"
value-format="YYYY-MM-DD HH:mm:ss"
/>
<el-button type="primary" style="margin-left: 5px" @click="loadChart">查询</el-button>
<el-button type="primary" style="margin-left: 5px" @click="getChartData">查询</el-button>
</el-col>
</el-row>
@ -134,12 +141,12 @@ import * as echarts from 'echarts'
import { ref, onMounted, nextTick, watch } from 'vue'
import API from '@/util/http'
import { ElMessage } from 'element-plus'
import { Top, Bottom, SemiSelect } from '@element-plus/icons-vue'
//
const markets = ref([])
//
const activeTab = ref('recharge')
const timeRange = ref('day')
const timeRange = ref('')
const dateRange = ref([])
const selectedType = ref('all')
const tableData = ref([])
@ -206,9 +213,9 @@ const processData = (data) => {
//
data.marketCards.forEach(market => {
for (const key in summary) {
if (market[key] !== undefined && market[key] !== null) { // number
summary[key] += market[key]
for (const i in summary) {
if (market[i] !== undefined && market[i] !== null) { // number
summary[i] += market[i]
}
}
})
@ -454,7 +461,7 @@ const updateChart = (chartData) => {
//
const handleTabChange = () => {
loadChart()
getChartData()
}
//
@ -468,7 +475,7 @@ const handleTimeRangeChange = () => {
endDate = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 23, 59, 59)
} else if (timeRange.value === 'week') {
const day = now.getDay()
const diff = now.getDate() - day + (day === 0 ? -6 : 1) //
const diff = now.getDate() - day + (day === 0 ? -6 : 1)
startDate = new Date(now.setDate(diff))
startDate.setHours(0, 0, 0, 0)
endDate = new Date(now)
@ -478,9 +485,10 @@ const handleTimeRangeChange = () => {
startDate = new Date(now.getFullYear(), now.getMonth(), 1)
endDate = new Date(now.getFullYear(), now.getMonth() + 1, 0)
endDate.setHours(23, 59, 59, 0)
} else { // year
startDate = '2025-01-01 00:00:00'
endDate = '2025-12-31 23:59:59'
} else {
startDate = new Date(now.getFullYear(), 0, 1)
endDate = new Date(now.getFullYear(), 11, 31)
endDate.setHours(23, 59, 59, 0)
}
dateRange.value = [
@ -488,7 +496,7 @@ const handleTimeRangeChange = () => {
formatDate(endDate)
]
loadChart()
getChartData()
}
//
@ -506,7 +514,7 @@ const formatDate = (date) => {
//
const handleDateRangeChange = () => {
timeRange.value = 'custom'
loadChart()
getChartData()
}
const getAdminData = async function () {
try {
@ -517,11 +525,6 @@ const getAdminData = async function () {
console.log('请求失败', error)
}
}
//
const loadChart = () => {
getChartData()
}
//
const getCardData = async () => {
try {
@ -542,6 +545,7 @@ onMounted(async () => {
await getAdminData()
await getCardData()
await getMarkets()
await getChartData()
handleTimeRangeChange() //
})
</script>

2
stats.html
File diff suppressed because it is too large
View File

Loading…
Cancel
Save