Browse Source

导出

zhangyong/feature-20250815160302-金币优化
ZhangYong 1 month ago
parent
commit
17f7232d90
  1. 2
      .env.development
  2. 3
      src/global.css
  3. 1
      src/main.ts
  4. 4
      src/views/audit/bean/beanAudit.vue
  5. 2
      src/views/audit/gold/audit.vue
  6. 4
      src/views/audit/gold/rechargeAudit.vue
  7. 7
      src/views/audit/gold/refundAudit.vue
  8. 2
      src/views/consume/bean/addBeanConsume.vue
  9. 43
      src/views/consume/bean/articleVideo.vue
  10. 9
      src/views/consume/bean/beanConsume.vue
  11. 4
      src/views/consume/bean/dieHardFan.vue
  12. 41
      src/views/consume/bean/liveStream.vue
  13. 6
      src/views/consume/gold/addCoinConsume.vue
  14. 2
      src/views/history/history.vue
  15. 2
      src/views/managerecharge/rate.vue
  16. 42
      src/views/permissions/permissions.vue
  17. 2
      src/views/permissions/rolePermission.vue
  18. 195
      src/views/permissions/userPermission.vue
  19. 17
      src/views/recharge/bean/beanSystemRecharge.vue
  20. 74
      src/views/recharge/gold/addCoinRecharge.vue
  21. 38
      src/views/refund/gold/coinRefund.vue
  22. 76
      src/views/refund/gold/coinRefundDetail.vue
  23. 5
      src/views/usergold/bean/userbean.vue
  24. 10
      src/views/usergold/gold/clientCount.vue
  25. 18
      src/views/usergold/gold/clientCountBalance.vue
  26. 6
      src/views/usergold/gold/clientCountDetail.vue
  27. 72
      src/views/workspace/index.vue

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/'
# sunjiabei
# VITE_API_BASE='http://192.168.0.115:8081/'
# VITE_API_BASE='http://192.168.0.34:8081/'

3
src/global.css

@ -0,0 +1,3 @@
body {
font-family: 'Microsoft YaHei UI';
}

1
src/main.ts

@ -15,6 +15,7 @@ import 'vxe-table/lib/style.css'
// 修正导入路径
import { useAdminStore } from './store'
import request from "@/util/request";
import "./global.css";
const app = createApp(App)
const pinia = createPinia()

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

@ -1,10 +1,10 @@
<template>
<el-card style="margin-bottom: 0.5vh;width:82.8vw">
<el-card style="margin-bottom: 0.5vh;width:82vw">
<div style="margin-bottom: 1vh">
<el-text size="large">精网号</el-text>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw" clearable />
<el-text class="mx-1" size="large">所属地区</el-text>
<el-text size="large">所属地区</el-text>
<el-cascader v-model="selectedMarkets" :options="marketOptions" placeholder="请选择所属地区" clearable
style="width: 12vw" @change="handleMarketChange" />
</div>

2
src/views/audit/gold/audit.vue

@ -1,6 +1,6 @@
<template>
<div>
<div style="height:2vw;">
<div style="height:4vh;width:82vw;">
<el-button-group>
<el-button :type="activeTab === 'rechargeAudit' ? 'primary' : 'default'" @click="navigateTo('rechargeAudit')"
:disabled="!hasRecharge">

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

@ -47,7 +47,7 @@
免费金币{{ format3(stats.freeGolds.toFixed(2)) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
</div>
</el-tabs>
<el-table :data="tableData" style="width: 100vw;height:55vh" @sort-change="handleSortChange"
<el-table :data="tableData" style="width: 82vw;height:54vh" @sort-change="handleSortChange"
:row-style="{ height: '50px' }">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
@ -60,7 +60,7 @@
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip/>
<el-table-column prop="rateName" label="货币名称" width="110px"/>
<el-table-column prop="money" label="充值金额" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
<template #default="scope">{{ scope.row.money / 100 }}</template>
</el-table-column>
<el-table-column prop="permanentGold" label="永久金币" width="110px" sortable="custom">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>

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

@ -1,5 +1,5 @@
<template>
<el-card style="margin-bottom: 0.5vh;width:82.8vw">
<el-card style="margin-bottom: 0.5vh;width:82vw">
<el-col style="margin-bottom: 0.5vh">
<el-text size="large">精网号</el-text>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw" clearable/>
@ -50,7 +50,7 @@
任务金币{{ format3(stats.taskGolds.toFixed(2)) }}金币
</div>
<el-table :data="tableData" style="height:55vh" @sort-change="handleSortChange">
<el-table :data="tableData" style="height:54vh;width:82vw" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="60"/>
<el-table-column prop="name" label="姓名" width="120" show-overflow-tooltip/>
<el-table-column prop="jwcode" label="精网号" width="120"/>
@ -64,7 +64,7 @@
</template>
</el-table-column>
<el-table-column prop="goodsName" label="退款商品" width="120" show-overflow-tooltip/>
<el-table-column prop="sumGold" label="退款金额" width="120" sortable="custom">
<el-table-column prop="sumGold" label="退款金币总数" width="160" sortable="custom">
<template #default="{ row }">
{{ row.sumGold / 100 }}
</template>
@ -122,6 +122,7 @@
</el-popconfirm>
<el-button :disabled="clicked || cancelClicked" type="primary" text @click="showRejectDialog(scope.row)">
驳回
驳回
</el-button>
</div>
</template>

2
src/views/consume/bean/addBeanConsume.vue

@ -290,7 +290,7 @@ const throttledHandleConsumeFormt = _.throttle(handleConsumeForm, 5000, {
<style scoped lang="scss">
.userAndform {
width: 80vw;
height: 85vh;
height: 80vh;
display: flex;
justify-content: center;

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

@ -463,36 +463,46 @@ const getTagText = (state) => {
</script>
<template>
<el-card style="margin-bottom: 10px;margin-top:10px">
<el-col style="margin-bottom: 10px">
<el-card style="margin-bottom: 1vh">
<el-col style="margin-bottom: 1vh; ">
<div style="display:flex">
<div style="width: 13vw; display:flex; align-items:center; justify-content: center;">
<el-text>精网号</el-text>
<el-input v-model="beanConsumeArticle.jwcode" placeholder="请输入精网号" style="width: 12vh;margin-right: 1vh" clearable />
<el-input v-model="beanConsumeArticle.jwcode" style="width:8vw;" placeholder="请输入精网号" clearable />
</div>
<div style="width: 13vw; display:flex; align-items:center; justify-content: center;">
<el-text>地区</el-text>
<el-select v-model="beanConsumeArticle.dept" placeholder="请选择地区" style="width: 13vh;margin-right: 1vh" clearable>
<el-select v-model="beanConsumeArticle.dept" style="width:8vw;" placeholder="请选择地区" clearable>
<el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item" />
</el-select>
</div>
<div style="width: 13vw; display:flex;align-items:center; justify-content: center;">
<el-text>类型</el-text>
<el-select v-model="beanConsumeArticle.payMode" placeholder="请选择类型" style="width: 13vh;margin-right: 1vh" clearable
@change="handlePayModeChange">
<el-select v-model="beanConsumeArticle.payMode" style="width:8vw;" placeholder="请选择类型" clearable @change="handlePayModeChange">
<el-option label="打赏" value="0" />
<el-option label="付费购买" value="1" />
<el-option label="其他" value="2" />
</el-select>
<el-text>文章/视频ID</el-text>
<el-input v-model="beanConsumeArticle.articleId" placeholder="请输入文章/视频ID" style="width: 15vh;margin-right: 1vh" clearable />
</div>
<div style="width: 15vw; display:flex; align-items:center; justify-content: center;">
<el-text>文章/视频ID:</el-text>
<el-input v-model="beanConsumeArticle.articleId" style="width:8vw;" placeholder="请输入文章/视频ID" clearable />
</div>
<div style="width: 16vw; display:flex; align-items:center; justify-content: center;">
<el-text>文章/视频标题</el-text>
<el-input v-model="beanConsumeArticle.articleName" placeholder="请输入文章/视频标题" style="width: 16vh;margin-right: 1vh" clearable />
<el-input v-model="beanConsumeArticle.articleName" style="width:9vw;" placeholder="请输入文章/视频标题" clearable />
</div>
<div style="width: 12vw; display:flex; align-items:center; justify-content: center;">
<el-text>作者</el-text>
<el-input v-model="beanConsumeArticle.author" placeholder="请输入作者" style="width: 12vh;" clearable />
<el-input v-model="beanConsumeArticle.author"style="width:8vw;" placeholder="请输入作者" clearable />
</div>
</div>
</el-col>
<el-col>
<div>
<el-text>付费时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px;margin-right: 10px" @change="handleDatePickerChange"
end-placeholder="结束时间" style="width: 20vw;margin-right: 10px" @change="handleDatePickerChange"
value-format="YYYY-MM-DD HH:mm:ss" :default-time="defaultTime" />
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"></el-button>
@ -503,6 +513,7 @@ const getTagText = (state) => {
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="exportExcel()">导出Excel</el-button>
<el-button type="primary" @click="openExportList">查看导出列表</el-button>
</div>
</el-col>
</el-card>
<el-card>
@ -512,7 +523,7 @@ const getTagText = (state) => {
免费金豆数{{ format3(Math.abs(freeBean)) }}
</div>
<div style="overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="550px" @sort-change="handleSortChange">
<el-table :data="tableData" style="width: 82vw" height="55vh" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<template #default="scope">
<span>{{

9
src/views/consume/bean/beanConsume.vue

@ -1,5 +1,5 @@
<template>
<div>
<div class="father">
<el-button-group>
<el-button
:type="activeTab === 'addBeanConsume' ? 'primary' : 'default'"
@ -111,8 +111,11 @@ onMounted(() => {
});
</script>
<style scoped>
.father{
width:82vw;
height:4vh;
}
.content{
width: 90%;
height: 90%;
flex:1;
}
</style>

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

@ -468,7 +468,7 @@ const getTagText = (state) => {
</script>
<template>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-card style="margin-bottom: 1vh;">
<el-col style="margin-bottom: 10px">
<el-text>精网号</el-text>
<el-input v-model="beanConsumeFan.jwcode" placeholder="请输入精网号" style="width: 200px;margin-right: 20px"
@ -506,7 +506,7 @@ const getTagText = (state) => {
免费金豆数{{ format3(Math.abs(freeBean)) }}
</div>
<div style="overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="550px" @sort-change="handleSortChange">
<el-table :data="tableData" style="width: 82vw" height="55vh" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<template #default="scope">
<span>{{

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

@ -502,37 +502,42 @@ const getTagText = (state) => {
</script>
<template>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-col style="margin-bottom: 10px">
<el-card style="margin-bottom: 1vh;width:80vw;">
<div style="margin-bottom: 1vh;display: flex;">
<div style="width: 18vw;margin-right: 1vw;display: flex;align-items: center;">
<el-text>精网号</el-text>
<el-input v-model="beanConsumeLive.jwcode" placeholder="请输入精网号" style="width: 200px;margin-right: 20px"
clearable />
<el-input v-model="beanConsumeLive.jwcode" style="width:10vw;" placeholder="请输入精网号" clearable />
</div>
<div style="margin-bottom: 1vh;width:18vw;display: flex;align-items: center;">
<el-text>地区</el-text>
<el-select v-model="beanConsumeLive.dept" placeholder="请选择地区" style="width: 200px;margin-right: 20px" clearable>
<el-select v-model="beanConsumeLive.dept" placeholder="请选择地区" style="width:10vw" clearable>
<el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item" />
</el-select>
</div>
<div style="margin-bottom: 1vh;width:18vw;display: flex;align-items: center;">
<el-text>礼物名称</el-text>
<el-select v-model="beanConsumeLive.gift" placeholder="请选择礼物名称" style="width: 200px;margin-right: 20px" clearable
filterable allow-create default-first-option>
<el-select v-model="beanConsumeLive.gift" placeholder="请选择礼物名称" style="width:10vw"
clearable filterable allow-create default-first-option>
<el-option v-for="(item, index) in gifts" :key="index" :label="item" :value="item" />
</el-select>
</div>
<div style="margin-bottom: 1vh;width:18vw;display: flex;align-items: center;">
<el-text>频道</el-text>
<el-select v-model="beanConsumeLive.liveChannel" placeholder="请选择频道" style="width: 200px;margin-right: 20px"
<el-select v-model="beanConsumeLive.liveChannel" placeholder="请选择频道" style="width:10vw"
clearable filterable allow-create default-first-option>
<el-option v-for="(item, index) in channels" :key="index" :label="item" :value="item" />
</el-select>
</div>
<div style="margin-bottom: 1vh;width:18vw;display: flex;align-items: center;">
<el-text>直播间</el-text>
<el-input v-model="beanConsumeLive.liveName" placeholder="请输入直播间" style="width: 200px;margin-right: 20px"
<el-input v-model="beanConsumeLive.liveName" placeholder="请输入直播间" style="width:10vw"
clearable />
</el-col>
<el-col>
</div>
</div>
<div>
<el-text>消费时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px;margin-right: 20px;" @change="handleDatePickerChange"
end-placeholder="结束时间" style="width: 20vw;margin-right: 1vw;" @change="handleDatePickerChange"
:default-time="defaultTime" />
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
@ -543,7 +548,7 @@ const getTagText = (state) => {
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="exportExcel()">导出excel</el-button>
<el-button type="primary" @click="openExportList">查看导出列表</el-button>
</el-col>
</div>
</el-card>
<el-card>
<div>
@ -553,7 +558,7 @@ const getTagText = (state) => {
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="550px" @sort-change="handleSortChange">
<el-table :data="tableData" style="width: 82vw" height="55vh" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<template #default="scope">
<span>{{

6
src/views/consume/gold/addCoinConsume.vue

@ -707,7 +707,7 @@ onMounted(async function () {
</el-dialog>
<el-dialog v-model="ConsumeDialogVisible" title="第二次操作确认" :before-close="ConsumeDialogVisiblehandleClose"
<el-dialog v-model="ConsumeDialogVisible" title="操作确认" :before-close="ConsumeDialogVisiblehandleClose"
:close-on-click-modal="false" width="480px">
<!-- 内容整体居中且收窄 -->
<div class="confirm-body">
@ -832,8 +832,8 @@ p {
}
.father1 {
width: 1000px;
height: 100%;
width: 82vw;
height: 80vh;
display: flex;
.left {

2
src/views/history/history.vue

@ -22,7 +22,7 @@
</el-card>
<el-card style="margin-top:10px" v-show="tableData.length > 0">
<el-table :data="tableData" style="width: 100%" height="600">
<el-table :data="tableData" style="width: 82vw;height:60vh">
<el-table-column type="index" label="序号" width="100" header-align="center" align="center">
<template #default="scope">
{{ scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize }}

2
src/views/managerecharge/rate.vue

@ -242,7 +242,7 @@ onMounted(async function () {
</script>
<template>
<el-card style="width:82.8vw;height:85vh">
<el-card style="width:82vw;height:85vh">
<el-table :data="tableData" v-if="(tableData.flag = 1)">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">

42
src/views/permissions/permissions.vue

@ -1,39 +1,31 @@
<template>
<div>
<!-- 这里放置标签切换的按钮 -->
<div class="father">
<el-button-group>
<!-- 切换后状态显示 primary 样式否则是默认样式 -->
<el-button
:type="activeTab === 'userPermission' ? 'primary' : 'default'"
@click="navigateTo('userPermission')"
:disabled="!hasDetail"
>
<el-button :type="activeTab === 'userPermission' ? 'primary' : 'default'" @click="navigateTo('userPermission')"
:disabled="!hasDetail">
用户管理
</el-button>
<el-button
:type="activeTab === 'rolePermission' ? 'primary' : 'default'"
@click="navigateTo('rolePermission')"
:disabled="!hasBalance"
>
<el-button :type="activeTab === 'rolePermission' ? 'primary' : 'default'" @click="navigateTo('rolePermission')"
:disabled="!hasBalance">
角色管理
</el-button>
</el-button-group>
<!-- 渲染子路由组件 -->
</div>
<div>
<router-view></router-view>
</div>
</template>
<script setup>
import {onMounted, ref, watch} from 'vue';
import {useRoute, useRouter} from 'vue-router';
import {storeToRefs} from "pinia";
import {useAdminStore} from "@/store/index.js";
import {hasMenuPermission, permissionMapping} from "@/utils/menuTreePermission.js";
import { onMounted, ref, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { storeToRefs } from "pinia";
import { useAdminStore } from "@/store/index.js";
import { hasMenuPermission, permissionMapping } from "@/utils/menuTreePermission.js";
const router = useRouter();
const route = useRoute();
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
const { menuTree } = storeToRefs(adminStore);
const activeTab = ref('');
const hasDetail = ref(false);
@ -41,7 +33,7 @@ const hasBalance = ref(false);
//
const navigateTo = (name) => {
activeTab.value = name;
router.push({name});
router.push({ name });
};
@ -87,3 +79,9 @@ onMounted(() => {
}
});
</script>
<style>
.father{
width:82vw;
height:4vh;
}
</style>

2
src/views/permissions/rolePermission.vue

@ -580,7 +580,7 @@ onMounted(async function () {
</script>
<template>
<div>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-card style="margin-bottom: 1vh;">
<div style="display: flex;">
<el-text size="large">角色名称</el-text>
<el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable />

195
src/views/permissions/userPermission.vue

@ -1,7 +1,7 @@
<script setup>
import {computed, onMounted, ref} from 'vue'
import {ElMessage, ElMessageBox} from 'element-plus'
import {InfoFilled} from '@element-plus/icons-vue'
import { computed, onMounted, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { InfoFilled } from '@element-plus/icons-vue'
import _ from 'lodash'
import request from '@/util/http'
import API from '@/util/http'
@ -26,27 +26,37 @@ const getObj = ref({
pageNum: 1,
pageSize: 10
})
//
const ackVisible = ref(false)
const currentStatusRow = ref(null)
const statusLoading = ref({})
const showStatusConfirm = (row, targetStatus) => {
currentStatusRow.value = {
...row,//
targetStatus//
}
ackVisible.value = true
}
//
const addUserRules = {
account: [
{required: true, message: '请输入OA号', trigger: 'blur'},
{pattern: /^\d+$/, message: 'OA号必须为数字', trigger: 'blur'},
{max: 20, message: '长度不能超过20位', trigger: 'blur'}
{ required: true, message: '请输入OA号', trigger: 'blur' },
{ pattern: /^\d+$/, message: 'OA号必须为数字', trigger: 'blur' },
{ max: 20, message: '长度不能超过20位', trigger: 'blur' }
],
name: [
{required: true, message: '请输入用户名', trigger: 'blur'},
{max: 20, message: '长度不能超过20位', trigger: 'blur'}
{ required: true, message: '请输入用户名', trigger: 'blur' },
{ max: 20, message: '长度不能超过20位', trigger: 'blur' }
],
market: [
{required: true, message: '请选择所属地区', trigger: 'change'}
{ required: true, message: '请选择所属地区', trigger: 'change' }
],
permission: [
{required: true, message: '请选择角色名称', trigger: 'change'}
{ required: true, message: '请选择角色名称', trigger: 'change' }
],
postiton: [
{required: true, message: '请输入职位', trigger: 'blur'},
{max: 20, message: '长度不能超过20位', trigger: 'blur'}
{ required: true, message: '请输入职位', trigger: 'blur' },
{ max: 20, message: '长度不能超过20位', trigger: 'blur' }
],
machineIds: [
{
@ -93,7 +103,7 @@ const adminData = ref({})
// todo
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
// console.log('', result)
console.log('管理员用户信息', adminData.value)
@ -320,7 +330,7 @@ const permissionList = ref([])
const getRoles = async function () {
try {
const res = await API({url: '/role/selectAll'})
const res = await API({ url: '/role/selectAll' })
permissionList.value = res.data.map(item => ({
label: item.roleName,
value: item.id
@ -436,7 +446,7 @@ const getUserLists = async function (selectedRoleId) {
parentRoleTip.value = '';
const parentRes = await request({
url: '/role/selectFather',
data: {id: selectedRoleId} // ID
data: { id: selectedRoleId } // ID
});
const parentId = parentRes.data.fatherId;
const parentName = parentRes.data.parentName;
@ -454,7 +464,7 @@ const getUserLists = async function (selectedRoleId) {
// }
const res = await API({
url: '/menu/tree',
data: {id: roleId}
data: { id: roleId }
})
data.value = processTreeData(res.data)
permissionEditObj.value.checkedKeys = collectIds(res.data) || [];
@ -469,11 +479,11 @@ const getUserLists = async function (selectedRoleId) {
//
const editAdminRules = {
market: [
{required: true, message: '请选择所属地区', trigger: 'change'}
{ required: true, message: '请选择所属地区', trigger: 'change' }
],
postiton: [
{required: true, message: '请输入职位', trigger: ['blur', 'change']},
{max: 20, message: '长度不能超过20位', trigger: ['blur', 'change']}
{ required: true, message: '请输入职位', trigger: ['blur', 'change'] },
{ max: 20, message: '长度不能超过20位', trigger: ['blur', 'change'] }
],
machineIds: [
{
@ -494,7 +504,7 @@ const editAdminRules = {
};
//
const permissionEdit = async function () {
let {adminName: userName, roleName: oldRole, roleId: newRoleId} = permissionEditObj.value;
let { adminName: userName, roleName: oldRole, roleId: newRoleId } = permissionEditObj.value;
if (oldRole == null) {
oldRole = '暂未分配角色'
}
@ -584,13 +594,16 @@ const delConfirm = async function () {
}
//
const editStatus = async function (row) {
const { id, account, targetStatus, ...restRow } = currentStatusRow.value
try {
console.log(row)
statusLoading.value[id] = true
console.log(row)
permissionEditObj.value = {}
permissionEditObj.value.id = row.id
permissionEditObj.value.account = row.account
permissionEditObj.value.adminStatus = row.adminStatus
permissionEditObj.value.id = id
permissionEditObj.value.account = account
permissionEditObj.value.adminStatus = targetStatus
console.log('修改用户权限状态', permissionEditObj.value)
const result = await request({
@ -598,9 +611,12 @@ const editStatus = async function (row) {
data: permissionEditObj.value
})
console.log('请求成功2', result)
if (result.code === 200) {
ElMessage.success(
permissionEditObj.value.adminStatus === 1 ? '启用成功' : '禁用成功'
)
statusLoading.value[id] = false
}
permissionEditObj.value = {}
getPermission()
} catch (error) {
@ -881,28 +897,22 @@ onMounted(async function () {
<template>
<div>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-card style="margin-bottom: 1vh;">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">OA号</el-text>
<el-input v-model="admin.account" style="width: 240px" placeholder="请输入OA号" clearable/>
<el-input v-model="admin.account" style="width: 240px" placeholder="请输入OA号" clearable />
</div>
<div class="head-card-element" style="margin-left: 50px">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="admin.market"
:options="marketsTree"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
<el-cascader v-model="admin.market" :options="marketsTree" placeholder="请选择所属地区" clearable style="width:180px"
@change="handleMarketChange" />
</div>
<div class="head-card-element" style="margin-left: 50px">
<el-text class="mx-1" size="large">职位名称</el-text>
<el-select v-model="admin.postiton" placeholder="请选择职位名称" style="width: 240px" clearable>
<el-option v-for="item in postiton" :key="item" :label="item" :value="item"/>
<el-option v-for="item in postiton" :key="item" :label="item" :value="item" />
</el-select>
</div>
@ -919,7 +929,7 @@ onMounted(async function () {
</div>
<div>
<el-table :data="tableData" style="width: 100%" show-overflow-tooltip>
<el-table :data="tableData" style="width: 82vw;height:60vh" show-overflow-tooltip>
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{
@ -928,13 +938,13 @@ onMounted(async function () {
</template>
</el-table-column>
<el-table-column prop="account" label="OA号"/>
<el-table-column prop="name" label="姓名"/>
<el-table-column prop="market" label="所属地区"/>
<el-table-column prop="postiton" label="职位"/>
<el-table-column prop="account" label="OA号" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="market" label="所属地区" />
<el-table-column prop="postiton" label="职位" />
<el-table-column prop="roleName" label="部门权限">
</el-table-column>
<el-table-column prop="remark" label="备注"/>
<el-table-column prop="remark" label="备注" />
<el-table-column prop="operation" label="操作" width="280px">
<template #default="scope">
<el-button type="warning" text @click="resetPassword(scope.row)">
@ -962,23 +972,21 @@ onMounted(async function () {
</el-table-column>
<el-table-column prop="adminStatus" label="状态">
<template #default="scope">
<el-switch v-model="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large"
:disabled="scope.row.account === adminData.account" @change="editStatus(scope.row)" style="
<el-switch :model-value="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large"
:disabled="scope.row.account === adminData.account || statusLoading[scope.row.id]"
@change="(targetStatus) => showStatusConfirm(scope.row, targetStatus)" style="
--el-switch-on-color: #13ce66;
--el-switch-off-color: #ff4949;
" active-text="启用" inactive-text="禁用" inline-prompt/>
" active-text="启用" inactive-text="禁用" inline-prompt />
</template>
</el-table-column>
</el-table>
</div>
<!-- 分页 -->
<div class="pagination" style="margin-top: 20px">
<div class="pagination" style="margin-top: 1vh;">
<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>
</div>
</div>
</el-card>
</div>
@ -989,27 +997,17 @@ onMounted(async function () {
<el-form ref="Ref" :rules="addUserRules" :model="addAdmin" label-width="auto"
style="max-width: 600px; align-items: center">
<el-form-item prop="account" label="OA号:" required clearable>
<el-input v-model="addAdmin.account" placeholder="请输入OA号" style="width: 220px"/>
<el-input v-model="addAdmin.account" placeholder="请输入OA号" style="width: 220px" />
</el-form-item>
<el-form-item prop="name" label="用户名:" required clearable>
<el-input v-model="addAdmin.name" placeholder="请输入用户名" style="width: 220px"/>
<el-input v-model="addAdmin.name" placeholder="请输入用户名" style="width: 220px" />
</el-form-item>
<el-form-item prop="market" label="所属地区:" required clearable>
<el-cascader
v-model="addAdmin.market"
:options="marketsTree"
placeholder="请选择所属地区"
clearable
collapse-tags
collapse-tags-tooltip
style="width:220px"
@change="handleMarketChangeAddUser"
:max-collapse-tags="2"
:props="addUserProps"
/>
<el-cascader v-model="addAdmin.market" :options="marketsTree" placeholder="请选择所属地区" clearable collapse-tags
collapse-tags-tooltip style="width:220px" @change="handleMarketChangeAddUser" :max-collapse-tags="2"
:props="addUserProps" />
</el-form-item>
<el-form-item prop="permission" label="角色名称:" required>
<el-select v-model="addAdmin.permission" placeholder="请选择角色名称" style="width: 220px" clearable>
@ -1018,21 +1016,21 @@ onMounted(async function () {
</el-select>
</el-form-item>
<el-form-item prop="postiton" label="职位:" required>
<el-input v-model="addAdmin.postiton" placeholder="请输入职位" style="width: 220px" clearable/>
<el-input v-model="addAdmin.postiton" placeholder="请输入职位" style="width: 220px" clearable />
</el-form-item>
<el-form-item prop="machineIds" label="机器码:" required>
<div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">
<!-- 动态添加的机器码输入框 -->
<div v-for="(item, index) in addAdmin.machineIds" :key="index">
<el-input v-model="addAdmin.machineIds[index]" placeholder="请输入机器码"
style="width: 220px; margin-right: 10px;"/>
style="width: 220px; margin-right: 10px;" />
</div>
<el-button type="primary" @click="addMachineIdInput">添加</el-button>
</div>
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-input v-model="addAdmin.remark" style="width: 300px" :rows="2" maxlength="100" show-word-limit
type="textarea"/>
type="textarea" />
</el-form-item>
</el-form>
@ -1050,32 +1048,21 @@ onMounted(async function () {
<el-form ref="Ref" :rules="editAdminRules" :model="permissionEditObj" label-width="auto"
style="max-width: 600px; align-items: center">
<el-form-item prop="account" label="用户账号:" clearable>
<el-input v-model="permissionEditObj.account" placeholder="请输入OA号" style="width: 220px" disabled/>
<el-input v-model="permissionEditObj.account" placeholder="请输入OA号" style="width: 220px" disabled />
</el-form-item>
<el-form-item prop="name" label="用户名称:">
<el-input v-model="permissionEditObj.adminName" placeholder="请输入用户名" style="width: 220px" disabled/>
<el-input v-model="permissionEditObj.adminName" placeholder="请输入用户名" style="width: 220px" disabled />
</el-form-item>
<el-form-item prop="market" label="所属地区:" clearable>
<el-cascader
v-model="permissionEditObj.market"
:options="marketsTree"
placeholder="请选择所属地区"
clearable
collapse-tags
collapse-tags-tooltip
style="width:220px"
@change="handleMarketChangeEditUser"
:max-collapse-tags="2"
:props="editUserProps"
/>
<el-cascader v-model="permissionEditObj.market" :options="marketsTree" placeholder="请选择所属地区" clearable
collapse-tags collapse-tags-tooltip style="width:220px" @change="handleMarketChangeEditUser"
:max-collapse-tags="2" :props="editUserProps" />
</el-form-item>
<el-form-item prop="postiton" label="职位:">
<el-input v-model="permissionEditObj.postiton" placeholder="请输入职位" style="width: 220px" clearable/>
<el-input v-model="permissionEditObj.postiton" placeholder="请输入职位" style="width: 220px" clearable />
</el-form-item>
<el-form-item prop="roleName" label="角色名称:">
<el-select v-model="permissionEditObj.roleId" placeholder="请选择角色" style="width: 220px"
@change="getUserLists">
<el-select v-model="permissionEditObj.roleId" placeholder="请选择角色" style="width: 220px" @change="getUserLists">
<el-option v-for="item in permissionList" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
@ -1083,15 +1070,14 @@ onMounted(async function () {
<el-form-item prop="parentName" label="上级角色:">
<el-select v-model="permissionEditObj.parentId" placeholder="无上级角色" :disabled="!!parentRoleTip"
style="width: 220px">
<el-option v-if="parentRoleTip" :key="0" :label="parentRoleTip" :value="null" disabled/>
<el-option v-if="parentRoleTip" :key="0" :label="parentRoleTip" :value="null" disabled />
<el-option v-else v-for="item in permissionList" :key="item.value" :label="item.label" disabled
:value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item prop="permissionSelect" label="权限列表:">
<el-tree v-if="data.length > 0" :data="data" :disabled="true" show-checkbox node-key="id"
:props="{ label: 'menuName', children: 'children' }"
:default-checked-keys="permissionEditObj.checkedKeys">
:props="{ label: 'menuName', children: 'children' }" :default-checked-keys="permissionEditObj.checkedKeys">
</el-tree>
<div v-else style="display: flex; align-items: center; gap: 8px;">
<span style="color: #999;">暂无数据</span>
@ -1102,7 +1088,7 @@ onMounted(async function () {
<!-- 动态添加的机器码输入框 -->
<div v-for="(item, index) in permissionEditObj.machineIds" :key="index">
<el-input v-model="permissionEditObj.machineIds[index]" placeholder=""
style="width: 220px; margin-right: 10px;"/>
style="width: 220px; margin-right: 10px;" />
</div>
<el-button type="primary" @click="UseraddMachineIdInput">添加</el-button>
</div>
@ -1126,7 +1112,7 @@ onMounted(async function () {
<el-row>
<el-col :span="4" style="margin-top: 20px">
<el-icon class="dialog-icon" color="#10AEFF" size="50">
<InfoFilled/>
<InfoFilled />
</el-icon>
</el-col>
<el-col :span="20">
@ -1143,7 +1129,30 @@ onMounted(async function () {
</template>
</el-dialog>
<el-dialog v-model="ackVisible" :title="currentStatusRow?.adminStatus === 1 ? '确认禁用' : '确认启用'" width="300px"
:close-on-click-modal="false"
@close="() => { if (currentStatusRow) currentStatusRow.adminStatus = currentStatusRow.adminStatus === 1 ? 0 : 1 }">
<div class="status-confirm-content">
确定要{{ currentStatusRow?.adminStatus === 1 ? '禁用' : '启用' }}该用户吗
<br>
</div>
<template #footer>
<div style="display: flex;">
<el-button @click="() => {
currentStatusRow.adminStatus = currentStatusRow.adminStatus === 1 ? 0 : 1
ackVisible = false
}">
取消
</el-button>
<el-button type="primary" @click="() => {
editStatus(currentStatusRow)
ackVisible = false
}">
确认
</el-button>
</div>
</template>
</el-dialog>
</template>
<style scoped>

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

@ -337,7 +337,7 @@ onMounted(async function () {
<el-option v-for="item in market" :key="item" :label="item" :value="item" />
</el-select>
</div>
<div style="margin-top: 10px;">
<div style="margin-top: 1vh;">
<el-text size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 20vw" @change="handleDatePickerChange"
@ -357,8 +357,6 @@ onMounted(async function () {
<el-button type="primary" style="width: 80px;" @click="exportExcel()">导出Excel</el-button>
<el-button type="primary" style="width: 95px;" @click="openExportList">查看导出列表</el-button>
</div>
</el-card>
<el-card>
<div>
@ -367,7 +365,7 @@ onMounted(async function () {
免费金豆数{{ format3(freeBean) }}
</div>
<div>
<el-table :data="tableData" style="width: 82.8vw;height:60vh;" @sort-change="handleSortChange">
<el-table :data="tableData" style="width: 82vw;height:55vh;" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<template #default="scope">
<span>{{
@ -428,4 +426,13 @@ onMounted(async function () {
</template>
</el-dialog>
</template>
<style scoped></style>
<style scoped>
.condition {
width: 82vw;
height: 6vw;
margin-bottom: 0.5vh;
display: flex;
justify-content: space-between;
align-items: center;
}
</style>

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

@ -230,10 +230,11 @@ const addBefore = () => {
return;
}
// rateId
const selectedRate = rateName.find(item => item.value === recharge.value.rateName);
// rateId
const selectedRate = rateName.value.find(item => item.value === recharge.value.rateName);
if (selectedRate) {
recharge.value.rateId = selectedRate.rateId;
recharge.value.rateId = selectedRate.value;
recharge.value.rateName = selectedRate.label; // rateName
}
//
@ -475,53 +476,27 @@ const activity = ref([])
//
const rateName = [
{
value: 'USD',
label: 'USD',
rateId: 1
},
{
value: 'HKD',
label: 'HKD',
rateId: 2
},
{
value: 'THB',
label: 'THB',
rateId: 3
},
{
value: 'VND',
label: 'VND',
rateId: 4
},
{
value: 'CAD',
label: 'CAD',
rateId: 5
},
{
value: 'MYR',
label: 'MYR',
rateId: 6
},
{
value: 'KRW',
label: 'KRW',
rateId: 7
},
{
value: 'JPY',
label: 'JPY',
rateId: 8
},
{
value: 'CNY',
label: 'CNY',
rateId: 9
const rateName = ref([])
const fetchRateData = async () => {
try {
const result = await API({
url: '/general/getRate',
data: {}
});
console.log('response', result);
if (result.code === 200) {
rateName.value = result.data.map(item => ({
value: item.id,
label: item.rateName,
}));
}
]
console.log('货币信息', rateName.value);
} catch (error) {
console.error('获取货币信息失败:', error);
}
};
//
const customUpload = async (options) => {
@ -648,6 +623,7 @@ const deleteRecharge = function () {
onMounted(async function () {
await getAdminData()
await fetchRateData()
// await getCurrency()
// await getActivity()//

38
src/views/refund/gold/coinRefund.vue

@ -1,39 +1,35 @@
<template>
<div>
<div class="father">
<!-- 这里放置标签切换的按钮 -->
<el-button-group>
<!-- 切换后状态显示 primary 样式否则是默认样式 -->
<el-button
:type="activeTab === 'addCoinRefund' ? 'primary' : 'default'"
@click="navigateTo('addCoinRefund')"
:disabled="!hasAdd"
>
<el-button :type="activeTab === 'addCoinRefund' ? 'primary' : 'default'" @click="navigateTo('addCoinRefund')"
:disabled="!hasAdd">
新增退款
</el-button>
<el-button
:type="activeTab === 'coinRefundDetail' ? 'primary' : 'default'"
@click="navigateTo('coinRefundDetail')"
:disabled="!hasDetail"
>
<el-button :type="activeTab === 'coinRefundDetail' ? 'primary' : 'default'"
@click="navigateTo('coinRefundDetail')" :disabled="!hasDetail">
金币退款明细
</el-button>
</el-button-group>
<!-- 渲染子路由组件 -->
</div>
<div>
<router-view></router-view>
</div>
</template>
<script setup>
import {onMounted, ref, watch} from 'vue';
import {useRoute, useRouter} from 'vue-router';
import {storeToRefs} from "pinia";
import {useAdminStore} from "@/store/index.js";
import {hasMenuPermission, permissionMapping} from "@/utils/menuTreePermission.js";
import { onMounted, ref, watch } from 'vue';
import { useRoute, useRouter } from 'vue-router';
import { storeToRefs } from "pinia";
import { useAdminStore } from "@/store/index.js";
import { hasMenuPermission, permissionMapping } from "@/utils/menuTreePermission.js";
const router = useRouter();
const route = useRoute();
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
const { menuTree } = storeToRefs(adminStore);
const activeTab = ref('');
const hasAdd = ref(false);
@ -41,7 +37,7 @@ const hasDetail = ref(false);
//
const navigateTo = (name) => {
activeTab.value = name;
router.push({name});
router.push({ name });
};
@ -87,3 +83,9 @@ onMounted(() => {
}
});
</script>
<style lang="css">
.father {
width: 82vw;
height: 4vh;
}
</style>

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

@ -164,7 +164,8 @@ const getSelectBy = async function (val) {
}
})
// refundUser.value
const detailWithoutSort = { ...refundUser.value,
const detailWithoutSort = {
...refundUser.value,
flag: showEmployeeData.value ? 0 : 1
}
delete detailWithoutSort.sortField
@ -193,9 +194,9 @@ const getSelectBy = async function (val) {
tableData.value = tableData.value.map(item => ({
...item,
sumGold: (Number(item.sumGold) || 0) ,
permanentGold: (Number(item.permanentGold) || 0) ,
freeGold: (Number(item.freeGold) || 0) ,
sumGold: (Number(item.sumGold) || 0),
permanentGold: (Number(item.permanentGold) || 0),
freeGold: (Number(item.freeGold) || 0),
taskGold: (Number(item.taskGold) || 0)
}))
console.log('tableData', tableData.value)
@ -515,58 +516,48 @@ const getMarket = async function () {
</script>
<template>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 10px">
<el-col :span="5">
<div class="head-card-element">
<el-card style="margin-bottom: 1vh;">
<div class="condition">
<div style="display: flex;align-items: center;width:18vw">
<el-text>精网号</el-text>
<el-input v-model="refundUser.jwcode" placeholder="请输入精网号" style="width: 150px" clearable />
<el-input v-model="refundUser.jwcode" placeholder="请输入精网号" style="width: 10vw;" clearable />
</div>
</el-col>
<el-col :span="5">
<div class="head-card-element">
<div style="display: flex;align-items: center;width:18vw">
<el-text>商品名称</el-text>
<el-select v-model="refundUser.goodsName" placeholder="请选择商品名称" style="width: 180px" clearable>
<el-select v-model="refundUser.goodsName" placeholder="请选择商品名称" style="width: 10vw;" clearable filterable>
<el-option v-for="item in goods" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col>
<el-col :span="5">
<div style="display: flex;align-items: center;width:18vw">
<el-text size="large">所属地区</el-text>
<el-cascader v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区" clearable
style="width:180px" @change="handleMarketChange" />
</el-col>
<el-col :span="5">
<div class="head-card-element">
<el-cascader v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区" clearable style="width:10vw"
@change="handleMarketChange" />
</div>
<div style="display: flex;align-items: center;width:18vw">
<el-text>退款类型</el-text>
<el-select v-model="refundUser.refundType" placeholder="请选择退款类型" style="width: 180px" clearable>
<!-- todo 这需要改-->
<el-select v-model="refundUser.refundType" placeholder="请选择退款类型" style="width: 10vw" clearable>
<el-option v-for="item in refundType" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col>
<el-col :span="3">
<div class="head-card-element">
<div>
<el-checkbox v-model="showEmployeeData" @change="search()">员工数据</el-checkbox>
</div>
</el-col>
</el-row>
<el-row>
</div>
<div>
<el-col :span="24">
<div class="head-card-element">
<div>
<el-text>退款时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
:default-time="defaultTime" :disabled-date="disabledDate"/>
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
end-placeholder="结束时间" style="width: 20vw;" @change="handleDatePickerChange" :default-time="defaultTime"
:disabled-date="disabledDate" />
<el-button @click="getToday()" style="margin-left: 10px" :type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
<el-button @click="get7Days()" style="margin-left: 10px" :type="activeTimeRange === '7days' ? 'primary' : ''">
近7天
</el-button>
<el-button type="success" @click="reset()">重置</el-button>
@ -575,8 +566,9 @@ const getMarket = async function () {
<el-button type="primary" @click="openExportList">查看导出列表</el-button>
</div>
</el-col>
</el-row>
</div>
</el-card>
<el-card>
<div>
退款金币总数{{ format3(Math.abs(sumGolds).toFixed(2)) }}&nbsp;&nbsp;&nbsp;&nbsp;
@ -585,8 +577,8 @@ const getMarket = async function () {
任务金币{{ format3(Math.abs(taskGolds).toFixed(2)) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 520px; overflow-y: auto;margin-top:10px">
<el-table :data="tableData" style="width: 100%" @sort-change="handleSortChange" height="520px">
<div style="height: 55vh; overflow-y: auto;">
<el-table :data="tableData" style="width: 82vw;height:55vh" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<template #default="scope">
<span>{{
@ -663,7 +655,9 @@ const getMarket = async function () {
</template>
<style scoped>
.head-card-element {
margin-right: 20px;
.condition{
display: flex;
width:82vw;
margin-bottom: 0.5vh;
}
</style>

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

@ -1,5 +1,5 @@
<template>
<el-card style="margin-bottom: 20px;">
<el-card style="margin-bottom: 1vh;">
<el-text size="large">精网号</el-text>
<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
<el-text size="large" style="margin-left:20px">地区</el-text>
@ -10,7 +10,6 @@
<div style="float: right;">
<el-button type="success" @click="reset">重置</el-button>
<el-button type="primary" @click="search">查询</el-button>
</div>
</el-card>
@ -21,7 +20,7 @@
免费金豆数{{ format3(stats.freeBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
消费金豆总数{{ format3(stats.consumeSum) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
</div>
<el-table :data="tableData" height="650px" @sort-change="handleSortChange" :row-style="{ height: '60px' }">
<el-table :data="tableData" height="65vh" @sort-change="handleSortChange" :row-style="{ height: '60px' }">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{

10
src/views/usergold/gold/clientCount.vue

@ -1,5 +1,5 @@
<template>
<div>
<div class="father">
<!-- 这里放置标签切换的按钮 -->
<el-button-group>
<!-- 切换后状态显示 primary 样式否则是默认样式 -->
@ -19,6 +19,8 @@
</el-button>
</el-button-group>
<!-- 渲染子路由组件 -->
</div>
<div>
<router-view></router-view>
</div>
</template>
@ -87,3 +89,9 @@ onMounted(() => {
}
});
</script>
<style>
.father{
width:82vw;
height:4vh;
}
</style>

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

@ -386,9 +386,7 @@ const format3 = (num) => {
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px;margin-top: 10px">
<el-card style="margin-bottom: 1vh;">
<div class="head-card">
<div class="head-card-element">
<el-text class="mx-1" size="large">精网号</el-text>
@ -415,10 +413,6 @@ const format3 = (num) => {
</div>
<!-- </div> -->
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<div>
金币总数{{ format3(goldtotal || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
@ -427,8 +421,8 @@ const format3 = (num) => {
任务金币{{ format3(taskGold || 0) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 626px; overflow-y: auto">
<el-table :data="tableData" @cellClick="cellClick" style="width: 100%" height="626px"
<div style="height: 60vh; overflow-y: auto">
<el-table :data="tableData" @cellClick="cellClick" style="width: 82vw;"height="60vh"
@sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
@ -450,12 +444,12 @@ const format3 = (num) => {
}}</span>
</template> -->
</el-table-column>
<el-table-column prop="currentPermanentGold" label="永久金币" sortable="custom" width="160">
<el-table-column prop="currentPermanentGold" label="永久金币" sortable="custom" width="150">
<template #default="scope">
<span>{{ (scope.row.currentPermanentGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="currentFreeJune" label="6月份到期免费金币" sortable="custom" width="170">
<el-table-column prop="currentFreeJune" label="6月份到期免费金币" sortable="custom" width="150">
<template #default="scope">
<span>{{ (scope.row.currentFreeJune || 0) }}</span>
</template>
@ -527,8 +521,6 @@ const format3 = (num) => {
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<el-dialog v-model="exportListVisible" title="导出列表" width="80%">
<el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名"/>

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

@ -493,7 +493,7 @@ const format3 = (num) => {
</script>
<template>
<div>
<el-card style="margin-bottom: 20px;margin-top: 10px;">
<el-card style="margin-bottom: 1vh;">
<el-row style="margin-bottom: 10px">
<el-col :span="5">
<div class="head-card-element">
@ -567,8 +567,8 @@ const format3 = (num) => {
任务金币{{ format3(totalTaskGold || 0) }}&nbsp;&nbsp;
<a style="color:#b1b1b1; font-size: small;">当前合计仅显示筛选范围内的金币净变化充值总额 - 消费总额 + 退款总额)</a>
</div>
<div style="height: 584px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" @sort-change="handleSortChange" height="584px">
<div style="height: 55vh; overflow-y: auto">
<el-table :data="tableData" style="width: 82vw" @sort-change="handleSortChange" height="55vh">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{

72
src/views/workspace/index.vue

@ -1,6 +1,6 @@
<template>
<div class="top">
<el-card style="width:20%" class="center-card">数据总览</el-card>
<el-card style="width:10vw" class="center-card">数据总览</el-card>
<span class="text">
最后更新时间{{
workDataUpdateTime && workDataUpdateTime !== '1970-01-01 08:00:00' ? workDataUpdateTime : '该地区暂无数据'
@ -15,7 +15,7 @@
<div class="card-title">当前金币余量</div>
<div>
<span style="font-weight: bold">{{ currentGold / 100
}}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;较前一日
}}</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;较前一日
{{ dailyChange / 100 }}
<template v-if="dailyChange > 0">
<el-icon style="color:red">
@ -60,7 +60,7 @@
<el-card class="card-item">
<div class="card-title">全年累计消费金币数</div>
<div class="card-title">{{ yearlyReduce / 100 }}</div>
<div style="padding-left: 30%;">{{ yearlyConsume / 100 }}</div>
<div style="padding-left: 30%;">{{ yearlyConsume / 100 }}</div>
<div style="padding-left: 30%;">退款{{ yearlyRefund / 100 }}</div>
<template #footer>
<div style="margin-bottom:0.5%;padding-left: 30%;">昨日新增消费{{ dailyConsume / 100 }}</div>
@ -115,7 +115,7 @@
</div>
<div class="graph">
<el-card style="width:100%;">
<el-card style="width:84vw;">
<div>
<el-tabs v-model="activeTab" @tab-change="handleTabChange">
<el-tab-pane label="金币充值" name="recharge"></el-tab-pane>
@ -123,29 +123,30 @@
</el-tabs>
</div>
<div class="condition">
<div style="display:flex;">合计&nbsp;&nbsp;
<span>永久金币</span> {{ activeTab === 'recharge' ? sumRechargePermanent / 100 : sumConsumePermanent / 100 }}&nbsp;&nbsp;
<span>免费金币</span> {{ activeTab === 'recharge' ? sumRechargeFree / 100 : sumConsumeFree / 100 }}&nbsp;&nbsp;
<span>任务金币</span> {{ activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100 }}&nbsp;&nbsp;
<div class="stats">合计&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 v-if="activeTab === 'consume'">合计 {{ sumConsume / 100 }}</div>
</div>
<div style="margin-left:auto;margin-right: 0.5%;">
<el-button @click="getYes()" :type="activeTimeRange === 'yes' ? 'primary' : ''">昨天
<div>
<el-button @click="getYes()" size="small" :type="activeTimeRange === 'yes' ? 'primary' : ''">昨天
</el-button>
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''">今天
<el-button @click="getToday()" size="small" :type="activeTimeRange === 'today' ? 'primary' : ''">今天
</el-button>
<el-button @click="getWeek()" :type="activeTimeRange === 'week' ? 'primary' : ''">本周
<el-button @click="getWeek()" size="small" :type="activeTimeRange === 'week' ? 'primary' : ''">本周
</el-button>
<el-button @click="getMonth()" :type="activeTimeRange === 'month' ? 'primary' : ''">本月
<el-button @click="getMonth()" size="small" :type="activeTimeRange === 'month' ? 'primary' : ''">本月
</el-button>
<el-button @click="getYear()" :type="activeTimeRange === 'year' ? 'primary' : ''">本年
<el-button @click="getYear()" size="small" :type="activeTimeRange === 'year' ? 'primary' : ''">本年
</el-button>
</div>
<div>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" format="YYYY-MM-DD HH:mm:ss" style="width:20vw" value-format="YYYY-MM-DD HH:mm:ss"
:default-time="defaultTime" :disabled-date="disabledDate" @change="handleDatePickerChange"/>
<el-button type="primary" style="margin-left: 5px" @click="getChartData">查询</el-button>
<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>
@ -701,7 +702,7 @@ const updateChart = (chartData) => {
grid: {
left: '3%',
right: '4%',
bottom: '15%',
bottom: '10%',
containLabel: true
},
xAxis: {
@ -807,13 +808,14 @@ onUnmounted(() => {
<style scoped>
.top {
height: 5.5%;
width:100%;
height: 5.5vh;
width: 80vw;
display: flex;
margin-bottom: 0.2%;
.text{
margin-left:0.2%;
width:50%;
margin-bottom: 0.5vh;
.text {
margin-left: 2vw;
width: 20vw;
display: flex;
align-items: center;
font-size: 18px;
@ -821,7 +823,8 @@ onUnmounted(() => {
}
.card {
height: 28%;
height: 28vh;
margin-bottom: 0.5vh;
display: flex;
justify-content: center;
}
@ -836,6 +839,13 @@ onUnmounted(() => {
height: 1%;
display: flex;
align-items: center;
.stats {
display: flex;
align-items: center;
width: 35vw;
font-size: 15px;
}
}
.graph-content {
@ -850,7 +860,7 @@ onUnmounted(() => {
.right {
flex: 1;
padding: 0.5% 2%;
padding: 0.5vw 2vh;
}
}
}
@ -862,21 +872,21 @@ onUnmounted(() => {
}
.margin-bottom {
margin-bottom: 0.5%;
margin-bottom: 0.5vh;
}
.card-item {
width: 25%;
height: 98%;
height: 28vh;
display: flex;
flex-direction: column;
justify-content: center;
margin-right: 0.25%;
margin-right: 0.25vw;
}
.card-title {
font-weight: bold;
margin-bottom: 10px;
margin-bottom: 1vh;
display: flex;
justify-content: center;
align-items: center;

Loading…
Cancel
Save