18 Commits

Author SHA1 Message Date
zhangrenyuan d40812ee74 style金币管理的1.0修改(背景颜色字体穿透) 1 week ago
zhangrenyuan e250039e1c Merge branch 'milestone-20250913-现金管理' of http://39.101.133.168:8807/huangqizhen/gold-vue into milestone-20250913-现金管理 1 week ago
zhangrenyuan b32346d57d fix金豆审核style 1 week ago
lihui 0d75574df8 fix:样式 1 week ago
lihui 8fd65196c9 Merge branch 'refs/heads/lihui/feature-20250915101448-现金管理' into milestone-20250913-现金管理 1 week ago
lihui 558be246d4 perf:优化代码 删除无用的样式,预留出地区负责人的页面,后面根据接口修改 1 week ago
zhangrenyuan 49b7f0cced Merge branch 'zhangrenyuan/feature-20250917134308-现金管理' into milestone-20250913-现金管理 1 week ago
lihui ccbad9cf6c Merge branch 'refs/heads/lihui/feature-20250915101448-现金管理' into milestone-20250913-现金管理 1 week ago
lihui baede47f1b fix:柱状图部分内容:排名卡片 1 week ago
ZhangYong 512652f882 收款明细更新进度 1 week ago
ZhangYong 70a20d3635 删除打包文件 1 week ago
ZhangYong 57a95e2948 9.29收款明细进度更新 1 week ago
lihui eb50cbd01a fix:重复请求 1 week ago
ZhangYong 214bbfb8cb 修改充值金额逻辑 2 weeks ago
ZhangYong c728df9d07 Merge branch 'milestone-20250913-现金管理' of http://39.101.133.168:8807/huangqizhen/gold-vue into zhangyong/milestone-20250913-现金管理 2 weeks ago
ZhangYong 88dc8998eb 拉代码 2 weeks ago
ZhangYong df5f91ae6c 9.26更新代码 2 weeks ago
ZhangYong 5ff3493269 权限控制 2 weeks ago
  1. 2
      .env.development
  2. 7
      package-lock.json
  3. 1
      package.json
  4. 5
      src/components/workspace/CashManagement.vue
  5. 210
      src/components/workspace/CashManagementMarkets.vue
  6. 78
      src/components/workspace/GoldGraph.vue
  7. 818
      src/components/workspace/GoldGraphMarkets.vue
  8. 4
      src/components/workspace/GoldManagement.vue
  9. 112
      src/views/audit/bean/beanAudit.vue
  10. 44
      src/views/audit/gold/rechargeAudit.vue
  11. 47
      src/views/audit/gold/refundAudit.vue
  12. 53
      src/views/consume/bean/articleVideo.vue
  13. 51
      src/views/consume/bean/dieHardFan.vue
  14. 51
      src/views/consume/bean/liveStream.vue
  15. 52
      src/views/consume/gold/coinConsumeDetail.vue
  16. 694
      src/views/moneyManage/receiveDetail/receiveDetail.vue
  17. 39
      src/views/permissions/rolePermission.vue
  18. 37
      src/views/permissions/userPermission.vue
  19. 2
      src/views/recharge/bean/addBeanRecharge.vue
  20. 52
      src/views/recharge/bean/beanOnlineRecharge.vue
  21. 54
      src/views/recharge/bean/beanSystemRecharge.vue
  22. 5
      src/views/recharge/gold/addCoinRecharge.vue
  23. 50
      src/views/recharge/gold/coinRechargeDetail.vue
  24. 51
      src/views/refund/gold/coinRefundDetail.vue
  25. 51
      src/views/usergold/bean/userbean.vue
  26. 96
      src/views/usergold/gold/clientCountBalance.vue
  27. 51
      src/views/usergold/gold/clientCountDetail.vue
  28. 73
      src/views/workspace/index.vue
  29. 4949
      stats.html

2
.env.development

@ -13,4 +13,4 @@ VITE_UPLOAD_URL=http://39.101.133.168:8828/hljw/api/aws/upload
# 本地 # 本地
#VITE_API_BASE='http://localhost:8081/' #VITE_API_BASE='http://localhost:8081/'
# sunjiabei # sunjiabei
# VITE_API_BASE='http://192.168.0.34:8081/'
# VITE_API_BASE='http://192.168.1.70:8081/'

7
package-lock.json

@ -17,6 +17,7 @@
"axios": "^1.12.2", "axios": "^1.12.2",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"dayjs-plugin-utc": "^0.1.2", "dayjs-plugin-utc": "^0.1.2",
"decimal.js": "^10.6.0",
"echarts": "^5.5.1", "echarts": "^5.5.1",
"element-plus": "^2.8.8", "element-plus": "^2.8.8",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
@ -3564,9 +3565,9 @@
} }
}, },
"node_modules/decimal.js": { "node_modules/decimal.js": {
"version": "10.4.3",
"resolved": "https://mirrors.huaweicloud.com/repository/npm/decimal.js/-/decimal.js-10.4.3.tgz",
"integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
"version": "10.6.0",
"resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.6.0.tgz",
"integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/define-lazy-prop": { "node_modules/define-lazy-prop": {

1
package.json

@ -21,6 +21,7 @@
"axios": "^1.12.2", "axios": "^1.12.2",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"dayjs-plugin-utc": "^0.1.2", "dayjs-plugin-utc": "^0.1.2",
"decimal.js": "^10.6.0",
"echarts": "^5.5.1", "echarts": "^5.5.1",
"element-plus": "^2.8.8", "element-plus": "^2.8.8",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",

5
src/components/workspace/CashManagement.vue

@ -17,7 +17,7 @@
<div class="market-data"> <div class="market-data">
<div v-for="market in cashData.markets" :key="market.name" class="market-item"> <div v-for="market in cashData.markets" :key="market.name" class="market-item">
<span class="market-name">{{ market.name }}:</span> <span class="market-name">{{ market.name }}:</span>
<span class="market-value">{{ market.value.toLocaleString() }}</span>
<span class="market-value">{{ market.value.toLocaleString() }}新币</span>
</div> </div>
</div> </div>
@ -58,8 +58,11 @@ const renderChart = () => {
bottom: 5, // bottom: 5, //
left: 'center' left: 'center'
}, },
series: [ series: [
{ {
label: {show: false},
type: 'pie', type: 'pie',
radius: ['40%', '70%'], radius: ['40%', '70%'],
data: cashData.value.markets, data: cashData.value.markets,

210
src/components/workspace/CashManagementMarkets.vue

@ -0,0 +1,210 @@
<!--各地区的现金管理情况-->
<template>
<div class="cash-management">
<div class="cash-title">
<div class="text1"> 现金管理
<span class="text1-update-time">最后更新时间{{
workDataUpdateTime && workDataUpdateTime !== '1970-01-01 08:00:00' ? workDataUpdateTime : '该地区暂无数据'
}}</span>
</div>
</div>
<div class="text2"><span class="text2-income">总营收{{ cashData.totalIncome }}</span></div>
<div class="chart-container">
<!-- 左侧数据列表 -->
<div class="market-data">
<div v-for="market in cashData.markets" :key="market.name" class="market-item">
<span class="market-name">{{ market.name }}:</span>
<span class="market-value">{{ market.value.toLocaleString() }}</span>
</div>
</div>
<!-- 图表区域 -->
<div ref="chartRef" class="chart"></div>
</div>
</div>
</template>
<script setup>
import * as echarts from 'echarts'
import {ref, onMounted} from 'vue'
//
const cashData = ref({
updateTime: '2025-09-24 12:00:00',
totalIncome: 1200000,
markets: [
{name: '北京', value: 450000},
{name: '上海', value: 300000},
{name: '广州', value: 200000},
{name: '深圳', value: 150000},
{name: '其他', value: 100000}
]
})
const chartRef = ref(null)
let chartInstance = null
const renderChart = () => {
if (!chartInstance && chartRef.value) {
chartInstance = echarts.init(chartRef.value)
}
const option = {
tooltip: {trigger: 'item'},
legend: {
bottom: 5, //
left: 'center'
},
series: [
{
label: {show: false},
type: 'pie',
radius: ['40%', '70%'],
data: cashData.value.markets,
center: ['60%', '45%'] //
}
]
}
chartInstance.setOption(option)
}
onMounted(() => {
renderChart()
})
</script>
<style scoped>
/* 背景卡片大小 */
.cash-management {
margin: 10px 5px;
width: 100%;
height: 50vh;
flex-shrink: 0;
border-radius: 8px;
background: #E7F4FD;
box-shadow: 0 2px 2px 0 #00000040;
display: flex;
flex-direction: column;
align-items: center;
}
/*
.cash-card {
width: 100%;
}
.chart {
width: 100%;
height: 200px;
} */
.cash-title {
width: 100%;
height: 5vh;
flex-shrink: 0;
border-radius: 8px;
background: linear-gradient(90deg, #E4F0FC 0%, #C6ADFF 50%, #E4F0FC 100%);
box-shadow: 0 2px 2px 0 #00152940;
display: flex;
align-items: center;
justify-content: center;
}
.text1 {
color: #040a2d;
font-family: "PingFang SC";
font-size: 28px;
font-style: normal;
font-weight: 900;
line-height: 31.79px;
}
.text1-update-time {
width: 100%;
height: 26px;
flex-shrink: 0;
color: #040a2d;
font-family: "PingFang SC";
font-size: 20px;
font-style: normal;
font-weight: 700;
line-height: 31.79px;
}
/* 总收入的渐变框 */
.text2 {
margin: 13px;
width: 95%;
height: 48px;
flex-shrink: 0;
border-radius: 8px;
background: linear-gradient(90deg, #E4F0FC 0%, #C1DCF8 50%, #E4F0FC 100%);
box-shadow: 0 2px 2px 0 #00152940;
display: flex;
align-items: center;
justify-content: center;
}
/* 总收入字体 */
.text2-income {
width: 215px;
height: 26px;
flex-shrink: 0;
color: #040a2d;
font-family: "PingFang SC";
font-size: 20px;
font-style: normal;
font-weight: 900;
line-height: 31.79px;
}
/* 图表容器 */
.chart-container {
display: flex;
align-items: center;
width: 100%;
height: 100%;
padding: 10px;
}
/* 左侧数据列表,使用您指定的样式 */
.market-data {
display: flex;
width: 179px;
flex-direction: column;
align-items: flex-start;
gap: 12px;
padding: 10px;
margin-left: 80px;
}
.market-item {
display: flex;
justify-content: space-between;
width: 100%;
font-family: "PingFang SC";
font-size: 16px;
color: #040a2d;
}
.market-name {
font-weight: 700;
}
.market-value {
font-weight: 500;
}
/* 图表样式 */
.chart {
flex: 1;
height: 300px;
margin-top: 10px;
}
</style>

78
src/components/workspace/GoldGraph.vue

@ -15,15 +15,25 @@
任务金币: {{ activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100 }}&nbsp;&nbsp; 任务金币: {{ activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100 }}&nbsp;&nbsp;
</div> </div>
<div> <div>
<el-button @click="getYes()" size="small" :type="activeTimeRange === 'yes' ? 'primary' : ''">昨天
<el-button
:style="{ backgroundColor: activeTimeRange === 'yes' ? '#2741DE' : '#E5EBFE', color: activeTimeRange === 'yes' ? 'white' : '#666' }"
@click="getYes()" size="default">昨天
</el-button> </el-button>
<el-button @click="getToday()" size="small" :type="activeTimeRange === 'today' ? 'primary' : ''">今天
<el-button
:style="{ backgroundColor: activeTimeRange === 'today' ? '#2741DE' : '#E5EBFE', color: activeTimeRange === 'today' ? 'white' : '#666' }"
@click="getToday()" size="default">今天
</el-button> </el-button>
<el-button @click="getWeek()" size="small" :type="activeTimeRange === 'week' ? 'primary' : ''">本周
<el-button
:style="{ backgroundColor: activeTimeRange === 'week' ? '#2741DE' : '#E5EBFE', color: activeTimeRange === 'week' ? 'white' : '#666' }"
@click="getWeek()" size="default">本周
</el-button> </el-button>
<el-button @click="getMonth()" size="small" :type="activeTimeRange === 'month' ? 'primary' : ''">本月
<el-button
:style="{ backgroundColor: activeTimeRange === 'month' ? '#2741DE' : '#E5EBFE', color: activeTimeRange === 'month' ? 'white' : '#666' }"
@click="getMonth()" size="default">本月
</el-button> </el-button>
<el-button @click="getYear()" size="small" :type="activeTimeRange === 'year' ? 'primary' : ''">本年
<el-button
:style="{ backgroundColor: activeTimeRange === 'year' ? '#2741DE' : '#E5EBFE', color: activeTimeRange === 'year' ? 'white' : '#666' }"
@click="getYear()" size="default">本年
</el-button> </el-button>
</div> </div>
<div> <div>
@ -655,28 +665,7 @@ const getAdminData = async function () {
console.log('请求失败', error) console.log('请求失败', error)
} }
} }
//
const getCardData = async () => {
try {
const response = await API({url: '/workbench/getCard', data: {}})
workDataUpdateTime.value = response.updateTime
//
sumWow.value = response.sumWow.toFixed(2)
//
sumDaily.value = response.sumDaily.toFixed(2)
if (response && response.data) {
processData(response.data)
} else if (Array.isArray(response?.marketCards)) {
processData(response)
} else {
console.error('无效的API响应结构:', response)
}
} catch (error) {
console.error('获取卡片数据失败:', error)
}
}
const workDataUpdateTime = ref(null)
// //
const activeTimeRange = ref('') const activeTimeRange = ref('')
@ -687,7 +676,6 @@ const handleDatePickerChange = () => {
onMounted(async () => { onMounted(async () => {
await getAdminData() await getAdminData()
await getCardData()
await getMarkets() await getMarkets()
getYear() getYear()
window.addEventListener('resize', () => { window.addEventListener('resize', () => {
@ -700,7 +688,7 @@ onUnmounted(() => {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
/* 整个柱状图的图表样式 */
.graph { .graph {
.condition { .condition {
width: 100%; width: 100%;
@ -733,15 +721,6 @@ onUnmounted(() => {
} }
} }
.center-card {
display: flex;
justify-content: center;
align-items: center;
}
.margin-bottom {
margin-bottom: 0.5vh;
}
.card-item { .card-item {
width: 25%; width: 25%;
@ -806,33 +785,34 @@ onUnmounted(() => {
/* 表格整体背景:把表格容器设为卡片背景 */ /* 表格整体背景:把表格容器设为卡片背景 */
:deep(.el-table) { :deep(.el-table) {
background-color: #F3FAFF !important;
background-color: #E7F4FD !important;
box-shadow: none !important; box-shadow: none !important;
} }
/* 表头/表体 wrapper 与 table body 单元格 */ /* 表头/表体 wrapper 与 table body 单元格 */
:deep(.el-table__header-wrapper), :deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper), :deep(.el-table__body-wrapper),
:deep(.el-table__body),
:deep(.el-table__header),
:deep(.el-table__body tbody),
:deep(.el-table__body tr), :deep(.el-table__body tr),
:deep(.el-table__row),
:deep(.el-table__cell),
:deep(.el-table__body td) { :deep(.el-table__body td) {
background-color: transparent !important; background-color: transparent !important;
} }
/* 表头 */ /* 表头 */
:deep(.el-table__header th) { :deep(.el-table__header th) {
background-color: #F3FAFF !important;
background-color: #E7F4FD !important;
} }
/* 行之间的分隔线(更像卡片内表格) */
:deep(.el-table .el-table__row):not(:last-child) {
border-bottom: 1px solid rgba(0,0,0,0.06);
/* 针对表格 body 中的单元格底部边框 */
:deep(.el-table__body .el-table__cell) {
border-bottom: 1px solid #BBC0C9 !important;
} }
} }
/* tabs的样式 */
/* 选中 tab 的文字颜色 */
:deep(.el-tabs__item.is-active) {
color: #2741DE !important;
font-size: 18px;
font-weight: bold;
}
</style> </style>

818
src/components/workspace/GoldGraphMarkets.vue

@ -0,0 +1,818 @@
<!--各地区的金币充值和消费情况柱状图-->
<template>
<div class="graph">
<el-card style="width:100%;" class="graph-card">
<div>
<el-tabs v-model="activeTab" @tab-change="handleTabChange">
<el-tab-pane label="金币充值" name="recharge"></el-tab-pane>
<el-tab-pane label="金币消费" name="consume"></el-tab-pane>
</el-tabs>
</div>
<div class="condition">
<div class="stats">
<div v-if="activeTab === 'consume'">合计{{ sumConsume / 100 }}</div>&nbsp;&nbsp;
永久金币: {{ activeTab === 'recharge' ? sumRechargePermanent / 100 : sumConsumePermanent / 100 }}&nbsp;&nbsp;
免费金币: {{ activeTab === 'recharge' ? sumRechargeFree / 100 : sumConsumeFree / 100 }}&nbsp;&nbsp;
任务金币: {{ activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100 }}&nbsp;&nbsp;
</div>
<div>
<el-button @click="getYes()" size="small" :type="activeTimeRange === 'yes' ? 'primary' : ''">昨天
</el-button>
<el-button @click="getToday()" size="small" :type="activeTimeRange === 'today' ? 'primary' : ''">今天
</el-button>
<el-button @click="getWeek()" size="small" :type="activeTimeRange === 'week' ? 'primary' : ''">本周
</el-button>
<el-button @click="getMonth()" size="small" :type="activeTimeRange === 'month' ? 'primary' : ''">本月
</el-button>
<el-button @click="getYear()" size="small" :type="activeTimeRange === 'year' ? 'primary' : ''">本年
</el-button>
</div>
<div>
<el-date-picker size="small" v-model="dateRange" type="datetimerange" range-separator=""
start-placeholder="开始时间" end-placeholder="结束时间" format="YYYY-MM-DD HH:mm:ss"
style="width:20vw;margin-left:0.5vw;" value-format="YYYY-MM-DD HH:mm:ss"
:default-time="defaultTime"
:disabled-date="disabledDate" @change="handleDatePickerChange"/>
<el-button type="primary" size="small" style="margin-left: 0.5vw" @click="getChartData">查询</el-button>
</div>
</div>
<div class="graph-content">
<div ref="chartRef" class="left"></div>
<div class="right">
<el-card class="graph-card-list">
<div class="card-large">金币{{ activeTab === 'recharge' ? '充值' : '消费' }}排名</div>
<el-select class="card-select" v-model="selectedType" style="width: 100%; margin-bottom: 15px">
<el-option label="全部类型" value="all"></el-option>
<el-option label="永久金币" value="permanent"></el-option>
<el-option label="免费金币" value="free"></el-option>
<el-option label="任务金币" value="task"></el-option>
</el-select>
<el-table class="card-table" :data="tableData" height="320px">
<el-table-column prop="rank" label="排名" width="60" 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">
<template #default="{ row }">
{{ row.coinAmount.toLocaleString() }}
</template>
</el-table-column>
</el-table>
</el-card>
</div>
</div>
</el-card>
</div>
</template>
<script setup>
import * as echarts from 'echarts'
import {onMounted, onUnmounted, ref, watch} from 'vue'
import API from '@/util/http'
import {ElMessage} from 'element-plus'
import dayjs from 'dayjs';
import utc from 'dayjs-plugin-utc'
import {marketMapping} from "@/utils/marketMap.js";
dayjs.extend(utc)
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
]
//
const markets = ref([])
//
const dateRange = ref([])
const activeTab = ref('recharge')
const selectedType = ref('all')
const tableData = ref([])
const chartRef = ref(null)
let chartInstance = null
//
const sumRechargePermanent = ref(0)
const sumRechargeFree = ref(0)
const sumRechargeTask = ref(0)
const sumConsumePermanent = ref(0)
const sumConsumeFree = ref(0)
const sumConsumeTask = ref(0)
const sumConsume = ref(0)
//
const adminData = ref({})
//
const currentGold = ref(0)
const dailyChange = ref(0)
const currentPermanent = ref(0)
const currentFree = ref(0)
const currentFreeJune = ref(0)
const currentFreeDecember = ref(0)
const currentTask = ref(0)
const yearlyRecharge = ref(0)
const yearlyMoney = ref(0)
const recharge = ref(0)
const money = ref(0)
const yearlyReduce = ref(0)
const yearlyConsume = ref(0)
const yearlyRefund = ref(0)
const dailyReduce = ref(0)
const dailyConsume = ref(0)
const dailyRefund = ref(0)
const yearlyRechargeNum = ref(0)
const sumWow = ref(0)
const sumDaily = ref(0)
const rechargeNum = ref(0)
const ydayRechargeNum = ref(0)
const firstRecharge = ref(0)
const length = ref(0)
//
const chartLoading = ref(true)
const handleResize = () => {
if (chartInstance.value) {
try {
chartInstance.value.resize()
console.log('resize一下')
} catch (error) {
console.error('图表resize失败:', error)
}
}
}
//
const initChart = () => {
if (!chartInstance && chartRef.value) {
chartInstance = echarts.init(chartRef.value)
window.addEventListener('resize', handleResize)
}
}
//
const destroyChart = () => {
if (chartInstance.value) {
try {
chartInstance.value.dispose()
} catch (error) {
console.error('图表销毁失败:', error)
}
chartInstance.value = null
}
window.removeEventListener('resize', handleResize)
}
const formatDate = function (date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
//
const getYes = function () {
const yesterday = dayjs().subtract(1, 'day')
const startTime = yesterday.startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = yesterday.endOf('day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('看看dateRange', dateRange.value)
activeTimeRange.value = 'yes' //
getChartData()
}
//
const getToday = function () {
const today = dayjs()
const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
// const endTime = today.add(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('看看dateRange', dateRange.value)
activeTimeRange.value = 'today' //
getChartData()
}
//
const getWeek = function () {
const today = dayjs();
// 01...6
const day = today.day();
// 6
let monday = today.subtract(day === 0 ? 6 : day - 1, 'day');
// (7 - day)
let sunday = today.add(day === 0 ? 0 : 7 - day, 'day');
//
const startTime = monday.startOf('day').format('YYYY-MM-DD HH:mm:ss');
const endTime = sunday.endOf('day').format('YYYY-MM-DD HH:mm:ss');
dateRange.value = [startTime, endTime];
console.log('本周时间范围(周一到周日):', dateRange.value);
activeTimeRange.value = 'week';
getChartData();
};
//
const getMonth = function () {
const today = dayjs()
const startTime = today.startOf('month').format('YYYY-MM-DD HH:mm:ss')
// const endTime = today.add(1, 'month').startOf('month').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.endOf('month').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('看看dateRange', dateRange.value)
activeTimeRange.value = 'month' //
getChartData()
}
//
const getYear = function () {
const today = dayjs()
const startTime = today.startOf('year').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.endOf('year').format('YYYY-MM-DD HH:mm:ss')
// const endTime = today.add(1, 'year').startOf('year').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('看看dateRange', dateRange.value)
activeTimeRange.value = 'year' //
getChartData()
}
// ( = + 6 + 12 + + )
const processData = (data) => {
const summary = {
currentGold: 0,
dailyChange: 0,
currentPermanent: 0,
currentFreeJune: 0,
currentFreeDecember: 0,
currentTask: 0,
currentFree: 0,
recharge: 0,
money: 0,
yearlyRecharge: 0,
yearlyMoney: 0,
consumePermanent: 0,
consumeFreeJune: 0,
consumeFreeDecember: 0,
consumeTask: 0,
refundPermanent: 0,
refundFreeJune: 0,
refundFreeDecember: 0,
refundTask: 0,
dailyReduce: 0,
yearlyConsume: 0,
yearlyRefund: 0,
yearlyReduce: 0,
rechargeNum: 0,
ydayRechargeNum: 0,
firstRecharge: 0,
sumWow: 0,
sumDaily: 0,
yearlyRechargeNum: 0
}
//
data.marketCards.forEach(market => {
for (const i in summary) {
if (market[i] !== undefined && market[i] !== null) { // number
summary[i] += market[i]
}
}
})
// wowdaily
length.value = data.markets.length
console.log(length.value)
// 退
const yesterdayConsume = summary.consumePermanent + summary.consumeFreeJune + summary.consumeFreeDecember + summary.consumeTask
const yesterdayRefund = summary.refundPermanent + summary.refundFreeJune + summary.refundFreeDecember + summary.refundTask
//
currentGold.value = summary.currentGold.toFixed(2)
dailyChange.value = summary.dailyChange.toFixed(2)
currentPermanent.value = summary.currentPermanent.toFixed(2)
currentFree.value = summary.currentFree.toFixed(2)
currentFreeJune.value = summary.currentFreeJune.toFixed(2)
currentFreeDecember.value = summary.currentFreeDecember.toFixed(2)
currentTask.value = summary.currentTask.toFixed(2)
yearlyRecharge.value = summary.yearlyRecharge.toFixed(2)
yearlyMoney.value = summary.yearlyMoney.toFixed(2)
recharge.value = summary.recharge.toFixed(2)
money.value = summary.money.toFixed(2)
yearlyReduce.value = summary.yearlyReduce.toFixed(2)
yearlyConsume.value = summary.yearlyConsume.toFixed(2)
yearlyRefund.value = summary.yearlyRefund.toFixed(2)
dailyReduce.value = summary.dailyReduce.toFixed(2)
dailyConsume.value = yesterdayConsume.toFixed(2)
dailyRefund.value = yesterdayRefund.toFixed(2)
yearlyRechargeNum.value = summary.yearlyRechargeNum
// //
// sumWow.value = (marketCards.sumWow / length.value).toFixed(2)
// //
// sumDaily.value = (marketCards.sumDaily / length.value).toFixed(2)
// rechargeNum.value = summary.rechargeNum
ydayRechargeNum.value = summary.ydayRechargeNum
firstRecharge.value = summary.firstRecharge
}
//
const disabledDate = (time) => {
const limitDate = new Date(2025, 0, 1);
return time.getTime() < limitDate.getTime();
}
//
const getMarkets = async () => {
console.log("adminData", adminData.value.account)
try {
const response = await API({
url: '/general/adminMarkets',
data: {
account: adminData.value.account
}
})
if (Array.isArray(response.data)) {
// markets.value = response.data.filter(data => data !== "1")
markets.value = response.data
console.log('市场列表获取成功:', markets.value)
} else {
console.error('获取市场列表失败', response)
ElMessage.error('获取市场列表失败')
}
} catch (error) {
console.error('获取市场列表失败:', error)
ElMessage.error('获取市场列表失败')
}
}
//
const getChartData = async () => {
try {
//
if (!markets.value || markets.value.length === 0) {
await getMarkets()
}
//
if (!dateRange.value || dateRange.value.length === 0) {
getYear()
}
const params = {
markets: markets.value,
startDate: dateRange.value[0],
endDate: dateRange.value[1]
};
const response = await API({
url: '/workbench/getGraph',
data: params
})
console.log('看看params', params)
if (Array.isArray(response.marketGraphs)) {
// const filteredGraphs = response.marketGraphs.filter(data => data.market !== "1");
//
processChartData(response.marketGraphs)
//
processRankingData(response.marketGraphs)
} else {
console.error('获取图表数据失败:', response)
ElMessage.error('获取图表数据失败')
}
} catch (error) {
console.error('获取图表数据失败:', error)
ElMessage.error('获取图表数据失败')
}
}
//
const processChartData = (marketCards) => {
const chartData = {
rechargePermanent: [],
rechargeFree: [],
rechargeTask: [],
consumePermanent: [],
consumeFree: [],
consumeTask: [],
sumConsume: []
}
//
const sumRechargePermanent1 = ref(0)
const sumRechargeFree1 = ref(0)
const sumRechargeTask1 = ref(0)
const sumConsumePermanent1 = ref(0)
const sumConsumeFree1 = ref(0)
const sumConsumeTask1 = ref(0)
const sumConsume1 = ref(0)
marketCards.forEach(market => {
chartData.rechargePermanent.push(market.sumRechargePermanent / 100 || 0)
chartData.rechargeFree.push(market.sumRechargeFree / 100 || 0)
chartData.rechargeTask.push(market.sumRechargeTask / 100 || 0)
chartData.consumePermanent.push(market.sumConsumePermanent / 100 || 0)
chartData.consumeFree.push(market.sumConsumeFree / 100 || 0)
chartData.consumeTask.push(market.sumConsumeTask / 100 || 0)
chartData.sumConsume.push(market.sumConsume / 100 || 0)
//
sumRechargePermanent1.value += (market.sumRechargePermanent || 0)
sumRechargeFree1.value += (market.sumRechargeFree || 0)
//sumRechargeTask1.value += (market.sumRechargeTask || 0)
sumConsumePermanent1.value += (market.sumConsumePermanent || 0)
sumConsumeFree1.value += (market.sumConsumeFree || 0)
sumConsumeTask1.value += (market.sumConsumeTask || 0)
sumConsume1.value += (market.sumConsume || 0)
})
sumRechargePermanent.value = sumRechargePermanent1.value
sumRechargeFree.value = sumRechargeFree1.value
sumRechargeTask.value = 0
sumConsumePermanent.value = sumConsumePermanent1.value
sumConsumeFree.value = sumConsumeFree1.value
sumConsumeTask.value = sumConsumeTask1.value
sumConsume.value = sumConsume1.value
updateChart(chartData)
}
const processRankingData = (marketCards) => {
//
const rankingData = marketCards.map(market => {
let coinAmount = 0;
if (activeTab.value === 'recharge') {
//
switch (selectedType.value) {
case 'all':
coinAmount = (market.sumRechargePermanent / 100 || 0) + (market.sumRechargeFree / 100 || 0) + (market.sumRechargeTask / 100 || 0);
break;
case 'permanent':
coinAmount = market.sumRechargePermanent / 100 || 0;
break;
case 'free':
coinAmount = market.sumRechargeFree / 100 || 0;
break;
case 'task':
coinAmount = market.sumRechargeTask / 100 || 0;
break;
}
} else {
//
switch (selectedType.value) {
case 'all':
coinAmount = (market.sumConsumePermanent / 100 || 0) + (market.sumConsumeFree / 100 || 0) + (market.sumConsumeTask / 100 || 0);
break;
case 'permanent':
coinAmount = market.sumConsumePermanent / 100 || 0;
break;
case 'free':
coinAmount = market.sumConsumeFree / 100 || 0;
break;
case 'task':
coinAmount = market.sumConsumeTask / 100 || 0;
break;
}
}
return {
market: market.market,
coinAmount: coinAmount
};
});
//
rankingData.sort((a, b) => b.coinAmount - a.coinAmount);
//
tableData.value = rankingData.map((item, index) => ({
rank: index + 1,
...item
}));
}
watch(selectedType, () => {
getChartData();
});
//
const updateChart = (chartData) => {
if (!chartInstance) {
initChart()
}
chartLoading.value = true
try {
let series = []
let legend = []
if (activeTab.value === 'recharge') {
series = [
{
name: '永久金币',
type: 'bar',
stack: 'recharge',
data: chartData.rechargePermanent,
itemStyle: {color: '#5470c6'},
barWidth: 30
},
{
name: '免费金币',
type: 'bar',
stack: 'recharge',
data: chartData.rechargeFree,
itemStyle: {color: '#91cc75'},
barWidth: 30
},
{
name: '任务金币',
type: 'bar',
stack: 'recharge',
data: chartData.rechargeTask,
itemStyle: {color: '#fac858'},
barWidth: 30
}
]
legend = ['永久金币', '免费金币', '任务金币']
} else {
series = [
{
name: '永久金币',
type: 'bar',
stack: 'consume',
data: chartData.consumePermanent,
itemStyle: {color: '#5470c6'},
barWidth: 30
},
{
name: '免费金币',
type: 'bar',
stack: 'consume',
data: chartData.consumeFree,
itemStyle: {color: '#91cc75'},
barWidth: 30
},
{
name: '任务金币',
type: 'bar',
stack: 'consume',
data: chartData.consumeTask,
itemStyle: {color: '#fac858'},
barWidth: 30
}
]
legend = ['永久金币', '免费金币', '任务金币']
}
const option = {
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
},
formatter: function (params) {
let result = params[0].name + '<br/>'
let total = 0;
params.forEach(param => {
result += `${param.seriesName}: ${param.value.toLocaleString()}<br/>`;
total += param.value;
})
result += `${activeTab.value === 'recharge' ? '充值' : '消费'}: ${total.toLocaleString()}`;
return result
}
},
legend: {
data: legend,
bottom: 10
},
grid: {
left: '3%',
right: '4%',
bottom: '10%',
containLabel: true
},
xAxis: {
type: 'category',
//
data: markets.value,
axisLabel: {
interval: 0,
rotate: 0
}
},
yAxis: {
type: 'value',
splitLine: {
lineStyle: {
type: 'dashed',
width: 1,
color: '#000000'
}
},
axisLabel: {
formatter: function (value) {
return value.toLocaleString()
}
},
},
series: series,
// dataZoom: [
// {
// type: 'slider',
// show: true,
// start: 0,
// end: 100,
// maxSpan: 100,
// minSpan: 100,
//
// height: 2,
// },
// ]
}
chartInstance.setOption(option)
} catch (error) {
console.error('图表更新失败:', error)
ElMessage.error('图表渲染失败')
} finally {
setTimeout(() => {
chartLoading.value = false
}, 300)
}
}
//
const handleTabChange = () => {
getChartData()
console.log('标签切换调用图表')
}
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
adminData.value = result
console.log('用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
//
const activeTimeRange = ref('')
//
const handleDatePickerChange = () => {
activeTimeRange.value = ''
}
onMounted(async () => {
await getAdminData()
await getMarkets()
getYear()
window.addEventListener('resize', () => {
chartInstance.resize()
})
})
onUnmounted(() => {
destroyChart()
})
</script>
<style scoped lang="scss">
.graph {
.condition {
width: 100%;
height: 1%;
display: flex;
align-items: center;
.stats {
display: flex;
align-items: center;
width: 35vw;
font-size: 15px;
}
}
.graph-content {
flex: 1;
height: auto;
display: flex;
.left {
width: 70%;
height: auto;
}
.right {
flex: 1;
padding: 0.5vw 2vh;
}
}
}
.center-card {
display: flex;
justify-content: center;
align-items: center;
}
.margin-bottom {
margin-bottom: 0.5vh;
}
.card-item {
width: 25%;
height: 28vh;
display: flex;
flex-direction: column;
justify-content: center;
margin-right: 0.25vw;
}
.card-title {
font-weight: bold;
margin-bottom: 1vh;
display: flex;
justify-content: center;
align-items: center;
}
.card-large {
font-weight: bold;
font-size: 16px;
text-align: center;
margin-bottom: 15px;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.graph-card {
background: #F3FAFF;
box-shadow: 0 0 8px 0 #00000040;
}
.graph-card-list {
background: #F3FAFF;
box-shadow: 0 0 8px 0 #00000040;
padding: 12px;
.card-select {
:deep(.el-input__wrapper) {
background-color: #E7F4FD !important;
box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.25) !important;
border: none !important;
}
:deep(.el-input__inner) {
background-color: transparent !important;
}
:deep(.el-input__suffix) {
background-color: transparent !important;
}
}
/* 表格整体背景:把表格容器设为卡片背景 */
:deep(.el-table) {
background-color: #F3FAFF !important;
box-shadow: none !important;
}
/* 表头/表体 wrapper 与 table body 单元格 */
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__body),
:deep(.el-table__header),
:deep(.el-table__body tbody),
:deep(.el-table__body tr),
:deep(.el-table__row),
:deep(.el-table__cell),
:deep(.el-table__body td) {
background-color: transparent !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFF !important;
}
/* 行之间的分隔线(更像卡片内表格) */
:deep(.el-table .el-table__row):not(:last-child) {
border-bottom: 1px solid rgba(0, 0, 0, 0.06);
}
}
</style>

4
src/components/workspace/GoldManagement.vue

@ -270,7 +270,8 @@ const processData = (data) => {
}); });
} }
//
//
/*
const initGoldTypeChart = () => { const initGoldTypeChart = () => {
const myChart = echarts.init(goldTypeChart.value); const myChart = echarts.init(goldTypeChart.value);
const option = { const option = {
@ -310,6 +311,7 @@ const initGoldTypeChart = () => {
}; };
myChart.setOption(option); myChart.setOption(option);
} }
*/
// //
const initRechargeGoldChart = () => { const initRechargeGoldChart = () => {

112
src/views/audit/bean/beanAudit.vue

@ -1,35 +1,47 @@
<template> <template>
<el-card style="margin-bottom: 0.5vh;width:82vw">
<div style="margin-bottom: 1vh">
<el-text size="large">精网号</el-text>
<el-card class="card1" style="margin-bottom: 0.5vh;">
<el-col style="margin-bottom: 1vh">
<div class="select">
<div class="selectRow">
<el-text class="text" size="large">精网号</el-text>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw" clearable /> <el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw" clearable />
<el-text size="large">所属地区</el-text>
</div>
<div class="selectRow">
<el-text class="text" size="large">所属地区</el-text>
<el-cascader v-model="selectedMarkets" :options="marketOptions" placeholder="请选择所属地区" clearable <el-cascader v-model="selectedMarkets" :options="marketOptions" placeholder="请选择所属地区" clearable
style="width: 12vw" @change="handleMarketChange" /> style="width: 12vw" @change="handleMarketChange" />
</div> </div>
</div>
</el-col>
<el-col> <el-col>
<el-text size="large" style="width: 80px" v-show="checkTab === 'pending'">提交时间</el-text>
<el-text size="large" style="width: 80px" v-show="checkTab === 'reject' || checkTab === 'pass'">审核时间</el-text>
<div class="select">
<div class="selectRow" style="width: 36vw;">
<el-text class="text" size="large" v-show="checkTab === 'pending'">提交时间</el-text>
<el-text size="large" style="width: 25vw;margin-right:1vw"
v-show="checkTab === 'reject' || checkTab === 'pass'">审核时间</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: 25vw;margin-right:1vw" @change="handleDatePickerChange" end-placeholder="结束时间" style="width: 25vw;margin-right:1vw" @change="handleDatePickerChange"
:default-time="defaultTime" /> :default-time="defaultTime" />
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"></el-button> <el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"></el-button>
<el-button @click="getYesterday()" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"></el-button> <el-button @click="getYesterday()" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"></el-button>
<el-button @click="get7Days()" :type="activeTimeRange === '7days' ? 'primary' : ''">近7天</el-button> <el-button @click="get7Days()" :type="activeTimeRange === '7days' ? 'primary' : ''">近7天</el-button>
</div>
<div class="selectRow" style="justify-content: flex-start;">
<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>
</el-col> </el-col>
</el-card> </el-card>
<el-card >
<el-card class="card2">
<el-tabs v-model="checkTab" type="card" @tab-click="handleClick"> <el-tabs v-model="checkTab" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="pending" v-if="hasbeanWait&&hasbeanWaitShow"></el-tab-pane>
<el-tab-pane label="待审核" name="pending" v-if="hasbeanWait && hasbeanWaitShow"></el-tab-pane>
<el-tab-pane label="已通过" name="pass" v-if="hasbeanThrough"></el-tab-pane> <el-tab-pane label="已通过" name="pass" v-if="hasbeanThrough"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject" v-if="hasbeanReject"></el-tab-pane> <el-tab-pane label="已驳回" name="reject" v-if="hasbeanReject"></el-tab-pane>
</el-tabs> </el-tabs>
<div>
<div class="goldStatistics">
总条数{{ format3(stats.num) }}&nbsp;&nbsp;&nbsp;&nbsp; 总条数{{ format3(stats.num) }}&nbsp;&nbsp;&nbsp;&nbsp;
总金豆数{{ format3(stats.beanNum) }}金豆&nbsp;&nbsp;&nbsp;&nbsp; 总金豆数{{ format3(stats.beanNum) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆{{ format3(stats.permanentBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp; 付费金豆{{ format3(stats.permanentBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
@ -61,7 +73,8 @@
{{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }} {{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="checkTab === 'pending' &&(hasbeanWaitThough||hasbeanWaitReject)" fixed="right" prop="operation" label="操作" width="400px">
<el-table-column v-if="checkTab === 'pending' && (hasbeanWaitThough || hasbeanWaitReject)" fixed="right"
prop="operation" label="操作" width="400px">
<template #default="scope"> <template #default="scope">
<div class="operation"> <div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)"> <el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
@ -77,7 +90,8 @@
</el-button> </el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
<el-button v-if="hasbeanWaitReject" :disabled="clicked || cancelClicked" type="primary" text @click="showRejectDialog(scope.row)">
<el-button v-if="hasbeanWaitReject" :disabled="clicked || cancelClicked" type="primary" text
@click="showRejectDialog(scope.row)">
驳回 驳回
</el-button> </el-button>
</div> </div>
@ -142,7 +156,7 @@ const hasbeanWaitThough = ref(false) // 金豆审核通过(对应beanWaitThou
const hasbeanWaitReject = ref(false) // beanWaitReject:47 const hasbeanWaitReject = ref(false) // beanWaitReject:47
// //
const initPermissions = async() => {
const initPermissions = async () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasbeanWait.value = hasMenuPermission(menuTree.value, permissionMapping.beanWait); hasbeanWait.value = hasMenuPermission(menuTree.value, permissionMapping.beanWait);
hasbeanThrough.value = hasMenuPermission(menuTree.value, permissionMapping.beanThrough); hasbeanThrough.value = hasMenuPermission(menuTree.value, permissionMapping.beanThrough);
@ -501,11 +515,11 @@ const trimJwCode = () => {
} }
onMounted(async () => { onMounted(async () => {
await initPermissions() await initPermissions()
if(hasbeanWaitShow.value){
if (hasbeanWaitShow.value) {
searchForm.value.status = 0 searchForm.value.status = 0
}else if(hasbeanThrough.value){
} else if (hasbeanThrough.value) {
searchForm.value.status = 1 searchForm.value.status = 1
}else if(hasbeanReject){
} else if (hasbeanReject) {
searchForm.value.status = 2 searchForm.value.status = 2
} }
getmarkets() getmarkets()
@ -515,4 +529,68 @@ onMounted(async () => {
}) })
</script> </script>
<style scoped></style>
<style scoped lang="scss">
/* 搜索的卡片样式 */
.card1 {
background: #F3FAFE;
}
/* 表单的卡片样式 */
.card2 {
background: #E7F4FD;
}
/* 充值新币总数等等 */
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
/* 表头/表体 wrapper 与 table body 单元格 */
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
.select {
display: flex;
.selectRow {
width: 17vw;
display: flex;
align-items: center;
justify-content: center;
padding: 0 0.5vw;
.text {
width: 5vw;
font-size: 15px;
}
.selectContent {
flex: 1;
}
}
}
</style>

44
src/views/audit/gold/rechargeAudit.vue

@ -49,7 +49,7 @@
</el-card> </el-card>
<el-card class="card2"> <el-card class="card2">
<el-tabs v-model="activeName" type="card" @tab-click="handleClick"> <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait" v-if="hasrechargeWait && hasrechargeWaitShow"></el-tab-pane>
<el-tab-pane label="待审核" name="wait" v-if="hasrechargeWait&&hasrechargeWaitShow"></el-tab-pane>
<el-tab-pane label="已通过" name="pass" v-if="hasrechargeThrough"></el-tab-pane> <el-tab-pane label="已通过" name="pass" v-if="hasrechargeThrough"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject" v-if="hasrechargeReject"></el-tab-pane> <el-tab-pane label="已驳回" name="reject" v-if="hasrechargeReject"></el-tab-pane>
<div class="goldStatistics"> <div class="goldStatistics">
@ -119,8 +119,7 @@
{{ moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss') }} {{ moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss') }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeName === 'wait' && (hasrechargeWaitThough || hasrechargeWaitReject) && hasrechargeWaitShow"
fixed="right" prop="operation" label="操作" width="150px">
<el-table-column v-if="activeName === 'wait'&&(hasrechargeWaitThough||hasrechargeWaitReject)&&hasrechargeWaitShow" fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope"> <template #default="scope">
<div class="operation"> <div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)"> <el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
@ -136,8 +135,7 @@
</el-button> </el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
<el-button v-if="hasrechargeWaitReject" :disabled="clicked || cancelClicked" type="primary" text
@click="showRejectDialog(scope.row)">
<el-button v-if="hasrechargeWaitReject" :disabled="clicked || cancelClicked" type="primary" text @click="showRejectDialog(scope.row)">
驳回 驳回
</el-button> </el-button>
</div> </div>
@ -191,7 +189,7 @@ const hasrechargeWaitThough = ref(false) // 充值审核通过
const hasrechargeWaitReject = ref(false) // const hasrechargeWaitReject = ref(false) //
// //
const initPermissions = async () => {
const initPermissions = async() => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasrechargeThrough.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeThrough); hasrechargeThrough.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeThrough);
hasrechargeReject.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeReject); hasrechargeReject.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeReject);
@ -482,21 +480,21 @@ const adminReject = async function () {
const handleClick = function (tab, event) { const handleClick = function (tab, event) {
activeName.value = tab.props.name activeName.value = tab.props.name
if (tab.props.name === 'wait') { if (tab.props.name === 'wait') {
if (!hasrechargeWait) {
if(!hasrechargeWait){
ElMessage.error('暂无权限') ElMessage.error('暂无权限')
return return
} }
if (hasrechargeWaitShow) {
if(hasrechargeWaitShow){
adminWait() adminWait()
} }
} else if (tab.props.name === 'pass') { } else if (tab.props.name === 'pass') {
if (!hasrechargeThrough) {
if(!hasrechargeThrough){
ElMessage.error('暂无权限') ElMessage.error('暂无权限')
return return
} }
adminPass() adminPass()
} else if (tab.props.name === 'reject') { } else if (tab.props.name === 'reject') {
if (!hasrechargeReject) {
if(!hasrechargeReject){
ElMessage.error('暂无权限') ElMessage.error('暂无权限')
return return
} }
@ -527,7 +525,7 @@ const handlePagination = (type, val) => {
const clicked = ref(false); const clicked = ref(false);
// //
const handleApprove = async (row) => { const handleApprove = async (row) => {
if (!hasrechargeWaitThough) {
if(!hasrechargeWaitThough){
ElMessage.error('暂无权限') ElMessage.error('暂无权限')
return return
} }
@ -552,7 +550,7 @@ const handleApprove = async (row) => {
} }
const showRejectDialog = (row) => { const showRejectDialog = (row) => {
if (!hasrechargeWaitReject) {
if(!hasrechargeWaitReject){
ElMessage.error('暂无权限') ElMessage.error('暂无权限')
return return
} }
@ -564,7 +562,7 @@ const showRejectDialog = (row) => {
const cancelClicked = ref(false) const cancelClicked = ref(false)
// //
const handleReject = async () => { const handleReject = async () => {
if (!hasrechargeWaitReject) {
if(!hasrechargeWaitReject){
ElMessage.error('暂无权限') ElMessage.error('暂无权限')
return return
} }
@ -702,11 +700,11 @@ const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
// //
onMounted(async function () { onMounted(async function () {
await initPermissions() await initPermissions()
if (hasrechargeWaitShow.value) {
if(hasrechargeWaitShow.value){
rechargeAudit.value.auditStatus = '0' rechargeAudit.value.auditStatus = '0'
} else if (hasrechargeThrough.value) {
}else if(hasrechargeThrough.value){
rechargeAudit.value.auditStatus = '1' rechargeAudit.value.auditStatus = '1'
} else if (hasrechargeReject) {
}else if(hasrechargeReject){
rechargeAudit.value.auditStatus = '2' rechargeAudit.value.auditStatus = '2'
} }
await getActivity() await getActivity()
@ -718,7 +716,6 @@ onMounted(async function () {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
//
.pagination { .pagination {
display: flex; display: flex;
margin-top: 0.5vh; margin-top: 0.5vh;
@ -738,7 +735,7 @@ onMounted(async function () {
background: #E7F4FD; background: #E7F4FD;
} }
//
//
.goldStatistics { .goldStatistics {
margin-left: 1vw; margin-left: 1vw;
margin-bottom: 1vh; margin-bottom: 1vh;
@ -750,18 +747,10 @@ onMounted(async function () {
line-height: 20px; line-height: 20px;
} }
/* 表头/表体 wrapper 与 table body 单元格 */
//
// :deep(.el-table__body),
// :deep(.el-table__header),
// :deep(.el-table__body tbody),
// :deep(.el-table__body tr),
// :deep(.el-table__row),
//
:deep(.el-table__header-wrapper), :deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper), :deep(.el-table__body-wrapper),
:deep(.el-table__cell), :deep(.el-table__cell),
/* 表格 */ /* 表格 */
:deep(.el-table__body td) { :deep(.el-table__body td) {
background-color: #F3FAFE !important; background-color: #F3FAFE !important;
@ -777,7 +766,6 @@ onMounted(async function () {
background-color: #E5EBFE !important; background-color: #E5EBFE !important;
} }
.select { .select {
display: flex; display: flex;

47
src/views/audit/gold/refundAudit.vue

@ -1,5 +1,5 @@
<template> <template>
<el-card style="margin-bottom: 0.5vh;">
<el-card class="card1" style="margin-bottom: 0.5vh;">
<el-col style="margin-bottom: 1vh"> <el-col style="margin-bottom: 1vh">
<div class="select"> <div class="select">
<div class="selectRow"> <div class="selectRow">
@ -49,14 +49,14 @@
</el-col> </el-col>
</el-card> </el-card>
<el-card >
<el-card class="card2">
<el-tabs v-model="activeName" type="card" @tab-click="handleClick"> <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait" v-if="hasrefundWait&&hasrefundWaitShow"></el-tab-pane> <el-tab-pane label="待审核" name="wait" v-if="hasrefundWait&&hasrefundWaitShow"></el-tab-pane>
<el-tab-pane label="已通过" name="pass" v-if="hasrefundThrough"></el-tab-pane> <el-tab-pane label="已通过" name="pass" v-if="hasrefundThrough"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject" v-if="hasrefundReject"></el-tab-pane> <el-tab-pane label="已驳回" name="reject" v-if="hasrefundReject"></el-tab-pane>
</el-tabs> </el-tabs>
<div>
<div class="goldStatistics">
退款总金币数{{ format3((stats.permanentGolds + stats.freeGolds + stats.taskGolds).toFixed(2)) 退款总金币数{{ format3((stats.permanentGolds + stats.freeGolds + stats.taskGolds).toFixed(2))
}}金币&nbsp;&nbsp;&nbsp;&nbsp; }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(stats.permanentGolds.toFixed(2)) }}金币&nbsp;&nbsp;&nbsp;&nbsp; 永久金币{{ format3(stats.permanentGolds.toFixed(2)) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
@ -639,6 +639,47 @@ onMounted(async () => {
display: flex; display: flex;
} }
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
.select { .select {
display: flex; display: flex;

53
src/views/consume/bean/articleVideo.vue

@ -463,7 +463,7 @@ const getTagText = (state) => {
</script> </script>
<template> <template>
<el-card style="margin-bottom: 1vh">
<el-card class="card1" style="margin-bottom: 1vh">
<el-col style="margin-bottom: 1vh; "> <el-col style="margin-bottom: 1vh; ">
<div style="display:flex"> <div style="display:flex">
<div style="width: 13vw; display:flex; align-items:center; justify-content: center;"> <div style="width: 13vw; display:flex; align-items:center; justify-content: center;">
@ -494,7 +494,7 @@ const getTagText = (state) => {
</div> </div>
<div style="width: 12vw; display:flex; align-items:center; justify-content: center;"> <div style="width: 12vw; display:flex; align-items:center; justify-content: center;">
<el-text>作者</el-text> <el-text>作者</el-text>
<el-input v-model="beanConsumeArticle.author"style="width:8vw; margin-left: 0.5vw;" placeholder="请输入作者" clearable />
<el-input v-model="beanConsumeArticle.author" style="width:8vw; margin-left: 0.5vw;" placeholder="请输入作者" clearable />
</div> </div>
</div> </div>
</el-col> </el-col>
@ -516,8 +516,8 @@ const getTagText = (state) => {
</div> </div>
</el-col> </el-col>
</el-card> </el-card>
<el-card>
<div>
<el-card class="card2">
<div class="goldStatistics">
金豆总数{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp; 金豆总数{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp; 付费金豆数{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ format3(Math.abs(freeBean)) }} 免费金豆数{{ format3(Math.abs(freeBean)) }}
@ -600,7 +600,50 @@ const getTagText = (state) => {
</el-dialog> </el-dialog>
</template> </template>
<style scoped>
<style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
.pagination { .pagination {
display: flex; display: flex;
margin-top: 20px; margin-top: 20px;

51
src/views/consume/bean/dieHardFan.vue

@ -468,7 +468,7 @@ const getTagText = (state) => {
</script> </script>
<template> <template>
<el-card style="margin-bottom: 1vh;">
<el-card class="card1" style="margin-bottom: 1vh;">
<el-col style="margin-bottom: 10px"> <el-col style="margin-bottom: 10px">
<el-text>精网号</el-text> <el-text>精网号</el-text>
<el-input v-model="beanConsumeFan.jwcode" placeholder="请输入精网号" style="width: 200px;margin-right: 20px" <el-input v-model="beanConsumeFan.jwcode" placeholder="请输入精网号" style="width: 200px;margin-right: 20px"
@ -499,8 +499,8 @@ const getTagText = (state) => {
<el-button type="primary" @click="openExportList">查看导出列表</el-button> <el-button type="primary" @click="openExportList">查看导出列表</el-button>
</el-col> </el-col>
</el-card> </el-card>
<el-card>
<div>
<el-card class="card2">
<div class="goldStatistics">
金豆总数{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp; 金豆总数{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp; 付费金豆数{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ format3(Math.abs(freeBean)) }} 免费金豆数{{ format3(Math.abs(freeBean)) }}
@ -573,7 +573,50 @@ const getTagText = (state) => {
</el-dialog> </el-dialog>
</template> </template>
<style scoped>
<style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
.pagination { .pagination {
display: flex; display: flex;
margin-top: 20px; margin-top: 20px;

51
src/views/consume/bean/liveStream.vue

@ -502,7 +502,7 @@ const getTagText = (state) => {
</script> </script>
<template> <template>
<el-card style="margin-bottom: 1vh;">
<el-card class="card1" style="margin-bottom: 1vh;">
<div style="margin-bottom: 1vh;display: flex;"> <div style="margin-bottom: 1vh;display: flex;">
<div style="width: 18vw;margin-right: 1vw;display: flex;align-items: center;"> <div style="width: 18vw;margin-right: 1vw;display: flex;align-items: center;">
<el-text>精网号</el-text> <el-text>精网号</el-text>
@ -550,8 +550,8 @@ const getTagText = (state) => {
<el-button type="primary" @click="openExportList">查看导出列表</el-button> <el-button type="primary" @click="openExportList">查看导出列表</el-button>
</div> </div>
</el-card> </el-card>
<el-card>
<div>
<el-card class="card2">
<div class="goldStatistics">
金豆总数{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp; 金豆总数{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp; 付费金豆数{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ format3(Math.abs(freeBean)) }} 免费金豆数{{ format3(Math.abs(freeBean)) }}
@ -623,7 +623,50 @@ const getTagText = (state) => {
</el-dialog> </el-dialog>
</template> </template>
<style scoped>
<style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
.pagination { .pagination {
display: flex; display: flex;
margin-top: 20px; margin-top: 20px;

52
src/views/consume/gold/coinConsumeDetail.vue

@ -562,7 +562,7 @@ const getMarket = async function () {
</script> </script>
<template> <template>
<el-card style="margin-bottom: 0.5vh;">
<el-card class="card1" style="margin-bottom: 0.5vh;">
<div style="width:82vw;margin-bottom: 1vh;"> <div style="width:82vw;margin-bottom: 1vh;">
<el-text>精网号</el-text> <el-text>精网号</el-text>
<el-input v-model="consumeUser.jwcode" placeholder="请输入精网号" style="width: 10vw;margin-right: 1vw;" clearable /> <el-input v-model="consumeUser.jwcode" placeholder="请输入精网号" style="width: 10vw;margin-right: 1vw;" clearable />
@ -605,8 +605,8 @@ const getMarket = async function () {
<el-button type="primary" @click="openExportList">查看导出列表</el-button> <el-button type="primary" @click="openExportList">查看导出列表</el-button>
</div> </div>
</el-card> </el-card>
<el-card>
<div>
<el-card class="card2">
<div class="goldStatistics">
消耗新币{{ format3(Math.abs(permanentGolds)) }}新币&nbsp;&nbsp;&nbsp;&nbsp; 消耗新币{{ format3(Math.abs(permanentGolds)) }}新币&nbsp;&nbsp;&nbsp;&nbsp;
总金币数{{ format3(Math.abs(permanentGolds + freeGolds + taskGolds)) }}&nbsp;&nbsp;&nbsp;&nbsp; 总金币数{{ format3(Math.abs(permanentGolds + freeGolds + taskGolds)) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(Math.abs(permanentGolds)) }}&nbsp;&nbsp;&nbsp;&nbsp; 永久金币{{ format3(Math.abs(permanentGolds)) }}&nbsp;&nbsp;&nbsp;&nbsp;
@ -713,7 +713,7 @@ const getMarket = async function () {
</el-dialog> </el-dialog>
</template> </template>
<style scoped>
<style scoped lang="scss">
.status { .status {
display: flex; display: flex;
} }
@ -734,4 +734,48 @@ const getMarket = async function () {
display: flex; display: flex;
margin-top: 1vh; margin-top: 1vh;
} }
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
</style> </style>

694
src/views/moneyManage/receiveDetail/receiveDetail.vue

@ -1,40 +1,40 @@
<template> <template>
<div class="content"> <div class="content">
<div class="card1">
<el-card style="margin-bottom: 0.5vh; min-height: 110px;">
<div class="div-card1">
<el-card class="card1" style="margin-bottom: 0.5vh; min-height: 110px;">
<div class="row"> <div class="row">
<div class="rowItem"> <div class="rowItem">
<el-text style="width: 4vw;">精网号</el-text> <el-text style="width: 4vw;">精网号</el-text>
<el-input placeholder="请输入精网号" style="width:10vw;" clearable></el-input> <el-input placeholder="请输入精网号" style="width:10vw;" clearable></el-input>
</div> </div>
<div class="rowItem"> <div class="rowItem">
<text style="width: 4vw;">客户姓名</text>
<el-text style="width: 4vw;">客户姓名</el-text>
<el-input placeholder="请输入客户姓名" style="width:10vw;" clearable></el-input> <el-input placeholder="请输入客户姓名" style="width:10vw;" clearable></el-input>
</div> </div>
<div class="rowItem"> <div class="rowItem">
<text style="width: 4vw;">所属地区</text>
<el-text style="width: 4vw;">所属地区</el-text>
<el-select placeholder="请选择所属地区" style="width:10vw;" clearable></el-select> <el-select placeholder="请选择所属地区" style="width:10vw;" clearable></el-select>
</div> </div>
<div class="rowItem"> <div class="rowItem">
<text style="width: 4vw;">订单状态</text>
<el-text style="width: 4vw;">订单状态</el-text>
<el-select placeholder="请选择订单状态" style="width: 10vw;" clearable></el-select> <el-select placeholder="请选择订单状态" style="width: 10vw;" clearable></el-select>
</div> </div>
<div class="rowItem"> <div class="rowItem">
<text style="width: 4vw;">支付方式</text>
<el-text style="width: 4vw;">支付方式</el-text>
<el-select placeholder="请选择支付方式" style="width: 10vw;" clearable></el-select> <el-select placeholder="请选择支付方式" style="width: 10vw;" clearable></el-select>
</div> </div>
</div> </div>
<div class="row" style="margin-top: 10px;"> <div class="row" style="margin-top: 10px;">
<div class="rowItem"> <div class="rowItem">
<text style="width: 4vw;">活动名称</text>
<el-text style="width: 4vw;">活动名称</el-text>
<el-select placeholdert="请选择活动方式" style="width: 10vw;" clearable></el-select> <el-select placeholdert="请选择活动方式" style="width: 10vw;" clearable></el-select>
</div> </div>
<div class="rowItem"> <div class="rowItem">
<text style="width: 4vw;">产品名称</text>
<el-text style="width: 4vw;">产品名称</el-text>
<el-select placeholder="请选择产品名称" style="width: 10vw;" clearable></el-select> <el-select placeholder="请选择产品名称" style="width: 10vw;" clearable></el-select>
</div> </div>
<div class="rowItem" style="width: 30vw"> <div class="rowItem" style="width: 30vw">
<text style="width: 4vw; margin-left: 0.5vw;">付款时间</text>
<el-text style="width: 4vw; margin-left: 0.5vw;">付款时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" <el-date-picker v-model="getTime" type="datetimerange" range-separator=""
start-placeholder="起始时间" end-placeholder="结束时间" style="width: 22vw; " start-placeholder="起始时间" end-placeholder="结束时间" style="width: 22vw; "
@change="handleDatePickerChange" :default-time="defaultTime" @change="handleDatePickerChange" :default-time="defaultTime"
@ -47,16 +47,18 @@
<el-button type="success">重置</el-button> <el-button type="success">重置</el-button>
<el-button type="primary">导出excel</el-button> <el-button type="primary">导出excel</el-button>
<el-button type="primary" style="background-color: #5870FF;">导出列表</el-button> <el-button type="primary" style="background-color: #5870FF;">导出列表</el-button>
<el-button type="primary" @click="checkKefu">切换客服</el-button>
<el-button type="success" @click="checkCaiwu">切换财务</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
</div> </div>
<div class="card2">
<el-card>
<div class="div-card2">
<el-card class="card2">
<div class="btns"> <div class="btns">
<div class="tabs">
<div class="tabs" v-if="caiwu">
<el-button-group> <el-button-group>
<el-button class="btnItem" <el-button class="btnItem"
:style="{ backgroundColor: activeTab === 'wait' ? '#2741DE' : '#E5EBFE', color: activeTab === 'wait' ? 'white' : '#666' }" :style="{ backgroundColor: activeTab === 'wait' ? '#2741DE' : '#E5EBFE', color: activeTab === 'wait' ? 'white' : '#666' }"
@ -76,7 +78,7 @@
</el-button-group> </el-button-group>
</div> </div>
<div class="btnAdd"> <div class="btnAdd">
<el-button @click="openAddForm" type="success">添加收款</el-button>
<el-button @click="openAddForm" type="success" v-if="kefu">添加收款</el-button>
</div> </div>
</div> </div>
@ -98,9 +100,24 @@
</el-table-column> </el-table-column>
<el-table-column prop="permanentGold" label="付款金额" width="120px"> <el-table-column prop="permanentGold" label="付款金额" width="120px">
</el-table-column> </el-table-column>
<el-table-column prop="freeGold" label="支付方式" width="110px">
<el-table-column prop="moneyType" label="到账币种" v-if="caiwu && activeTab == 'pass'" width="150px" ></el-table-column>
<el-table-column prop="getMoney" label="到账金额" v-if="caiwu && activeTab == 'pass'" width="150px" >
<template #default="scope">
<div v-if="!scope.row.getMoney">
<text style="color: #FA5A1E;">待补充</text>
</div>
</template>
</el-table-column>
<el-table-column prop="shouxufei" label="手续费" v-if="caiwu && activeTab == 'pass'" width="150px" >
<template #default="scope">
<div v-if="!scope.row.shouxufei">
<text style="color: #FA5A1E;">待补充</text>
</div>
</template>
</el-table-column> </el-table-column>
<el-table-column prop="remark" label="付款时间" width="200px" />
<el-table-column prop="pastType" label="支付方式" width="110px">
</el-table-column>
<el-table-column prop="remark" label="付款时间" width="100px" />
<el-table-column prop="payModel" label="转账凭证" width="110px"> <el-table-column prop="payModel" label="转账凭证" width="110px">
<template #default="scope"> <template #default="scope">
<div v-if="scope.row.voucher" <div v-if="scope.row.voucher"
@ -114,10 +131,26 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="" label="备注" width="150px" show-overflow-tooltip>
<el-table-column prop="bankOrder" label="银行流水订单号" v-if="caiwu && activeTab == 'pass'" width="150px" show-overflow-tooltip></el-table-column>
<el-table-column prop="submiter" label="提交人" width="150px" show-overflow-tooltip></el-table-column>
<el-table-column prop="auditor" label="审核人" v-if="caiwu && activeTab == 'pass'" width="150px" show-overflow-tooltip></el-table-column>
<el-table-column prop="mask" label="备注" width="150px" show-overflow-tooltip></el-table-column>
<el-table-column prop="getMoneyTime" label="到账时间" v-if="caiwu && activeTab == 'pass'" width="150px" show-overflow-tooltip>
</el-table-column>
<el-table-column v-if="kefu" fixed="right" prop="orderStatus" label="订单状态" width="100px" />
<el-table-column fixed="right" label="操作" width="100px" v-if="activeTab != 'reject'">
<template #default=scope>
<span v-if="kefu && scope.row.orderStatus == '已通过'" style="color: #FA5A1E;">退款</span>
<span v-else-if="kefu && scope.row.orderStatus == '已撤回'"
style="color: #2741DE;">编辑</span>
<span v-else-if="kefu && scope.row.orderStatus == '待审核'"
style="color: #FA5A1E;">撤回</span>
<span v-else-if="activeTab == 'wait' && !kefu" style="color: #2741DE;"
@click="openAuditForm">审核</span>
<span v-else-if="activeTab == 'pass' && !kefu" style="color: #2741DE;"
@click="openEditForm(scope.row)">编辑</span>
</template>
</el-table-column> </el-table-column>
<el-table-column fixed="right" prop="adminName" label="订单状态" width="100px" />
<el-table-column fixed="right" prop="rejectReason" label="操作" width="100px" />
</el-table> </el-table>
</div> </div>
<div class="pagination"> <div class="pagination">
@ -168,8 +201,8 @@
</el-icon> </el-icon>
</el-upload> </el-upload>
</el-form-item> </el-form-item>
<el-form-item label="驳回理由" required>
<el-input v-model="addFormData.mask" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
<el-form-item label="备注" required>
<el-input v-model="addFormData.mask" type="textarea" :rows="4" placeholder="请输入备注" maxlength="100"
show-word-limit /> show-word-limit />
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -181,12 +214,173 @@
</span> </span>
</template> </template>
</el-dialog> </el-dialog>
<!-- 审核弹窗 -->
<el-dialog class="adddialog" v-model="auditFormisible" width="20vw" :before-close="closeAuditForm">
<el-form class="addForm" label-width="4vw" label-position="left">
<el-form-item label="精网号">
<el-input v-model="auditFormData.jwcode" placeholder="请输入驳回理由" />
</el-form-item>
<el-form-item label="客户姓名">
<el-input v-model="auditFormData.userName" placeholder="请输入客户姓名" />
</el-form-item>
<el-form-item label="所属地区">
<el-input disabled="true" v-model="auditFormData.market" />
</el-form-item>
<el-form-item label="活动名称">
<el-input v-model="auditFormData.jwcode" placeholder="请输入活动名称" />
</el-form-item>
<el-form-item label="产品名称">
<el-select placeholder="请选择产品名称" clearable></el-select>
</el-form-item>
<el-form-item label="付款币种">
<el-select placeholder="请选择付款币种" clearable></el-select>
</el-form-item>
<el-form-item label="付款金额">
<el-input v-model="auditFormData.jwcode" placeholder="请输入付款金额" />
</el-form-item>
<el-form-item label="支付方式">
<el-select placeholder="请选择支付方式" clearable></el-select>
</el-form-item>
<el-form-item label="付款时间">
<el-time-picker v-model="auditFormData.time" placeholder="请选择付款时间" />
</el-form-item>
<el-form-item label="转账凭证">
<div class="pic">
<el-upload ref="uploadRef" class="uploader" :show-file-list="false" list-type="picture-card"
:auto-upload="false" :before-upload="beforeUpload" :on-error="handelImgErr"
:on-change="handleImageChange" :http-request="customUpload">
<img v-if="auditFormData.imageUrl" :src="auditFormData.imageUrl" class="avatar"
style="height: 100%; width: 100%; object-fit: cover;" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
<el-text class="picText">
仅支持.jpg .png格式文件 1 MB
</el-text>
</div>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="auditFormData.mask" type="textarea" :rows="3" placeholder="请输入备注" maxlength="100"
show-word-limit />
</el-form-item>
<el-form-item label="驳回理由" v-if="ifReject" required>
<el-input v-model="auditFormData.mask" type="textarea" :rows="3" placeholder="请输入驳回理由"
maxlength="100" show-word-limit />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer" v-if="!ifReject">
<el-button style="background-color: #7E91FF;" @click="ifReject = true">驳回</el-button>
<el-button :style="{
backgroundColor: isBtnDisabled ? '#E5E5E5FF' : '#2741DEFF',
marginLeft: '60px',
color: isBtnDisabled ? '#8A8A8A' : '#F3FAFE'
}" @click="handleReject" :disabled="isBtnDisabled">{{ btnText }}</el-button>
</span>
<span class="dialog-footer" v-if="ifReject">
<el-button style="background-color: #7E91FF;" @click="closeAuditForm">取消</el-button>
<el-button style="background-color: #2741DE; margin-left: 2.5vw;" type="primary"
@click="handleReject">确定</el-button>
</span>
</template>
</el-dialog>
<!-- 编辑弹窗 -->
<el-dialog class="editdialog" v-model="editFormisible" width="20vw" :before-close="closeEditForm">
<div class="content">
<div class="left">
<el-form class="editForm" label-width="4.5vw" label-position="left">
<el-form-item label="精网号">
<el-input v-model="editFormData.jwcode" placeholder="请输入驳回理由" />
</el-form-item>
<el-form-item label="客户姓名">
<el-input v-model="editFormData.userName" placeholder="请输入客户姓名" />
</el-form-item>
<el-form-item label="所属地区">
<el-input disabled="true" v-model="editFormData.market" placeholder="请输入所属地区" />
</el-form-item>
<el-form-item label="活动名称">
<el-input v-model="editFormData.jwcode" placeholder="请输入活动名称" />
</el-form-item>
<el-form-item label="产品名称">
<el-select placeholder="请选择产品名称" clearable></el-select>
</el-form-item>
<el-form-item label="付款币种">
<el-select placeholder="请选择付款币种" clearable></el-select>
</el-form-item>
<el-form-item label="付款金额">
<el-input v-model="editFormData.jwcode" placeholder="请输入付款金额" />
</el-form-item>
<el-form-item label="支付方式">
<el-select placeholder="请选择支付方式" clearable></el-select>
</el-form-item>
<el-form-item label="付款时间">
<el-time-picker v-model="editFormData.time" placeholder="请选择付款时间" />
</el-form-item>
<el-form-item label="转账凭证">
<div class="pic">
<el-upload ref="uploadRef" class="uploader" :show-file-list="false"
list-type="picture-card" :auto-upload="false" :before-upload="beforeUpload"
:on-error="handelImgErr" :on-change="handleImageChange"
:http-request="customUpload">
<img v-if="editFormData.imageUrl" :src="editFormData.imageUrl" class="avatar"
style="height: 100%; width: 100%; object-fit: cover;" />
<el-icon v-else class="avatar-uploader-icon">
<Plus />
</el-icon>
</el-upload>
<el-text class="picText">
仅支持.jpg .png格式文件 1 MB
</el-text>
</div>
</el-form-item>
<el-form-item label="驳回理由">
<el-input v-model="addFormData.mask" type="textarea" :rows="4" placeholder="请输入驳回理由"
maxlength="100" show-word-limit />
</el-form-item>
</el-form>
</div>
<div class="right">
<el-form class="editFormRighrt" label-width="4.5vw" label-position="left">
<el-form-item label="到账货币">
<el-select placeholder="请选择产品名称" clearable></el-select>
</el-form-item>
<el-form-item label="到账金额">
<el-input v-model="addFormData.userName" placeholder="请输入到账金额" />
</el-form-item>
<el-form-item label="手续费">
<el-input disabled="true" v-model="addFormData.market" placeholder="请输入手续费" />
</el-form-item>
<el-form-item label="银行流水订单号">
<el-input v-model="addFormData.jwcode" placeholder="请输入银行流水订单号" />
</el-form-item>
<el-form-item label="到账时间">
<el-input v-model="addFormData.jwcode" placeholder="请输入到账时间" />
</el-form-item>
</el-form>
<span class="editBtns">
<button class="editBtn1">
<text class="txt">
取消
</text>
</button>
<button class="editBtn2">
<text class="txt">
提交
</text>
</button>
</span>
</div>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref } from 'vue';
import { ref, watch } from 'vue';
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import API from '@/util/http.js' import API from '@/util/http.js'
import { color } from 'echarts';
import { template } from 'lodash';
//==================== ========================= //==================== =========================
const activeTab = ref('wait') const activeTab = ref('wait')
@ -201,11 +395,24 @@ const navigateTo = (tab) => {
activeTab.value = 'reject' activeTab.value = 'reject'
} }
} }
const kefu = ref(true)
const caiwu = ref(true)
const checkKefu = () => {
kefu.value = true
caiwu.value = false
}
const checkCaiwu = () => {
kefu.value = false
caiwu.value = true
}
//================= ================== //================= ==================
const addFormData = ref({ const addFormData = ref({
}) })
const addFormisible = ref(false) const addFormisible = ref(false)
const uploadRef = ref() const uploadRef = ref()
const openAddForm = () => { const openAddForm = () => {
addFormisible.value = true addFormisible.value = true
@ -258,7 +465,7 @@ const customUpload = async (options) => {
'Content-Type': 'multipart/form-data' 'Content-Type': 'multipart/form-data'
} }
}) })
if (response.code === 200 && response.data) {
if (response.code === 100 && response.data) {
handleImgSuccess(response, options.file) handleImgSuccess(response, options.file)
ElMessage.success(response.msg || '上传成功') ElMessage.success(response.msg || '上传成功')
} else { } else {
@ -270,6 +477,60 @@ const customUpload = async (options) => {
ElMessage.error(`上传失败: ${error.msg || error.message || '网络异常'}`) ElMessage.error(`上传失败: ${error.msg || error.message || '网络异常'}`)
} }
} }
//================== =========================
const editFormData = ref({
})
const editFormisible = ref(false)
const openEditForm = (row) => {
console.log('编辑时该行数据:',row);
editFormData.value = row
editFormisible.value = true
}
const closeEditForm = () => {
editFormisible.value = false
editFormData.value = {}
}
//================== =========================
const auditFormData = ref({
})
const auditFormisible = ref(false)
//
const ifReject = ref(false)
const openAuditForm = () => {
auditFormisible.value = true
}
const countdown = ref(0); // 5
const isBtnDisabled = ref(false); //
const btnText = ref('通过(3)'); //
const closeAuditForm = () => {
ifReject.value = false
auditFormisible.value = false
auditFormData.value = {}
}
//
watch(auditFormisible, (val) => {
if (val) {
countdown.value = 3
isBtnDisabled.value = true
btnText.value = `通过(${countdown.value})`
const timer = setInterval(() => {
countdown.value--
btnText.value = `通过(${countdown.value})`
console.log(btnText.value);
if (countdown.value <= 0) {
isBtnDisabled.value = false
clearInterval(timer)
btnText.value = '通过'
}
}, 1000);
}
})
//========================================== //==========================================
const pageInfo = ref({ const pageInfo = ref({
pageSize: 10, pageSize: 10,
@ -280,83 +541,125 @@ const pageInfo = ref({
const total = ref(0) const total = ref(0)
const tableData = [ const tableData = [
{ {
jwcode: 'HW2023001',
name: '张三',
market: '北京',
activity: '春季促销活动',
rateName: '黄金投资产品A',
money: '人民币',
permanentGold: '5000.00',
freeGold: '银行转账',
remark: '2023-03-15 10:30:00',
voucher: 'https://example.com/images/voucher1.jpg',
adminName: '已支付',
rejectReason: '无',
"jwcode": "HM2024001",
"name": "张三",
"market": "华东区",
"activity": "2024春季促销活动",
"rateName": "年度会员套餐A",
"money": "人民币",
"permanentGold": 2980.00,
"moneyType": "人民币",
"getMoney": 2980.00,
"shouxufei": 59.60,
"pastType": "支付宝转账",
"remark": "2024-05-10 09:23",
"voucher": "https://example.com/voucher/1.jpg",
"payModel": "https://example.com/icon/alipay.png",
"bankOrder": "ALIPAY2024051000001",
"submiter": "李四(运营部)",
"auditor": "王五(财务部)",
"mask": "客户主动购买,无特殊备注",
"getMoneyTime": "2024-05-10 10:05",
"orderStatus": "已通过"
}, },
{ {
jwcode: 'HW2023002',
name: '李四',
market: '上海',
activity: '夏日特惠活动',
rateName: '白银理财产品B',
money: '人民币',
permanentGold: '3000.00',
freeGold: '支付宝',
remark: '2023-06-20 14:15:00',
voucher: 'https://example.com/images/voucher2.jpg',
adminName: '已支付',
rejectReason: '无',
"jwcode": "HM2024002",
"name": "李四",
"market": "华北区",
"activity": "新客首单优惠",
"rateName": "季度体验套餐B",
"money": "美元",
"permanentGold": 99.00,
"moneyType": "人民币",
"getMoney": 712.00,
"shouxufei": 14.24,
"pastType": "PayPal",
"remark": "2024-05-11 14:56",
"voucher": "https://example.com/voucher/2.jpg",
"payModel": "https://example.com/icon/paypal.png",
"bankOrder": "PAYPAL2024051100002",
"submiter": "赵六(国际部)",
"auditor": "孙七(财务部)",
"mask": "跨境支付,汇率按当日中间价计算",
"getMoneyTime": "2024-05-12 08:30",
"orderStatus": "待审核"
}, },
{ {
jwcode: 'HW2023003',
name: '王五',
market: '广州',
activity: '秋季回馈活动',
rateName: '铂金收藏产品C',
money: '美元',
permanentGold: '1000.00',
freeGold: '微信支付',
remark: '2023-09-10 09:20:00',
voucher: '',
adminName: '待支付',
rejectReason: '无',
"jwcode": "HM2024003",
"name": "王五",
"market": "华南区",
"activity": "老客召回活动",
"rateName": "月度续费套餐C",
"money": "人民币",
"permanentGold": 399.00,
"moneyType": "人民币",
"getMoney": null,
"shouxufei": null,
"pastType": "微信支付",
"remark": "2024-05-12 11:18",
"voucher": "https://example.com/voucher/3.jpg",
"payModel": "https://example.com/icon/wechat.png",
"bankOrder": "WECHAT2024051200003",
"submiter": "钱八(客服部)",
"auditor": null,
"mask": "到账信息待财务补充",
"getMoneyTime": null,
"orderStatus": "已撤回"
}, },
{ {
jwcode: 'HW2023004',
name: '赵六',
market: '深圳',
activity: '冬季感恩活动',
rateName: '钻石尊享产品D',
money: '欧元',
permanentGold: '2000.00',
freeGold: '信用卡',
remark: '2023-12-05 16:40:00',
voucher: 'https://example.com/images/voucher4.jpg',
adminName: '已支付',
rejectReason: '无',
"jwcode": "HM2024004",
"name": "赵六",
"market": "西区",
"activity": "企业团购活动",
"rateName": "企业定制套餐D",
"money": "人民币",
"permanentGold": 15800.00,
"moneyType": "人民币",
"getMoney": 15800.00,
"shouxufei": 316.00,
"pastType": "银行对公转账",
"remark": "2024-05-13 09:45",
"voucher": "https://example.com/voucher/4.jpg",
"payModel": "https://example.com/icon/bank.png",
"bankOrder": "BANK2024051300004",
"submiter": "周九(销售部)",
"auditor": "吴十(财务部)",
"mask": "10人企业团单,享受95折优惠",
"getMoneyTime": "2024-05-13 11:20",
"orderStatus": "已通过"
}, },
{ {
jwcode: 'HW2023005',
name: '孙七',
market: '成都',
activity: '周年庆典活动',
rateName: '翡翠投资产品E',
money: '人民币',
permanentGold: '8000.00',
freeGold: '银行转账',
remark: '2024-01-20 11:10:00',
voucher: '',
adminName: '已驳回',
rejectReason: '支付金额有误',
}
];
"jwcode": "HM2024005",
"name": "孙七",
"market": "东北区",
"activity": "节日特惠活动",
"rateName": "年度会员套餐A",
"money": "人民币",
"permanentGold": 2780.00,
"moneyType": "人民币",
"getMoney": 2780.00,
"shouxufei": 55.60,
"pastType": "银联支付",
"remark": "2024-05-14 15:30",
"voucher": null,
"payModel": null,
"bankOrder": "UNIONPAY2024051400005",
"submiter": "郑一(市场部)",
"auditor": "王二(财务部)",
"mask": "凭证暂未上传,已提醒客户补充",
"getMoneyTime": "2024-05-14 16:45",
"orderStatus": "待审核"
}
]
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.content {
.content { //
height: 100%; height: 100%;
width: 83vw; width: 83vw;
.card1 {
.div-card1 { //
width: 100%; width: 100%;
.row { .row {
@ -383,26 +686,29 @@ const tableData = [
} }
.card2 {
.div-card2 { // card
width: 100%; width: 100%;
margin-top: 2vh; margin-top: 2vh;
.btns {
.btns { //
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
.tabs{
padding-bottom: 10px;
.tabs {
min-width: 300px; min-width: 300px;
.btnItem { .btnItem {
margin-left: 10px; margin-left: 10px;
border-radius: 5px; border-radius: 5px;
} }
} }
.btnAdd { .btnAdd {
flex: 1;
justify-content: flex-end;
margin-right: 1vw;
margin-right: 5vw;
padding-left: 10px;
} }
} }
@ -419,18 +725,47 @@ const tableData = [
} }
} }
:deep(.adddialog) {
min-width: 450px;
:deep(.adddialog) { //
min-width: 500px;
background-color: #F3FAFE !important; background-color: #F3FAFE !important;
margin-top: 8vh;
border-radius: 8px;
.addForm { .addForm {
padding: 0 3vw 1vh 1vw;
padding: 0 60px 1vh 60px;
.el-date-editor { .el-date-editor {
display: flex; display: flex;
flex: 1; flex: 1;
} }
.pic {
display: flex;
align-items: center;
.uploader {
height: 80px;
width: 80px;
.el-upload {
height: 100%;
width: 100%;
}
}
.picText {
color: #999999;
font-family: "PingFang SC";
font-size: 10px;
font-style: normal;
font-weight: 400;
line-height: 20px;
margin-left: 10px;
}
}
} }
.dialog-footer { .dialog-footer {
@ -440,11 +775,178 @@ const tableData = [
} }
} }
:deep(.adddialog .el-form-item__label) {
:deep(.editdialog) { //
min-width: 990px;
background-color: #F3FAFE !important;
margin-top: 8vh;
border-radius: 8px;
.editForm {
padding: 0 60px 1vh 60px;
.el-date-editor {
display: flex;
flex: 1;
}
.pic {
display: flex;
align-items: center;
.uploader {
height: 80px;
width: 80px;
.el-upload {
height: 100%;
width: 100%;
}
}
.picText {
color: #999999;
font-family: "PingFang SC";
font-size: 10px;
font-style: normal;
font-weight: 400;
line-height: 20px;
margin-left: 10px;
}
}
}
.content { //
display: flex;
height: 100%;
width: 100%;
.left {
min-width: 500px;
}
.right {
flex: 1;
.editFormRighrt {
padding: 0 60px 0 40px;
.el-date-editor {
display: flex;
flex: 1;
}
.pic {
display: flex;
align-items: center;
.uploader {
height: 80px;
width: 80px;
.el-upload {
height: 100%;
width: 100%;
}
}
.picText {
color: #999999;
font-family: "PingFang SC";
font-size: 10px;
font-style: normal;
font-weight: 400;
line-height: 20px;
margin-left: 10px;
}
}
}
.editBtns {
display: flex;
justify-content: center;
margin-top: 60px;
.txt {
color: #f3fafe;
text-align: center;
font-family: "PingFang SC";
font-size: 14px;
font-style: normal;
font-weight: 700;
line-height: 22px;
}
.editBtn1 {
min-width: 80px;
padding: 5px 12px;
justify-content: center;
align-items: center;
gap: 4px;
border-radius: 4px;
background: #7E91FF;
border: none;
box-shadow: 0 0 4px 0 #00000040;
}
.editBtn2 {
display: flex;
width: 80px;
min-width: 80px;
padding: 5px 12px;
justify-content: center;
align-items: center;
gap: 4px;
border-radius: 4px;
background: #2741DE;
border: none;
box-shadow: 0 0 4px 0 #00000040;
margin-left: 60px;
}
}
}
}
}
:deep(.adddialog .el-form-item__label) { //
min-width: 80px; min-width: 80px;
width: auto; width: auto;
font-weight: 800; font-weight: 800;
padding-bottom: 15px; padding-bottom: 15px;
} }
} }
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
</style> </style>

39
src/views/permissions/rolePermission.vue

@ -586,7 +586,7 @@ onMounted(async function () {
</script> </script>
<template> <template>
<div> <div>
<el-card style="margin-bottom: 1vh;">
<el-card class="card1" style="margin-bottom: 1vh;">
<div style="display: flex;"> <div style="display: flex;">
<el-text size="large">角色名称</el-text> <el-text size="large">角色名称</el-text>
<el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable /> <el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable />
@ -597,7 +597,7 @@ onMounted(async function () {
</div> </div>
</el-card> </el-card>
<el-card>
<el-card class="card2">
<div class="add-item"> <div class="add-item">
<el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()" :disabled="!canAdd" v-if="canAdd">新增角色</el-button> <el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()" :disabled="!canAdd" v-if="canAdd">新增角色</el-button>
</div> </div>
@ -739,7 +739,40 @@ onMounted(async function () {
</el-dialog> </el-dialog>
</template> </template>
<style scoped>
<style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
.head-card { .head-card {
display: flex; display: flex;
} }

37
src/views/permissions/userPermission.vue

@ -910,7 +910,7 @@ onMounted(async function () {
<template> <template>
<div> <div>
<el-card style="margin-bottom: 1vh;">
<el-card class="card1" style="margin-bottom: 1vh;">
<div class="head-card"> <div class="head-card">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">OA号</el-text> <el-text class="mx-1" size="large">OA号</el-text>
@ -935,7 +935,7 @@ onMounted(async function () {
</div> </div>
</div> </div>
</el-card> </el-card>
<el-card>
<el-card class="card2">
<!-- 展示表单 --> <!-- 展示表单 -->
<div class="add-item"> <div class="add-item">
<el-button style="color: #048efb; border: 1px solid #048efb" :disabled="!canAdd" v-if="canAdd" @click="userAddInit()">新增用户</el-button> <el-button style="color: #048efb; border: 1px solid #048efb" :disabled="!canAdd" v-if="canAdd" @click="userAddInit()">新增用户</el-button>
@ -1168,7 +1168,38 @@ onMounted(async function () {
</el-dialog> </el-dialog>
</template> </template>
<style scoped>
<style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
.pagination { .pagination {
display: flex; display: flex;
} }

2
src/views/recharge/bean/addBeanRecharge.vue

@ -247,7 +247,7 @@ const handleAddForm = async () => {
</div> </div>
</div> </div>
</template> </template>
<style scoped>
<style scoped lang="scss">
.userAndform { .userAndform {
width: 80vw; width: 80vw;
height: 80vh; height: 80vh;

52
src/views/recharge/bean/beanOnlineRecharge.vue

@ -349,7 +349,7 @@ onMounted(async function () {
}) })
</script> </script>
<template> <template>
<el-card style="margin-bottom: 0.5vh;">
<el-card class="card1" style="margin-bottom: 0.5vh;">
<div> <div>
<el-text size="large">精网号</el-text> <el-text size="large">精网号</el-text>
<el-input v-model="selectData.jwcode" placeholder="请输入精网号" style="width: 10vw;margin-right: 1vw;" clearable /> <el-input v-model="selectData.jwcode" placeholder="请输入精网号" style="width: 10vw;margin-right: 1vw;" clearable />
@ -385,8 +385,8 @@ onMounted(async function () {
<el-button type="primary" @click="openExportList">查看导出列表</el-button> <el-button type="primary" @click="openExportList">查看导出列表</el-button>
</div> </div>
</el-card> </el-card>
<el-card>
<div>
<el-card class="card2">
<div class="goldStatistics">
充值金豆数{{ format3(num) }}&nbsp;&nbsp;&nbsp;&nbsp;合计新币数{{ format3(money) }} 充值金豆数{{ format3(num) }}&nbsp;&nbsp;&nbsp;&nbsp;合计新币数{{ format3(money) }}
</div> </div>
<!-- 设置表格容器的高度和滚动样式 --> <!-- 设置表格容器的高度和滚动样式 -->
@ -459,4 +459,48 @@ onMounted(async function () {
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<style scoped></style>
<style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
</style>

54
src/views/recharge/bean/beanSystemRecharge.vue

@ -335,7 +335,7 @@ onMounted(async function () {
}) })
</script> </script>
<template> <template>
<el-card class="condition">
<el-card class="card1" style="margin-bottom: 0.5vh">
<div> <div>
<el-text size="large">精网号</el-text> <el-text size="large">精网号</el-text>
<el-input v-model="selectData.jwcode" placeholder="请输入精网号" style="width: 9vw;margin-right:1vw" clearable /> <el-input v-model="selectData.jwcode" placeholder="请输入精网号" style="width: 9vw;margin-right:1vw" clearable />
@ -366,8 +366,8 @@ onMounted(async function () {
<el-button type="primary" style="width: 95px;" @click="openExportList">查看导出列表</el-button> <el-button type="primary" style="width: 95px;" @click="openExportList">查看导出列表</el-button>
</div> </div>
</el-card> </el-card>
<el-card>
<div>
<el-card class="card2">
<div class="goldStatistics">
金豆总数{{ format3(beanNum) }}&nbsp;&nbsp;&nbsp;&nbsp; 金豆总数{{ format3(beanNum) }}&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(permanentBeans) }}&nbsp;&nbsp;&nbsp;&nbsp; 付费金豆数{{ format3(permanentBeans) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ format3(freeBean) }} 免费金豆数{{ format3(freeBean) }}
@ -434,12 +434,56 @@ onMounted(async function () {
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<style scoped>
.condition {
<style scoped lang="scss">
/* .condition {
height: 6vw; height: 6vw;
margin-bottom: 0.5vh; margin-bottom: 0.5vh;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
} */
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
} }
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
</style> </style>

5
src/views/recharge/gold/addCoinRecharge.vue

@ -6,6 +6,9 @@ import axios from 'axios'
import API from '@/util/http.js' import API from '@/util/http.js'
import moment from 'moment' import moment from 'moment'
import Cookies from 'js-cookie'; import Cookies from 'js-cookie';
import Decimal from 'decimal.js';
// fixedAdminId
// const fixedAdminId = 1;
// //
const trimJwCode = () => { const trimJwCode = () => {
@ -91,7 +94,7 @@ const add = async function () {
formattedRecharge.freeGold = Number(formattedRecharge.freeGold) * 100; formattedRecharge.freeGold = Number(formattedRecharge.freeGold) * 100;
} }
if (formattedRecharge.money) { if (formattedRecharge.money) {
formattedRecharge.money = Number(formattedRecharge.money) * 100;
formattedRecharge.money = new Decimal(formattedRecharge.money).mul(100).toNumber();
} }
if (formattedRecharge.payTime) { if (formattedRecharge.payTime) {

50
src/views/recharge/gold/coinRechargeDetail.vue

@ -586,7 +586,7 @@ const getTagText = (state) => {
</script> </script>
<template> <template>
<el-card style="margin-bottom: 0.5vh">
<el-card class="card1" style="margin-bottom: 0.5vh">
<div style="margin-bottom: 0.5vh;"> <div style="margin-bottom: 0.5vh;">
<el-text size="large">精网号</el-text> <el-text size="large">精网号</el-text>
<el-input v-model="rechargeUser.jwcode" placeholder="请输入精网号" style="width: 10vw;margin-right: 1vw;" clearable /> <el-input v-model="rechargeUser.jwcode" placeholder="请输入精网号" style="width: 10vw;margin-right: 1vw;" clearable />
@ -628,8 +628,8 @@ const getTagText = (state) => {
</div> </div>
</el-card> </el-card>
<el-card>
<div>
<el-card class="card2">
<div class="goldStatistics">
充值新币{{ format3(permanentGolds) }}新币&nbsp;&nbsp;&nbsp;&nbsp; 充值新币{{ format3(permanentGolds) }}新币&nbsp;&nbsp;&nbsp;&nbsp;
总金币数{{ format3(permanentGolds + freeGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp; 总金币数{{ format3(permanentGolds + freeGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(permanentGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp; 永久金币{{ format3(permanentGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
@ -712,5 +712,47 @@ const getTagText = (state) => {
</template> </template>
</el-dialog> </el-dialog>
</template> </template>
<style scoped>
<style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
</style> </style>

51
src/views/refund/gold/coinRefundDetail.vue

@ -499,7 +499,7 @@ const getMarket = async function () {
</script> </script>
<template> <template>
<el-card style="margin-bottom: 1vh;">
<el-card class="card1" style="margin-bottom: 1vh;">
<div class="condition"> <div class="condition">
<div style="display: flex;align-items: center;width:18vw"> <div style="display: flex;align-items: center;width:18vw">
<el-text>精网号</el-text> <el-text>精网号</el-text>
@ -552,8 +552,8 @@ const getMarket = async function () {
</div> </div>
</el-card> </el-card>
<el-card>
<div>
<el-card class="card2">
<div class="goldStatistics">
退款金币总数{{ format3(Math.abs(sumGolds).toFixed(2)) }}&nbsp;&nbsp;&nbsp;&nbsp; 退款金币总数{{ format3(Math.abs(sumGolds).toFixed(2)) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(Math.abs(permanentGolds).toFixed(2)) }}&nbsp;&nbsp;&nbsp;&nbsp; 永久金币{{ format3(Math.abs(permanentGolds).toFixed(2)) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(Math.abs(freeGolds).toFixed(2)) }}&nbsp;&nbsp;&nbsp;&nbsp; 免费金币{{ format3(Math.abs(freeGolds).toFixed(2)) }}&nbsp;&nbsp;&nbsp;&nbsp;
@ -637,7 +637,50 @@ const getMarket = async function () {
</el-dialog> </el-dialog>
</template> </template>
<style scoped>
<style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
.condition{ .condition{
display: flex; display: flex;
width:82vw; width:82vw;

51
src/views/usergold/bean/userbean.vue

@ -1,5 +1,5 @@
<template> <template>
<el-card style="margin-bottom: 1vh;">
<el-card class="card1" style="margin-bottom: 1vh;">
<el-text size="large">精网号</el-text> <el-text size="large">精网号</el-text>
<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 240px" clearable /> <el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
<el-text size="large" style="margin-left:20px">地区</el-text> <el-text size="large" style="margin-left:20px">地区</el-text>
@ -13,8 +13,8 @@
</div> </div>
</el-card> </el-card>
<el-card>
<div class="stats-card">
<el-card class="card2">
<div class="goldStatistics">
现有金豆数{{ format3(stats.sumBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp; 现有金豆数{{ format3(stats.sumBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(stats.permanentBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp; 付费金豆数{{ format3(stats.permanentBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ format3(stats.freeBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp; 免费金豆数{{ format3(stats.freeBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
@ -188,5 +188,48 @@ onMounted(() => {
}) })
</script> </script>
<style scoped>
<style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
</style> </style>

96
src/views/usergold/gold/clientCountBalance.vue

@ -5,11 +5,11 @@ import { storeToRefs } from "pinia"
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js" import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore() const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore) const { adminData, menuTree } = storeToRefs(adminStore)
import {onMounted, ref} from 'vue'
import {ElMessage} from 'element-plus'
import { onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import moment from 'moment' import moment from 'moment'
import API from '@/util/http.js' import API from '@/util/http.js'
import {reverseMarketMapping} from "@/utils/marketMap.js";
import { reverseMarketMapping } from "@/utils/marketMap.js";
// //
const showEmployeeData = ref(false) const showEmployeeData = ref(false)
@ -65,7 +65,7 @@ const sortOrder = ref('')
// =========================================================================== // ===========================================================================
// //
const get = async function (val) { const get = async function (val) {
if(!findMenuById(menuTree.value, permissionMapping.coinCustomerMoney)){
if (!findMenuById(menuTree.value, permissionMapping.coinCustomerMoney)) {
ElMessage.error('无此权限') ElMessage.error('无此权限')
return return
} }
@ -81,7 +81,7 @@ const get = async function (val) {
console.log('搜索参数', getObj.value) console.log('搜索参数', getObj.value)
// POST // POST
const requestData = {...getObj.value, user: {...user.value}};//
const requestData = { ...getObj.value, user: { ...user.value } };//
console.log('最终请求参数', JSON.stringify(requestData, null, 2)); // console.log('最终请求参数', JSON.stringify(requestData, null, 2)); //
//console.log('', requestData); //console.log('', requestData);
// markets'''' // markets''''
@ -102,7 +102,7 @@ const get = async function (val) {
const result = await API({ const result = await API({
url: '/goldDetail/getGold', url: '/goldDetail/getGold',
method: 'post', method: 'post',
data: {...getObj.value, user: {...user.value, flag: showEmployeeData.value? 0 : 1}}
data: { ...getObj.value, user: { ...user.value, flag: showEmployeeData.value ? 0 : 1 } }
}) })
console.log('响应数据', result) console.log('响应数据', result)
tableData.value = result.data.list tableData.value = result.data.list
@ -115,7 +115,7 @@ const get = async function (val) {
data: { data: {
jwcode: user.value.jwcode, jwcode: user.value.jwcode,
markets: user.value.markets, markets: user.value.markets,
flag: showEmployeeData.value? 0 : 1
flag: showEmployeeData.value ? 0 : 1
} }
}) })
// result.data.list // result.data.list
@ -137,7 +137,7 @@ const get = async function (val) {
// ElMessage.warning('') // ElMessage.warning('')
} }
// , result.data.list // , result.data.list
else if(resultGoldTotal.data===0){
else if (resultGoldTotal.data === 0) {
// //
tableData.value = [] tableData.value = []
// 0 // 0
@ -242,11 +242,11 @@ const exportExcel = async function () {
user: { user: {
jwcode: user.value.jwcode || '', jwcode: user.value.jwcode || '',
markets: user.value.markets || [], markets: user.value.markets || [],
flag: showEmployeeData.value? 0 : 1
flag: showEmployeeData.value ? 0 : 1
} }
} }
const res = await API({url: '/goldDetail/exportGold', data: params})
const res = await API({ url: '/goldDetail/exportGold', data: params })
if (res.code === 200) { if (res.code === 200) {
ElMessage.success('导出成功') ElMessage.success('导出成功')
} }
@ -268,7 +268,7 @@ const exportListLoading = ref(false)
const getExportList = async () => { const getExportList = async () => {
exportListLoading.value = true exportListLoading.value = true
try { try {
const result = await API({url: '/export/export'})
const result = await API({ url: '/export/export' })
if (result.code === 200) { if (result.code === 200) {
const filteredData = result.data.filter(item => { const filteredData = result.data.filter(item => {
return item.type === 1; //type0 return item.type === 1; //type0
@ -382,22 +382,16 @@ const format3 = (num) => {
</script> </script>
<template> <template>
<el-card style="margin-bottom: 1vh;">
<el-card class="card1" style="margin-bottom: 1vh;">
<div class="head-card"> <div class="head-card">
<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-input v-model="user.jwcode" style="width: 160px" placeholder="请输入精网号" clearable/>
<el-input v-model="user.jwcode" style="width: 160px" placeholder="请输入精网号" clearable />
</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-cascader
v-model="selectedMarketPath"
:options="markets"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
<el-cascader v-model="selectedMarketPath" :options="markets" placeholder="请选择所属地区" clearable style="width:180px"
@change="handleMarketChange" />
</div> </div>
<div class="head-card-element"> <div class="head-card-element">
<el-checkbox v-model="showEmployeeData" @change="search()">员工数据</el-checkbox> <el-checkbox v-model="showEmployeeData" @change="search()">员工数据</el-checkbox>
@ -409,8 +403,8 @@ const format3 = (num) => {
</div> </div>
<!-- </div> --> <!-- </div> -->
</el-card> </el-card>
<el-card>
<div>
<el-card class="card2">
<div class="goldStatistics">
金币总数{{ format3(goldtotal || 0) }}&nbsp;&nbsp;&nbsp;&nbsp; 金币总数{{ format3(goldtotal || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(permanentGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp; 永久金币{{ format3(permanentGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(freeGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp; 免费金币{{ format3(freeGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
@ -427,9 +421,9 @@ const format3 = (num) => {
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="name" label="姓名" width="140"/>
<el-table-column prop="jwcode" label="精网号" width="160"/>
<el-table-column prop="market" label="所属地区" width="140"/>
<el-table-column prop="name" label="姓名" width="140" />
<el-table-column prop="jwcode" label="精网号" width="160" />
<el-table-column prop="market" label="所属地区" width="140" />
<el-table-column prop="sumGold" label="金币总数" width="140" aligh="center"> <el-table-column prop="sumGold" label="金币总数" width="140" aligh="center">
<!-- <template #default="scope"> <!-- <template #default="scope">
<span>{{ <span>{{
@ -460,7 +454,7 @@ const format3 = (num) => {
<span>{{ (scope.row.currentTaskGold || 0) }}</span> <span>{{ (scope.row.currentTaskGold || 0) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column prop="rcoin" label="历史金币总额" width="150">
<!-- <el-table-column prop="rcoin" label="历史金币总额" width="150">
<template #default="scope"> <template #default="scope">
<el-popover trigger="hover" placement="left" width="150"> <el-popover trigger="hover" placement="left" width="150">
<template #default> <template #default>
@ -512,14 +506,13 @@ const format3 = (num) => {
<!-- 分页 --> <!-- 分页 -->
<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>
<el-dialog v-model="exportListVisible" title="导出列表" width="80%"> <el-dialog v-model="exportListVisible" title="导出列表" width="80%">
<el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading"> <el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名"/>
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态"> <el-table-column prop="state" label="状态">
<template #default="scope"> <template #default="scope">
<el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'"> <el-tag :type="getTagType(scope.row.state)" :effect="scope.row.state === 3 ? 'light' : 'plain'">
@ -551,6 +544,49 @@ const format3 = (num) => {
</template> </template>
<style scoped lang="scss"> <style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
.pagination { .pagination {
display: flex; display: flex;
} }

51
src/views/usergold/gold/clientCountDetail.vue

@ -460,7 +460,7 @@ const format3 = (num) => {
</script> </script>
<template> <template>
<div> <div>
<el-card style="margin-bottom: 1vh;">
<el-card class="card1" style="margin-bottom: 1vh;">
<el-row style="margin-bottom: 10px"> <el-row style="margin-bottom: 10px">
<el-col :span="5"> <el-col :span="5">
<div class="head-card-element"> <div class="head-card-element">
@ -526,8 +526,8 @@ const format3 = (num) => {
<el-button type="primary" @click="openExportList">查看导出列表</el-button> <el-button type="primary" @click="openExportList">查看导出列表</el-button>
</div> </div>
</el-card> </el-card>
<el-card>
<div>
<el-card class="card2">
<div class="goldStatistics">
金币净变化{{ format3(totalGoldTotal || 0) }}&nbsp;&nbsp;&nbsp;&nbsp; 金币净变化{{ format3(totalGoldTotal || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(totalPermanentGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp; 永久金币{{ format3(totalPermanentGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(totalFreeGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp; 免费金币{{ format3(totalFreeGold || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
@ -631,7 +631,50 @@ const format3 = (num) => {
</div> </div>
</template> </template>
<style scoped>
<style scoped lang="scss">
//
.card1 {
background: #F3FAFE;
}
//
.card2 {
background: #E7F4FD;
}
//
.goldStatistics {
margin-left: 1vw;
margin-bottom: 1vh;
color: #000000;
font-family: "PingFang SC";
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 20px;
}
//
:deep(.el-table__header-wrapper),
:deep(.el-table__body-wrapper),
:deep(.el-table__cell),
/* 表格 */
:deep(.el-table__body td) {
background-color: #F3FAFE !important;
}
/* 表头 */
:deep(.el-table__header th) {
background-color: #F3FAFE !important;
}
/* 鼠标悬停 */
:deep(.el-table__row:hover > .el-table__cell) {
background-color: #E5EBFE !important;
}
.dialog-footer { .dialog-footer {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;

73
src/views/workspace/index.vue

@ -6,7 +6,7 @@
<div style="height: 100vh;"> <div style="height: 100vh;">
<el-row class="cards" > <el-row class="cards" >
<el-col :span="14"> <el-col :span="14">
<GoldManagement :cardData="cardData" />
<GoldManagement/>
</el-col> </el-col>
<!-- 右上格子占12列 --> <!-- 右上格子占12列 -->
<el-col :span="10"> <el-col :span="10">
@ -15,7 +15,7 @@
</el-row> </el-row>
<el-row class="graphs"> <el-row class="graphs">
<el-col :span="24"> <el-col :span="24">
<GoldGraph :graphData="graphData" @tab-change="handleTabChange" />
<GoldGraph/>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
@ -29,76 +29,7 @@ import GoldManagement from "@/components/workspace/GoldManagement.vue"
import CashManagement from "@/components/workspace/CashManagement.vue" import CashManagement from "@/components/workspace/CashManagement.vue"
import GoldGraph from "@/components/workspace/GoldGraph.vue" import GoldGraph from "@/components/workspace/GoldGraph.vue"
const cardData = ref({})
const graphData = ref([])
const markets = ref([])
const account = ref('')
const activeTab = ref('recharge')
// tab
const handleTabChange = async (tab) => {
activeTab.value = tab
await getGraphData()
}
// account
const getUserInfo = async () => {
const res = await API({ url: '/admin/userinfo', data: {} })
account.value = res?.account || ''
}
//
const getMarkets = async () => {
if (!account.value) return
const res = await API({ url: '/general/adminMarkets', data: { account: account.value } })
markets.value = res.data
console.log('获取市场列表:res:', res)
console.log('获取市场列表:market:', markets.value)
}
//
const getCardData = async () => {
const res = await API({ url: '/workbench/getCard', data: {} })
cardData.value = res?.data || {}
}
//
const getGraphData = async () => {
if (!markets.value.length) return
const params = {
markets: markets.value,
startDate: '2025-01-01 00:00:00',
endDate: '2025-12-31 23:59:59'
}
const res = await API({ url: '/workbench/getGraph', data: params })
if (!res?.marketGraphs) return
graphData.value = res.marketGraphs.map(m => ({
market: m.market,
permanent: activeTab.value === 'recharge'
? m.sumRechargePermanent / 100
: m.sumConsumePermanent / 100,
free: activeTab.value === 'recharge'
? m.sumRechargeFree / 100
: m.sumConsumeFree / 100,
task: activeTab.value === 'recharge'
? m.sumRechargeTask / 100
: m.sumConsumeTask / 100,
}))
}
onMounted(async () => {
try {
await getUserInfo() // account
await getMarkets() // markets
await getCardData() //
await getGraphData() //
} catch (err) {
console.error('初始化失败:', err)
}
})
</script> </script>
<style scoped> <style scoped>

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

Loading…
Cancel
Save